IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 22708


Ignore:
Timestamp:
Feb 27, 2009, 12:32:05 PM (17 years ago)
Author:
Paul Price
Message:

MySQL only handles microseconds --- it barfs on nanoseconds

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/src/db/psDB.c

    r21401 r22708  
    866866                            const psArray *rowSet,
    867867                            const char *query
    868     )                           
     868    )
    869869{
    870870    PS_ASSERT_PTR_NON_NULL(dbh, -1);
     
    10401040
    10411041      for (i = 0; i < fieldCount; i++) {
    1042         // lookup MySQL column type
    1043         pType = psDBMySQLToPType(field[i].type, field[i].flags);
    1044         if (!pType) {
    1045           psError(PS_ERR_UNKNOWN, false, "Failed to lookup type.");
    1046           psFree(md);
    1047           mysql_free_result(result);
    1048           psFree(resultSet);
    1049           return NULL;
    1050         }
    1051 
    1052         len = fieldLength[i];
    1053         if (len) {
    1054           // copy the data out of the result set struct
    1055           data = psAlloc(len + 1);
    1056           memcpy(data, row[i], len);
    1057           ((char*)data)[len] = '\0';
    1058         } else {
    1059           // if len is zero then the value is NULL
    1060           psTrace("psLib.db", PS_LOG_INFO, "database field name %s contains a NULL", field[i].name);
    1061           data = psDBGetPTypeNaN(pType);
    1062 
    1063           // the NULL case must be handled for each type differently
    1064           switch (pType) {
    1065             case PS_DATA_STRING:
    1066               if (!psMetadataAddStr(md, PS_LIST_TAIL, field[i].name, 0, "", data)) {
    1067                 psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
    1068                 psFree(data);
    1069                 psFree(md);
    1070                 mysql_free_result(result);
    1071                 psFree(resultSet);
    1072                 return NULL;
    1073               }
    1074               break;
    1075             case PS_DATA_U8:
    1076               if (!psMetadataAddU8(md, PS_LIST_TAIL, field[i].name, 0, "",*(psU8 *)data)) {
    1077                 psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
    1078                 psFree(data);
    1079                 psFree(md);
    1080                 mysql_free_result(result);
    1081                 psFree(resultSet);
    1082                 return NULL;
    1083               }
    1084               break;
    1085             case PS_DATA_U16:
    1086               if (!psMetadataAddU16(md, PS_LIST_TAIL, field[i].name, 0, "",*(psU16 *)data)) {
    1087                 psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
    1088                 psFree(data);
    1089                 psFree(md);
    1090                 mysql_free_result(result);
    1091                 psFree(resultSet);
    1092                 return NULL;
    1093               }
    1094               break;
    1095             case PS_DATA_U32:
    1096               if (!psMetadataAddU32(md, PS_LIST_TAIL, field[i].name, 0, "",*(psU32 *)data)) {
    1097                 psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
    1098                 psFree(data);
    1099                 psFree(md);
    1100                 mysql_free_result(result);
    1101                 psFree(resultSet);
    1102                 return NULL;
    1103               }
    1104               break;
    1105             case PS_DATA_U64:
    1106               if (!psMetadataAddU64(md, PS_LIST_TAIL, field[i].name, 0, "",*(psU64 *)data)) {
    1107                 psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
    1108                 psFree(data);
    1109                 psFree(md);
    1110                 mysql_free_result(result);
    1111                 psFree(resultSet);
    1112                 return NULL;
    1113               }
    1114               break;
    1115             case PS_DATA_S8:
    1116               if (!psMetadataAddS8(md, PS_LIST_TAIL, field[i].name, 0, "", *(psS8 *)data)) {
    1117                 psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
    1118                 psFree(data);
    1119                 psFree(md);
    1120                 mysql_free_result(result);
    1121                 psFree(resultSet);
    1122                 return NULL;
    1123               }
    1124               break;
    1125             case PS_DATA_S16:
    1126               if (!psMetadataAddS16(md, PS_LIST_TAIL, field[i].name, 0, "", *(psS16 *)data)) {
    1127                 psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
    1128                 psFree(data);
    1129                 psFree(md);
    1130                 mysql_free_result(result);
    1131                 psFree(resultSet);
    1132                 return NULL;
    1133               }
    1134               break;
    1135             case PS_DATA_S32:
    1136               if (!psMetadataAddS32(md, PS_LIST_TAIL, field[i].name, 0, "", *(psS32 *)data)) {
    1137                 psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
    1138                 psFree(data);
    1139                 psFree(md);
    1140                 mysql_free_result(result);
    1141                 psFree(resultSet);
    1142                 return NULL;
    1143               }
    1144               break;
    1145             case PS_DATA_S64:
    1146               if (!psMetadataAddS64(md, PS_LIST_TAIL, field[i].name, 0, "", *(psS64 *)data)) {
    1147                 psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
    1148                 psFree(data);
    1149                 psFree(md);
    1150                 mysql_free_result(result);
    1151                 psFree(resultSet);
    1152                 return NULL;
    1153               }
    1154               break;
    1155             case PS_DATA_F32:
    1156               if (!psMetadataAddF32(md, PS_LIST_TAIL, field[i].name, 0, "", *(psF32 *)data)) {
    1157                 psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
    1158                 psFree(data);
    1159                 psFree(md);
    1160                 mysql_free_result(result);
    1161                 psFree(resultSet);
    1162                 return NULL;
    1163               }
    1164               break;
    1165             case PS_DATA_F64:
    1166               if (!psMetadataAddF64(md, PS_LIST_TAIL, field[i].name, 0, "", *(psF64 *)data)) {
    1167                 psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
    1168                 psFree(data);
    1169                 psFree(md);
    1170                 mysql_free_result(result);
    1171                 psFree(resultSet);
    1172                 return NULL;
    1173               }
    1174               break;
    1175             case PS_DATA_BOOL:
    1176               if (!psMetadataAddBool(md, PS_LIST_TAIL, field[i].name, 0, "", *(bool *)data)) {
    1177                 psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
    1178                 psFree(data);
    1179                 psFree(md);
    1180                 mysql_free_result(result);
    1181                 psFree(resultSet);
    1182                 return NULL;
    1183               }
    1184               break;
    1185             case PS_DATA_TIME:
    1186               // just pass NULL values through as there is currently no
    1187               // concept of a psTime with a NULL value
    1188               if (!psMetadataAddTime(md, PS_LIST_TAIL, field[i].name, 0, "", NULL)) {
    1189                 psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
    1190                 psFree(data);
    1191                 psFree(md);
    1192                 mysql_free_result(result);
    1193                 psFree(resultSet);
    1194                 return NULL;
    1195               }
    1196               break;
    1197 
    1198             default:
    1199               // just pass NULL values for all other types
    1200               if (!psMetadataAddUnknown(md, PS_LIST_TAIL, field[i].name, 0, "", NULL)) {
    1201                 psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
    1202                 psFree(data);
    1203                 psFree(md);
    1204                 mysql_free_result(result);
    1205                 psFree(resultSet);
    1206                 return NULL;
    1207               }
    1208               break;
    1209           }
    1210           psFree(data);
    1211           continue;
    1212         }
     1042        // lookup MySQL column type
     1043        pType = psDBMySQLToPType(field[i].type, field[i].flags);
     1044        if (!pType) {
     1045          psError(PS_ERR_UNKNOWN, false, "Failed to lookup type.");
     1046          psFree(md);
     1047          mysql_free_result(result);
     1048          psFree(resultSet);
     1049          return NULL;
     1050        }
     1051
     1052        len = fieldLength[i];
     1053        if (len) {
     1054          // copy the data out of the result set struct
     1055          data = psAlloc(len + 1);
     1056          memcpy(data, row[i], len);
     1057          ((char*)data)[len] = '\0';
     1058        } else {
     1059          // if len is zero then the value is NULL
     1060          psTrace("psLib.db", PS_LOG_INFO, "database field name %s contains a NULL", field[i].name);
     1061          data = psDBGetPTypeNaN(pType);
     1062
     1063          // the NULL case must be handled for each type differently
     1064          switch (pType) {
     1065            case PS_DATA_STRING:
     1066              if (!psMetadataAddStr(md, PS_LIST_TAIL, field[i].name, 0, "", data)) {
     1067                psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
     1068                psFree(data);
     1069                psFree(md);
     1070                mysql_free_result(result);
     1071                psFree(resultSet);
     1072                return NULL;
     1073              }
     1074              break;
     1075            case PS_DATA_U8:
     1076              if (!psMetadataAddU8(md, PS_LIST_TAIL, field[i].name, 0, "",*(psU8 *)data)) {
     1077                psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
     1078                psFree(data);
     1079                psFree(md);
     1080                mysql_free_result(result);
     1081                psFree(resultSet);
     1082                return NULL;
     1083              }
     1084              break;
     1085            case PS_DATA_U16:
     1086              if (!psMetadataAddU16(md, PS_LIST_TAIL, field[i].name, 0, "",*(psU16 *)data)) {
     1087                psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
     1088                psFree(data);
     1089                psFree(md);
     1090                mysql_free_result(result);
     1091                psFree(resultSet);
     1092                return NULL;
     1093              }
     1094              break;
     1095            case PS_DATA_U32:
     1096              if (!psMetadataAddU32(md, PS_LIST_TAIL, field[i].name, 0, "",*(psU32 *)data)) {
     1097                psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
     1098                psFree(data);
     1099                psFree(md);
     1100                mysql_free_result(result);
     1101                psFree(resultSet);
     1102                return NULL;
     1103              }
     1104              break;
     1105            case PS_DATA_U64:
     1106              if (!psMetadataAddU64(md, PS_LIST_TAIL, field[i].name, 0, "",*(psU64 *)data)) {
     1107                psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
     1108                psFree(data);
     1109                psFree(md);
     1110                mysql_free_result(result);
     1111                psFree(resultSet);
     1112                return NULL;
     1113              }
     1114              break;
     1115            case PS_DATA_S8:
     1116              if (!psMetadataAddS8(md, PS_LIST_TAIL, field[i].name, 0, "", *(psS8 *)data)) {
     1117                psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
     1118                psFree(data);
     1119                psFree(md);
     1120                mysql_free_result(result);
     1121                psFree(resultSet);
     1122                return NULL;
     1123              }
     1124              break;
     1125            case PS_DATA_S16:
     1126              if (!psMetadataAddS16(md, PS_LIST_TAIL, field[i].name, 0, "", *(psS16 *)data)) {
     1127                psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
     1128                psFree(data);
     1129                psFree(md);
     1130                mysql_free_result(result);
     1131                psFree(resultSet);
     1132                return NULL;
     1133              }
     1134              break;
     1135            case PS_DATA_S32:
     1136              if (!psMetadataAddS32(md, PS_LIST_TAIL, field[i].name, 0, "", *(psS32 *)data)) {
     1137                psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
     1138                psFree(data);
     1139                psFree(md);
     1140                mysql_free_result(result);
     1141                psFree(resultSet);
     1142                return NULL;
     1143              }
     1144              break;
     1145            case PS_DATA_S64:
     1146              if (!psMetadataAddS64(md, PS_LIST_TAIL, field[i].name, 0, "", *(psS64 *)data)) {
     1147                psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
     1148                psFree(data);
     1149                psFree(md);
     1150                mysql_free_result(result);
     1151                psFree(resultSet);
     1152                return NULL;
     1153              }
     1154              break;
     1155            case PS_DATA_F32:
     1156              if (!psMetadataAddF32(md, PS_LIST_TAIL, field[i].name, 0, "", *(psF32 *)data)) {
     1157                psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
     1158                psFree(data);
     1159                psFree(md);
     1160                mysql_free_result(result);
     1161                psFree(resultSet);
     1162                return NULL;
     1163              }
     1164              break;
     1165            case PS_DATA_F64:
     1166              if (!psMetadataAddF64(md, PS_LIST_TAIL, field[i].name, 0, "", *(psF64 *)data)) {
     1167                psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
     1168                psFree(data);
     1169                psFree(md);
     1170                mysql_free_result(result);
     1171                psFree(resultSet);
     1172                return NULL;
     1173              }
     1174              break;
     1175            case PS_DATA_BOOL:
     1176              if (!psMetadataAddBool(md, PS_LIST_TAIL, field[i].name, 0, "", *(bool *)data)) {
     1177                psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
     1178                psFree(data);
     1179                psFree(md);
     1180                mysql_free_result(result);
     1181                psFree(resultSet);
     1182                return NULL;
     1183              }
     1184              break;
     1185            case PS_DATA_TIME:
     1186              // just pass NULL values through as there is currently no
     1187              // concept of a psTime with a NULL value
     1188              if (!psMetadataAddTime(md, PS_LIST_TAIL, field[i].name, 0, "", NULL)) {
     1189                psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
     1190                psFree(data);
     1191                psFree(md);
     1192                mysql_free_result(result);
     1193                psFree(resultSet);
     1194                return NULL;
     1195              }
     1196              break;
     1197
     1198            default:
     1199              // just pass NULL values for all other types
     1200              if (!psMetadataAddUnknown(md, PS_LIST_TAIL, field[i].name, 0, "", NULL)) {
     1201                psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
     1202                psFree(data);
     1203                psFree(md);
     1204                mysql_free_result(result);
     1205                psFree(resultSet);
     1206                return NULL;
     1207              }
     1208              break;
     1209          }
     1210          psFree(data);
     1211          continue;
     1212        }
    12131213
    12141214            switch (pType) {
     
    24232423    case PS_DATA_TIME: {
    24242424            if (item->data.V) {
    2425                 psString timeStr = psTimeToISO(item->data.V);
     2425                psString timeStr = psTimeToString(item->data.V, 6); // MySQL only handles microseconds
    24262426                psStringAppend(&query, "%s %s '%s'", itemName, opStr, timeStr);
    24272427                psFree(timeStr);
Note: See TracChangeset for help on using the changeset viewer.