in source/hack_parallel/hack_parallel/heap/hh_shared.c [2662:2709]
CAMLprim value hh_get_dep_sqlite(value ocaml_key) {
CAMLparam1(ocaml_key);
CAMLlocal2(result, cell);
result = Val_int(0); // The empty list
assert(db_filename != NULL);
// Check whether we are in SQL mode
if (*db_filename == '\0') {
// We are not in SQL mode, return empty list
CAMLreturn(result);
}
// Now that we know we are in SQL mode, make sure db connection is made
if (g_db == NULL) {
assert(*db_filename != '\0');
// We are in sql, hence we shouldn't be in the master process,
// since we are not connected yet, soo.. try to connect
assert_not_master();
// SQLITE_OPEN_READONLY makes sure that we throw if the db doesn't exist
assert_sql(
sqlite3_open_v2(db_filename, &g_db, SQLITE_OPEN_READONLY, NULL),
SQLITE_OK);
assert(g_db != NULL);
}
uint32_t* values = NULL;
// The caller is required to pass a 32-bit node ID.
const uint64_t key64 = Long_val(ocaml_key);
query_result_t query_result =
get_dep_sqlite_blob(g_db, key64, &g_get_dep_select_stmt);
// Make sure we don't have malformed output
assert(query_result.size % sizeof(uint32_t) == 0);
size_t count = query_result.size / sizeof(uint32_t);
values = (uint32_t*)query_result.blob;
if (count > 0) {
assert(values != NULL);
}
for (size_t i = 0; i < count; i++) {
cell = caml_alloc_tuple(2);
Field(cell, 0) = Val_long(values[i]);
Field(cell, 1) = result;
result = cell;
}
CAMLreturn(result);
}