|
@@ -1,312 +0,0 @@
|
|
|
-#============================================================================
|
|
|
-# This file is part of Pwman3.
|
|
|
-#
|
|
|
-# Pwman3 is free software; you can redistribute it and/or modify
|
|
|
-# it under the terms of the GNU General Public License, version 2
|
|
|
-# as published by the Free Software Foundation;
|
|
|
-#
|
|
|
-# Pwman3 is distributed in the hope that it will be useful,
|
|
|
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
-# GNU General Public License for more details.
|
|
|
-#
|
|
|
-# You should have received a copy of the GNU General Public License
|
|
|
-# along with Pwman3; if not, write to the Free Software
|
|
|
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
-#============================================================================
|
|
|
-# Copyright (C) 2012 Oz Nahum <nahumoz@gmail.com>
|
|
|
-#============================================================================
|
|
|
-#============================================================================
|
|
|
-# Copyright (C) 2006 Ivan Kelly <ivan@ivankelly.net>
|
|
|
-#============================================================================
|
|
|
-
|
|
|
-"""
|
|
|
- Obsolete SQLite Database implementation. Used only for convert purpose.
|
|
|
- This will be removed in the new pwman3 version
|
|
|
-"""
|
|
|
-from pwman.data.database import Database, DatabaseException
|
|
|
-from pwman.data.nodes import Node
|
|
|
-from pwman.data.tags import Tag
|
|
|
-import sqlite3 as sqlite
|
|
|
-import pwman.util.config as config
|
|
|
-import cPickle
|
|
|
-
|
|
|
-
|
|
|
-class SQLiteDatabase(Database):
|
|
|
- """SQLite Database implementation"""
|
|
|
-
|
|
|
- def __init__(self):
|
|
|
- """Initialise SQLitePwmanDatabase instance."""
|
|
|
- Database.__init__(self)
|
|
|
-
|
|
|
- try:
|
|
|
- self._filename = config.get_value('Database', 'filename')
|
|
|
- except KeyError, e:
|
|
|
- raise DatabaseException(
|
|
|
- "SQLite: missing parameter [%s]" % (e))
|
|
|
-
|
|
|
- def _open(self):
|
|
|
- try:
|
|
|
- self._con = sqlite.connect(self._filename)
|
|
|
- self._cur = self._con.cursor()
|
|
|
- self._checktables()
|
|
|
- except sqlite.DatabaseError, e:
|
|
|
- raise DatabaseException("SQLite: %s" % (e))
|
|
|
-
|
|
|
- def close(self):
|
|
|
- self._cur.close()
|
|
|
- self._con.close()
|
|
|
-
|
|
|
- def listtags(self, alltags=False):
|
|
|
- sql = ''
|
|
|
- params = []
|
|
|
- if len(self._filtertags) == 0 or alltags:
|
|
|
- sql = "SELECT DATA FROM TAGS ORDER BY DATA ASC"
|
|
|
- else:
|
|
|
- sql = ("SELECT TAGS.DATA FROM LOOKUP"
|
|
|
- + " INNER JOIN TAGS ON LOOKUP.TAG = TAGS.ID"
|
|
|
- + " WHERE NODE IN (")
|
|
|
- first = True
|
|
|
- # if using the command filter, the code crashes ...
|
|
|
- #
|
|
|
- for t in self._filtertags:
|
|
|
- if not first:
|
|
|
- sql += " INTERSECT "
|
|
|
- else:
|
|
|
- first = False
|
|
|
-
|
|
|
- sql += ("SELECT NODE FROM LOOKUP LEFT JOIN TAGS ON TAG " +
|
|
|
- + " = TAGS.ID "
|
|
|
- + " WHERE TAGS.DATA = ?")
|
|
|
- params.append(cPickle.dumps(t))
|
|
|
- sql += ") EXCEPT SELECT DATA FROM TAGS WHERE "
|
|
|
- first = True
|
|
|
- for t in self._filtertags:
|
|
|
- if not first:
|
|
|
- sql += " OR "
|
|
|
- else:
|
|
|
- first = False
|
|
|
- sql += "TAGS.DATA = ?"
|
|
|
- params.append(t)
|
|
|
- try:
|
|
|
- print params
|
|
|
- self._cur.execute(sql, params)
|
|
|
- tags = []
|
|
|
- row = self._cur.fetchone()
|
|
|
- while (row is not None):
|
|
|
- tag = cPickle.loads(str(row[0]))
|
|
|
- tags.append(tag)
|
|
|
- row = self._cur.fetchone()
|
|
|
- return tags
|
|
|
- except sqlite.DatabaseError, e:
|
|
|
- raise DatabaseException("SQLite: %s" % (e))
|
|
|
-
|
|
|
- def getnodes(self, ids):
|
|
|
- nodes = []
|
|
|
- for i in ids:
|
|
|
- sql = "SELECT DATA FROM NODES WHERE ID = ?"
|
|
|
- try:
|
|
|
- self._cur.execute(sql, [i])
|
|
|
-
|
|
|
- row = self._cur.fetchone()
|
|
|
- if row is not None:
|
|
|
- node = cPickle.loads(str(row[0]))
|
|
|
- node.set_id(i)
|
|
|
- nodes.append(node)
|
|
|
- except sqlite.DatabaseError, e:
|
|
|
- raise DatabaseException("SQLite: %s" % (e))
|
|
|
- return nodes
|
|
|
-
|
|
|
- def editnode(self, id, node):
|
|
|
- if not isinstance(node, Node):
|
|
|
- raise DatabaseException(
|
|
|
- "Tried to insert foreign object into database [%s]" % node)
|
|
|
- try:
|
|
|
- sql = "UPDATE NODES SET DATA = ? WHERE ID = ?"
|
|
|
- self._cur.execute(sql, [cPickle.dumps(node), id])
|
|
|
-
|
|
|
- except sqlite.DatabaseError, e:
|
|
|
- raise DatabaseException("SQLite: %s" % (e))
|
|
|
- self._setnodetags(node)
|
|
|
- self._checktags()
|
|
|
- self._commit()
|
|
|
-
|
|
|
- def addnodes(self, nodes):
|
|
|
- for n in nodes:
|
|
|
- sql = "INSERT INTO NODES(DATA) VALUES(?)"
|
|
|
- if not isinstance(n, Node):
|
|
|
- raise DatabaseException(
|
|
|
- "Tried to insert foreign object into database [%s]", n)
|
|
|
- value = cPickle.dumps(n)
|
|
|
- try:
|
|
|
- self._cur.execute(sql, [value])
|
|
|
- except sqlite.DatabaseError, e:
|
|
|
- raise DatabaseException("SQLite: %s" % (e))
|
|
|
- id = self._cur.lastrowid
|
|
|
- n.set_id(id)
|
|
|
-
|
|
|
- self._setnodetags(n)
|
|
|
- self._commit()
|
|
|
-
|
|
|
- def removenodes(self, nodes):
|
|
|
- for n in nodes:
|
|
|
- if not isinstance(n, Node):
|
|
|
- raise DatabaseException(
|
|
|
- "Tried to delete foreign object from database [%s]", n)
|
|
|
- try:
|
|
|
- sql = "DELETE FROM NODES WHERE ID = ?"
|
|
|
- self._cur.execute(sql, [n.get_id()])
|
|
|
-
|
|
|
- except sqlite.DatabaseError, e:
|
|
|
- raise DatabaseException("SQLite: %s" % (e))
|
|
|
- self._deletenodetags(n)
|
|
|
-
|
|
|
- self._checktags()
|
|
|
- self._commit()
|
|
|
-
|
|
|
- def listnodes(self):
|
|
|
- sql = ''
|
|
|
- params = []
|
|
|
- if len(self._filtertags) == 0:
|
|
|
- sql = "SELECT ID FROM NODES ORDER BY ID ASC"
|
|
|
- else:
|
|
|
- first = True
|
|
|
- for t in self._filtertags:
|
|
|
- if not first:
|
|
|
- sql += " INTERSECT "
|
|
|
- else:
|
|
|
- first = False
|
|
|
- sql += ("SELECT NODE FROM LOOKUP LEFT JOIN TAGS "
|
|
|
- + " ON TAG = TAGS.ID"
|
|
|
- + " WHERE TAGS.DATA = ? ")
|
|
|
-
|
|
|
- params.append(cPickle.dumps(t))
|
|
|
- try:
|
|
|
- self._cur.execute(sql, params)
|
|
|
-
|
|
|
- ids = []
|
|
|
- row = self._cur.fetchone()
|
|
|
- while (row is not None):
|
|
|
- ids.append(row[0])
|
|
|
- row = self._cur.fetchone()
|
|
|
- return ids
|
|
|
- except sqlite.DatabaseError, e:
|
|
|
- raise DatabaseException("SQLite: %s" % (e))
|
|
|
-
|
|
|
- def _commit(self):
|
|
|
- try:
|
|
|
- self._con.commit()
|
|
|
- except sqlite.DatabaseError, e:
|
|
|
- self._con.rollback()
|
|
|
- raise DatabaseException(
|
|
|
- "SQLite: Error commiting data to db [%s]" % (e))
|
|
|
-
|
|
|
- def _tagids(self, tags):
|
|
|
- ids = []
|
|
|
- for t in tags:
|
|
|
- sql = "SELECT ID FROM TAGS WHERE DATA = ?"
|
|
|
- if not isinstance(t, Tag):
|
|
|
- raise DatabaseException(
|
|
|
- "Tried to insert foreign object into database [%s]", t)
|
|
|
- data = cPickle.dumps(t)
|
|
|
-
|
|
|
- try:
|
|
|
- self._cur.execute(sql, [data])
|
|
|
- row = self._cur.fetchone()
|
|
|
- if (row is not None):
|
|
|
- ids.append(row[0])
|
|
|
- else:
|
|
|
- sql = "INSERT INTO TAGS(DATA) VALUES(?)"
|
|
|
- self._cur.execute(sql, [data])
|
|
|
- ids.append(self._cur.lastrowid)
|
|
|
- except sqlite.DatabaseError, e:
|
|
|
- raise DatabaseException("SQLite: %s" % (e))
|
|
|
- return ids
|
|
|
-
|
|
|
- def _deletenodetags(self, node):
|
|
|
- try:
|
|
|
- sql = "DELETE FROM LOOKUP WHERE NODE = ?"
|
|
|
- self._cur.execute(sql, [node.get_id()])
|
|
|
-
|
|
|
- except sqlite.DatabaseError, e:
|
|
|
- raise DatabaseException("SQLite: %s" % (e))
|
|
|
- self._commit()
|
|
|
-
|
|
|
- def _setnodetags(self, node):
|
|
|
- self._deletenodetags(node)
|
|
|
- ids = self._tagids(node.get_tags())
|
|
|
-
|
|
|
- for i in ids:
|
|
|
- sql = "INSERT OR REPLACE INTO LOOKUP VALUES(?, ?)"
|
|
|
- params = [node.get_id(), i]
|
|
|
-
|
|
|
- try:
|
|
|
- self._cur.execute(sql, params)
|
|
|
- except sqlite.DatabaseError, e:
|
|
|
- raise DatabaseException("SQLite: %s" % (e))
|
|
|
- self._commit()
|
|
|
-
|
|
|
- def _checktags(self):
|
|
|
- try:
|
|
|
- sql = "DELETE FROM TAGS WHERE ID NOT IN (SELECT TAG FROM " \
|
|
|
- + "LOOKUP GROUP BY TAG)"
|
|
|
- self._cur.execute(sql)
|
|
|
- except sqlite.DatabaseError, e:
|
|
|
- raise DatabaseException("SQLite: %s" % (e))
|
|
|
- self._commit()
|
|
|
-
|
|
|
- def _checktables(self):
|
|
|
- """ Check if the Pwman tables exist """
|
|
|
- self._cur.execute("PRAGMA TABLE_INFO(NODES)")
|
|
|
- if (self._cur.fetchone() is None):
|
|
|
- # table doesn't exist, create it
|
|
|
- # SQLite does have constraints implemented at the moment
|
|
|
- # so datatype will just be a string
|
|
|
- self._cur.execute("CREATE TABLE NODES "
|
|
|
- "(ID INTEGER PRIMARY KEY AUTOINCREMENT,"
|
|
|
- "DATA BLOB NOT NULL)")
|
|
|
- self._cur.execute("CREATE TABLE TAGS "
|
|
|
- "(ID INTEGER PRIMARY KEY AUTOINCREMENT,"
|
|
|
- "DATA BLOB NOT NULL UNIQUE)")
|
|
|
- self._cur.execute("CREATE TABLE LOOKUP "
|
|
|
- "(NODE INTEGER NOT NULL, TAG INTEGER NOT NULL,"
|
|
|
- " PRIMARY KEY(NODE, TAG))")
|
|
|
-
|
|
|
- self._cur.execute("CREATE TABLE KEY "
|
|
|
- + "(THEKEY TEXT NOT NULL DEFAULT '')")
|
|
|
- self._cur.execute("INSERT INTO KEY VALUES('')")
|
|
|
- try:
|
|
|
- self._con.commit()
|
|
|
- except DatabaseException, e:
|
|
|
- self._con.rollback()
|
|
|
- raise e
|
|
|
-
|
|
|
- def savekey(self, key):
|
|
|
- """
|
|
|
- This function is saving the key to table KEY.
|
|
|
- The key already arrives as an encrypted string.
|
|
|
- It is the same self._keycrypted from
|
|
|
- crypto py (check with id(self._keycrypted) and
|
|
|
- id(key) here.
|
|
|
- """
|
|
|
- sql = "UPDATE KEY SET THEKEY = ?"
|
|
|
- values = [key]
|
|
|
- self._cur.execute(sql, values)
|
|
|
- try:
|
|
|
- self._con.commit()
|
|
|
- except sqlite.DatabaseError, e:
|
|
|
- self._con.rollback()
|
|
|
- raise DatabaseException(
|
|
|
- "SQLite: Error saving key [%s]" % (e))
|
|
|
-
|
|
|
- def loadkey(self):
|
|
|
- """
|
|
|
- fetch the key to database. the key is also stored
|
|
|
- encrypted.
|
|
|
- """
|
|
|
- self._cur.execute("SELECT THEKEY FROM KEY")
|
|
|
- keyrow = self._cur.fetchone()
|
|
|
- if (keyrow[0] == ''):
|
|
|
- return None
|
|
|
- else:
|
|
|
- return keyrow[0]
|