changeset 104:dfdfd092e250

Fixed some bugs with the SQL db layer: - Fixed some incorrect uses of the SQLAlchemy API. - More robust DB re-creation or version checking. - Removed some useless stuff.
author Ludovic Chabant <ludovic@chabant.com>
date Tue, 12 Nov 2013 13:45:28 -0800
parents cc1f3b81364c
children 986f399a1471
files wikked/db.py
diffstat 1 files changed, 23 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/wikked/db.py	Wed Nov 06 22:14:19 2013 -0800
+++ b/wikked/db.py	Tue Nov 12 13:45:28 2013 -0800
@@ -5,9 +5,9 @@
 import logging
 import datetime
 from sqlalchemy import (
-        create_engine, and_,
+        and_,
         Column, Boolean, Integer, String, Text, DateTime, ForeignKey)
-from sqlalchemy.orm import sessionmaker, relationship, backref
+from sqlalchemy.orm import relationship, backref
 from wikked.web import db
 
 
@@ -147,22 +147,25 @@
     def __init__(self, db_path, logger=None):
         Database.__init__(self, logger)
         self.db_path = db_path
-        self.engine = create_engine(db_path, echo=True)
-        self.session_class = sessionmaker(bind=self.engine)
 
     def initDb(self):
         create_schema = False
         if self.db_path != 'sqlite:///:memory:':
-            if not os.path.isdir(os.path.dirname(self.db_path)):
+            if not os.path.exists(os.path.dirname(self.db_path)):
                 # No database on disk... create one.
-                self.logger.debug("Creating SQL database.")
-                os.makedirs(os.path.dirname(self.db_path))
+                self.logger.debug("Creating SQL database at: %s" % self.db_path)
                 create_schema = True
             else:
                 # The existing schema is outdated, re-create it.
                 schema_version = self._getSchemaVersion()
                 if schema_version < self.schema_version:
+                    self.logger.debug(
+                            "SQL database is outdated (got version %s), will re-create.",
+                            schema_version)
                     create_schema = True
+                else:
+                    self.logger.debug(
+                            "SQL database has up-to-date schema.")
         else:
             create_schema = True
         if create_schema:
@@ -176,8 +179,7 @@
 
     def reset(self, pages):
         self.logger.debug("Re-creating SQL database.")
-        db.drop_all()
-        db.create_all()
+        self._createSchema()
         for page in pages:
             self._addPage(page)
         db.session.commit()
@@ -204,7 +206,7 @@
         for p in to_remove:
             self._removePage(p)
 
-        self.session.commit()
+        db.session.commit()
 
         added_db_objs = []
         for p in pages:
@@ -212,7 +214,7 @@
                 p.path not in already_added):
                 added_db_objs.append(self._addPage(p))
 
-        self.session.commit()
+        db.session.commit()
         self.logger.debug("...done updating SQL database.")
 
         return [o.id for o in added_db_objs]
@@ -258,6 +260,7 @@
             yield l.source
 
     def _createSchema(self):
+        db.drop_all()
         db.create_all()
 
         ver = SQLInfo()
@@ -267,11 +270,14 @@
         db.session.commit()
 
     def _getSchemaVersion(self):
-        q = db.session.query(SQLInfo).\
-                filter(SQLInfo.name == 'schema_version').\
-                first()
-        if q is None:
-            return 0
+        try:
+            q = db.session.query(SQLInfo).\
+                    filter(SQLInfo.name == 'schema_version').\
+                    first()
+            if q is None:
+                return 0
+        except:
+            return -1
         return q.int_value
 
     def _addPage(self, page):
@@ -331,5 +337,5 @@
     def _removePage(self, page):
         self.logger.debug("Removing page '%s' [%d] from SQL database." %
             (page.url, page.id))
-        self.session.remove(page)
+        db.session.delete(page)