Added DbState.open_database() for opening without DbManager
This commit is contained in:
parent
8a657250b1
commit
8d92b5d634
@ -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?")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user