From 05bd51b4253586ea92712ee4ece8df770335a552 Mon Sep 17 00:00:00 2001 From: Doug Blank Date: Tue, 12 Jul 2016 13:21:09 -0400 Subject: [PATCH] Remove DB-API XML config; replace with settings.py/.ini --- gramps/gen/config.py | 5 -- gramps/plugins/db/dbapi/dbapi.py | 83 ++++++++++------------------ gramps/plugins/db/dbapi/settings.ini | 11 ++++ gramps/plugins/db/dbapi/settings.py | 55 ++++++++++++++++++ 4 files changed, 96 insertions(+), 58 deletions(-) create mode 100644 gramps/plugins/db/dbapi/settings.ini create mode 100644 gramps/plugins/db/dbapi/settings.py diff --git a/gramps/gen/config.py b/gramps/gen/config.py index 115cda126..cbfa71b60 100644 --- a/gramps/gen/config.py +++ b/gramps/gen/config.py @@ -159,11 +159,6 @@ register('behavior.addons-url', "https://raw.githubusercontent.com/gramps-projec register('database.backend', 'bsddb') register('database.compress-backup', True) register('database.path', os.path.join(HOME_DIR, 'grampsdb')) -register('database.dbtype', 'sqlite') # Used in dbapi backend only -register('database.dbname', 'gramps') -register('database.host', 'localhost') -register('database.user', 'user') -register('database.password', 'password') register('export.proxy-order', [["privacy", 0], diff --git a/gramps/plugins/db/dbapi/dbapi.py b/gramps/plugins/db/dbapi/dbapi.py index 7966d2d6e..73d664787 100644 --- a/gramps/plugins/db/dbapi/dbapi.py +++ b/gramps/plugins/db/dbapi/dbapi.py @@ -28,8 +28,6 @@ import sys import pickle from operator import itemgetter import logging -import xml.dom.minidom -from html import escape #------------------------------------------------------------------------ # @@ -125,59 +123,38 @@ class DBAPI(DbGeneric): _LOG.debug("Write database backend file to 'dbapi'") with open(versionpath, "w") as version_file: version_file.write("dbapi") - - # Write settings - settings_file = os.path.join(directory, "settings.xml") - with open(settings_file, "w") as f: - f.write("\n") - f.write(" %s\n" % - escape(config.get('database.dbtype'))) - f.write(" %s\n" % - escape(config.get('database.dbname'))) - f.write(" %s\n" % - escape(config.get('database.host'))) - f.write(" %s\n" % - escape(config.get('database.user'))) - f.write(" %s\n" % - escape(config.get('database.password'))) - f.write("\n") - - def __parse_settings(self, settings_file): - """ - Parse the database settings file and return a dictionary of settings. - """ - settings = {} - dom = xml.dom.minidom.parse(settings_file) - top = dom.getElementsByTagName('settings') - if len(top) != 1: - return settings - for key in ('dbtype', 'dbname', 'host', 'user', 'password'): - elements = top[0].getElementsByTagName(key) - if len(elements) == 1: - settings[key] = elements[0].childNodes[0].data - return settings + # Write settings.py and settings.ini: + settings_py = os.path.join(os.path.dirname(os.path.abspath(__file__)), + "settings.py") + settings_ini = os.path.join(os.path.dirname(os.path.abspath(__file__)), + "settings.ini") + LOG.debug("Copy settings.py from: " + settings_py) + LOG.debug("Copy settings.ini from: " + settings_py) + shutil.copy2(settings_py, directory) + shutil.copy2(settings_ini, directory) def initialize_backend(self, directory): - # Read settings - settings_file = os.path.join(directory, "settings.xml") - settings = self.__parse_settings(settings_file) - - if settings['dbtype'] == 'sqlite': - from gramps.plugins.db.dbapi.sqlite import Sqlite - path_to_db = os.path.join(directory, 'sqlite.db') - self.dbapi = Sqlite(path_to_db) - elif settings['dbtype'] == 'mysql': - from gramps.plugins.db.dbapi.mysql import MySQL - self.dbapi = MySQL(settings['host'], settings['user'], - settings['password'], settings['dbname'], - charset='utf8', use_unicode=True) - elif settings['dbtype'] == 'postgres': - from gramps.plugins.db.dbapi.postgresql import Postgresql - self.dbapi = Postgresql(dbname=settings['dbname'], - user=settings['user'], - host=settings['host'], - password=settings['password']) - + # Run code from directory + from gramps.gen.utils.configmanager import ConfigManager + config_file = os.path.join(directory, 'settings.ini') + config = ConfigManager(config_file) + config.register('database.dbtype', 'sqlite') + config.register('database.dbname', 'gramps') + config.register('database.host', 'localhost') + config.register('database.user', 'user') + config.register('database.password', 'password') + config.register('database.port', 'port') + config.load() # load from settings.ini + settings = { + "__file__": + os.path.join(directory, "settings.py"), + "config": config + } + settings_file = os.path.join(directory, "settings.py") + with open(settings_file) as f: + code = compile(f.read(), settings_file, 'exec') + exec(code, globals(), settings) + self.dbapi = settings["dbapi"] self.update_schema() def update_schema(self): diff --git a/gramps/plugins/db/dbapi/settings.ini b/gramps/plugins/db/dbapi/settings.ini new file mode 100644 index 000000000..94698fe2a --- /dev/null +++ b/gramps/plugins/db/dbapi/settings.ini @@ -0,0 +1,11 @@ +;; Gramps key file +;; Automatically created at 2016/07/12 13:06:48 + +[database] +;;dbname='gramps' +;;dbtype='sqlite' +;;host='localhost' +;;password='password' +;;port='port' +;;user='user' + diff --git a/gramps/plugins/db/dbapi/settings.py b/gramps/plugins/db/dbapi/settings.py new file mode 100644 index 000000000..212713687 --- /dev/null +++ b/gramps/plugins/db/dbapi/settings.py @@ -0,0 +1,55 @@ +# +# Gramps - a GTK+/GNOME based genealogy program +# +# Copyright (C) 2015-2016 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 +# + +## This file is copied from gramps/plugins/db/dbapi/settings.py +## into each grampsdb/*/ directory. You can edit each copy +## to connect to different databases, or with different +## parameters. + +## The database options are saved in settings.ini. +# NOTE: config is predefined + +# NOTE: you can override this in settings.ini or here: +dbtype = config.get('database.dbtype') + +if dbtype == "sqlite": + from gramps.plugins.db.dbapi.sqlite import Sqlite + path_to_db = os.path.join(os.path.dirname(os.path.realpath(__file__)), + 'sqlite.db') + dbapi = Sqlite(path_to_db) +else: + # NOTE: you can override these settings here or in settings.ini: + dbname = config.get('database.dbname') + host = config.get('database.host') + user = config.get('database.user') + password = config.get('database.password') + port = config.get('database.port') + if dbtype == "mysql": + from gramps.plugins.db.dbapi.mysql import MySQL + dbapi = MySQL(host, user, password, dbname, + charset='utf8', use_unicode=True) + elif dbtype == "postgresql": + from gramps.plugins.db.dbapi.postgresql import Postgresql + dbapi = Postgresql(dbname=dbname, user=user, + host=host, password=password) + else: + raise AttributeError(("invalid DB-API dbtype: '%s'. " + + "Should be 'sqlite', 'mysql', " + + "or 'postgresql'") % dbtype)