diff --git a/gramps/cli/clidbman.py b/gramps/cli/clidbman.py
index fd2088514..156814c27 100644
--- a/gramps/cli/clidbman.py
+++ b/gramps/cli/clidbman.py
@@ -33,6 +33,7 @@ creating, and deleting of databases.
import re
import os
import sys
+import ast
import time
from urllib.parse import urlparse
from urllib.request import urlopen, url2pathname
@@ -158,9 +159,9 @@ class CLIDbManager(object):
if not self.is_locked(dirpath):
try:
database = self.dbstate.make_database(dbid)
- database.load(dirpath, None, update=False)
+ database.load(dirpath, None)
retval = database.get_summary()
- database.close(update=False)
+ database.close()
except Exception as msg:
retval = {_("Unavailable"): str(msg)[:74] + "..."}
else:
@@ -173,26 +174,24 @@ class CLIDbManager(object):
})
return retval
- def print_family_tree_summaries(self, database_names=None):
+ def print_family_tree_summaries(self):
"""
Prints a detailed list of the known family trees.
"""
print(_('Gramps Family Trees:'))
for item in self.current_names:
(name, dirpath, path_name, last,
- tval, enable, stock_id) = item
- if (database_names is None or
- any([re.match(dbname, name) for dbname in database_names])):
- summary = self.get_dbdir_summary(dirpath, name)
- print(_("Family Tree \"%s\":") % summary[_("Family Tree")])
- for item in sorted(summary):
- if item != "Family Tree":
- # translators: needed for French, ignore otherwise
- print(_(" %(item)s: %(summary)s") % {
- 'item' : item,
- 'summary' : summary[item] } )
+ tval, enable, stock_id, backend_type, version) = item
+ summary = self.get_dbdir_summary(dirpath, name)
+ print(_("Family Tree \"%s\":") % summary[_("Family Tree")])
+ for item in sorted(summary):
+ if item != "Family Tree":
+ # translators: needed for French, ignore otherwise
+ print(_(" %(item)s: %(summary)s") % {
+ 'item' : item,
+ 'summary' : summary[item] } )
- def family_tree_summary(self, database_names=None):
+ def family_tree_summary(self):
"""
Return a list of dictionaries of the known family trees.
"""
@@ -200,11 +199,9 @@ class CLIDbManager(object):
summary_list = []
for item in self.current_names:
(name, dirpath, path_name, last,
- tval, enable, stock_id) = item
- if (database_names is None or
- any([re.match(dbname, name) for dbname in database_names])):
- retval = self.get_dbdir_summary(dirpath, name)
- summary_list.append( retval )
+ tval, enable, stock_id, backend_type) = item
+ retval = self.get_dbdir_summary(dirpath, name)
+ summary_list.append( retval )
return summary_list
def _populate_cli(self):
@@ -220,6 +217,15 @@ class CLIDbManager(object):
for dpath in os.listdir(dbdir):
dirpath = os.path.join(dbdir, dpath)
path_name = os.path.join(dirpath, NAME_FILE)
+ try:
+ backend_type = open(os.path.join(dirpath, "database.txt")).read()
+ except:
+ backend_type = "bsddb"
+ try:
+ version = open(os.path.join(dirpath, "bdbversion.txt")).read()
+ except:
+ version = "(0, 0, 0)"
+ version = ast.literal_eval(version)
if os.path.isfile(path_name):
file = open(path_name, 'r', encoding='utf8')
name = file.readline().strip()
@@ -231,10 +237,10 @@ class CLIDbManager(object):
if (stock_id == 'gramps-lock'):
last = find_locker_name(dirpath)
-
+
self.current_names.append(
(name, os.path.join(dbdir, dpath), path_name,
- last, tval, enable, stock_id))
+ last, tval, enable, stock_id, backend_type, version))
self.current_names.sort()
@@ -294,7 +300,7 @@ class CLIDbManager(object):
(tval, last) = time_val(new_path)
self.current_names.append((title, new_path, path_name,
- last, tval, False, ""))
+ last, tval, False, "", "Backend Type"))
return new_path, title
def _create_new_db(self, title=None, dbid=None):
@@ -406,10 +412,10 @@ class CLIDbManager(object):
"No matching family tree found: '%s'" % dbname)
# now delete them:
for (name, directory) in match_list:
- if user is None or not user.prompt(
+ if user is None or user.prompt(
_('Remove family tree warning'),
_('Are you sure you want to remove the family tree named\n"%s"?' % name),
- _('no'), _('yes')):
+ _('Yes'), _('No'), None):
try:
for (top, dirs, files) in os.walk(directory):
for filename in files:
diff --git a/gramps/gen/db/generic.py b/gramps/gen/db/generic.py
index 3ff4ff839..268a3d204 100644
--- a/gramps/gen/db/generic.py
+++ b/gramps/gen/db/generic.py
@@ -2001,6 +2001,7 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
_("Number of repositories"): self.get_number_of_repositories(),
_("Number of notes"): self.get_number_of_notes(),
_("Number of tags"): self.get_number_of_tags(),
+ _("Schema version"): ".".join([str(v) for v in self.VERSION]),
}
def get_dbname(self):
@@ -2102,3 +2103,20 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
"""
self.__tables[table] = funcs
setattr(DbGeneric, table, property(lambda self: QuerySet(self, table)))
+
+ def get_version(self):
+ """
+ Return the version number of the schema.
+ """
+ if self._directory:
+ filepath = os.path.join(self._directory, "bdbversion.txt")
+ try:
+ name_file = open(filepath, "r", encoding='utf-8')
+ version = name_file.readline().strip()
+ name_file.close()
+ except (OSError, IOError) as msg:
+ self.__log_error()
+ version = "(0, 0, 0)"
+ return ast.literal_eval(version)
+ else:
+ return (0, 0, 0)
diff --git a/gramps/gui/dbman.py b/gramps/gui/dbman.py
index 12e580000..f055730de 100644
--- a/gramps/gui/dbman.py
+++ b/gramps/gui/dbman.py
@@ -106,6 +106,7 @@ DATE_COL = 3
DSORT_COL = 4
OPEN_COL = 5
ICON_COL = 6
+BACKEND_COL = 7
RCS_BUTTON = { True : _('_Extract'), False : _('_Archive') }
@@ -299,7 +300,7 @@ class DbManager(CLIDbManager):
"""
Builds the columns for the TreeView. The columns are:
- Icon, Database Name, Last Modified
+ Icon, Database Name, Last Modified, Backend Type
The Icon column gets its data from column 6 of the database model.
It is expecting either None, or a GTK stock icon name
@@ -310,8 +311,9 @@ class DbManager(CLIDbManager):
The last accessed column simply displays the last time famtree was
opened.
- """
+ The Backend Type column is a string based on database backend.
+ """
# build the database name column
render = Gtk.CellRendererText()
render.set_property('ellipsize', Pango.EllipsizeMode.END)
@@ -341,6 +343,12 @@ class DbManager(CLIDbManager):
column.set_sort_column_id(DSORT_COL)
self.dblist.append_column(column)
+ # build the backend column
+ render = Gtk.CellRendererText()
+ column = Gtk.TreeViewColumn(_('Database Type'), render, text=BACKEND_COL)
+ column.set_sort_column_id(BACKEND_COL)
+ self.dblist.append_column(column)
+
def __populate(self):
"""
Builds the data and the display model.
@@ -352,14 +360,17 @@ class DbManager(CLIDbManager):
"""
Builds the display model.
"""
- self.model = Gtk.TreeStore(str, str, str, str, int, bool, str)
+ self.model = Gtk.TreeStore(str, str, str, str, int, bool, str, str)
#use current names to set up the model
for items in self.current_names:
- data = list(items[:7])
- node = self.model.append(None, data)
+ data = list(items[:8])
+ backend_type = self.get_backend_name_from_dbid(data[7])
+ version = str(".".join([str(v) for v in items[8]]))
+ node = self.model.append(None, data[:-1] + [backend_type + ", " + version])
for rdata in find_revisions(os.path.join(items[1], ARCHIVE_V)):
- data = [ rdata[2], rdata[0], items[1], rdata[1], 0, False, "" ]
+ data = [rdata[2], rdata[0], items[1], rdata[1], 0, False, "",
+ backend_type + ", " + version]
self.model.append(node, data)
self.model.set_sort_column_id(NAME_COL, Gtk.SortType.ASCENDING)
self.dblist.set_model(self.model)
@@ -808,6 +819,13 @@ class DbManager(CLIDbManager):
str(msg))
self.new.set_sensitive(True)
+ def get_backend_name_from_dbid(self, dbid):
+ pmgr = GuiPluginManager.get_instance()
+ for plugin in pmgr.get_reg_databases():
+ if plugin.id == dbid:
+ return plugin._name
+ return _("Unknown Database Type")
+
def _create_new_db(self, title=None, create_db=True, dbid=None):
"""
Create a new database, append to model
@@ -815,8 +833,9 @@ class DbManager(CLIDbManager):
new_path, title = self.create_new_db_cli(title, create_db, dbid)
path_name = os.path.join(new_path, NAME_FILE)
(tval, last) = time_val(new_path)
+ backend_type = self.get_backend_name_from_dbid(dbid)
node = self.model.append(None, [title, new_path, path_name,
- last, tval, False, ''])
+ last, tval, False, '', backend_type])
self.selection.select_iter(node)
path = self.model.get_path(node)
self.name_renderer.set_property('editable', True)
diff --git a/gramps/gui/glade/dbman.glade b/gramps/gui/glade/dbman.glade
index 4f90af92e..39b585eed 100644
--- a/gramps/gui/glade/dbman.glade
+++ b/gramps/gui/glade/dbman.glade
@@ -106,7 +106,7 @@
6
Family Trees - Gramps
center-on-parent
- 710
+ 800
300
dialog
diff --git a/gramps/plugins/database/bsddb.gpr.py b/gramps/plugins/database/bsddb.gpr.py
index 82a23573c..192ddad92 100644
--- a/gramps/plugins/database/bsddb.gpr.py
+++ b/gramps/plugins/database/bsddb.gpr.py
@@ -20,8 +20,8 @@
plg = newplugin()
plg.id = 'bsddb'
-plg.name = _("BSDDB Database Backend")
-plg.name_accell = _("_BSDDB Database Backend")
+plg.name = _("BSDDB Database")
+plg.name_accell = _("_BSDDB Database")
plg.description = _("Berkeley Software Distribution Database Backend")
plg.version = '1.0'
plg.gramps_target_version = "5.0"
diff --git a/gramps/plugins/database/bsddb_support/read.py b/gramps/plugins/database/bsddb_support/read.py
index 327f2ac64..62bf7c02c 100644
--- a/gramps/plugins/database/bsddb_support/read.py
+++ b/gramps/plugins/database/bsddb_support/read.py
@@ -35,6 +35,7 @@ import random
import os
from sys import maxsize
from operator import itemgetter
+import ast
try:
from bsddb3 import db
@@ -2047,6 +2048,17 @@ class DbBsddbRead(DbReadBase, Callback):
name = None
return name
+ def get_version(self):
+ filepath = os.path.join(self.path, "bdbversion.txt")
+ try:
+ name_file = open(filepath, "r", encoding='utf-8')
+ version = name_file.readline().strip()
+ name_file.close()
+ except (OSError, IOError) as msg:
+ self.__log_error()
+ version = "(0, 0, 0)"
+ return ast.literal_eval(version)
+
def get_summary(self):
"""
Returns dictionary of summary item.
diff --git a/gramps/plugins/database/dbapi.gpr.py b/gramps/plugins/database/dbapi.gpr.py
index 9c4e43b10..0c704d41c 100644
--- a/gramps/plugins/database/dbapi.gpr.py
+++ b/gramps/plugins/database/dbapi.gpr.py
@@ -20,9 +20,9 @@
register(DATABASE,
id = 'dbapi',
- name = _("DB-API 2.0 Database Backend"),
- name_accell = _("DB-_API 2.0 Database Backend"),
- description = _("DB-API 2.0 Database Backend"),
+ name = _("DB-API Database"),
+ name_accell = _("DB-_API Database"),
+ description = _("DB-API Database"),
version = '1.0.32',
gramps_target_version = "5.0",
status = STABLE,
diff --git a/gramps/plugins/database/dbapi.py b/gramps/plugins/database/dbapi.py
index 97977e4c9..ff07409bb 100644
--- a/gramps/plugins/database/dbapi.py
+++ b/gramps/plugins/database/dbapi.py
@@ -40,6 +40,7 @@ class DBAPI(DbGeneric):
"""
Database backends class for DB-API 2.0 databases
"""
+ VERSION = (18, 0, 0)
def restore(self):
"""
@@ -53,6 +54,9 @@ class DBAPI(DbGeneric):
LOG.debug("Write database backend file to 'dbapi'")
with open(versionpath, "w") as version_file:
version_file.write("dbapi")
+ versionpath = os.path.join(directory, "bdbversion.txt")
+ with open(versionpath, "w") as version_file:
+ version_file.write(str(self.VERSION))
# Write default_settings, sqlite.db
defaults = os.path.join(os.path.dirname(os.path.abspath(__file__)),
"dbapi_support", "defaults")
diff --git a/gramps/plugins/database/dictionarydb.gpr.py b/gramps/plugins/database/dictionarydb.gpr.py
index d035de58a..5d38cd8c3 100644
--- a/gramps/plugins/database/dictionarydb.gpr.py
+++ b/gramps/plugins/database/dictionarydb.gpr.py
@@ -20,9 +20,9 @@
plg = newplugin()
plg.id = 'dictionarydb'
-plg.name = _("Dictionary Database Backend")
-plg.name_accell = _("Di_ctionary Database Backend")
-plg.description = _("Dictionary (in-memory) Database Backend")
+plg.name = _("Dictionary Database")
+plg.name_accell = _("Di_ctionary Database")
+plg.description = _("Dictionary Database")
plg.version = '1.0'
plg.gramps_target_version = "5.0"
plg.status = STABLE
diff --git a/gramps/plugins/database/dictionarydb.py b/gramps/plugins/database/dictionarydb.py
index 30d6f39a8..3d6010f60 100644
--- a/gramps/plugins/database/dictionarydb.py
+++ b/gramps/plugins/database/dictionarydb.py
@@ -103,6 +103,9 @@ class DictionaryDb(DbGeneric):
LOG.debug("Write database backend file to 'dictionarydb'")
with open(versionpath, "w") as version_file:
version_file.write("dictionarydb")
+ versionpath = os.path.join(directory, "bdbversion.txt")
+ with open(versionpath, "w") as version_file:
+ version_file.write(str(self.VERSION))
def initialize_backend(self, directory):
pass
diff --git a/gramps/plugins/database/inmemorydb.gpr.py b/gramps/plugins/database/inmemorydb.gpr.py
index c9395e6a2..c715d1c71 100644
--- a/gramps/plugins/database/inmemorydb.gpr.py
+++ b/gramps/plugins/database/inmemorydb.gpr.py
@@ -20,9 +20,9 @@
register(DATABASE,
id = 'inmemorydb',
- name = _("In-Memory Database Backend"),
- name_accell = _("In-_Memory Database Backend"),
- description = _("In-Memory Database Backend"),
+ name = _("In-Memory Database"),
+ name_accell = _("In-_Memory Database"),
+ description = _("In-Memory Database"),
version = '1.0.0',
gramps_target_version = "5.0",
status = STABLE,
diff --git a/gramps/plugins/database/inmemorydb.py b/gramps/plugins/database/inmemorydb.py
index 6c92c0f57..234eb2e1b 100644
--- a/gramps/plugins/database/inmemorydb.py
+++ b/gramps/plugins/database/inmemorydb.py
@@ -42,6 +42,9 @@ class InMemoryDB(DBAPI):
LOG.debug("Write database backend file to 'inmemorydb'")
with open(versionpath, "w") as version_file:
version_file.write("inmemorydb")
+ versionpath = os.path.join(directory, "bdbversion.txt")
+ with open(versionpath, "w") as version_file:
+ version_file.write(str(self.VERSION))
def load(self, directory, callback=None, mode=None,
force_schema_upgrade=False,