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)