Это не совсем то, что вы ищете, но довольно близко. Это выведет ваш запрос в формате JSON в outbuf, я не включил b64encode()
во фрагмент.
int sqlite3_json(sqlite3_stmt *s, char *outbuf, size_t blen, size_t *used)
{
int nuse=0;
int res,i=0,ncolumn=sqlite3_column_count(s);
nuse+=snprintf(outbuf+nuse,blen-nuse,"[\n");
while(SQLITE_ROW==(res=sqlite3_step(s))) {
nuse+=snprintf(outbuf+nuse,blen-nuse, "\t{\n");
for(i=0;i<ncolumn;++i) {
nuse+=snprintf(outbuf+nuse,blen-nuse,
"\t\t\"%s\" : ", sqlite3_column_name(s,i));
switch (sqlite3_column_type(s,i)) {
case SQLITE_INTEGER:
nuse+=snprintf(outbuf+nuse,blen-nuse,
"%d,\n", sqlite3_column_int(s,i));
break;
case SQLITE_FLOAT:
nuse+=snprintf(outbuf+nuse,blen-nuse,
"%e,\n", sqlite3_column_double(s,i));
break;
case SQLITE_TEXT:
nuse+=snprintf(outbuf+nuse,blen-nuse,
"\"%s\",\n", sqlite3_column_text(s,i));
break;
case SQLITE_BLOB:
nuse+=snprintf(outbuf+nuse,blen-nuse,"\"");
nuse+=b64encode((char*) sqlite3_column_blob(s,i),
sqlite3_column_bytes(s,i),
outbuf+nuse,blen-nuse);
nuse+=snprintf(outbuf+nuse,blen-nuse,"\",\n");
}
}
nuse-=2; // trailing ',\n'
nuse+=snprintf(outbuf+nuse,blen-nuse, "\n\t},\n");
if( blen < nuse ) {
printf("buffer overflow\n");
break;
}
}
if(i&&res==SQLITE_DONE) nuse-=2; //trailing ',\n'
nuse+=snprintf(outbuf+nuse,blen-nuse,"\n]\n");
if(used) *used=nuse;
return res;
}