void Open()

in benchmarks/db_bench_sqlite3.cc [421:481]


  void Open() {
    assert(db_ == nullptr);

    int status;
    char file_name[100];
    char* err_msg = nullptr;
    db_num_++;

    // Open database
    std::string tmp_dir;
    Env::Default()->GetTestDirectory(&tmp_dir);
    std::snprintf(file_name, sizeof(file_name), "%s/dbbench_sqlite3-%d.db",
                  tmp_dir.c_str(), db_num_);
    status = sqlite3_open(file_name, &db_);
    if (status) {
      std::fprintf(stderr, "open error: %s\n", sqlite3_errmsg(db_));
      std::exit(1);
    }

    // Change SQLite cache size
    char cache_size[100];
    std::snprintf(cache_size, sizeof(cache_size), "PRAGMA cache_size = %d",
                  FLAGS_num_pages);
    status = sqlite3_exec(db_, cache_size, nullptr, nullptr, &err_msg);
    ExecErrorCheck(status, err_msg);

    // FLAGS_page_size is defaulted to 1024
    if (FLAGS_page_size != 1024) {
      char page_size[100];
      std::snprintf(page_size, sizeof(page_size), "PRAGMA page_size = %d",
                    FLAGS_page_size);
      status = sqlite3_exec(db_, page_size, nullptr, nullptr, &err_msg);
      ExecErrorCheck(status, err_msg);
    }

    // Change journal mode to WAL if WAL enabled flag is on
    if (FLAGS_WAL_enabled) {
      std::string WAL_stmt = "PRAGMA journal_mode = WAL";

      // LevelDB's default cache size is a combined 4 MB
      std::string WAL_checkpoint = "PRAGMA wal_autocheckpoint = 4096";
      status = sqlite3_exec(db_, WAL_stmt.c_str(), nullptr, nullptr, &err_msg);
      ExecErrorCheck(status, err_msg);
      status =
          sqlite3_exec(db_, WAL_checkpoint.c_str(), nullptr, nullptr, &err_msg);
      ExecErrorCheck(status, err_msg);
    }

    // Change locking mode to exclusive and create tables/index for database
    std::string locking_stmt = "PRAGMA locking_mode = EXCLUSIVE";
    std::string create_stmt =
        "CREATE TABLE test (key blob, value blob, PRIMARY KEY(key))";
    if (!FLAGS_use_rowids) create_stmt += " WITHOUT ROWID";
    std::string stmt_array[] = {locking_stmt, create_stmt};
    int stmt_array_length = sizeof(stmt_array) / sizeof(std::string);
    for (int i = 0; i < stmt_array_length; i++) {
      status =
          sqlite3_exec(db_, stmt_array[i].c_str(), nullptr, nullptr, &err_msg);
      ExecErrorCheck(status, err_msg);
    }
  }