Created
June 5, 2020 12:25
-
-
Save leoGalani/5f9d86e71c0c6a92a3ebf0d5477369c8 to your computer and use it in GitHub Desktop.
Overengineer - resources manager
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import time | |
import sqlite3 | |
import os.path | |
RESOURCE_TIME_LIMIT = 100 | |
db_path = os.path.dirname(os.path.realpath(__file__)) + '/resources.db' | |
def request_resource(resource_name, request_uuid, retries=5): | |
resource_value = _request_for(resource_name, request_uuid) | |
if _confirm_resource(request_uuid): | |
return resource_value | |
else: | |
if retries == 0: | |
time.sleep(0.5) | |
retries -= 1 | |
return request_resource(resource_name) | |
raise Exception('Failed to get a resource - Timeout') | |
def release_resource(request_uuid): | |
conn = sqlite3.connect(db_path) | |
db = conn.cursor() | |
sql_update = "UPDATE resources SET uuid = '' WHERE uuid = ?" | |
db.execute(sql_update, (str(request_uuid), )) | |
conn.commit() | |
conn.close() | |
class Singleton(type): | |
def __init__(cls, name, bases, attrs, **kwargs): | |
super().__init__(name, bases, attrs) | |
cls._instance = None | |
def __call__(cls, *args, **kwargs): | |
if cls._instance is None: | |
cls._instance = super().__call__(*args, **kwargs) | |
return cls._instance | |
def _confirm_resource(request_uuid): | |
conn = sqlite3.connect(db_path) | |
db = conn.cursor() | |
sql_select = "select * from resources where uuid = ?" | |
result = db.execute(sql_select, (str(request_uuid),)).fetchall() | |
conn.close() | |
if not result: | |
return False | |
return True | |
def _request_for(resource_name, request_uuid): | |
conn = sqlite3.connect(db_path) | |
db = conn.cursor() | |
sql_select = "select * from resources where resource_name == ? and uuid == '' limit 1" | |
resource = db.execute(sql_select, (resource_name,)).fetchall() | |
sql_update = "UPDATE resources SET uuid = ? WHERE id = ?" | |
db.execute(sql_update, (request_uuid, resource[0][0], )) | |
conn.commit() | |
conn.close() | |
return resource[0][2] # resource_value | |
class ResourceManager(metaclass=Singleton): | |
def __init__(self): | |
if create_db(): | |
setup_resource_manager_db() | |
def create_db(): | |
try: | |
conn = sqlite3.connect(db_path) | |
db = conn.cursor() | |
db.execute( | |
"CREATE TABLE resources(id INTEGER PRIMARY KEY, resource_name TEXT, resource_value TEXT, uuid TEXT, lock_time_stamp REAL)") | |
conn.commit() | |
conn.close() | |
except: | |
return False | |
return True | |
def setup_resource_manager_db(): | |
conn = sqlite3.connect(db_path) | |
try: | |
db = conn.cursor() | |
db.execute("INSERT INTO resources(resource_name, resource_value, uuid, lock_time_stamp) VALUES ('client_id', 'integrated_tests0' , '', '');") | |
db.execute("INSERT INTO resources(resource_name, resource_value, uuid, lock_time_stamp) VALUES ('client_id', 'integrated_tests1' , '', '');") | |
db.execute("INSERT INTO resources(resource_name, resource_value, uuid, lock_time_stamp) VALUES ('client_id', 'integrated_tests2' , '', '');") | |
db.execute("INSERT INTO resources(resource_name, resource_value, uuid, lock_time_stamp) VALUES ('client_id', 'integrated_tests3' , '', '');") | |
db.execute("INSERT INTO resources(resource_name, resource_value, uuid, lock_time_stamp) VALUES ('client_id', 'integrated_tests4' , '', '');") | |
db.execute("INSERT INTO resources(resource_name, resource_value, uuid, lock_time_stamp) VALUES ('client_id', 'integrated_tests5' , '', '');") | |
db.execute("INSERT INTO resources(resource_name, resource_value, uuid, lock_time_stamp) VALUES ('client_id', 'integrated_tests6' , '', '');") | |
db.execute("INSERT INTO resources(resource_name, resource_value, uuid, lock_time_stamp) VALUES ('client_id', 'integrated_tests7' , '', '');") | |
db.execute("INSERT INTO resources(resource_name, resource_value, uuid, lock_time_stamp) VALUES ('client_id', 'integrated_tests8' , '', '');") | |
db.execute("INSERT INTO resources(resource_name, resource_value, uuid, lock_time_stamp) VALUES ('client_id', 'integrated_tests9' , '', '');") | |
except sqlite3.OperationalError: | |
pass | |
conn.commit() | |
conn.close() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment