/** * 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; }