| 1197 | } |
| 1198 | |
| 1199 | int Result_buffer::append_column(cdb2_hndl_tp *hndl, int col) { |
| 1200 | std::string typeStr; |
| 1201 | std::string column; |
| 1202 | char buffer[512]; |
| 1203 | void *val; |
| 1204 | |
| 1205 | val = cdb2_column_value(hndl, col); |
| 1206 | |
| 1207 | if (val == NULL) { |
| 1208 | if (printmode & DISP_COLTYPE) { |
| 1209 | typeStr = "NULL"; |
| 1210 | } |
| 1211 | column = "NULL"; |
| 1212 | } else { |
| 1213 | int type = cdb2_column_type(hndl, col); |
| 1214 | |
| 1215 | if (printmode & DISP_COLTYPE) { |
| 1216 | if (type >= MIN_COL_TYPE_NAME && type <= MAX_COL_TYPE_NAME) { |
| 1217 | typeStr = col_type_names[type]; |
| 1218 | } else { |
| 1219 | typeStr = "UNKNOWN"; |
| 1220 | } |
| 1221 | } |
| 1222 | |
| 1223 | switch (type) { |
| 1224 | case CDB2_INTEGER: |
| 1225 | column = std::to_string(*(long long *)val); |
| 1226 | break; |
| 1227 | case CDB2_REAL: { |
| 1228 | int len = |
| 1229 | snprintf(buffer, sizeof(buffer), doublefmt, *(double *)val); |
| 1230 | assert(len < sizeof(buffer)); |
| 1231 | column = buffer; |
| 1232 | break; |
| 1233 | } |
| 1234 | case CDB2_CSTRING: { |
| 1235 | char *c = (char *)val; |
| 1236 | column += "'"; |
| 1237 | |
| 1238 | while (*c) { |
| 1239 | if (*c == '\'') |
| 1240 | column += "''"; |
| 1241 | else |
| 1242 | column += *c; |
| 1243 | c++; |
| 1244 | } |
| 1245 | column += "'"; |
| 1246 | break; |
| 1247 | } |
| 1248 | case CDB2_BLOB: { |
| 1249 | int len = cdb2_column_size(cdb2h, col); |
| 1250 | |
| 1251 | if (string_blobs) { |
| 1252 | char *c = (char *)val; |
| 1253 | column += '\''; |
| 1254 | while (len > 0) { |
| 1255 | if (isprint(*c) || *c == '\n' || *c == '\t') { |
| 1256 | column += *c; |
no test coverage detected