diff -r 4cb6d9f3d3eb -r 9e7e8b678819 lib/my_db.py --- a/lib/my_db.py Tue Sep 23 10:26:35 2003 -0400 +++ b/lib/my_db.py Tue Sep 23 15:11:11 2003 -0400 @@ -1,116 +1,154 @@ #!/usr/bin/python -import pg +import pgdb import config +from bkmark import Bookmark class MyDbConnexion: def __init__(self): - self.cnx = pg.connect(config.database, config.host, - config.port, None, None, config.user, config.passwd) + self.cnx = pgdb.connect(database = config.database, + host = config.host+':%d'%config.port, + user = config.user, password = config.passwd) + self.crs = self.cnx.cursor(); def add_bookmark(self, bk): id = self.get_next_id('bookmarks') - res = self.cnx.query(""" + self.crs.execute(""" INSERT INTO bookmarks(id, url, name, ldesc, added) VALUES (%d, '%s', '%s', '%s', '%s'); - INSERT INTO bookmarks(bookmark, keyword) + INSERT INTO bookmarks_keywords(bookmark, keyword) VALUES (%d, %d); """ % (id, bk.url, bk.name, bk.desc, bk.added, id, 0)) + self.cnx.commit() return id - def get_bookmark(self, id): - bk = Bookmark() - res = self.cnx.query(""" - SELECT url, name, ldesc, added + def get_bookmarks(self, ids): + qry = """ + SELECT id, url, name, ldesc, added FROM bookmarks - WHERE id = %d; - """ % (id,)) - res = res.dictresult()[0] - bk.url = res['url'] - bk.name = res['name'] - bk.desc = res['ldesc'] - bk.added = res['added'] - bk.id = id - return bk + WHERE id = %d + """ % (ids.pop(),) + for id in ids: + qry = qry + " OR id = %d" % (id,) + qry = qry + ";" + self.crs.execute(qry) + bks = [] + list = self.crs.fetchall() + for res in list: + bk = Bookmark() + bk.id = res[0] + bk.url = res[1] + bk.name = res[2] + bk.desc = res[3] + bk.added = res[4] + bks.append(bk) + return bks def update_bookmark(self, bk): - return self.cnx.query(""" + self.crs.execute(""" UPDATE bookmarks SET url = '%s', name = '%s', ldesc = '%s', added = '%s' WHERE id = %d; """ % (bk.url, bk.name, bk.desc, bk.added, bk.id)) + self.cnx.commit() + def update_keywords(self, id, keywords): + self.crs.execute(""" + DELETE FROM bookmarks_keywords + WHERE bookmark = %d AND + keyword <> 0;""" % (id,)) + for kw in keywords: + if kw == 0: continue + self.crs.execute(""" + INSERT INTO + bookmarks_keywords(bookmark, keyword) + VALUES (%d, %d);""" % (id, kw)) + self.cnx.commit() def remove_bookmark(self, id): - return self.cnx.query(""" + self.crs.execute(""" DELETE FROM bookmarks_keywords WHERE bookmark = %d; DELETE FROM bookmarks WHERE id = %d; """ % (id, id)) + self.cnx.commit() def add_keyword(self, name): id = self.get_next_id('keywords') - res = self.cnx.query(""" + self.crs.execute(""" INSERT INTO keywords(id, name) VALUES (%d, '%s')' """ % (id, name)) + self.cnx.commit() return id def get_keyword(self, id): - return self.cnx.query(""" + self.crs.execute(""" SELECT name FROM keywords WHERE keyword.id = %d; - """ % (id,)).getresult()[0][0] + """ % (id,)) + return self.crs.fetchone()[0] def get_keywords(self, bk_id): - return self.cnx.query(""" + self.crs.execute(""" SELECT id, name FROM keywords, bookmarks_keywords WHERE keywords.id = bookmarks_keywords.keyword - AND bookmarks_keywords.bookmark = %d; + AND bookmarks_keywords.bookmark = %d + ORDER BY id; """ % (bk_id,)) + return self.crs.fetchall() def update_keyword(self, id, name): - return self.cnx.query(""" + self.crs.execute(""" UPDATE keywords SET name = '%s' WHERE id = %d; """ % (name, id)) + self.cnx.commit() def remove_keyword(self, id): if id == 0: raise "Can't remove default keyword!" - return self.cnx.query(""" + self.crs.execute(""" DELETE FROM bookmarks_keywords WHERE keyword = %d; DELETE FROM keywords WHERE id = %d; """ % (id, id)) + self.cnx.commit() def merge_keywords(self, merge_id, into_id): - self.cnx.query(""" + self.crs.execute(""" UPDATE bookmarks_keywords SET keyword = %d WHERE keyword = %d; """ % (into_id, merge_id)) self.remove_keyword(merge_id) def get_all_keywords(self): - self.cnx.query("SELECT id, name FROM keywords;" - def get_bookmarks(self, has_kw, except_kw): + """Return a list of pair-elements [id, keyword].""" + self.crs.execute("SELECT id, name FROM keywords ORDER BY id;") + return self.crs.fetchall() + def select_bookmarks(self, has_kw = [0], except_kw = []): + """ +Return a list of id bookmarks who has /has_kw/ set but not /except_kw/. +""" basic_qry = """ - SELECT id, name, url FROM bookmarks, bookmarks_keywords + SELECT id FROM bookmarks, bookmarks_keywords WHERE bookmarks.id = bookmarks_keywords.bookmark AND bookmarks_keywords.keyword = %d """ - has_kw.reverse() - kw = has_kw.pop() - qry = basic_qry % kw - has_kw.reverse() - for kw in has_kw: - qry = qry + ("INTERCEPT " + basic_qry % kw) + + qry = basic_qry % has_kw[0] + for kw in has_kw[1:]: + qry = qry + ("INTERSECT " + basic_qry % kw) for kw in except_kw: qry = qry + ("EXCEPT " + basic_qry % kw) qry = qry + ';' + self.crs.execute(qry) + return self.crs.fetchall() def get_next_id(self, seq_name): - id = self.cnx.query(""" + self.crs.execute(""" SELECT nextid FROM db_sequence WHERE - db_sequence.seq_name = '%s'; - """ % (seq_name)).getresult()[0][0] - self.cnx.query(""" + db_sequence.seq_name = '%s' FOR UPDATE; + """ % (seq_name)) + id = self.crs.fetchone()[0] + self.crs.execute(""" UPDATE db_sequence SET nextid = %d WHERE seq_name = 'bookmarks'; """ % (id+1,)) + return id def connect(): return MyDbConnexion()