Hi List,

I'm seeing strange behavior here :


I create a database with 2 tables each with two fields.  These fields are INT.

I run a select * on the first table, and use dbi_result_get_int to retreive 
the values, and dbi_result_get_field_type to see the field types... no 
problem, everything is as expected.

I run a select * on the second table, and use dbi_result_get_int to retreive 
the values, and dbi_result_get_field_type to see the field types... no 
problem, everything is as expected.

Now I run a select "select tableone.a,tabletwo.d from two as tabletwo, one as 
tableone where tableone.a=tabletwo.c;"

Now the results say that "a" is of type string and the get int function 
returns 0, while "d" is type int and get the int ok.

If I switch the order of the tables, i.e. "from one as tableone, two as 
tabletwo", then the "a" column is ok, but the "d" column is seen as a string.

When I run the query through the sqlite3 interface, everything is ok.

sqlite3.5.9
libdbi 0.8.3
libdbidriver 0.8.3.1



Here is the code to see the problem :

#include <string>
struct ConnInfo {
        std::string driverdir;
        std::string drivername;
        std::string dbname;
        std::string timeout;
        std::string dbdir;
};
class test {
public:
        test();
        virtual ~test();
        static void runtest();
        static int callback(void *NotUsed, int argc, char **argv, char 
**azColName);
};
#include "dbi/dbi.h"
#include <sqlite3.h>
test::test() {
}
test::~test() {
}
void test::runtest() {
        ConnInfo conninfo;
        dbi_conn conn;
        dbi_result result;
        int retcode;
        const char* errormsg;
        sqlite3 *db;
        char *zErrMsg = 0;
        conninfo.driverdir = "/usr/local/lib/dbd";
        printf("DBI_DRIVER_DIR = %s\n", conninfo.driverdir.c_str());
        conninfo.drivername = "sqlite3";
        printf("DBI_DRIVER_NAME = %s\n", conninfo.drivername.c_str());
        conninfo.dbdir = "/home/kgs";
        printf("DB_DIR = %s\n", conninfo.dbdir.c_str());
        conninfo.dbname = "dbitest.db";
        printf("DB_NAME = %s\n", conninfo.dbname.c_str());
        conninfo.timeout = "0";
        if ( atoi(conninfo.timeout.c_str()) < 1 ) conninfo.timeout = "0";
        printf("DBI_SQLITE3_TIMEOUT = %s\n", conninfo.timeout.c_str());
        if ( dbi_initialize(conninfo.driverdir.c_str()) < 1 ) {
                printf("Unable to initialize libdbi!\n");
                dbi_shutdown();
        }
        conn = dbi_conn_new(conninfo.drivername.c_str());
        retcode = dbi_conn_set_option(conn, "dbname", conninfo.dbname.c_str());
        if ( retcode != 0 ) {
                printf("cannot set database option dbname!\n");
        }
        retcode = dbi_conn_set_option(conn, "sqlite3_dbdir", 
conninfo.dbdir.c_str());
        if ( retcode != 0 ) {
                printf("cannot set database option sqlite3_dbdir!\n");
        }
        retcode = dbi_conn_set_option(conn, "sqlite3_timeout", 
conninfo.timeout.c_str());
        if ( retcode != 0 ) {
                printf("cannot set database option sqlite3_timeout!\n");
        }
        retcode = dbi_conn_connect(conn);
        if ( retcode != 0 ) {
                printf("DBI return code = %d\n", retcode);
                printf("cannot connect to database!\n");
        }

        // create database
        result = dbi_conn_queryf(conn,"create table one (a INT,b INT);");
        result = dbi_conn_queryf(conn,"create table two (c INT,d INT);");

        // insert data
        result = dbi_conn_queryf(conn,"insert into one values(1,1);");
        result = dbi_conn_queryf(conn,"insert into one values(2,2);");
        result = dbi_conn_queryf(conn,"insert into one values(3,3);");
        result = dbi_conn_queryf(conn,"insert into one values(4,4);");
        result = dbi_conn_queryf(conn,"insert into two values(1,1);");
        result = dbi_conn_queryf(conn,"insert into two values(2,2);");
        result = dbi_conn_queryf(conn,"insert into two values(3,3);");
        result = dbi_conn_queryf(conn,"insert into two values(4,4);");

        // single table select table one
        printf("single table select table one\n");
        result = dbi_conn_queryf(conn,"select tableone.a,tableone.b from one as 
tableone;");
        while ( dbi_result_next_row(result) ) {
                unsigned short fieldtype = 
dbi_result_get_field_type(result,"a");
                printf("fieldtype = %d\n",fieldtype);
                int theint = dbi_result_get_int(result, "a");
                printf("theint = %d\n",theint);
                fieldtype = dbi_result_get_field_type(result,"b");
                printf("fieldtypeb = %d\n",fieldtype);
                int theintb = dbi_result_get_int(result, "b");
                printf("theintb = %d\n",theintb);

        }
        dbi_result_free(result);
        // single table select table two
        printf("single table select table two\n");
        result = dbi_conn_queryf(conn,"select tabletwo.c from two as 
tabletwo;");
        if ( result == NULL ) {
                dbi_conn_error(conn,&errormsg);
                printf("errormsg = %s\n",errormsg);
        }
        while ( dbi_result_next_row(result) ) {
                unsigned short fieldtype = 
dbi_result_get_field_type(result,"c");
                printf("fieldtype = %d\n",fieldtype);

                int theint = dbi_result_get_int(result, "c");
                printf("theint = %d\n",theint);
        }
        dbi_result_free(result);

        // join select
        printf("join select\n");
        result = dbi_conn_queryf(conn,"select tableone.a,tabletwo.d from two as 
tabletwo, one as tableone where tableone.a=tabletwo.c;");
        if ( result == NULL ) {
                dbi_conn_error(conn,&errormsg);
                printf("errormsg = %s\n",errormsg);
        }
        while ( dbi_result_next_row(result) ) {
                unsigned short fieldtype = 
dbi_result_get_field_type(result,"a");
                printf("fieldtype a = %d\n",fieldtype);
                int theinta = dbi_result_get_int(result, "a");
                printf("theinta = %d\n",theinta);
                fieldtype = dbi_result_get_field_type(result,"d");
                printf("fieldtype d = %d\n",fieldtype);
                int theintd = dbi_result_get_int(result, "d");
                printf("theintd = %d\n",theintd);
        }
        dbi_result_free(result);

        dbi_conn_close(conn);

        // try the join select with sqlite3 directly
        retcode = sqlite3_open("/home/kgs/dbitest.db", &db);
        if( retcode ){
                fprintf(stderr, "Can't open database: %s\n", 
sqlite3_errmsg(db));
                sqlite3_close(db);
                exit(1);
        }
        retcode = sqlite3_exec(db, "select tableone.a,tabletwo.d from two as 
tabletwo, one as tableone where tableone.a=tabletwo.c;", callback, 0, 
&zErrMsg);
        if( retcode!=SQLITE_OK ){
                fprintf(stderr, "SQL error: %s\n", zErrMsg);
                sqlite3_free(zErrMsg);
        }
        sqlite3_close(db);

}

int test::callback(void *NotUsed, int argc, char **argv, char **azColName){
  int i;
  for(i=0; i<argc; i++){
    printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
  }
  printf("\n");
  return 0;
}

int main() {
        test::runtest();
}

-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
_______________________________________________
libdbi-users mailing list
libdbi-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/libdbi-users

Reply via email to