in holo-client-c/src/request.c [250:337]
int set_record_val_by_type(HoloRecord* record, int colIndex, const char* str, int len){
Oid type = record->schema->columns[colIndex].type;
char* ptr = NULL;
switch (type){
case HOLO_TYPE_INT2:
ptr = (char*)new_record_val(record, 2);
char* end;
*(int16_t*)ptr = strtol(str, &end, 10);
if (*end){
LOG_ERROR("\"%s\" is not a int16 value.", str);
revoke_record_val(ptr, record, 2);
return HOLO_CLIENT_INVALID_PARAM;
}
endian_swap(ptr, 2);
return set_record_val(record, colIndex, ptr, 1, 2);
break;
case HOLO_TYPE_INT4:
ptr = (char*)new_record_val(record, 4);
*(int32_t*)ptr = strtol(str, &end, 10);
if (*end){
LOG_ERROR("\"%s\" is not a int32 value.", str);
revoke_record_val(ptr, record, 4);
return HOLO_CLIENT_INVALID_PARAM;
}
endian_swap(ptr, 4);
return set_record_val(record, colIndex, ptr, 1, 4);
break;
case HOLO_TYPE_INT8:
ptr = (char*)new_record_val(record, 8);
*(int64_t*)ptr = strtol(str, &end, 10);
if (*end){
LOG_ERROR("\"%s\" is not a int64 value.", str);
revoke_record_val(ptr, record, 8);
return HOLO_CLIENT_INVALID_PARAM;
}
endian_swap(ptr, 8);
return set_record_val(record, colIndex, ptr, 1, 8);
break;
case HOLO_TYPE_BOOL:
ptr = (char*)new_record_val(record, 1);
char* tmp = MALLOC(len + 1, char);
deep_copy_string_to(str, tmp, len);
tmp[len] = '\0';
to_lower_case(tmp, len);
if (strncmp(tmp, "true", len + 1) == 0 || strncmp(tmp, "1", len + 1) == 0) *ptr = 1;
else if (strncmp(tmp, "false", len + 1) == 0 || strncmp(tmp, "0", len + 1) == 0) *ptr = 0;
else {
LOG_ERROR("\"%s\" is not a bool value.", str);
revoke_record_val(ptr, record, 1);
FREE(tmp);
return HOLO_CLIENT_INVALID_PARAM;
}
FREE(tmp);
return set_record_val(record, colIndex, ptr, 1, 1);
break;
case HOLO_TYPE_FLOAT4:
ptr = (char*)new_record_val(record, 4);
*(float*)ptr = strtof(str, &end);
if (*end){
LOG_ERROR("\"%s\" is not a float value.", str);
revoke_record_val(ptr, record, 4);
return HOLO_CLIENT_INVALID_PARAM;
}
endian_swap(ptr, 4);
return set_record_val(record, colIndex, ptr, 1, 4);
break;
case HOLO_TYPE_FLOAT8:
ptr = (char*)new_record_val(record, 8);
*(double*)ptr = strtod(str, &end);
if (*end){
LOG_ERROR("\"%s\" is not a double value.", str);
revoke_record_val(ptr, record, 8);
return HOLO_CLIENT_INVALID_PARAM;
}
endian_swap(ptr, 8);
return set_record_val(record, colIndex, ptr, 1, 8);
break;
// TODO: timestamp的字符串解析成数字,统一两种写入方式
default:
ptr = (char*)new_record_val(record, len + 1);
deep_copy_string_to(str, ptr, len);
// add '\0', PQexecPrepared need it when processing text as parameter
ptr[len] = '\0';
return set_record_val(record, colIndex, ptr, 0, len + 1);
break;
}
return HOLO_CLIENT_RET_OK;
}