lib/my_db.py
branchxbelweb
changeset 3 9e7e8b678819
parent 2 4cb6d9f3d3eb
child 8 c763c420cbfc
--- 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()