FIN: database schema compare
This commit is contained in:
parent
80d9fbacd1
commit
42c8dfa493
|
@ -48,17 +48,17 @@ class DBSchema:
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
|
||||||
def importJson(self, filein):
|
def importJson(self, filejson):
|
||||||
self.tables = __importDBSchema(filein)
|
self.tablesJson = self.__importDBSchema(filejson)
|
||||||
|
|
||||||
|
|
||||||
def compareDBSchema(self, filein):
|
def compareDB(self, filejson):
|
||||||
self.tablesJson = __importDBSchema(filein)
|
self.tablesJson = self.__importDBSchema(filejson)
|
||||||
result = __DBSchemaCompare()
|
result = self.__DBSchemaCompare()
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
def __importDBSchema(self, filein)
|
def __importDBSchema(self, filein):
|
||||||
tables = {}
|
tables = {}
|
||||||
try:
|
try:
|
||||||
fh = open(filein, "r")
|
fh = open(filein, "r")
|
||||||
|
@ -67,16 +67,73 @@ class DBSchema:
|
||||||
tb = jsonData['tables']
|
tb = jsonData['tables']
|
||||||
keys = tb.keys()
|
keys = tb.keys()
|
||||||
for key in keys:
|
for key in keys:
|
||||||
|
print "[[ Table <" + key + "> imported ]]"
|
||||||
newTable = TableDefinition()
|
newTable = TableDefinition()
|
||||||
newTable.importTable(key, dbmt[key], tb[key])
|
newTable.importTable(key, dbmt[key], tb[key])
|
||||||
tables[key] = newTable
|
tables[key] = newTable
|
||||||
|
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
|
print "ERROR: problem loading json file: " + filein
|
||||||
print e
|
print e
|
||||||
|
|
||||||
return tables
|
return tables
|
||||||
|
|
||||||
|
|
||||||
|
def __DBSchemaCompare(self):
|
||||||
|
# the json database schema definition is what our tools is expecting...
|
||||||
|
# ...so we use it as the baseline
|
||||||
|
# look for table, if exists, compare each
|
||||||
|
# if exists, compare each field
|
||||||
|
# else, add to unknown tables...or do a fuzzy compare (look at number of fields, field names)
|
||||||
|
for tableName in self.tablesJson.keys():
|
||||||
|
table = self.tables[tableName]
|
||||||
|
print "[[ Comparing Table: " + tableName + " ]]"
|
||||||
|
if (table):
|
||||||
|
self.__CompareTable(self.tablesJson[tableName], table)
|
||||||
|
else:
|
||||||
|
self.__FuzzyTable()
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Compare the Table Definitions.
|
||||||
|
# Compare Table 1 (Json table) to Table 2
|
||||||
|
#
|
||||||
|
def __CompareTable(self, tb1, tb2):
|
||||||
|
fieldsTotalCount = 0
|
||||||
|
fieldsErrorCount = 0
|
||||||
|
propTotalCount = 0
|
||||||
|
propErrorCount = 0
|
||||||
|
|
||||||
|
fields1 = tb1.fields
|
||||||
|
fields2 = tb2.fields
|
||||||
|
for field in fields1.keys():
|
||||||
|
field1 = fields1[field]
|
||||||
|
fieldsTotalCount += 1
|
||||||
|
if (fields2.has_key(field)):
|
||||||
|
field2 = fields1[field]
|
||||||
|
for properties in field1.keys():
|
||||||
|
propTotalCount += 1
|
||||||
|
if not field2.has_key(properties):
|
||||||
|
propErrorCount += 1
|
||||||
|
else:
|
||||||
|
fieldsErrorCount += 1
|
||||||
|
|
||||||
|
if (propErrorCount == 0 and fieldsErrorCount == 0):
|
||||||
|
print "100% compatible"
|
||||||
|
else:
|
||||||
|
totals = propTotalCount + fieldsTotalCount
|
||||||
|
errors = propErrorCount + fieldsErrorCount
|
||||||
|
print "Table difference found: " + str(errors)
|
||||||
|
#print str((errors/totals) * 100) + '% compatible total == ' + str(totals) + " errors == " + str(errors)
|
||||||
|
|
||||||
|
|
||||||
|
# look at un-identified tables and try to match fields by their properties
|
||||||
|
def __FuzzyTable():
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
def __openDB(self, filein):
|
def __openDB(self, filein):
|
||||||
conn = sqlite3.connect(filein)
|
conn = sqlite3.connect(filein)
|
||||||
cur = conn.cursor()
|
cur = conn.cursor()
|
||||||
|
@ -93,10 +150,17 @@ class DBSchema:
|
||||||
|
|
||||||
|
|
||||||
def debugFingerprint(self):
|
def debugFingerprint(self):
|
||||||
keys = self.tables.keys()
|
if self.tables:
|
||||||
|
myDict = self.tables
|
||||||
|
elif self.tablesJson:
|
||||||
|
myDict = self.tablesJson
|
||||||
|
else:
|
||||||
|
return
|
||||||
|
|
||||||
|
keys = myDict.keys()
|
||||||
for key in keys:
|
for key in keys:
|
||||||
print "[[ TABLE: <" + key + "> ]]"
|
print "[[ TABLE: <" + key + "> ]]"
|
||||||
tableDef = self.tables[key]
|
tableDef = myDict[key]
|
||||||
#print str(tableDef.SQLstr())
|
#print str(tableDef.SQLstr())
|
||||||
tableDef.toJSON()
|
tableDef.toJSON()
|
||||||
|
|
||||||
|
|
8
main.py
8
main.py
|
@ -11,7 +11,11 @@ def main():
|
||||||
(filein, fileout2, filejson, verbose) = parseArgs()
|
(filein, fileout2, filejson, verbose) = parseArgs()
|
||||||
|
|
||||||
db = fingerprint.DBSchema()
|
db = fingerprint.DBSchema()
|
||||||
if (filein):
|
|
||||||
|
if (filein and filejson):
|
||||||
|
db.scanDBFile(filein)
|
||||||
|
db.compareDB(filejson)
|
||||||
|
elif (filein):
|
||||||
retVal = db.scanDBFile(filein)
|
retVal = db.scanDBFile(filein)
|
||||||
if (retVal > 0):
|
if (retVal > 0):
|
||||||
fh = open(fileout2, "w")
|
fh = open(fileout2, "w")
|
||||||
|
@ -21,7 +25,7 @@ def main():
|
||||||
else:
|
else:
|
||||||
print db.getErrorString(retVal)
|
print db.getErrorString(retVal)
|
||||||
elif (filejson):
|
elif (filejson):
|
||||||
db.importDBSchema(filejson)
|
db.importJson(filejson)
|
||||||
db.debugFingerprint()
|
db.debugFingerprint()
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue