| @@ -20,7 +20,8 @@ class Database(object): | |||||
| def _connect(self): | def _connect(self): | ||||
| """Establish a connection to the database.""" | """Establish a connection to the database.""" | ||||
| default_file = os.path.join(os.path.dirname(__file__), ".my.cnf") | |||||
| root = os.path.dirname(os.path.abspath(__file__)) | |||||
| default_file = os.path.join(root, ".my.cnf") | |||||
| self._conn = oursql.connect(read_default_file=default_file, | self._conn = oursql.connect(read_default_file=default_file, | ||||
| autoping=True, autoreconnect=True) | autoping=True, autoreconnect=True) | ||||
| @@ -54,9 +55,18 @@ class Database(object): | |||||
| :param codelet: The codelet to insert. | :param codelet: The codelet to insert. | ||||
| :type codelet: :py:class:`.Codelet` | :type codelet: :py:class:`.Codelet` | ||||
| """ | """ | ||||
| query = "INSERT INTO codelets VALUES (?, ?, ?, ?, ?, ?, ?, ?)" | |||||
| frag_size = 16384 # 16 kB | |||||
| query_slt1 = """SELECT code_id, LEFT(code_code, {0}) | |||||
| FROM code WHERE code_hash = ?""".format(frag_size) | |||||
| query_ins1 = "INSERT INTO code VALUES (?, ?)" | |||||
| query_ins2 = "INSERT INTO codelets VALUES (?, ?, ?, ?, ?, ?, ?, ?)" | |||||
| query_ins3 = "INSERT INTO authors VALUES", " (?, ?, ?)" | |||||
| query_ins4 = "INSERT INTO symbols VALUES", " (?, ?, ?, ?, ?)" | |||||
| cursor.execute(query, ()) | |||||
| # LAST_INSERT_ID() | |||||
| code_id = None | |||||
| code_hash = mmh3.hash64(codelet.code.encode("utf8"))[0] | |||||
| # codelet_id -- auto_increment used here | # codelet_id -- auto_increment used here | ||||
| codelet_name | codelet_name | ||||
| @@ -78,4 +88,14 @@ class Database(object): | |||||
| codelet.date_created | codelet.date_created | ||||
| codelet.date_modified | codelet.date_modified | ||||
| code_hash = mmh3.hash64(codelet.code.encode("utf8"))[0] | |||||
| with self._conn.cursor() as cursor: | |||||
| # Retrieve the ID of the source code if it's already in the DB: | |||||
| cursor.execute(query_slt1, (code_hash,)) | |||||
| for c_id, c_code_frag in cursor.fetchall(): | |||||
| if c_code_frag == codelet.code[:frag_size]: | |||||
| code_id = c_id | |||||
| break | |||||
| # If the source code isn't already in the DB, add it: | |||||
| if not code_id: | |||||
| cursor.execute() | |||||