mirror of https://github.com/citusdata/citus.git
114 lines
3.0 KiB
C
114 lines
3.0 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* test/src/dependency.c
|
|
*
|
|
* This file contains functions to exercise dependency resolution for objects.
|
|
*
|
|
* Copyright (c) Citus Data, Inc.
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#include "postgres.h"
|
|
#include "c.h"
|
|
#include "fmgr.h"
|
|
|
|
#include "distributed/listutils.h"
|
|
#include "distributed/metadata/dependency.h"
|
|
#include "distributed/metadata_cache.h"
|
|
#include "distributed/tuplestore.h"
|
|
|
|
|
|
PG_FUNCTION_INFO_V1(citus_get_all_dependencies_for_object);
|
|
PG_FUNCTION_INFO_V1(citus_get_dependencies_for_object);
|
|
|
|
|
|
/*
|
|
* citus_get_all_dependencies_for_object(classid oid, objid oid, objsubid int)
|
|
*
|
|
* citus_get_all_dependencies_for_object gets an object and returns all of its
|
|
* dependencies irrespective of whether the dependencies are already distributed
|
|
* or not.
|
|
*
|
|
* This is to emulate what Citus would qualify as dependency when adding a new
|
|
* node.
|
|
*/
|
|
Datum
|
|
citus_get_all_dependencies_for_object(PG_FUNCTION_ARGS)
|
|
{
|
|
CheckCitusVersion(ERROR);
|
|
|
|
Oid classid = PG_GETARG_OID(0);
|
|
Oid objid = PG_GETARG_OID(1);
|
|
int32 objsubid = PG_GETARG_INT32(2);
|
|
|
|
TupleDesc tupleDescriptor = NULL;
|
|
Tuplestorestate *tupleStore = SetupTuplestore(fcinfo, &tupleDescriptor);
|
|
|
|
ObjectAddress address = { 0 };
|
|
ObjectAddressSubSet(address, classid, objid, objsubid);
|
|
|
|
List *dependencies = GetAllSupportedDependenciesForObject(&address);
|
|
ObjectAddress *dependency = NULL;
|
|
foreach_ptr(dependency, dependencies)
|
|
{
|
|
Datum values[3];
|
|
bool isNulls[3];
|
|
|
|
memset(values, 0, sizeof(values));
|
|
memset(isNulls, 0, sizeof(isNulls));
|
|
|
|
values[0] = ObjectIdGetDatum(dependency->classId);
|
|
values[1] = ObjectIdGetDatum(dependency->objectId);
|
|
values[2] = Int32GetDatum(dependency->objectSubId);
|
|
|
|
tuplestore_putvalues(tupleStore, tupleDescriptor, values, isNulls);
|
|
}
|
|
|
|
PG_RETURN_VOID();
|
|
}
|
|
|
|
|
|
/*
|
|
* citus_get_dependencies_for_object(classid oid, objid oid, objsubid int)
|
|
*
|
|
* citus_get_dependencies_for_object gets an object and returns all of its
|
|
* dependencies that are not already distributed.
|
|
*
|
|
* This is to emulate what Citus would qualify as dependency when creating
|
|
* a new object.
|
|
*/
|
|
Datum
|
|
citus_get_dependencies_for_object(PG_FUNCTION_ARGS)
|
|
{
|
|
CheckCitusVersion(ERROR);
|
|
|
|
Oid classid = PG_GETARG_OID(0);
|
|
Oid objid = PG_GETARG_OID(1);
|
|
int32 objsubid = PG_GETARG_INT32(2);
|
|
|
|
TupleDesc tupleDescriptor = NULL;
|
|
Tuplestorestate *tupleStore = SetupTuplestore(fcinfo, &tupleDescriptor);
|
|
|
|
ObjectAddress address = { 0 };
|
|
ObjectAddressSubSet(address, classid, objid, objsubid);
|
|
|
|
List *dependencies = GetDependenciesForObject(&address);
|
|
ObjectAddress *dependency = NULL;
|
|
foreach_ptr(dependency, dependencies)
|
|
{
|
|
Datum values[3];
|
|
bool isNulls[3];
|
|
|
|
memset(values, 0, sizeof(values));
|
|
memset(isNulls, 0, sizeof(isNulls));
|
|
|
|
values[0] = ObjectIdGetDatum(dependency->classId);
|
|
values[1] = ObjectIdGetDatum(dependency->objectId);
|
|
values[2] = Int32GetDatum(dependency->objectSubId);
|
|
|
|
tuplestore_putvalues(tupleStore, tupleDescriptor, values, isNulls);
|
|
}
|
|
|
|
PG_RETURN_VOID();
|
|
}
|