c ++ sqlite3 запрос на обновление не фиксируется - PullRequest
0 голосов
/ 14 апреля 2020

Я изучаю, как использовать библиотеку sqlite3 для c ++, и пока все хорошо, что мне удалось выполнить запросы SELECT и создать новые таблицы, но кажется, что обновление / вставка не работает:

Как пробный тест, я использую запрос stati c (без переменных):

int rc {0};
char *zErrMsg {0};
sql = "UPDATE tag_list set name = 'foo' where ID=16; " \
      "SELECT * from tag_list";

rc = sqlite3_exec(this->db_ptr, sql, callback, (void*)data, &zErrMsg);

if( rc != SQLITE_OK ) {
    fprintf(stderr, "SQL error: %s\n", zErrMsg);
    sqlite3_free(zErrMsg);
} else {
    fprintf(stdout, "Operation done successfully\n");
}

Моя функция обратного вызова:

static int callback(void *data, int argc, char **argv, char **azColName){
   int i;
   fprintf(stderr, "%s: ", (const char*)data);

   for(i = 0; i<argc; i++) {
      printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
   }
   printf("\n");
   return 0;
}

Вывод:

id = 14
name = computer
last_update = 123

id = 16
name = foo
last_update = 1

Operation done successfully

Когда я запрашиваю базу данных напрямую, это то, что я получаю:

╔════╦══════════╦═════════════╗
║ ID ║   name   ║ Last_update ║
╠════╬══════════╬═════════════╣
║ 14 ║ computer ║         123 ║
║ 16 ║ s        ║           1 ║
╚════╩══════════╩═════════════╝

Я проверил с помощью sqlite3_get_autocommit, и он вернул 1, что, как я понял, означает, что это автоматическая фиксация.

Я могу обновлять строки извне, это просто происходит в коде.

tl; dr: я пытаюсь обновить имя в созданной мной таблице, но похоже, что изменение не передается.

Я надеюсь, что кто-то с большим опытом сталкивался с этим раньше и знает, как это обойти.

1 Ответ

0 голосов
/ 15 апреля 2020

Итак, мне удалось найти мою проблему, ее нет в опубликованном коде вообще.

Моя проблема заключалась в том, что я передал свой указатель sqlite3 другому классу, думая, что это ссылка, а не копия .

Приведенная выше кодовая форма принадлежит моему другому классу, в котором я могу запрашивать данные, но не записывать / изменять.

Как указано в документации по SQLite3 (https://www.sqlite.org/lockingv3.html):

Только один процесс одновременно может удерживать зарезервированную блокировку. Но другие процессы могут продолжать считывать базу данных, пока удерживается блокировка RESERVED.

Код:

main. cpp:

in main() {
 sqlite3 *db_ptr;
 sqlite3_open("test.db",db_ptr);

 ConfigurationManager *config_manager = new ConfigurationManager(db_ptr);
}

ConfigurationManager. cpp:

ConfigurationManager::ConfigurationManager(sqlite3 *db) {
    std::cout << "in constructor" << std::endl;
    this->db_ptr = db;

    if (initialize_db()) {  // initialize_db() creates tables if they don't exist
        std::cout << "Configuration table initialized" << std::endl;
    }


}
int ConfigurationManager::update_rule_last_run(int id) {
    int rc {0};
    char *zErrMsg = 0;
    auto epoch = std::chrono::system_clock::now().time_since_epoch();
    auto epoch_seconds = std::chrono::duration_cast<std::chrono::seconds>(epoch).count();

    std::ostringstream string_stream;
    string_stream << "Update discovery_rules ";
    string_stream << "SET last_run = " << epoch_seconds <<" ";
    string_stream << "Where id = " << id << ";";
    std::string query = string_stream.str();

    std::cout << "- Rule Id " << id << " update command: " << query << std::endl;
    rc = sqlite3_exec(this->db_ptr, query.c_str(), NULL,NULL, &zErrMsg);

    if (rc != SQLITE_OK) {
        std::cout << "Error occured while polling discovery rules: " << zErrMsg << std::endl;
        throw std::exception();
    }

    return 0;
}

Возможное решение (которое я нашел) - создать класс-оболочку для sqlite3 и управлять всеми запросами из него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...