4 DATABASE_NAME = 'contacts.db'
7 MIDDLELEVEL_FIELD = 'ou'
20 id integer primary key,
24 create table relation (
30 id integer primary key,
40 def __init__(self, basedir):
41 self._path = os.path.join(basedir, DATABASE_NAME)
43 if not os.path.exists(self._path):
46 self.conn = sqlite3.connect(self._path)
49 """Creates new databse."""
51 self.conn = sqlite3.connect(self._path)
52 self.conn.executescript(SCHEMA)
56 """Closes connection with database."""
61 # operations with FIELDS table
62 def update_field(self, field_names_list):
63 """Adds new field name to database."""
65 fields = [item[0] for item in \
66 self.conn.execute("SELECT name from fields").fetchall()]
67 for field_name in field_names_list:
68 if not field_name in fields:
69 self.conn.execute("INSERT INTO fields values(NULL, ?)", \
73 def get_field_id_by_name(self, field_name):
74 """Returns unique field id by its name."""
77 return self.conn.execute("SELECT id FROM fields WHERE name=?", \
78 (field_name,)).fetchone()[0]
82 def get_field_name_by_id(self, _id):
83 """Returns field name by its id."""
86 return self.conn.execute("SELECT name FROM fields WHERE id=?", \
92 # operations with DATA table
93 def add_entry(self, entry):
94 """Adds new entry to database."""
96 if not 'uid' in entry:
99 # check man existence in DATA table
100 if self.conn.execute("SELECT field_id FROM data WHERE value=?", \
101 (entry['uid'][0],)).fetchone():
104 self.update_field(entry.keys())
105 # check for empty table
107 _id = self.conn.execute("SELECT MAX(id) FROM data").fetchone()[0] \
112 # add entry (fill DATA table)
113 for field_name in entry:
114 for value in entry[field_name]:
115 self.conn.execute("INSERT INTO data values(?,?,?)", \
116 (_id, field_name, value))
120 def get_toplevel_entries(self):
121 """Returns list of all toplevel entries from DATA table."""
123 return set([item[0] for item in self.conn.execute("SELECT value FROM \
124 data WHERE field_id=?", (TOPLEVEL_FIELD,)).fetchall()])
126 def get_middlelevel_entries(self, toplevel_item=None):
127 """Returns list of all middlelevel entries from DATA table."""
129 if not toplevel_item:
130 return set([item[0] for item in self.conn.execute("SELECT value \
131 FROM data WHERE field_id=?", (MIDDLELEVEL_FIELD,)).fetchall()])
133 ids = [item[0] for item in self.conn.execute("SELECT id FROM data \
134 WHERE value=?", (toplevel_item,)).fetchall()]
135 return set([self.conn.execute("SELECT value FROM data WHERE \
136 field_id=? AND id=?", (MIDDLELEVEL_FIELD, _id)).fetchone()[0] \
139 def get_lowlevel_entries(self):
140 """Returns list of all lowlevel entries from DATA table."""
142 return set([item[0] for item in self.conn.execute("SELECT value FROM \
143 data WHERE field_id=?", (LOWLEVEL_FIELD,)).fetchall()])
146 def get_entry_by_id(self, _id):
147 """Returns full entry by it id."""
149 sql_res = self.conn.execute("""SELECT id_field, value FROM data
150 WHERE id=?""", (_id,)).fetchall()
151 return dict([(self.get_field_name_by_id(field_id), value) for field_id, \
154 def get_all_entries(self):
155 """Returns list of all entries."""
157 ids = set([item[0] for item in self.conn.execute( \
158 """SELECT id FROM data""").fetchall()])
159 return [self.get_entry_by_id(_id) for _id in ids]
164 if __name__ == "__main__":
166 #db.update_field('test')
167 #print db.get_field_id_by_name('fax')
168 #print db.get_entry_by_id(1)
169 #print db.get_all_entries()