/* * CStoreTable checks if the given table name belongs to a foreign columnar store * table. If it does, the function returns true. Otherwise, it returns false. */ static bool CStoreTable(RangeVar *rangeVar) { bool cstoreTable = false; Relation relation = heap_openrv(rangeVar, AccessShareLock); Oid relationId = RelationGetRelid(relation); char relationKind = get_rel_relkind(relationId); if (relationKind == RELKIND_FOREIGN_TABLE) { ForeignTable *foreignTable = GetForeignTable(relationId); ForeignServer *server = GetForeignServer(foreignTable->serverid); ForeignDataWrapper *foreignDataWrapper = GetForeignDataWrapper(server->fdwid); char *foreignWrapperName = foreignDataWrapper->fdwname; if (strncmp(foreignWrapperName, CSTORE_FDW_NAME, NAMEDATALEN) == 0) { cstoreTable = true; } } heap_close(relation, AccessShareLock); return cstoreTable; }
/* * pg_get_extensiondef_string finds the foreign data wrapper that corresponds to * the given foreign tableId, and checks if an extension owns this foreign data * wrapper. If it does, the function returns the extension's definition. If not, * the function returns null. */ char * pg_get_extensiondef_string(Oid tableRelationId) { ForeignTable *foreignTable = GetForeignTable(tableRelationId); ForeignServer *server = GetForeignServer(foreignTable->serverid); ForeignDataWrapper *foreignDataWrapper = GetForeignDataWrapper(server->fdwid); StringInfoData buffer = { NULL, 0, 0, 0 }; Oid classId = ForeignDataWrapperRelationId; Oid objectId = server->fdwid; Oid extensionId = getExtensionOfObject(classId, objectId); if (OidIsValid(extensionId)) { char *extensionName = get_extension_name(extensionId); Oid extensionSchemaId = get_extension_schema(extensionId); char *extensionSchema = get_namespace_name(extensionSchemaId); initStringInfo(&buffer); appendStringInfo(&buffer, "CREATE EXTENSION IF NOT EXISTS %s WITH SCHEMA %s", quote_identifier(extensionName), quote_identifier(extensionSchema)); } else { ereport(NOTICE, (errmsg("foreign-data wrapper \"%s\" does not have an " "extension defined", foreignDataWrapper->fdwname))); } return (buffer.data); }
/* * pg_get_serverdef_string finds the foreign server that corresponds to the * given foreign tableId, and returns this server's definition. */ char * pg_get_serverdef_string(Oid tableRelationId) { ForeignTable *foreignTable = GetForeignTable(tableRelationId); ForeignServer *server = GetForeignServer(foreignTable->serverid); ForeignDataWrapper *foreignDataWrapper = GetForeignDataWrapper(server->fdwid); StringInfoData buffer = { NULL, 0, 0, 0 }; initStringInfo(&buffer); appendStringInfo(&buffer, "CREATE SERVER %s", quote_identifier(server->servername)); if (server->servertype != NULL) { appendStringInfo(&buffer, " TYPE %s", quote_literal_cstr(server->servertype)); } if (server->serverversion != NULL) { appendStringInfo(&buffer, " VERSION %s", quote_literal_cstr(server->serverversion)); } appendStringInfo(&buffer, " FOREIGN DATA WRAPPER %s", quote_identifier(foreignDataWrapper->fdwname)); /* append server options, if any */ AppendOptionListToString(&buffer, server->options); return (buffer.data); }
/* * GetForeignDataWrapperByName - look up the foreign-data wrapper * definition by name. */ ForeignDataWrapper * GetForeignDataWrapperByName(const char *fdwname, bool missing_ok) { Oid fdwId = GetForeignDataWrapperOidByName(fdwname, missing_ok); if (!OidIsValid(fdwId) && missing_ok) return NULL; return GetForeignDataWrapper(fdwId); }
/* * GetForeignDataWrapperByName - look up the foreign-data wrapper * definition by name. */ ForeignDataWrapper * GetForeignDataWrapperByName(const char *fdwname, bool missing_ok) { Oid fdwId = get_foreign_data_wrapper_oid(fdwname, missing_ok); if (!OidIsValid(fdwId)) return NULL; return GetForeignDataWrapper(fdwId); }
/* * CStoreTable returns true if the given relationId belongs to a foreign cstore * table, otherwise it returns false. */ bool CStoreTable(Oid relationId) { bool cstoreTable = false; char relationKind = get_rel_relkind(relationId); if (relationKind == RELKIND_FOREIGN_TABLE) { ForeignTable *foreignTable = GetForeignTable(relationId); ForeignServer *server = GetForeignServer(foreignTable->serverid); ForeignDataWrapper *foreignDataWrapper = GetForeignDataWrapper(server->fdwid); if (strncmp(foreignDataWrapper->fdwname, CSTORE_FDW_NAME, NAMEDATALEN) == 0) { cstoreTable = true; } } return cstoreTable; }
wxString pgForeignServer::GetSql(ctlTree *browser) { if (sql.IsNull()) { sql = wxT("-- Server: ") + GetQuotedFullIdentifier() + wxT("\n\n") + wxT("-- DROP SERVER ") + GetQuotedFullIdentifier() + wxT(";") + wxT("\n\nCREATE SERVER ") + GetQuotedFullIdentifier() + wxT("\n FOREIGN DATA WRAPPER ") + qtIdent(GetForeignDataWrapper()->GetName()); if (!GetType().IsEmpty()) sql += wxT("\n TYPE ") + qtDbString(GetType()); if (!GetVersion().IsEmpty()) sql += wxT("\n VERSION ") + qtDbString(GetVersion()); if (!GetOptions().IsEmpty()) sql += wxT("\n OPTIONS (") + GetCreateOptions() + wxT(")"); sql += wxT(";\n") + GetOwnerSql(8, 4, wxT("SERVER ") + GetQuotedFullIdentifier()) + GetGrant(wxT("U"), wxT("FOREIGN SERVER ") + GetQuotedFullIdentifier()); } return sql; }