Changeset 3242 for trunk/archive/psdb/psDB.c
- Timestamp:
- Feb 15, 2005, 4:08:33 PM (21 years ago)
- File:
-
- 1 edited
-
trunk/archive/psdb/psDB.c (modified) (25 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/archive/psdb/psDB.c
r3236 r3242 8 8 * @author Joshua Hoblitt 9 9 * 10 * @version $Revision: 1.2 8$ $Name: not supported by cvs2svn $11 * @date $Date: 2005-02-16 0 0:45:11$10 * @version $Revision: 1.29 $ $Name: not supported by cvs2svn $ 11 * @date $Date: 2005-02-16 02:08:33 $ 12 12 * 13 13 * Copyright 2005 Joshua Hoblitt, University of Hawaii … … 45 45 // lookup table functions 46 46 static psElemType psDBMySQLToPType(enum enum_field_types type, unsigned int flags); 47 48 static psHash *psDBGetPSToSQLTable(void); 49 static void psDBPSToSQLTableCleanup(void); 50 51 static psHash *psDBGetSQLToPSTable(void); 52 static void psDBSQLToPSTableCleanup(void); 47 static char *psDBPTypeToSQL(psElemType pType); 48 static mysqlType *psDBPTypeToMySQL(psElemType pType); 49 50 static psHash *psDBGetPTypeToSQLTable(void); 51 static void psDBPTypeToSQLTableCleanup(void); 52 53 static psHash *psDBGetSQLToPTypeTable(void); 54 static void psDBSQLToPTypeTableCleanup(void); 53 55 54 56 static psHash *psDBGetMySQLToSQLTable(void); 55 57 static void psDBMySQLToSQLTableCleanup(void); 56 58 57 static psHash *psDBGetP SToMySQLTable(void);58 static void psDBP SToMySQLTableCleanup(void);59 static psHash *psDBGetPTypeToMySQLTable(void); 60 static void psDBPTypeToMySQLTableCleanup(void); 59 61 60 62 static psPtr psDBMySQLTypeAlloc(enum enum_field_types type, bool isUnsigned); … … 113 115 // one or more are still open 114 116 psDBMySQLToSQLTableCleanup(); 115 psDBP SToSQLTableCleanup();116 psDBSQLToP STableCleanup();117 psDBP SToMySQLTableCleanup();117 psDBPTypeToSQLTableCleanup(); 118 psDBSQLToPTypeTableCleanup(); 119 psDBPTypeToMySQLTableCleanup(); 118 120 } 119 121 … … 353 355 int i; // field index 354 356 psMetadata *md; // a row 355 psHash *mysqlToSQLTable; // type lookup table356 psHash *sqlToPSTable; // type lookup table357 char *key; // hash tmp value358 char *value; // hash tmp value359 357 psU32 pType; // psElemType of a field 360 358 psU32 type; // psMetadataType of a a field 361 char *sqlType; // copy of lookup table result362 359 psPtr data; // copy of result field 363 360 … … 402 399 fieldCount = mysql_num_fields(result); 403 400 404 mysqlToSQLTable = psDBGetMySQLToSQLTable();405 sqlToPSTable = psDBGetSQLToPSTable();406 407 401 while ((row = mysql_fetch_row(result))) { 408 402 // allocate new psMetadata to represent a row … … 413 407 for (i = 0; i < fieldCount; i++) { 414 408 // lookup MySQL column type 415 key = psDBIntToString((psU64)field[i].type); 416 value = psHashLookup(mysqlToSQLTable, key); 417 sqlType = psStringCopy(value); 418 psFree(key); 419 420 // MySQL column types can not be directly translated to PS 421 // types as the the mysql types do not tell you if the value is 422 // signed or unsigned. The result is this ugly conversion from 423 // mysql -> ascii -> ptype 424 if (field[i].flags & UNSIGNED_FLAG) { 425 psStringPrepend(&sqlType, "UNSIGNED "); 426 } 427 428 // convert MySQL type to PS type 429 value = psHashLookup(sqlToPSTable, sqlType); 430 pType = (psU32)atol(value); 431 psFree(sqlType); 409 pType = psDBMySQLToPType(field[i].type, field[i].flags); 432 410 433 411 // copy field data and convert NULLs to the appropriate NaN value … … 455 433 psArrayAdd(resultSet, 0, md); 456 434 } 457 458 psFree(mysqlToSQLTable);459 psFree(sqlToPSTable);460 435 461 436 mysql_free_result(result); … … 751 726 psListIterator *cursor; // row iterator 752 727 psMetadataItem *item; // field in row 753 psHash *mysqlFieldType; // type lookup table754 728 mysqlType *mType; // type tmp variable 755 729 static bool isNull = true; // used in a MYSQL_BIND to indicate NULL, 756 730 // this will be used outside of this func 757 char *key; // hash tmp variable758 731 psU32 i; // field index 759 732 … … 761 734 762 735 cursor = psListIteratorAlloc(values->list, 0); 763 764 mysqlFieldType = psDBGetPSToMySQLTable();765 736 766 737 // loop over fields … … 768 739 while ((item = psListGetNext(cursor))) { 769 740 // lookup pType -> mysql type 770 key = psDBIntToString((psU64)item->pType); 771 mType = psHashLookup(mysqlFieldType, key); 772 psFree(key); 741 mType = psDBPTypeToMySQL(item->pType); 773 742 774 743 // input data length is determined by the MYSQL_TYPE_* unless it's a string … … 776 745 bind[i].buffer_type = mType->type; 777 746 bind[i].is_unsigned = mType->isUnsigned; 747 748 psFree(mType); 778 749 779 750 // convert NaNs to NULL and set the buffer_length for strings … … 789 760 // error, not a pointer to a string 790 761 psFree(cursor); 791 psFree(mysqlFieldType);792 762 793 763 return false; … … 805 775 806 776 psFree(cursor); 807 psFree(mysqlFieldType);808 777 809 778 return true; … … 819 788 psMetadataItem *item; // column description 820 789 psListIterator *cursor; // column iterator 821 psHash *colType; // type lookup table 822 char *key; // hash tmp variable 823 char *value; // hash tmp variable 790 char *colType; // type lookup table 824 791 825 792 if (!table) { … … 829 796 // + _ + tableName + _ + ( 830 797 psStringAppend(&query, "CREATE TABLE %s (", tableName); 831 832 colType = psDBGetPSToSQLTable();833 798 834 799 cursor = psListIteratorAlloc(table->list, 0); … … 837 802 while ((item = psListGetNext(cursor))) { 838 803 if (item->type == PS_META_PRIMITIVE) { 839 // lookup SQL column type840 key = psDBIntToString((psU64)item->pType);841 value = psHashLookup(colType, key);842 psFree(key);843 844 804 // + column name + _ + column type 845 psStringAppend(&query, "%s %s", item->name, value); 805 colType = psDBPTypeToSQL(item->pType); 806 psStringAppend(&query, "%s %s", item->name, colType); 807 psFree(colType); 846 808 } else if ((item->type == PS_META_STR) && (item->pType == PS_TYPE_PTR)) { 847 809 // + column name + _ + varchar( + length + ) … … 860 822 } 861 823 } 862 863 psFree(colType);864 824 865 825 psListIteratorSet(cursor, 0); … … 1096 1056 1097 1057 mysqlToSQLTable = psDBGetMySQLToSQLTable(); 1098 sqlToPSTable = psDBGetSQLToP STable();1058 sqlToPSTable = psDBGetSQLToPTypeTable(); 1099 1059 1100 1060 // lookup MySQL column type … … 1122 1082 } 1123 1083 1124 static psHash *psDBGetPSToSQLTable(void) 1084 static char *psDBPTypeToSQL(psElemType pType) 1085 { 1086 psHash *pTypeToSQLTable; // type lookup table 1087 char *key; // hash tmp value 1088 char *sqlType; // hash tmp value 1089 1090 pTypeToSQLTable = psDBGetPTypeToSQLTable(); 1091 1092 key = psDBIntToString((psU64)pType); 1093 sqlType = psHashLookup(pTypeToSQLTable, key); 1094 psFree(key); 1095 1096 psFree(pTypeToSQLTable); 1097 1098 psMemIncrRefCounter(sqlType); 1099 1100 return sqlType; 1101 } 1102 1103 static mysqlType *psDBPTypeToMySQL(psElemType pType) 1104 { 1105 psHash *pTypeToMySQLTable; // type lookup table 1106 char *key; // hash tmp value 1107 mysqlType *mType; // mysqlType struct to return 1108 1109 pTypeToMySQLTable = psDBGetPTypeToMySQLTable(); 1110 1111 key = psDBIntToString((psU64)pType); 1112 mType = psHashLookup(pTypeToMySQLTable, key); 1113 psFree(key); 1114 1115 psFree(pTypeToMySQLTable); 1116 1117 psMemIncrRefCounter(mType); 1118 1119 return mType; 1120 } 1121 1122 static psHash *psDBGetPTypeToSQLTable(void) 1125 1123 { 1126 1124 static psHash *lookupTable = NULL; … … 1152 1150 } 1153 1151 1154 static void psDBP SToSQLTableCleanup(void)1152 static void psDBPTypeToSQLTableCleanup(void) 1155 1153 { 1156 1154 psHash *lookupTable; 1157 1155 1158 lookupTable = psDBGetP SToSQLTable();1156 lookupTable = psDBGetPTypeToSQLTable(); 1159 1157 1160 1158 psMemDecrRefCounter(lookupTable); … … 1162 1160 } 1163 1161 1164 static psHash *psDBGetSQLToP STable(void)1162 static psHash *psDBGetSQLToPTypeTable(void) 1165 1163 { 1166 1164 static psHash *lookupTable = NULL; … … 1173 1171 if (!lookupTable) { 1174 1172 // invert the PSToSQL table 1175 psToSQLTable = psDBGetP SToSQLTable();1173 psToSQLTable = psDBGetPTypeToSQLTable(); 1176 1174 lookupTable = psHashAlloc(psToSQLTable->nbucket); 1177 1175 … … 1196 1194 } 1197 1195 1198 static void psDBSQLToP STableCleanup(void)1196 static void psDBSQLToPTypeTableCleanup(void) 1199 1197 { 1200 1198 psHash *lookupTable; 1201 1199 1202 lookupTable = psDBGetSQLToP STable();1200 lookupTable = psDBGetSQLToPTypeTable(); 1203 1201 1204 1202 psMemDecrRefCounter(lookupTable); … … 1251 1249 } 1252 1250 1253 static psHash *psDBGetP SToMySQLTable(void)1251 static psHash *psDBGetPTypeToMySQLTable(void) 1254 1252 { 1255 1253 static psHash *lookupTable = NULL; … … 1282 1280 } 1283 1281 1284 static void psDBP SToMySQLTableCleanup(void)1282 static void psDBPTypeToMySQLTableCleanup(void) 1285 1283 { 1286 1284 psHash *lookupTable; 1287 1285 1288 lookupTable = psDBGetP SToMySQLTable();1286 lookupTable = psDBGetPTypeToMySQLTable(); 1289 1287 1290 1288 psMemDecrRefCounter(lookupTable);
Note:
See TracChangeset
for help on using the changeset viewer.
