2023-10-18 00:20:38 -07:00
|
|
|
import pg8000
|
2023-11-27 05:14:43 -08:00
|
|
|
import time
|
2023-11-24 03:13:33 -08:00
|
|
|
import ssl
|
2023-10-18 00:20:38 -07:00
|
|
|
from os import environ
|
|
|
|
|
2023-11-27 05:14:43 -08:00
|
|
|
def query(statement, args=[]):
|
|
|
|
start = time.time()
|
2023-11-27 06:59:22 -08:00
|
|
|
con = _create_new_connection()
|
2023-11-27 05:14:43 -08:00
|
|
|
cursor = con.cursor()
|
|
|
|
elapsed_connect = time.time() - start
|
|
|
|
|
|
|
|
cursor.execute(statement, args=args)
|
|
|
|
|
|
|
|
elapsed_total = time.time() - start
|
|
|
|
|
|
|
|
keys = [k[0] for k in cursor.description]
|
|
|
|
maprows = [dict(zip(keys, row)) for row in cursor]
|
|
|
|
|
|
|
|
if elapsed_total > .5:
|
|
|
|
print("Database Query took", elapsed_total, "secs", "(", elapsed_connect, ")")
|
|
|
|
|
|
|
|
return maprows
|
|
|
|
|
|
|
|
|
|
|
|
# caution: must not expose this due to "pg8000 is designed to be used with one thread per connection."
|
2023-11-24 05:02:23 -08:00
|
|
|
def _create_new_connection():
|
2023-11-27 05:59:17 -08:00
|
|
|
print("pg8000.dbapi.threadsafety", pg8000.dbapi.threadsafety)
|
2023-10-18 00:20:38 -07:00
|
|
|
username = environ.get('PGUSER', 'mev_dashboard_query_user')
|
|
|
|
password = environ.get('PGPASSWORD')
|
|
|
|
assert password is not None, "PGPASSWORD environment variable must be set"
|
|
|
|
host = environ.get('PGHOST', 'localhost')
|
|
|
|
port = environ.get('PGPORT', '5432')
|
|
|
|
database = environ.get('PGDATABASE', 'mangolana')
|
2023-11-24 03:13:33 -08:00
|
|
|
if environ.get('PGSSL', 'false') == 'true':
|
|
|
|
ssl_context = ssl.create_default_context()
|
|
|
|
ssl_context.verify_mode = ssl.CERT_REQUIRED
|
|
|
|
ssl_context.check_hostname = False
|
|
|
|
ssl_context.load_verify_locations("ca.cer")
|
|
|
|
ssl_context.load_cert_chain("client.cer", keyfile="client-key.cer")
|
|
|
|
|
2023-11-27 05:59:17 -08:00
|
|
|
con = pg8000.dbapi.Connection(username, host=host, port=port, password=password, database=database,
|
|
|
|
application_name="bankingstage-dashboard", ssl_context=ssl_context)
|
2023-11-24 03:13:33 -08:00
|
|
|
return con
|
|
|
|
else:
|
2023-11-27 05:59:17 -08:00
|
|
|
con = pg8000.dbapi.Connection(username, host=host, port=port, password=password, database=database,
|
|
|
|
application_name="bankingstage-dashboard")
|
2023-11-24 05:43:40 -08:00
|
|
|
return con
|
2023-11-24 05:02:23 -08:00
|
|
|
|