summaryrefslogtreecommitdiff
path: root/portato/db/sql.py
diff options
context:
space:
mode:
Diffstat (limited to 'portato/db/sql.py')
-rw-r--r--portato/db/sql.py68
1 files changed, 42 insertions, 26 deletions
diff --git a/portato/db/sql.py b/portato/db/sql.py
index bee8a4a..cb252c1 100644
--- a/portato/db/sql.py
+++ b/portato/db/sql.py
@@ -17,7 +17,11 @@ try:
except ImportError:
from pysqlite2 import dbapi2 as sql
-import anydbm
+try:
+ import cPickle as pickle
+except ImportError:
+ import pickle
+
import hashlib
import os
@@ -113,33 +117,45 @@ class SQLDatabase (Database):
dbpath = os.path.join(SESSION_DIR, "portdirs.db")
db_existed = os.path.exists(dbpath)
- db = anydbm.open(dbpath, "c")
- try:
- if db_existed:
- debug("portdirs.db already existant")
- for key in set(db.keys())- set(hashes.keys()):
- debug("Overlay '%s' has been removed", key)
- del db[key]
- changed = True
-
- for key in hashes.iterkeys():
- if key not in db.keys():
- debug("Overlay '%s' has been added.", key)
- changed = True
+ if db_existed and "pickle" not in self.session:
+ debug("Removing old portdirs.db, as this looks like old DBM format. If it is not - well - no real harm ;)")
+ os.remove(dbpath)
+ db_existed = False
- elif db[key] != hashes[key]:
- debug("Overlay '%s' has been changed.", key)
- changed = True
-
- db[key] = hashes[key]
- else:
- debug("portdirs.db not existant")
- for key in hashes.iterkeys():
- db[key] = hashes[key]
-
- finally:
- db.close()
+ self.session["pickle"] = True # no need for a certain value
+
+ if db_existed:
+ debug("portdirs.db already existant")
+ with open(dbpath, "rb") as dbfile:
+ db = pickle.load(dbfile)
+
+ # the following could be simplified - losing the debug possibilities
+ # so we keep it as is :)
+ # there shouldn't be so much overlays, that this would result
+ # in performance loss
+
+ for key in set(db.keys()) - set(hashes.keys()):
+ debug("Overlay '%s' has been removed", key)
+ changed = True
+
+ for key in hashes.iterkeys():
+
+ if key not in db:
+ debug("Overlay '%s' has been added.", key)
+ changed = True
+
+ elif db[key] != hashes[key]:
+ debug("Overlay '%s' has been changed.", key)
+ changed = True
+
+ else:
+ debug("portdirs.db not existant")
+ changed = True
+
+ if changed:
+ with open(dbpath, "wb") as dbfile:
+ db = pickle.dump(hashes, dbfile, protocol = -1)
return changed
insertions'>+16 2009-07-25cgitrc.5.txt: document 'head-include'Lars Hjemli1-0/+4 2009-07-25ui-blob: return 'application/octet-stream' for binary blobsLars Hjemli1-1/+7 2009-07-25ui-plain: Return 'application/octet-stream' for binary files.Remko Tronçon1-1/+4 2009-06-11use cgit_httpscheme() for atom feedDiego Ongaro2-3/+6 2009-06-11add cgit_httpscheme() -> http:// or https://Diego Ongaro2-0/+12 2009-06-07Return http statuscode 404 on unknown branchLars Hjemli3-0/+6 2009-06-07Add head-include configuration option.Mark Lodato3-1/+6 2009-03-15CGIT 0.8.2.1v0.8.2.1Lars Hjemli1-1/+1 2009-03-15Fix doc-related glitches in Makefile and .gitignoreLars Hjemli2-1/+6 2009-03-15ui-snapshot: avoid segfault when no filename is specifiedLars Hjemli1-6/+17 2009-03-15fix segfault when displaying empty blobsEric Wong1-5/+8 2009-02-19Add support for HEAD requestsLars Hjemli2-0/+7 2009-02-19Add support for ETag in 'plain' viewLars Hjemli4-0/+5 2009-02-12ui-tree: escape ascii-text properly in hexdump viewLars Hjemli1-4/+9 2009-02-12Makefile: add doc-related targetsLars Hjemli1-2/+17