Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save leoGalani/5f9d86e71c0c6a92a3ebf0d5477369c8 to your computer and use it in GitHub Desktop.
Save leoGalani/5f9d86e71c0c6a92a3ebf0d5477369c8 to your computer and use it in GitHub Desktop.
Overengineer - resources manager
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