Browse Source

Finish database insertion, except for origins.

tags/v1.0^2
Ben Kurtovic 10 years ago
parent
commit
d2aef2829e
1 changed files with 26 additions and 11 deletions
  1. +26
    -11
      bitshift/database/__init__.py

+ 26
- 11
bitshift/database/__init__.py View File

@@ -51,6 +51,23 @@ class Database(object):
"Run `python -m bitshift.database.migration`."
raise RuntimeError(err)

def _decompose_url(self, url):
"""Break up a URL into an origin (with a URL base) and a suffix."""
pass ## TODO

def _insert_symbols(self, cursor, code_id, sym_type, symbols):
"""Insert a list of symbols of a given type into the database."""
sym_types = ["functions", "classes", "variables"]
query1 = "INSERT INTO symbols VALUES (?, ?, ?)"
query2 = "INSERT INTO symbol_locations VALUES (?, ?, ?, ?, ?, ?)"

for (name, decls, uses) in symbols:
cursor.execute(query1, (code_id, sym_types.index(sym_type), name))
sym_id = cursor.lastrowid
params = ([tuple([sym_id, 0] + list(loc)) for loc in decls] +
[tuple([sym_id, 1] + list(loc)) for loc in uses])
cursor.executemany(query2, params)

def close(self):
"""Disconnect from the database."""
self._conn.close()
@@ -89,23 +106,21 @@ class Database(object):
ON DUPLICATE KEY UPDATE code_id=code_id"""
query2 = """INSERT INTO codelets VALUES
(?, ?, ?, ?, ?, ?, ?, ?)"""
query3 = "SELECT LAST_INSERT_ID()"
query4 = "INSERT INTO authors VALUES (?, ?, ?)"
query5 = "INSERT INTO symbols VALUES (?, ?, ?, ?, ?, ?, ?)"
query3 = "INSERT INTO authors VALUES (?, ?, ?)"

code_id = mmh3.hash64(codelet.code.encode("utf8"))[0]
origin, url = decompose(codelet.url) ## TODO: create decompose() function
origin, url = self._decompose_url(codelet.url)

with self._conn.cursor() as cursor:
cursor.execute(query1, (code_id, codelet.code))
new_code = cursor.rowcount == 1
cursor.execute(query2, (codelet.name, code_id, codelet.language,
origin, url, codelet.rank,
codelet.date_created,
codelet.date_modified))
cursor.execute(query3)
codelet_id = cursor.fetchone()[0]
authors = [(codelet_id, a.name, a.url) for a in codelet.authors] ## TODO: check author fields (is it a tuple?)
cursor.executemany(query4, authors)
if code_id is new: ## TODO: check for this properly
symbols = [(code_id, sym.type, sym.name, sym.row, sym.col, sym.end_row, sym.end_col) for sym in codelet.symbols] # TODO: check symbol fields (dict?)
cursor.executemany(query5, symbols)
codelet_id = cursor.lastrowid
authors = [(codelet_id, a[0], a[1]) for a in codelet.authors]
cursor.executemany(query3, authors)
if new_code:
for sym_type, symbols in codelet.symbols.iteritems():
self._insert_symbols(cursor, code_id, sym_type, symbols)

Loading…
Cancel
Save