allow export/import of db models, issue 1316 (experimental), thanks Alan

This commit is contained in:
mdipierro
2013-02-03 09:11:13 -06:00
parent af7a922cac
commit d06a1a68a0
2 changed files with 39 additions and 23 deletions
+1 -1
View File
@@ -1 +1 @@
Version 2.4.1-alpha.2+timestamp.2013.02.03.09.08.28 Version 2.4.1-alpha.2+timestamp.2013.02.03.09.10.34
+38 -22
View File
@@ -7124,8 +7124,12 @@ class DAL(object):
:attempts (defaults to 5). Number of times to attempt connecting :attempts (defaults to 5). Number of times to attempt connecting
""" """
dbdict = None
if uri == '<zombie>' and db_uid is not None: return if uri == '<zombie>' and db_uid is not None: return
elif isinstance(uri, dict):
dbdict = uri
uri = dbdict["uri"]
codec = dbdict["codec"] or codec
if not decode_credentials: if not decode_credentials:
credential_decoder = lambda cred: cred credential_decoder = lambda cred: cred
else: else:
@@ -7207,32 +7211,44 @@ class DAL(object):
self._fake_migrate = fake_migrate self._fake_migrate = fake_migrate
self._migrate_enabled = migrate_enabled self._migrate_enabled = migrate_enabled
self._fake_migrate_all = fake_migrate_all self._fake_migrate_all = fake_migrate_all
if auto_import: if auto_import or dbdict:
self.import_table_definitions(adapter.folder) self.import_table_definitions(adapter.folder,
items=dbdict["items"])
@property @property
def tables(self): def tables(self):
return self._tables return self._tables
def import_table_definitions(self,path,migrate=False,fake_migrate=False): def import_table_definitions(self, path, migrate=False,
fake_migrate=False, items=None):
pattern = pjoin(path,self._uri_hash+'_*.table') pattern = pjoin(path,self._uri_hash+'_*.table')
for filename in glob.glob(pattern): if items:
tfile = self._adapter.file_open(filename, 'r') for tablename, table in items.iteritems():
try: # TODO: read all field/table options
sql_fields = pickle.load(tfile) fields = []
name = filename[len(pattern)-7:-6] for fieldname, field in table["items"].iteritems():
mf = [(value['sortable'], type = field["type"]
Field(key, fields.append(Field(fieldname, type))
type=value['type'], self.define_table(tablename, *fields)
length=value.get('length',None), else:
notnull=value.get('notnull',False), for filename in glob.glob(pattern):
unique=value.get('unique',False))) \ tfile = self._adapter.file_open(filename, 'r')
for key, value in sql_fields.iteritems()] try:
mf.sort(lambda a,b: cmp(a[0],b[0])) sql_fields = pickle.load(tfile)
self.define_table(name,*[item[1] for item in mf], name = filename[len(pattern)-7:-6]
**dict(migrate=migrate,fake_migrate=fake_migrate)) mf = [(value['sortable'],
finally: Field(key,
self._adapter.file_close(tfile) type=value['type'],
length=value.get('length',None),
notnull=value.get('notnull',False),
unique=value.get('unique',False))) \
for key, value in sql_fields.iteritems()]
mf.sort(lambda a,b: cmp(a[0],b[0]))
self.define_table(name,*[item[1] for item in mf],
**dict(migrate=migrate,
fake_migrate=fake_migrate))
finally:
self._adapter.file_close(tfile)
def check_reserved_keyword(self, name): def check_reserved_keyword(self, name):
""" """
@@ -7571,7 +7587,7 @@ def index():
def as_dict(self, flat=False, sanitize=True): def as_dict(self, flat=False, sanitize=True):
dbname = codec = uid = uri = None dbname = codec = uid = uri = None
if not sanitize: if not sanitize:
uri, dbname, codec, uid = (str(self), self._dbname, uri, dbname, codec, uid = (self._uri, self._dbname,
self._db_codec, self._db_uid) self._db_codec, self._db_uid)
db_as_dict = dict(items={}, tables=[], uri=uri, dbname=dbname, db_as_dict = dict(items={}, tables=[], uri=uri, dbname=dbname,
codec=codec, uid=uid) codec=codec, uid=uid)