www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - I could use some help with SQLite3

reply Mista <stoop hotpop.com> writes:
I hope someone can help me with sqlite3.
Maybe someone has been doing it succesfully and can show me how they did 
it, or maybe someone can explain what i am doing wrong in my own test.
Because i can't figure out how i should use the callback function of 
sqlite3.
The code does compile without errors.
But when i start the program it gives the error message:  "Error: Access 
Violation"
Also the numCols always returns 1 no matter how many columns there are.
And if i try to writef the results then i get a wrong set of characters 
and the
error message:  "Error: invalid UTF-8 sequence"
And if i try to do the same with columnNames then i get the error message:
"Error: ArrayBoundsError test.d(9)"



Here is my code:


import std.stdio;
import sqlite3_imp;


int DoTheCallback (void* NotUsed, int numCols , char[][] results, 
char[][] columnNames)
   {
   writef("number of colomns: ", numCols, "\n");
   return 0;
   };


int main()
   {
   sqlite3* db;
   sqlite3_open("test.db", &db);
   sqlite3_exec(db, "SELECT * FROM account" ,cast(sqlite_callback) 
&DoTheCallback, null, null);
   sqlite3_close(db);
   return 0;
   }
Jul 29 2004
parent reply "Vathix" <vathixSpamFix dprogramming.com> writes:
"Mista" <stoop hotpop.com> wrote in message
news:ceb8pu$1i9n$1 digitaldaemon.com...
 I hope someone can help me with sqlite3.
 Maybe someone has been doing it succesfully and can show me how they did
 it, or maybe someone can explain what i am doing wrong in my own test.
 Because i can't figure out how i should use the callback function of
 sqlite3.
 The code does compile without errors.
 But when i start the program it gives the error message:  "Error: Access
 Violation"
 Also the numCols always returns 1 no matter how many columns there are.
 And if i try to writef the results then i get a wrong set of characters
 and the
 error message:  "Error: invalid UTF-8 sequence"
 And if i try to do the same with columnNames then i get the error message:
 "Error: ArrayBoundsError test.d(9)"



 Here is my code:


 import std.stdio;
 import sqlite3_imp;


 int DoTheCallback (void* NotUsed, int numCols , char[][] results,
 char[][] columnNames)
    {
    writef("number of colomns: ", numCols, "\n");
    return 0;
    };


 int main()
    {
    sqlite3* db;
    sqlite3_open("test.db", &db);
    sqlite3_exec(db, "SELECT * FROM account" ,cast(sqlite_callback)
 &DoTheCallback, null, null);
    sqlite3_close(db);
    return 0;
    }

Your callback function is incorrect and your cast is telling the compiler to ignore it. Use this and don't cast it: extern(C) int DoTheCallback(void* pArg, int numCols, char** results, char** columnNames) { writef("number of colomns: ", numCols, "\n"); for(int i = 0; i != numCols; i++) { writef("Column '%s' result is: %s\n", toString(columnNames[i]), toString(results[i])); } return 0; }
Jul 29 2004
parent Mista <stoop hotpop.com> writes:
Thank you, that did the trick.

It would be great if the callback part could be included in the example 
on http://www.dprogramming.com/sqlite.php
Maybe there will be more people who will find this info usefull.
Or maybe i am the only one who can't figure out that i should use 
extern(C) :D



Vathix wrote:

 "Mista" <stoop hotpop.com> wrote in message
 news:ceb8pu$1i9n$1 digitaldaemon.com...
 
I hope someone can help me with sqlite3.
Maybe someone has been doing it succesfully and can show me how they did
it, or maybe someone can explain what i am doing wrong in my own test.
Because i can't figure out how i should use the callback function of
sqlite3.
The code does compile without errors.
But when i start the program it gives the error message:  "Error: Access
Violation"
Also the numCols always returns 1 no matter how many columns there are.
And if i try to writef the results then i get a wrong set of characters
and the
error message:  "Error: invalid UTF-8 sequence"
And if i try to do the same with columnNames then i get the error message:
"Error: ArrayBoundsError test.d(9)"



Here is my code:


import std.stdio;
import sqlite3_imp;


int DoTheCallback (void* NotUsed, int numCols , char[][] results,
char[][] columnNames)
   {
   writef("number of colomns: ", numCols, "\n");
   return 0;
   };


int main()
   {
   sqlite3* db;
   sqlite3_open("test.db", &db);
   sqlite3_exec(db, "SELECT * FROM account" ,cast(sqlite_callback)
&DoTheCallback, null, null);
   sqlite3_close(db);
   return 0;
   }

Your callback function is incorrect and your cast is telling the compiler to ignore it. Use this and don't cast it: extern(C) int DoTheCallback(void* pArg, int numCols, char** results, char** columnNames) { writef("number of colomns: ", numCols, "\n"); for(int i = 0; i != numCols; i++) { writef("Column '%s' result is: %s\n", toString(columnNames[i]), toString(results[i])); } return 0; }

Jul 29 2004