Added DbState.open_database() for opening without DbManager

This commit is contained in:
Doug Blank 2015-05-21 10:51:36 -04:00
parent 8a657250b1
commit 8d92b5d634

View File

@ -23,6 +23,8 @@
Provide the database state class Provide the database state class
""" """
import sys import sys
import os
import io
from .db import DbReadBase from .db import DbReadBase
from .proxy.proxybase import ProxyDbBase from .proxy.proxybase import ProxyDbBase
@ -62,6 +64,7 @@ class DbState(Callback):
Closes the existing db, and opens a new one. Closes the existing db, and opens a new one.
Retained for backward compatibility. Retained for backward compatibility.
""" """
if database:
self.emit('no-database', ()) self.emit('no-database', ())
self.db.close() self.db.close()
self.change_database_noclose(database) self.change_database_noclose(database)
@ -158,6 +161,53 @@ class DbState(Callback):
database = getattr(mod, pdata.databaseclass) database = getattr(mod, pdata.databaseclass)
return database() return database()
def open_database(self, dbname, force_unlock=False, callback=None):
"""
Open a database by name and return the database.
"""
data = self.lookup_family_tree(dbname)
database = None
if data:
dbpath, locked, locked_by, backend = data
if (not locked) or (locked and force_unlock):
database = self.make_database(backend)
database.load(dbpath, callback=callback)
return database
def lookup_family_tree(self, dbname):
"""
Find a Family Tree given its name, and return properties.
"""
dbdir = os.path.expanduser(config.get('behavior.database-path'))
for dpath in os.listdir(dbdir):
dirpath = os.path.join(dbdir, dpath)
path_name = os.path.join(dirpath, "name.txt")
if os.path.isfile(path_name):
file = io.open(path_name, 'r', encoding='utf8')
name = file.readline().strip()
file.close()
if dbname == name:
locked = False
locked_by = None
backend = None
fname = os.path.join(dirpath, "database.txt")
if os.path.isfile(fname):
ifile = io.open(fname, 'r', encoding='utf8')
backend = ifile.read().strip()
ifile.close()
else:
backend = "bsddb"
try:
fname = os.path.join(dirpath, "lock")
ifile = io.open(fname, 'r', encoding='utf8')
locked_by = ifile.read().strip()
locked = True
ifile.close()
except (OSError, IOError):
pass
return (dirpath, locked, locked_by, backend)
return None
## Work-around for databases that need sys refresh (django): ## Work-around for databases that need sys refresh (django):
def modules_is_set(self): def modules_is_set(self):
LOG.info("modules_is_set?") LOG.info("modules_is_set?")