aboutsummaryrefslogtreecommitdiffstats
path: root/pysite/database.py
diff options
context:
space:
mode:
authorGravatar lmn <[email protected]>2018-02-13 13:11:57 +0100
committerGravatar Joseph <[email protected]>2018-02-13 12:11:57 +0000
commitf92946e12f9acfa394c04a140a2a4d025a5fe3ca (patch)
treea74a0874c842952899f3d10ff2df8397fb89560d /pysite/database.py
parentWebsocket echo test (diff)
RethinkDB API Views #yqhg
* Refactoring the database implementation into a class of its own. * Refactoring the database implementation into a class of its own. * healthcheck should belong to the API. * dynamic subdomain loading, setting up basic handling for staff.pythondiscord.com, and started on a TagView for a bot tag feature. * Oops, forgot to fix some merges. * Some quality of life updates - default values for env variables that aren't secret, and starting to get through the tag view. * Refactoring the database implementation into a class of its own. * healthcheck should belong to the API. * dynamic subdomain loading, setting up basic handling for staff.pythondiscord.com, and started on a TagView for a bot tag feature. * Oops, forgot to fix some merges. * Some quality of life updates - default values for env variables that aren't secret, and starting to get through the tag view. * API validation added to the APIView class, TagView should be finished as well. * super important commit you guys * fixed a bug with the RethinkDB class where host and port attributes were accessed before being created * Fixed my editor now you guys * Fixing up some of the problems brought up in gdude's review * Handling GET requests with param indata and POST with JSON. Fixed error handling to use the constants and the baseclass self.error(). * Get API-key from headers, context manage the db assignment, and default env var values * Changed API-KEY header to X_API_Key. Added a default for secret key. it should no longer be necessary with environment variables to run this system locally. * Changing back the nav to have relative paths * Why am I like this
Diffstat (limited to 'pysite/database.py')
-rw-r--r--pysite/database.py43
1 files changed, 43 insertions, 0 deletions
diff --git a/pysite/database.py b/pysite/database.py
new file mode 100644
index 00000000..75f01378
--- /dev/null
+++ b/pysite/database.py
@@ -0,0 +1,43 @@
+# coding=utf-8
+
+import os
+
+from flask import abort
+
+import rethinkdb
+
+
+class RethinkDB:
+
+ def __init__(self, loop_type: str = "gevent"):
+ self.host = os.environ.get("RETHINKDB_HOST", "127.0.0.1")
+ self.port = os.environ.get("RETHINKDB_PORT", "28016")
+ self.database = os.environ.get("RETHINKDB_DATABASE", "pythondiscord")
+ self.conn = None
+
+ rethinkdb.set_loop_type(loop_type)
+
+ with self.get_connection(connect_database=False) as conn:
+ try:
+ rethinkdb.db_create(self.database).run(conn)
+ print(f"Database created: {self.database}")
+ except rethinkdb.RqlRuntimeError:
+ print(f"Database found: {self.database}")
+
+ def get_connection(self, connect_database: bool = True):
+ if connect_database:
+ return rethinkdb.connect(host=self.host, port=self.port, db=self.database)
+ else:
+ return rethinkdb.connect(host=self.host, port=self.port)
+
+ def before_request(self):
+ try:
+ self.conn = self.get_connection()
+ except rethinkdb.RqlDriverError:
+ abort(503, "Database connection could not be established.")
+
+ def teardown_request(self, _):
+ try:
+ self.conn.close()
+ except AttributeError:
+ pass