static int cdbi_result_get_field (dbi_result res, /* {{{ */ unsigned int index, char *buffer, size_t buffer_size) { unsigned short src_type; src_type = dbi_result_get_field_type_idx (res, index); if (src_type == DBI_TYPE_ERROR) { ERROR ("dbi plugin: cdbi_result_get: " "dbi_result_get_field_type_idx failed."); return (-1); } if (src_type == DBI_TYPE_INTEGER) { long long value; value = dbi_result_get_longlong_idx (res, index); ssnprintf (buffer, buffer_size, "%lli", value); } else if (src_type == DBI_TYPE_DECIMAL) { double value; value = dbi_result_get_double_idx (res, index); ssnprintf (buffer, buffer_size, "%63.15g", value); } else if (src_type == DBI_TYPE_STRING) { const char *value; value = dbi_result_get_string_idx (res, index); if (value == NULL) sstrncpy (buffer, "", buffer_size); else if (strcmp ("ERROR", value) == 0) return (-1); else sstrncpy (buffer, value, buffer_size); } /* DBI_TYPE_BINARY */ /* DBI_TYPE_DATETIME */ else { const char *field_name; field_name = dbi_result_get_field_name (res, index); if (field_name == NULL) field_name = "<unknown>"; ERROR ("dbi plugin: Column `%s': Don't know how to handle " "source type %hu.", field_name, src_type); return (-1); } return (0); } /* }}} int cdbi_result_get_field */
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; } }
long long dbi_result_get_longlong(dbi_result Result, const char *fieldname) { long long ERROR = 0; unsigned int fieldidx; dbi_error_flag errflag; fieldidx = _find_field(RESULT, fieldname, &errflag); if (errflag != DBI_ERROR_NONE) { dbi_conn_t *conn = RESULT->conn; _error_handler(conn, DBI_ERROR_BADNAME); return ERROR; } return dbi_result_get_longlong_idx(Result, fieldidx+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); }
int dbiw_res_get_int64_ndx(db_wrap_result * self, unsigned int ndx, int64_t * val) { RES_DECL(DB_WRAP_E_BAD_ARG); if (! val) return DB_WRAP_E_BAD_ARG; unsigned int const realIdx = ndx+1; //FIXME("Consolidate the duplicate code in get_int32_ndx() and here."); #if 1 /** See this thread: http://www.mail-archive.com/[email protected]/msg00126.html */ unsigned int const a = dbi_result_get_field_attrib_idx (dbires, realIdx, 0, 0xff) /* i can't find one bit of useful docs/examples for this function, so i'm kind of guessing here. */ ; /* MARKER("Attribute return=0x%x/%u\n",a, a); */ /*assert(0);*/ if (DBI_ATTRIBUTE_ERROR == a) { return DB_WRAP_E_CHECK_DB_ERROR; } else if (DBI_INTEGER_SIZE1 & a) { /* MARKER("SIZE1\n"); */ *val = (a & DBI_DECIMAL_UNSIGNED) ? dbi_result_get_uchar_idx(dbires, realIdx) : dbi_result_get_char_idx(dbires, realIdx) ; } else if (DBI_INTEGER_SIZE2 & a) { /* MARKER("SIZE2\n"); */ *val = (a & DBI_DECIMAL_UNSIGNED) ? dbi_result_get_ushort_idx(dbires, realIdx) : dbi_result_get_short_idx(dbires, realIdx) ; } else if (DBI_INTEGER_SIZE4 & a) { /*MARKER("SIZE4\n");*/ *val = (a & DBI_DECIMAL_UNSIGNED) ? dbi_result_get_uint_idx(dbires, realIdx) : dbi_result_get_int_idx(dbires, realIdx) ; } else if (DBI_INTEGER_SIZE8 & a) { /* MARKER("SIZE8\n"); */ *val = (a & DBI_DECIMAL_UNSIGNED) ? dbi_result_get_ulonglong_idx(dbires, realIdx) : dbi_result_get_longlong_idx(dbires, realIdx) ; } else { /** libdbi Sqlite driver returns 0 for attributes for the case of SELECT COUNT(*). i have no workaround for this :(. */ return DB_WRAP_E_UNKNOWN_ERROR; } #else //*val = dbi_result_get_int_idx(dbires, realIdx); //MARKER("val as int=%"PRIi64"\n",*val); //if (!*val) *val = dbi_result_get_longlong_idx(dbires, realIdx); //MARKER("val as longlong=%"PRIi64"\n",*val); #endif return 0; }
int dbiw_res_get_int32_ndx(db_wrap_result * self, unsigned int ndx, int32_t * val) { RES_DECL(DB_WRAP_E_BAD_ARG); if (! val) return DB_WRAP_E_BAD_ARG; unsigned int const realIdx = ndx+1; #if 1 /** See this thread: http://www.mail-archive.com/[email protected]/msg00126.html */ unsigned int const a = dbi_result_get_field_attrib_idx (dbires, realIdx, 0/*DBI_INTEGER_UNSIGNED*/, 0xff/*DBI_INTEGER_SIZE8*/) /* i can't find one bit of useful docs/examples for this function, so i'm kind of guessing here. */ ; //MARKER("Attribute return=0x%x/%u\n",a, a); /*assert(0);*/ /** See this thread: http://www.mail-archive.com/[email protected]/msg00126.html */ if (DBI_ATTRIBUTE_ERROR == a) { return DB_WRAP_E_CHECK_DB_ERROR; } #if 0 else if (0 == a) { /* HORRIBLE KLUDGE for sqlite driver! But after testing, NONE of these return the value i'm expecting! */ *val = dbi_result_get_short_idx(dbires, realIdx); if (!*val) *val = dbi_result_get_ushort_idx( dbires, realIdx ); if (!*val) *val = dbi_result_get_int_idx( dbires, realIdx ); if (!*val) *val = dbi_result_get_uint_idx( dbires, realIdx ); if (!*val) *val = dbi_result_get_longlong_idx( dbires, realIdx ); if (!*val) *val = dbi_result_get_ulonglong_idx( dbires, realIdx ); //if (!*val) *val = dbi_result_get_double_idx( dbires, realIdx ); } #endif else if (DBI_INTEGER_SIZE1 & a) { /* MARKER("SIZE1\n"); */ *val = (a & DBI_DECIMAL_UNSIGNED) ? dbi_result_get_uchar_idx(dbires, realIdx) : dbi_result_get_char_idx(dbires, realIdx) ; } else if (DBI_INTEGER_SIZE2 & a) { /* MARKER("SIZE2\n"); */ *val = (a & DBI_DECIMAL_UNSIGNED) ? dbi_result_get_ushort_idx(dbires, realIdx) : dbi_result_get_short_idx(dbires, realIdx) ; } else if (DBI_INTEGER_SIZE4 & a) { /* MARKER("SIZE4\n"); */ *val = (a & DBI_DECIMAL_UNSIGNED) ? dbi_result_get_uint_idx(dbires, realIdx) : dbi_result_get_int_idx(dbires, realIdx) ; } else if (DBI_INTEGER_SIZE8 & a) { /* MARKER("SIZE8\n"); */ *val = (a & DBI_DECIMAL_UNSIGNED) ? dbi_result_get_ulonglong_idx(dbires, realIdx) : dbi_result_get_longlong_idx(dbires, realIdx) ; } else { /** libdbi Sqlite driver returns 0 for attributes for the case of SELECT COUNT(*). i have no workaround for this :(. */ return DB_WRAP_E_UNKNOWN_ERROR; } #else *val = dbi_result_get_int_idx(dbires, realIdx); #endif return 0; }
unsigned long long dbi_result_get_ulonglong_idx(dbi_result Result, unsigned int fieldidx) { return (unsigned long long)dbi_result_get_longlong_idx(Result, fieldidx); }