Hello,
Following, I have a function my_dbi_get_value. I use dbi_result_get
and tranform the value received in a char *buf to return.
char *my_dbi_getvalue(dbi_result *result, int row_number, unsigned int
column_number) {
char *buf = NULL;
const char *errmsg;
const char *field_name;
unsigned short dbitype;
int32_t field_length = 0;
int64_t num;
/* correct the index for dbi interface
* dbi index begins 1
* I prefer do not change others functions
*/
column_number++;
if(row_number == 0) {
row_number++;
}
if(dbi_result_seek_row(result, row_number)) {
field_name = dbi_result_get_field_name(result, column_number);
field_length = dbi_result_get_field_length(result, field_name);
dbitype = dbi_result_get_field_type_idx(result,column_number);
if(field_length) {
buf = (char *)malloc(sizeof(char *) * field_length + 1);
} else {
/* if numbers */
buf = (char *)malloc(sizeof(char *) * 50);
}
switch (dbitype) {
case DBI_TYPE_INTEGER:
num = dbi_result_get_longlong(result, field_name);
edit_int64(num, buf);
field_length = strlen(buf);
break;
case DBI_TYPE_STRING:
if(field_length) {
field_length = bsnprintf(buf, field_length + 1, "%s",
dbi_result_get_string(result, field_name));
} else {
buf[0] = 0;
}
break;
case DBI_TYPE_BINARY:
/* dbi_result_get_binary return a NULL pointer if value is empty
* following, change this to what Bacula espected
*/
if(field_length) {
field_length = bsnprintf(buf, field_length + 1, "%s",
dbi_result_get_binary(result, field_name));
} else {
buf[0] = 0;
}
break;
case DBI_TYPE_DATETIME:
time_t last;
struct tm tm;
last = dbi_result_get_datetime(result, field_name);
if(last == -1) {
field_length = bsnprintf(buf, 20, "0000-00-00 00:00:00");
} else {
(void)localtime_r(&last, &tm);
field_length = bsnprintf(buf, 20, "%04d-%02d-%02d %02d:%02d:%02d",
(tm.tm_year + 1900), (tm.tm_mon + 1), tm.tm_mday,
tm.tm_hour, tm.tm_min, tm.tm_sec);
}
break;
}
} else {
dbi_conn_error(dbi_result_get_conn(result), &errmsg);
Dmsg1(500, "my_dbi_getvalue error: %s\n", errmsg);
}
return buf;
}
How I can use dbi_result_bind_* and not need to allocate a char *buf?
One possibility is change the function to:
char *my_dbi_getvalue(dbi_result *result, int row_number, unsigned int
column_number, char *value) and char *value will be bind in
dbi_result_bind_* functions. It's possible?
Thanks
--
-----------------------------------------------------------
João Henrique Freitas - joaohf_at_gmail.com
Campinas-SP-Brasil
BSD051283
LPI 1
http://joaohf.pbwiki.com
http://www.livejournal.com/users/joaohf/
-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference
Don't miss this year's exciting event. There's still time to save $100.
Use priority code J8TL2D2.
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
_______________________________________________
libdbi-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/libdbi-users