MOD: updated the processing of sql create statements to handle more syntax styles
This commit is contained in:
		
							parent
							
								
									5bc90d7407
								
							
						
					
					
						commit
						5d4d351248
					
				|  | @ -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,53 +366,66 @@ 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): | ||||
|             field['primarykey'] = True | ||||
|           self.primarykeyFlag = False | ||||
|         elif (self.uniqueFlag): | ||||
|           field['unique'] = True | ||||
|           if (field): | ||||
|             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: | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 JohnE
						JohnE