more work with SQLite
authorMax Usachev <maxusachev@gmail.com>
Wed, 9 Jun 2010 05:50:31 +0000 (08:50 +0300)
committerMax Usachev <maxusachev@gmail.com>
Wed, 9 Jun 2010 10:48:10 +0000 (13:48 +0300)
database/SQLite.py

index 1ec907c..2da8a8b 100644 (file)
@@ -3,11 +3,15 @@ import sqlite3
 
 DATABASE_NAME = 'contacts.db'
 
+TOPLEVEL_FIELD = 'o'
+MIDDLELEVEL_FIELD = 'ou'
+LOWLEVEL_FIELD = 'cn'
+
 SCHEMA = """
     begin;
 
     create table data(
-        id integer primary key,
+        id integer,
         field_id integer,
         value text
     );
@@ -54,25 +58,90 @@ class SQLite:
         self.conn.commit()
         self.conn.close()
 
-    def update_field(self, fname):
-        """Adds new field to database."""
+    # operations with FIELDS table
+    def update_field(self, field_names_list):
+        """Adds new field name to database."""
 
-        fields = self.conn.execute("""SELECT name from field""").fetchall()
-        if not fname in fields:
-            self.conn.execute("""INSERT INTO field values((SELECT max(id) 
-            FROM field)+1, ?)""", (fname,))
+        fields = [item[0] for item in \
+            self.conn.execute("SELECT name from fields").fetchall()]
+        for field_name in field_names_list:
+            if not field_name in fields:
+                self.conn.execute("INSERT INTO fields values(NULL, ?)", \
+                (field_name,))
+        self.conn.commit()
 
-    def get_field_id_by_name(self, fname):
-        """Returns field id by it name."""
+    def get_field_id_by_name(self, field_name):
+        """Returns unique field id by its name."""
 
-        return self.conn.execute("""SELECT id FROM field WHERE name=?""", \
-            (fname,)).fetchone()[0]
+        try:
+            return self.conn.execute("SELECT id FROM fields WHERE name=?", \
+                (field_name,)).fetchone()[0]
+        except TypeError:
+            return None
 
     def get_field_name_by_id(self, _id):
-        """Returns field id by it name."""
+        """Returns field name by its id."""
+
+        try:
+            return self.conn.execute("SELECT name FROM fields WHERE id=?", \
+                (_id,)).fetchone()[0]
+        except TypeError:
+            return None
+
+
+    # operations with DATA table
+    def add_entry(self, entry):
+        """Adds new entry to database."""
+
+        if not 'uid' in entry:
+            return
+
+        # check man existence in DATA table
+        if self.conn.execute("SELECT field_id FROM data WHERE value=?", \
+            (entry['uid'][0],)).fetchone():
+            return
+
+        self.update_field(entry.keys())
+        # check for empty table
+        try:
+            _id = self.conn.execute("SELECT MAX(id) FROM data").fetchone()[0] \
+                + 1
+        except TypeError:
+            _id = 1
+
+        # add entry (fill DATA table)
+        for field_name in entry:
+            for value in entry[field_name]:
+                self.conn.execute("INSERT INTO data values(?,?,?)", \
+                    (_id, field_name, value))
+
+        self.conn.commit()
+
+    def get_toplevel_entries(self):
+        """Returns list of all toplevel entries from DATA table."""
+
+        return set([item[0] for item in self.conn.execute("SELECT value FROM \
+            data WHERE field_id=?", (TOPLEVEL_FIELD,)).fetchall()])
+
+    def get_middlelevel_entries(self, toplevel_item=None):
+        """Returns list of all middlelevel entries from DATA table."""
+
+        if not toplevel_item:
+            return set([item[0] for item in self.conn.execute("SELECT value \
+                FROM data WHERE field_id=?", (MIDDLELEVEL_FIELD,)).fetchall()])
+        else:
+            ids = [item[0] for item in self.conn.execute("SELECT id FROM data \
+                WHERE value=?", (toplevel_item,)).fetchall()]
+            return set([self.conn.execute("SELECT value FROM data WHERE \
+                field_id=? AND id=?", (MIDDLELEVEL_FIELD, _id)).fetchone()[0] \
+                for _id in ids])
+
+    def get_lowlevel_entries(self):
+        """Returns list of all lowlevel entries from DATA table."""
+
+        return set([item[0] for item in self.conn.execute("SELECT value FROM \
+            data WHERE field_id=?", (LOWLEVEL_FIELD,)).fetchall()])
 
-        return self.conn.execute("""SELECT name FROM field WHERE id=?""", \
-            (_id,)).fetchone()[0]
 
     def get_entry_by_id(self, _id):
         """Returns full entry by it id."""