From 5d4d351248fdb5639ceaba4310f09dac5a08a7a7 Mon Sep 17 00:00:00 2001 From: JohnE Date: Wed, 23 Sep 2015 12:21:54 -0700 Subject: [PATCH] MOD: updated the processing of sql create statements to handle more syntax styles --- libs/fingerprint.py | 66 ++++++++++++++++++++++++++++++--------------- 1 file changed, 45 insertions(+), 21 deletions(-) diff --git a/libs/fingerprint.py b/libs/fingerprint.py index 72903a4..8e061ea 100644 --- a/libs/fingerprint.py +++ b/libs/fingerprint.py @@ -278,7 +278,7 @@ class TableDefinition: self.tableName = tableName self.sqlStr = sqlStr - print "[[ TABLE: <{}> ] loading]".format(tableName) + print "[[ TABLE: <{}> ] processing...]".format(tableName) # hash the sql create string for quicker fingerprint matching try: m = hashlib.md5() @@ -319,18 +319,30 @@ class TableDefinition: def __parseCreateStr(self, sqltext): try: newField = {} - # photo_id INTEGER REFERENCES data(_id) - # name_raw_contact_id INTEGER REFERENCES raw_contacts(_id) - results = re.match(r'(?:[`|\"|\'])*(\w+)(?:[`|\"|\'])*\s+(\w+)\s+REFERENCESS\s+(\W+)', sqltext) + + # use for debug purposes + # print "sqltext=={}".format(sqltext) + # raw_contact_id INTEGER REFERENCES raw_contacts(_id) NOT NULL + results = re.match(r'(?:[`|\"|\'])*(\w+)(?:[`|\"|\'])*\s+(\w+)\s+REFERENCES\s+(.*)\s+NOT.NULL', sqltext, re.IGNORECASE) if results: newField['name'] = results.group(1) newField['datatype'] = results.group(2) - newField['references'] = 1 + newField['references'] = True + newField['referencesdata'] = results.group(3) + newField['notnull'] = True + return newField + # photo_id INTEGER REFERENCES data(_id) + # name_raw_contact_id INTEGER REFERENCES raw_contacts(_id) + results = re.match(r'(?:[`|\"|\'])*(\w+)(?:[`|\"|\'])*\s+(\w+)\s+REFERENCES\s+(.*)', sqltext, re.IGNORECASE) + if results: + newField['name'] = results.group(1) + newField['datatype'] = results.group(2) + newField['references'] = True newField['referencesdata'] = results.group(3) return newField # pinned INTEGER NOT NULL DEFAULT 2147483647 # send_to_voicemail INTEGER NOT NULL DEFAULT 0 - results = re.match(r'(?:[`|\"|\'])*(\w+)(?:[`|\"|\'])*\s+(\w+)\s+NOT NULL\s+DEFAULT\s+(\w+)', sqltext) + results = re.match(r'(?:[`|\"|\'])*(\w+)(?:[`|\"|\'])*\s+(\w+)\s+NOT.NULL\s+DEFAULT\s+(\w+)', sqltext, re.IGNORECASE) if results: newField['name'] = results.group(1) newField['datatype'] = results.group(2) @@ -339,15 +351,14 @@ class TableDefinition: return newField # pinned INTEGER DEFAULT 2147483647 # send_to_voicemail INTEGER DEFAULT 0 - results = re.match(r'(?:[`|\"|\'])*(\w+)(?:[`|\"|\'])*\s+(\w+)\s+DEFAULT\s+(\w+)', sqltext) + results = re.match(r'(?:[`|\"|\'])*(\w+)(?:[`|\"|\'])*\s+(\w+)\s+DEFAULT\s+(\w+)', sqltext, re.IGNORECASE) if results: newField['name'] = results.group(1) newField['datatype'] = results.group(2) - newField['notnull'] = True newField['default'] = results.group(3) return newField # _id INTEGER PRIMARY KEY AUTOINCREMENT - results = re.match(r'(?:[`|\"|\'])*(\w+)(?:[`|\"|\'])*\s+(\w+)\s+PRIMARY KEY\s+AUTOINCREMENT', sqltext) + results = re.match(r'(?:[`|\"|\'])*(\w+)(?:[`|\"|\'])*\s+(\w+)\s+PRIMARY.KEY\s+AUTOINCREMENT', sqltext, re.IGNORECASE) if results: newField['name'] = results.group(1) newField['datatype'] = results.group(2) @@ -355,54 +366,67 @@ class TableDefinition: newField['autoincrement'] = True return newField # _id INTEGER PRIMARY KEY - results = re.match(r'(?:[`|\"|\'])*(\w+)(?:[`|\"|\'])*\s+(\w+)\s+PRIMARY KEY', sqltext) + results = re.match(r'(?:[`|\"|\'])*(\w+)(?:[`|\"|\'])*\s+(\w+)\s+PRIMARY.KEY', sqltext, re.IGNORECASE) if results: newField['name'] = results.group(1) newField['datatype'] = results.group(2) newField['primarykey'] = True return newField # FileID INTEGER NOT NULL - results = re.match(r'(?:[`|\"|\'])*(\w+)(?:[`|\"|\'])*\s+(\w+)\s+NOT NULL', sqltext) + results = re.match(r'(?:[`|\"|\'])*(\w+)(?:[`|\"|\'])*\s+(\w+)\s+NOT.NULL', sqltext, re.IGNORECASE) if results: newField['name'] = results.group(1) newField['datatype'] = results.group(2) newField['notnull'] = True return newField # PRIMARY KEY (field_name, - results = re.match(r'PRIMARY KEY \((?:[`|\"|\'])*(\w+)(?:[`|\"|\'])*\,?', sqltext) + results = re.match(r'PRIMARY.KEY\s+\((?:[`|\"|\'])*(\w+)(?:[`|\"|\'])*\,?', sqltext, re.IGNORECASE) if results: field = self.fields[results.group(1)] field['primarykey'] = True self.primarykeyFlag = True return False # UNIQUE(field_name, - results = re.match(r'UNIQUE\((?:[`|\"|\'])*(\w+)(?:[`|\"|\'])*\,?', sqltext) + results = re.match(r'UNIQUE\((?:[`|\"|\'])*(\w+)(?:[`|\"|\'])*\,?', sqltext, re.IGNORECASE) if results: field = self.fields[results.group(1)] field['unique'] = True self.uniqueFlag = True; return False # custom_ringtone TEXT - results = re.match(r'(?:[`|\"|\'])*(\w+)(?:[`|\"|\'])*\s+(\w+)', sqltext) + results = re.match(r'(?:[`|\"|\'])*(\w+)(?:[`|\"|\'])*\s+(\w+)', sqltext, re.IGNORECASE) if results: newField['name'] = results.group(1) newField['datatype'] = results.group(2) return newField # field_name) - # results = re.match(r'(?:[`|\"|\'])*(\w+)(?:[`|\"|\'])*(\)?)', sqltext) - results = re.match(r'(?:[`|\"|\'])*(\w+)(?:[`|\"|\'])*\)', sqltext) + results = re.match(r'(?:[`|\"|\'])*(\w+)(?:[`|\"|\'])*\)', sqltext, re.IGNORECASE) if results: field = self.fields[results.group(1)] if (self.primarykeyFlag): - field['primarykey'] = True if (field): - self.primarykeyFlag = False + field['primarykey'] = True + self.primarykeyFlag = False elif (self.uniqueFlag): - field['unique'] = True if (field): - self.uniqueFlag = False + field['unique'] = True + self.uniqueFlag = False return False - + # field_name + results = re.match(r'^(?:[`|\"|\'])*(\w+)(?:[`|\"|\'])*$', sqltext, re.IGNORECASE) + if results: + if (self.primarykeyFlag): + field = self.fields[results.group(1)] + field['primarykey'] = True + elif (self.uniqueFlag): + field = self.fields[results.group(1)] + field['unique'] = True + else: + newField['name'] = results.group(1) + newField['datatype'] = "INTEGER" + return newField + return False + print 'WARN: field definition not recognized: "{}"'.format(sqltext) except Exception, e: print 'WARN: problem parsing sql create text: "{}"'.format(sqltext)