static double rrd_fetch_dbi_double(dbi_result *result,int idx) { char *ptmp=""; double value=DNAN; /* get the attributes for this filed */ unsigned int attr=dbi_result_get_field_attribs_idx(result,idx); unsigned int type=dbi_result_get_field_type_idx(result,idx); /* return NAN if NULL */ if(dbi_result_field_is_null_idx(result,idx)) { return DNAN; } /* do some conversions */ switch (type) { case DBI_TYPE_STRING: ptmp=(char*)dbi_result_get_string_idx(result,idx); value=strtod(ptmp,NULL); break; case DBI_TYPE_INTEGER: if (attr & DBI_INTEGER_SIZE1) { value=dbi_result_get_char_idx(result,idx); } else if (attr & DBI_INTEGER_SIZE2) { value=dbi_result_get_short_idx(result,idx); } else if (attr & DBI_INTEGER_SIZE3) { value=dbi_result_get_int_idx(result,idx); } else if (attr & DBI_INTEGER_SIZE4) { value=dbi_result_get_int_idx(result,idx); } else if (attr & DBI_INTEGER_SIZE8) { value=dbi_result_get_longlong_idx(result,idx); } else { value=DNAN; if (getenv("RRDDEBUGSQL")) { fprintf(stderr,"RRDDEBUGSQL: %li: column %i unsupported attribute flags %i for type INTEGER\n",time(NULL),idx,attr ); } } break; case DBI_TYPE_DECIMAL: if (attr & DBI_DECIMAL_SIZE4) { value=dbi_result_get_float_idx(result,idx); } else if (attr & DBI_DECIMAL_SIZE8) { value=dbi_result_get_double_idx(result,idx); } else { value=DNAN; if (getenv("RRDDEBUGSQL")) { fprintf(stderr,"RRDDEBUGSQL: %li: column %i unsupported attribute flags %i for type DECIMAL\n",time(NULL),idx,attr ); } } break; case DBI_TYPE_BINARY: attr=dbi_result_get_field_length_idx(result,idx); ptmp=(char*)dbi_result_get_binary_copy_idx(result,idx); ptmp[attr-1]=0; /* check for "known" libdbi error */ if (strncmp("ERROR",ptmp,5)==0) { if (!getenv("RRD_NO_LIBDBI_BUG_WARNING")) { fprintf(stderr,"rrdtool_fetch_libDBI: you have possibly triggered a bug in libDBI by using a (TINY,MEDIUM,LONG) TEXT field with mysql\n this may trigger a core dump in at least one version of libdbi\n if you are not touched by this bug and you find this message annoying\n please set the environment-variable RRD_NO_LIBDBI_BUG_WARNING to ignore this message\n"); } } /* convert to number */ value=strtod(ptmp,NULL); /* free pointer */ free(ptmp); break; case DBI_TYPE_DATETIME: value=dbi_result_get_datetime_idx(result,idx); break; default: if (getenv("RRDDEBUGSQL")) { fprintf(stderr,"RRDDEBUGSQL: %li: column %i unsupported type: %i with attribute %i\n",time(NULL),idx,type,attr ); } value=DNAN; break; } return value; }
long long SMSDDBI_GetNumber(GSM_SMSDConfig * Config, SQL_result *res, unsigned int field) { unsigned int type; field++; type = dbi_result_get_field_type_idx(res->dbi, field); switch (type) { case DBI_TYPE_INTEGER: type = dbi_result_get_field_attribs_idx(res->dbi, field); if ((type & DBI_INTEGER_SIZEMASK) == DBI_INTEGER_SIZE1) { return dbi_result_get_int_idx(res->dbi, field); } else if ((type & DBI_INTEGER_SIZEMASK) == DBI_INTEGER_SIZE2) { return dbi_result_get_int_idx(res->dbi, field); } else if ((type & DBI_INTEGER_SIZEMASK) == DBI_INTEGER_SIZE3) { return dbi_result_get_int_idx(res->dbi, field); } else if ((type & DBI_INTEGER_SIZEMASK) == DBI_INTEGER_SIZE4) { return dbi_result_get_int_idx(res->dbi, field); } else if ((type & DBI_INTEGER_SIZEMASK) == DBI_INTEGER_SIZE8) { return dbi_result_get_longlong_idx(res->dbi, field); } SMSD_Log(DEBUG_ERROR, Config, "Wrong integer field subtype from DBI: %d", type); return -1; case DBI_TYPE_DECIMAL: type = dbi_result_get_field_attribs_idx(res->dbi, field); if ((type & DBI_DECIMAL_SIZEMASK) == DBI_DECIMAL_SIZE4) { return dbi_result_get_int_idx(res->dbi, field); } else if ((type & DBI_DECIMAL_SIZEMASK) == DBI_DECIMAL_SIZE8) { return dbi_result_get_longlong_idx(res->dbi, field); } SMSD_Log(DEBUG_ERROR, Config, "Wrong decimal field subtype from DBI: %d", type); return -1; #ifdef DBI_TYPE_XDECIMAL case DBI_TYPE_XDECIMAL: return dbi_result_get_as_longlong_idx(res->dbi, field); #endif default: SMSD_Log(DEBUG_ERROR, Config, "Wrong field type for number (not INTEGER nor DECIMAL) from DBI: %d", type); return -1; } }
/** * SQL callback. Return an integer from a query * * @param return_integer integer pointer cast to void* which holds the integer to be returned * @param result dbi_result pointer * @return 0 (always, due to SQLite policy, may change in the future) */ int tagsistant_return_integer(void *return_integer, dbi_result result) { uint32_t *buffer = (uint32_t *) return_integer; *buffer = 0; unsigned int type = dbi_result_get_field_type_idx(result, 1); if (type == DBI_TYPE_INTEGER) { unsigned int size = dbi_result_get_field_attribs_idx(result, 1); unsigned int is_unsigned = size & DBI_INTEGER_UNSIGNED; size = size & DBI_INTEGER_SIZEMASK; switch (size) { case DBI_INTEGER_SIZE8: if (is_unsigned) *buffer = dbi_result_get_ulonglong_idx(result, 1); else *buffer = dbi_result_get_longlong_idx(result, 1); break; case DBI_INTEGER_SIZE4: case DBI_INTEGER_SIZE3: if (is_unsigned) *buffer = dbi_result_get_uint_idx(result, 1); else *buffer = dbi_result_get_int_idx(result, 1); break; case DBI_INTEGER_SIZE2: if (is_unsigned) *buffer = dbi_result_get_ushort_idx(result, 1); else *buffer = dbi_result_get_short_idx(result, 1); break; case DBI_INTEGER_SIZE1: if (is_unsigned) *buffer = dbi_result_get_uchar_idx(result, 1); else *buffer = dbi_result_get_char_idx(result, 1); break; } } else if (type == DBI_TYPE_DECIMAL) { return (0); } else if (type == DBI_TYPE_STRING) { const gchar *int_string = dbi_result_get_string_idx(result, 1); *buffer = atoi(int_string); dbg('s', LOG_INFO, "tagsistant_return_integer called on non integer field"); } dbg('s', LOG_INFO, "Returning integer: %d", *buffer); return (0); }
unsigned int dbi_result_get_field_attribs(dbi_result Result, const char *fieldname) { unsigned int fieldidx = 0; dbi_error_flag errflag; if (!RESULT) { _error_handler(/*RESULT->conn*/ NULL, DBI_ERROR_BADPTR); return DBI_ATTRIBUTE_ERROR; } fieldidx = _find_field(RESULT, fieldname, &errflag); if (errflag != DBI_ERROR_NONE) { _error_handler(RESULT->conn, errflag); return DBI_ATTRIBUTE_ERROR; } return dbi_result_get_field_attribs_idx(Result, fieldidx+1); }