lib/my_db.py
author fabien
Thu, 25 Sep 2003 11:02:05 -0400
branchxbelweb
changeset 15 574631f841c3
parent 13 7357230539d2
child 21 345ee7421989
permissions -rw-r--r--
[svn r1549] Add update/merge/delete keywords.

#!/usr/bin/python

import pgdb
import config
from bkmark import Bookmark

def sql_quote(str):
	return pgdb._quote(str)

class MyDbConnexion:
	def __init__(self):
		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')
		self.crs.execute("""
			INSERT INTO bookmarks(id, url, name, ldesc, added)
			VALUES (%d, %s, %s, %s, %s);
			INSERT INTO bookmarks_keywords(bookmark, keyword)
			VALUES (%d, %d);
			""" % (id, sql_quote(bk.url),
			sql_quote(bk.name), sql_quote(bk.desc),
			sql_quote(bk.added), id, 0))
		self.cnx.commit()
		return id
	def get_bookmarks(self, ids):
		qry = """
			SELECT id, url, name, ldesc, added
			FROM bookmarks
			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):
		self.crs.execute("""
			UPDATE bookmarks
			SET url = %s, name = %s,
			ldesc = %s, added = %s
			WHERE id = %d;
			""" % (sql_quote(bk.url), sql_quote(bk.name),
			sql_quote(bk.desc),
			sql_quote(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):
		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')
		self.crs.execute("""
			INSERT INTO keywords(id, name)
			VALUES (%d, %s);
			""" % (id, sql_quote(name)))
		self.cnx.commit()
		return id
	def get_keyword(self, id):
		self.crs.execute("""
			SELECT name FROM keywords
			WHERE id = %d;
			""" % (id,))
		return self.crs.fetchone()[0]
	def get_keywords(self, bk_id):
		self.crs.execute("""
			SELECT id, name FROM keywords, bookmarks_keywords
			WHERE keywords.id = bookmarks_keywords.keyword
			AND bookmarks_keywords.bookmark = %d
			ORDER BY id;
			""" % (bk_id,))
		return self.crs.fetchall()
	def update_keyword(self, id, name):
		self.crs.execute("""
			UPDATE keywords
			SET name = %s
			WHERE id = %d;
			""" % (sql_quote(name), id))
		self.cnx.commit()
	def remove_keyword(self, id):
		if id == 0:
			raise "Can't remove default keyword!"
		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.crs.execute("""
			UPDATE bookmarks_keywords
			SET keyword = %d
			WHERE keyword = %d
			AND NOT ( bookmark IN 
			  (SELECT bookmark FROM bookmarks_keywords
			  WHERE keyword = %d ))
			;
			""" % (into_id, merge_id, merge_id))
		self.remove_keyword(merge_id)
	def get_all_keywords(self):
		"""Return a list of triplets [id, keyword, count]."""
		self.crs.execute("""SELECT k.id, k.name, COUNT(bk.keyword)
			FROM keywords k, bookmarks_keywords bk
			WHERE k.id = bk.keyword
			GROUP BY k.id, k.name
			ORDER BY k.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 FROM bookmarks, bookmarks_keywords
		  WHERE bookmarks.id = bookmarks_keywords.bookmark
		  AND bookmarks_keywords.keyword = %d
		  """
		
		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):
		self.crs.execute("""
			SELECT nextid FROM db_sequence WHERE
			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 = '%s';
			""" % (id+1, seq_name))
		return id

def connect():
	return MyDbConnexion()