Получить все выходные данные из sqlite3 в C - PullRequest
0 голосов
/ 02 марта 2020

У меня есть таблица с 2 записями:

id hostname     ip           port
1  Raspberry pi 192.168.1.49 22
2  Test         127.0.0.1    22

В моем коде я получаю только первую запись с sqlite3.

У меня есть:

{"id": "1", "hostname": "Raspberry pi", "ip": "192.168.1.49", "port": "22"}

Где вторая запись?

Я пробовал с printf и получаю ту же проблему, это не проблема json.

Есть код:

#include <stdarg.h> /* va_list */
#include <stddef.h> /* NULL */
#include <stdint.h> /* int64_t */
#include <stdlib.h>
#include <string.h> /* memset */
#include <stdio.h>
#include <sqlite3.h>
#include <kcgi.h>
#include <kcgihtml.h>
#include <kcgijson.h>
static int callback(void *ptr, int argc, char **argv, char **azColName) {
    struct kjsonreq *req = (struct kjsonreq *)ptr;
    struct khtmlreq  r;
  int i;
  for(i=0; i<argc; i++){
    kjson_putstringp(req, azColName[i], argv[i] ? argv[i] : "NULL");
  }
}

int
main(void)
{
  struct kreq r;
  struct kjsonreq req;
  const char *page = "index";

  if (khttp_parse(&r, NULL, 0, &page, 1, 0) != KCGI_OK)
    return EXIT_FAILURE;

  khttp_head(&r, kresps[KRESP_STATUS],
    "%s", khttps[KHTTP_200]);
  khttp_head(&r, kresps[KRESP_CONTENT_TYPE],
    "%s", kmimetypes[r.mime]);
  khttp_body(&r);
  kjson_open(&req, &r);
  kjson_obj_open(&req);
        sqlite3 *db;
        char *zErrMsg = 0;
        int rc;
        rc = sqlite3_open("/var/www/MaSSH/databases/massh.db", &db);
        if(rc){
                sqlite3_close(db);
        }
        rc = sqlite3_exec(db, "SELECT * FROM hosts;", callback, &req, &zErrMsg);
        if(rc!= SQLITE_OK){
                sqlite3_free(zErrMsg);
        }
        sqlite3_close(db);
  kjson_obj_close(&req);
  kjson_close(&req);
  khttp_free(&r);
  return EXIT_SUCCESS;
}

1 Ответ

0 голосов
/ 02 марта 2020
#include <sys/types.h> /* size_t, ssize_t */
#include <stdarg.h> /* va_list */
#include <stddef.h> /* NULL */
#include <stdint.h> /* int64_t */
#include <stdlib.h>
#include <string.h> /* memset */
#include <stdio.h>
#include <sqlite3.h>
#include <kcgi.h>
#include <kcgihtml.h>
#include <kcgijson.h>
int
main(void)
{
  struct kreq r;
  struct kjsonreq req;
  const char *page = "index";

  if (khttp_parse(&r, NULL, 0, &page, 1, 0) != KCGI_OK)
    return EXIT_FAILURE;

  khttp_head(&r, kresps[KRESP_STATUS],
    "%s", khttps[KHTTP_200]);
  khttp_head(&r, kresps[KRESP_CONTENT_TYPE],
    "%s", kmimetypes[r.mime]);
  khttp_body(&r);
  kjson_open(&req, &r);
  kjson_obj_open(&req);
  sqlite3 *db;
  sqlite3_stmt *res;
  int rc;
  rc = sqlite3_open("/var/www/MaSSH/databases/massh.db", &db);
  if(rc){
    sqlite3_close(db);
  }
  rc = sqlite3_prepare_v2(db, "SELECT * FROM hosts;", -1, &res, 0);
  while((rc = sqlite3_step(res)) == SQLITE_ROW){
    kjson_objp_open(&req, "host");
    kjson_putstringp(&req, "id", sqlite3_column_text(res,0));
    kjson_putstringp(&req, "hostname", sqlite3_column_text(res,1));
    kjson_putstringp(&req, "ip", sqlite3_column_text(res,2));
    kjson_putstringp(&req, "port", sqlite3_column_text(res,3));
    kjson_obj_close(&req);
  }
  sqlite3_close(db);
  kjson_obj_close(&req);
  kjson_close(&req);
  khttp_free(&r);
  return EXIT_SUCCESS;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...