diff --git a/src/plugins/import/ImportSql.py b/src/plugins/import/ImportSql.py new file mode 100644 index 000000000..c719f8b40 --- /dev/null +++ b/src/plugins/import/ImportSql.py @@ -0,0 +1,166 @@ +# +# Gramps - a GTK+/GNOME based genealogy program +# +# Copyright (C) 2009 Douglas S. Blank +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program 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 this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# $Id$ + +"Import from SQL Database" + +#------------------------------------------------------------------------- +# +# Standard Python Modules +# +#------------------------------------------------------------------------- +from gettext import gettext as _ +from gettext import ngettext +import sqlite3 as sqlite +import re +import time + +#------------------------------------------------------------------------ +# +# Set up logging +# +#------------------------------------------------------------------------ +import logging +log = logging.getLogger(".ImportSql") + +#------------------------------------------------------------------------- +# +# GRAMPS modules +# +#------------------------------------------------------------------------- +import gen.lib +from QuestionDialog import ErrorDialog +from DateHandler import parser as _dp +from gen.plug import PluginManager, ImportPlugin +from Utils import gender as gender_map +from gui.utils import ProgressMeter +from Utils import create_id + +#------------------------------------------------------------------------- +# +# SQL Reader +# +#------------------------------------------------------------------------- +class Database(object): + """ + The db connection. + """ + def __init__(self, database): + self.database = database + self.db = sqlite.connect(self.database) + self.cursor = self.db.cursor() + + def query(self, q, *args): + if q.strip().upper().startswith("DROP"): + try: + self.cursor.execute(q, args) + self.db.commit() + except: + "WARN: no such table to drop: '%s'" % q + else: + try: + self.cursor.execute(q, args) + self.db.commit() + except: + print "ERROR: query :", q + print "ERROR: values:", args + raise + return self.cursor.fetchall() + + def close(self): + """ Closes and writes out tables """ + self.cursor.close() + self.db.close() + +class SQLReader(object): + def __init__(self, db, filename, callback): + print filename + self.db = db + self.filename = filename + self.callback = callback + self.debug = 0 + + def openSQL(self): + sql = None + try: + sql = Database(self.filename) + except IOError, msg: + errmsg = _("%s could not be opened\n") % self.filename + ErrorDialog(errmsg,str(msg)) + return None + return sql + + def process(self): + progress = ProgressMeter(_('SQLite Import')) + progress.set_pass(_('Reading data...'), 1) + sql = self.openSQL() + progress.set_pass(_('Importing data...'), 100) + self.trans = self.db.transaction_begin("",batch=True) + self.db.disable_signals() + t = time.time() + + notes = sql.query("""select * from note;""") + for note in notes: + (handle, + gid, + text, + format, + note_type1, + note_type2, + change, + marker0, + marker1, + private) = note + markups = sql.query("""select * from markup where handle = ?""", handle) + for markup in markups: + (mhandle, + markup0, + markup1, + value, + start_stop_list) = markup + + t = time.time() - t + msg = ngettext('Import Complete: %d second','Import Complete: %d seconds', t ) % t + self.db.transaction_commit(self.trans,_("CSV import")) + self.db.enable_signals() + self.db.request_rebuild() + print msg + progress.close() + return None + +def importData(db, filename, callback=None): + g = SQLReader(db, filename, callback) + g.process() + +#------------------------------------------------------------------------- +# +# Register the plugin +# +#------------------------------------------------------------------------- +_name = _('SQLite Import') +_description = _('SQLite is a common local database format') + +pmgr = PluginManager.get_instance() +plugin = ImportPlugin(name = _('SQLite Database'), + description = _("Import data from SQLite database"), + import_function = importData, + extension = "sql") +pmgr.register_plugin(plugin) +