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
);
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."""