query_result_t get_dep_sqlite_blob()

in source/hack_parallel/hack_parallel/heap/hh_shared.c [2613:2659]


query_result_t get_dep_sqlite_blob(
    sqlite3* const db,
    const uint64_t key64,
    sqlite3_stmt** select_stmt) {
  // Extract the 32-bit key from the 64 bits.
  const uint32_t key = (uint32_t)key64;
  assert((key & 0x7FFFFFFF) == key64);

  if (*select_stmt == NULL) {
    const char* sql = "SELECT VALUE_VERTEX FROM DEPTABLE WHERE KEY_VERTEX=?;";
    assert_sql(sqlite3_prepare_v2(db, sql, -1, select_stmt, NULL), SQLITE_OK);
    assert(*select_stmt != NULL);
  } else {
    assert_sql(sqlite3_clear_bindings(*select_stmt), SQLITE_OK);
    assert_sql(sqlite3_reset(*select_stmt), SQLITE_OK);
  }

  assert_sql(sqlite3_bind_int(*select_stmt, 1, key), SQLITE_OK);

  int err_num = sqlite3_step(*select_stmt);
  // err_num is SQLITE_ROW if there is a row to look at,
  // SQLITE_DONE if no results
  if (err_num == SQLITE_ROW) {
    // Means we found it in the table
    // Columns are 0 indexed
    uint32_t* values = (uint32_t*)sqlite3_column_blob(*select_stmt, 0);
    size_t size = (size_t)sqlite3_column_bytes(*select_stmt, 0);
    query_result_t result = {0};
    result.size = size;
    result.blob = values;
    return result;
  } else if (err_num == SQLITE_DONE) {
    // No row found, return "None".
    query_result_t null_result = {0};
    return null_result;
  } else {
    // Remaining cases are SQLITE_BUSY, SQLITE_ERROR, or SQLITE_MISUSE.
    // The first should never happen since we are reading here.
    // Regardless, something went wrong in sqlite3_step, lets crash.
    assert_sql(err_num, SQLITE_ROW);
  }
  // Unreachable.
  assert(0);
  // Return something to satisfy compiler.
  query_result_t null_result = {0};
  return null_result;
}