From 385d0f7d5f6b6fcadce75d0b53f295e8e69a65bf Mon Sep 17 00:00:00 2001 From: Sven Slootweg Date: Fri, 27 Sep 2013 09:43:49 +0200 Subject: [PATCH] Fill up unset columns with NULLs when inserting a new row --- core/db.py | 43 ++++++++++++++++++++++++++++++++----------- core/node.db | Bin 2048 -> 2048 bytes 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/core/db.py b/core/db.py index 85a4b07..b2b45fa 100644 --- a/core/db.py +++ b/core/db.py @@ -47,8 +47,9 @@ class Database(object): return self._get_table(name, in_memory=True) def query(self, query, params = [], commit=False): - print "QUERY: %s" % query - print "PARAMS: %s" % repr(params) + #print "QUERY: %s" % query + #print "PARAMS: %s" % repr(params) + # TODO: Query log cur = self._get_cursor() cur.execute(query, params) @@ -109,7 +110,11 @@ class Table(object): def _process_insert(self, value, key=None): if key is not None: value['id'] = key - + + for column in self.columns: + if column != "id" and column not in value._commit_buffer.keys(): + value._commit_buffer[column] = None + column_list = ", ".join("`%s`" % name for name in value._commit_buffer.keys()) sub_list = ", ".join("?" for name in value._commit_buffer.keys()) query = "INSERT INTO %s (%s) VALUES (%s)" % (self.table, column_list, sub_list) # Not SQLi-safe! @@ -129,6 +134,23 @@ class Table(object): except sqlite3.IntegrityError, e: raise TypeError("A row with the given ID already exists. Either edit the existing one, or append a new row using append().") + def _set_column_names(self, names): + self._column_names = names + + def _retrieve_column_names(self): + cur = self.db.query("SELECT * FROM %s WHERE 0" % self.table) # Not SQLi-safe! + self._set_column_names([x[0] for x in cur.description]) + + def __getattr__(self, name): + if name == "columns": + try: + return self._column_names + except AttributeError, e: + self._retrieve_column_names() + return self._column_names + else: + raise AttributeError("No such attribute exists") + def append(self, value): return self._process_insert(value) @@ -185,7 +207,6 @@ class MemoryTable(Table): self.data[rowid]._nexus_db = self.db self.data[rowid]._nexus_table = self.table self.data[rowid]._nexus_type = "memory" - # TODO: Set None for other unset properties? return rowid def __getitem__(self, key): @@ -202,14 +223,14 @@ if __name__ == "__main__": # Testing code db = Database() db.setup() - #table = db.get_database_table("nodes") - - #new_row = Row() - #new_row['uuid'] = "abc" - #new_row['host'] = "def" - #new_row['port'] = 123 + table = db.get_database_table("nodes") + #print table.columns + new_row = Row() + new_row['uuid'] = "abc" + new_row['host'] = "def" + new_row['port'] = 123 - #table.append(new_row) + table.append(new_row) #table[10] = new_row diff --git a/core/node.db b/core/node.db index a134ece11573bec59939e06afa6a53e2ecebe333..869792c7d9172353a6cad19a97f582a92014a233 100644 GIT binary patch delta 118 zcmZn=Xb_kn%_uNY#+gxIW5N<