65 char *rel = GetDatabasePath(MyDatabaseId, MyDatabaseTableSpace);
66 std::string path = std::string(DataDir) +
"/" + rel
67 +
"/provsql_table_info.mmap";
70 if(access(path.c_str(), R_OK) != 0)
75 if(SPI_connect() != SPI_OK_CONNECT)
76 provsql_error(
"Cannot connect to SPI while migrating provsql.table_info");
82 for(
unsigned long i = 0; i < legacy.
nbElements(); ++i) {
84 Oid argtypes[4] = { OIDOID, TEXTOID, INT2ARRAYOID, OIDARRAYOID };
90 if(info.
relid == InvalidOid)
92 if(!SearchSysCacheExists1(RELOID, ObjectIdGetDatum(info.
relid)))
95 values[0] = ObjectIdGetDatum(info.
relid);
98 elems = (Datum *) palloc(
sizeof(Datum) *
101 elems[k] = Int16GetDatum(info.
block_key[k]);
102 values[2] = PointerGetDatum(
103 construct_array(elems, info.
block_key_n, INT2OID, 2,
true,
's'));
106 elems = (Datum *) palloc(
sizeof(Datum) *
109 elems[k] = ObjectIdGetDatum(info.
ancestors[k]);
110 values[3] = PointerGetDatum(
111 construct_array(elems, info.
ancestor_n, OIDOID,
sizeof(Oid),
true,
'i'));
114 rc = SPI_execute_with_args(
115 "INSERT INTO provsql.table_info(relid, kind, block_key, ancestors) "
116 "VALUES ($1::regclass, $2, $3, $4) ON CONFLICT (relid) DO NOTHING",
117 4, argtypes, values, NULL,
false, 0);
118 if(rc != SPI_OK_INSERT)
119 provsql_error(
"Cannot insert into provsql.table_info (SPI code %d)", rc);
120 inserted += SPI_processed;
122 }
catch(
const std::exception &e) {
125 path.c_str(), e.what());
129 PG_RETURN_INT64(inserted);