私は本当に基本的なことをしようとしています-SQLiteのC/C++インターフェイスをSELECT
使用してステートメントの結果を返します。私のデータテーブルには、キー(varchar)と値(text)の2つのフィールドしかありません。
キーが与えられた場合、私の目標はSQLiteデータベースにクエリを実行して値を返すことです。* sqlite3_exec *-* select_callback *関数とparam(char *)に渡します。パラメータは、*select_callback*内で正しい値に正常に設定されています。ただし、* sqlite3_exec *を呼び出した後、paramは空の文字列を指します(同じメモリを指しているにもかかわらず)。
何がうまくいかず、これを修正する方法はありますか?* sqlite3_exec *はバックグラウンドでparamのメモリの割り当てを解除しますか?
前もって感謝します!
// given the key tid returns the value
void getTypeByID(sqlite3 * db, string tid)
{
string sql_exp_base = "select value from Data where key=''";
int len = (int)sql_exp_base.size() + (int)tid.size() + 10;
char * sql_exp = new char[len];
sprintf(sql_exp, "select value from Data where key='%s'", tid.data());
sql_exec(db, sql_exp);
}
// This is the callback function to set the param to the value
static int select_callback(void * param, int argc, char **argv, char **azColName)
{
if(argc == 0) return 0;
char * res = (char *)param;
res = (char *) realloc(res, sizeof(*res));
res = (char *) malloc(strlen(argv[0]) + 1);
strcpy(res, argv[0]);
printf("%s\n", res); // {"name": "Instagram Photo", url: "http://instagram.com"}
return 0;
}
// execute the SQL statement specified by sql_statement
void sql_exec(sqlite3 * db, const char * sql_statement)
{
char * zErrMsg = 0;
char * param = (char *)calloc(1, sizeof(*param));
int rc = sqlite3_exec(db, sql_statement, select_callback, param, &zErrMsg);
printf("%s\n", param);
paramは{"name": "Instagram Photo"、url: "http://instagram.com"}である必要がありますが、何らかの理由で空の文字列です。
if(rc != SQLITE_OK)
{
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
}