Я пытаюсь распечатать таблицу sqlite, возвращенную вызовом SELECT, но не могу заставить указатели работать правильно.
Пока что у меня есть следующее:
char *full_response = "";
sqlite3_exec(db, select_query, callback, (void *)full_response, &zErrMsg);
printf(full_response); // This is where I'd like the entire table
И следующая функция обратного вызова:
static int callback(void *full_response, int argc, char **argv, char **azColName){
int i;
int response_header_length = 0;
int response_body_length = 0;
// This is to get the length of the header and body strings.
for (i=0;i<argc;i++){
response_header_length+=strlen(azColName[i])+1;
response_body_length+=strlen(argv[i])+1;
}
//This is to turn the headers and field values of the returned table into a single string
char response_header[response_header_length-1];strcpy(response_header,azColName[0]);
char response_body[response_body_length-1];strcpy(response_body,argv[0]);
for (i=1;i<argc;i++){
strcat(response_header,"|"); strcat(response_header,azColName[i]);
strcat(response_body,"|"); strcat(response_body,argv[i]);
}
if (strlen((char *)full_response)==0){ // full_response is empty so we need the header
char temp_response[strlen(response_header) + strlen(response_body)+1];
strcpy(temp_response, response_header);
strcat(temp_response, "\n");
strcat(temp_response, response_body);
full_response = &temp_response;
}
else{ // full_response has stuff in it so we just need the field values for this row
char temp_response[strlen((char *)full_response) + strlen(response_body)+1];
strcpy(temp_response, (char *)full_response);
strcat(temp_response, "\n");
strcat(temp_response, response_body);
full_response = &temp_response;
}
return 0;
}
(я знаю, что это не очень элегантно, но это в основном для доказательства концепции чего-то еще).
Я подумал, что строка
full_response = &temp_response
в функции обратного вызова будет переназначать адрес full_response
на адрес temp_response
, который должен содержать таблицу на данный момент плюс текущую строку, обрабатываемую функцией обратного вызова, но кажется чтобы не работать так.
-
В качестве альтернативы, если есть функция pretty-print или фрагмент кода или git репо в C, которое возвращает мне всю возвращенную таблицу в строка в основном теле (то есть там, где называется sqlite_exec
), это было бы великолепно.