unsigned int dbi_result_get_field_attrib_idx(dbi_result Result, unsigned int fieldidx, unsigned int attribmin, unsigned int attribmax) { fieldidx--; if (!RESULT) { _error_handler(/*RESULT->conn*/ NULL, DBI_ERROR_BADPTR); return DBI_ATTRIBUTE_ERROR; } else if (!RESULT->field_attribs) { _error_handler(RESULT->conn, DBI_ERROR_BADOBJECT); return DBI_ATTRIBUTE_ERROR; } else if (fieldidx >= RESULT->numfields) { _error_handler(RESULT->conn, DBI_ERROR_BADIDX); return DBI_ATTRIBUTE_ERROR; } return _isolate_attrib(RESULT->field_attribs[fieldidx], attribmin, attribmax); }
int _get_row_data(dbi_result_t *result, dbi_row_t *row, unsigned long long rowidx) { unsigned int curfield = 0; XSQLVAR var; long fetch_stat = 0, blob_stat = 0; ISC_QUAD bid; isc_blob_handle blob_handle = NULL; /* Blob handle. */ char blob_segment[80]; unsigned short actual_seg_len; struct tm times; char date_s[25]; unsigned int sizeattrib; dbi_data_t *data = NULL; ibase_stmt_t *istmt = (ibase_stmt_t *)result->result_handle; ibase_conn_t *iconn = (ibase_conn_t *)result->conn->connection; fetch_stat = isc_dsql_fetch(iconn->status_vector, &(istmt->stmt), SQL_DIALECT_V6, istmt->osqlda); if (fetch_stat != 0) { result->numrows_matched--; return 0; } while (curfield < result->numfields) { var = istmt->osqlda->sqlvar[curfield]; data = &row->field_values[curfield]; /** * If the column holds a NULL value mark it as NULL */ if ( (var.sqltype & 1) && ( *var.sqlind < 0)) { _set_field_flag( row, curfield, DBI_VALUE_NULL, 1); curfield++; continue; } switch ( result->field_types[curfield] ) { case DBI_TYPE_STRING: if(result->field_attribs[curfield] & DBI_STRING_FIXEDSIZE) { data->d_string = strdup(var.sqldata); row->field_sizes[curfield] = (unsigned long long) var.sqllen; } else { vary_t *vary = NULL; vary = (vary_t *) var.sqldata; data->d_string = malloc(vary->vary_length+1); memcpy(data->d_string, vary->vary_string, vary->vary_length); data->d_string[vary->vary_length] = '\0'; row->field_sizes[curfield] = (unsigned long long) vary->vary_length; } break; case DBI_TYPE_INTEGER: sizeattrib = _isolate_attrib(result->field_attribs[curfield], DBI_INTEGER_SIZE1, DBI_INTEGER_SIZE8); switch (sizeattrib) { case DBI_INTEGER_SIZE1: case DBI_INTEGER_SIZE2: data->d_short = *(short *) var.sqldata; break; case DBI_INTEGER_SIZE3: case DBI_INTEGER_SIZE4: data->d_long = *(int *) var.sqldata; break; case DBI_INTEGER_SIZE8: data->d_longlong = *(ISC_INT64 *) var.sqldata; break; default: break; } break; case DBI_TYPE_DECIMAL: sizeattrib = _isolate_attrib(result->field_attribs[curfield], DBI_DECIMAL_SIZE4, DBI_DECIMAL_SIZE8); switch (sizeattrib) { case DBI_DECIMAL_SIZE4: data->d_float = *(float *) (var.sqldata); break; case DBI_DECIMAL_SIZE8: data->d_double = *(double *) (var.sqldata); break; default: break; } break; case DBI_TYPE_DATETIME: sizeattrib = _isolate_attrib(result->field_attribs[curfield], DBI_DATETIME_DATE, DBI_DATETIME_TIME); if (sizeattrib&DBI_DATETIME_TIME && sizeattrib&DBI_DATETIME_DATE) { isc_decode_timestamp((ISC_TIMESTAMP *)var.sqldata, ×); sprintf(date_s, "%04d-%02d-%02d %02d:%02d:%02d", times.tm_year + 1900, times.tm_mon+1, times.tm_mday, times.tm_hour, times.tm_min, times.tm_sec); } else if (sizeattrib&DBI_DATETIME_TIME) { isc_decode_sql_time((ISC_TIME *)var.sqldata, ×); sprintf(date_s, "%02d:%02d:%02d", times.tm_hour, times.tm_min, times.tm_sec); } else { isc_decode_sql_date((ISC_DATE *)var.sqldata, ×); sprintf(date_s, "%04d-%02d-%02d", times.tm_year + 1900, times.tm_mon+1, times.tm_mday); } data->d_datetime = _dbd_parse_datetime(date_s, sizeattrib); break; case DBI_TYPE_BINARY: bid = *(ISC_QUAD *) var.sqldata; isc_open_blob2( iconn->status_vector, &(iconn->db), &(iconn->trans), &blob_handle, &bid, 0, NULL ); blob_stat = isc_get_segment( iconn->status_vector, &blob_handle, &actual_seg_len, sizeof(blob_segment), blob_segment ); data->d_string = malloc(sizeof(actual_seg_len)); memcpy(data->d_string, blob_segment, actual_seg_len); row->field_sizes[curfield] = actual_seg_len; while (blob_stat == 0 || iconn->status_vector[1] == isc_segment) { blob_stat = isc_get_segment(iconn->status_vector, &blob_handle, &actual_seg_len, sizeof(blob_segment), blob_segment); data->d_string = realloc(data->d_string, row->field_sizes[curfield] + actual_seg_len); memcpy(data->d_string+row->field_sizes[curfield], blob_segment, actual_seg_len); row->field_sizes[curfield] += actual_seg_len; } isc_close_blob(iconn->status_vector, &blob_handle); row->field_sizes[curfield] = _dbd_decode_binary(data->d_string, data->d_string); break; default: break; } curfield++; } if( fetch_stat != 100L ) { result->rows = realloc(result->rows, (sizeof(dbi_row_t *) * (result->numrows_matched+1))); result->numrows_matched++; } return result->numrows_matched; }