mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-31 10:30:33 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			200 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			200 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  *	pg_upgrade_support.c
 | |
|  *
 | |
|  *	server-side functions to set backend global variables
 | |
|  *	to control oid and relfilenode assignment, and do other special
 | |
|  *	hacks needed for pg_upgrade.
 | |
|  *
 | |
|  *	Copyright (c) 2010-2011, PostgreSQL Global Development Group
 | |
|  *	contrib/pg_upgrade_support/pg_upgrade_support.c
 | |
|  */
 | |
| 
 | |
| #include "postgres.h"
 | |
| 
 | |
| #include "fmgr.h"
 | |
| #include "catalog/dependency.h"
 | |
| #include "catalog/namespace.h"
 | |
| #include "catalog/pg_class.h"
 | |
| #include "catalog/pg_type.h"
 | |
| #include "commands/extension.h"
 | |
| #include "miscadmin.h"
 | |
| #include "utils/array.h"
 | |
| #include "utils/builtins.h"
 | |
| 
 | |
| /* THIS IS USED ONLY FOR PG >= 9.0 */
 | |
| 
 | |
| #ifdef PG_MODULE_MAGIC
 | |
| PG_MODULE_MAGIC;
 | |
| #endif
 | |
| 
 | |
| extern PGDLLIMPORT Oid binary_upgrade_next_pg_type_oid;
 | |
| extern PGDLLIMPORT Oid binary_upgrade_next_array_pg_type_oid;
 | |
| extern PGDLLIMPORT Oid binary_upgrade_next_toast_pg_type_oid;
 | |
| 
 | |
| extern PGDLLIMPORT Oid binary_upgrade_next_heap_pg_class_oid;
 | |
| extern PGDLLIMPORT Oid binary_upgrade_next_index_pg_class_oid;
 | |
| extern PGDLLIMPORT Oid binary_upgrade_next_toast_pg_class_oid;
 | |
| 
 | |
| extern PGDLLIMPORT Oid binary_upgrade_next_pg_enum_oid;
 | |
| extern PGDLLIMPORT Oid binary_upgrade_next_pg_authid_oid;
 | |
| 
 | |
| Datum		set_next_pg_type_oid(PG_FUNCTION_ARGS);
 | |
| Datum		set_next_array_pg_type_oid(PG_FUNCTION_ARGS);
 | |
| Datum		set_next_toast_pg_type_oid(PG_FUNCTION_ARGS);
 | |
| 
 | |
| Datum		set_next_heap_pg_class_oid(PG_FUNCTION_ARGS);
 | |
| Datum		set_next_index_pg_class_oid(PG_FUNCTION_ARGS);
 | |
| Datum		set_next_toast_pg_class_oid(PG_FUNCTION_ARGS);
 | |
| 
 | |
| Datum		set_next_pg_enum_oid(PG_FUNCTION_ARGS);
 | |
| Datum		set_next_pg_authid_oid(PG_FUNCTION_ARGS);
 | |
| 
 | |
| Datum		create_empty_extension(PG_FUNCTION_ARGS);
 | |
| 
 | |
| PG_FUNCTION_INFO_V1(set_next_pg_type_oid);
 | |
| PG_FUNCTION_INFO_V1(set_next_array_pg_type_oid);
 | |
| PG_FUNCTION_INFO_V1(set_next_toast_pg_type_oid);
 | |
| 
 | |
| PG_FUNCTION_INFO_V1(set_next_heap_pg_class_oid);
 | |
| PG_FUNCTION_INFO_V1(set_next_index_pg_class_oid);
 | |
| PG_FUNCTION_INFO_V1(set_next_toast_pg_class_oid);
 | |
| 
 | |
| PG_FUNCTION_INFO_V1(set_next_pg_enum_oid);
 | |
| PG_FUNCTION_INFO_V1(set_next_pg_authid_oid);
 | |
| 
 | |
| PG_FUNCTION_INFO_V1(create_empty_extension);
 | |
| 
 | |
| 
 | |
| Datum
 | |
| set_next_pg_type_oid(PG_FUNCTION_ARGS)
 | |
| {
 | |
| 	Oid			typoid = PG_GETARG_OID(0);
 | |
| 
 | |
| 	binary_upgrade_next_pg_type_oid = typoid;
 | |
| 
 | |
| 	PG_RETURN_VOID();
 | |
| }
 | |
| 
 | |
| Datum
 | |
| set_next_array_pg_type_oid(PG_FUNCTION_ARGS)
 | |
| {
 | |
| 	Oid			typoid = PG_GETARG_OID(0);
 | |
| 
 | |
| 	binary_upgrade_next_array_pg_type_oid = typoid;
 | |
| 
 | |
| 	PG_RETURN_VOID();
 | |
| }
 | |
| 
 | |
| Datum
 | |
| set_next_toast_pg_type_oid(PG_FUNCTION_ARGS)
 | |
| {
 | |
| 	Oid			typoid = PG_GETARG_OID(0);
 | |
| 
 | |
| 	binary_upgrade_next_toast_pg_type_oid = typoid;
 | |
| 
 | |
| 	PG_RETURN_VOID();
 | |
| }
 | |
| 
 | |
| Datum
 | |
| set_next_heap_pg_class_oid(PG_FUNCTION_ARGS)
 | |
| {
 | |
| 	Oid			reloid = PG_GETARG_OID(0);
 | |
| 
 | |
| 	binary_upgrade_next_heap_pg_class_oid = reloid;
 | |
| 
 | |
| 	PG_RETURN_VOID();
 | |
| }
 | |
| 
 | |
| Datum
 | |
| set_next_index_pg_class_oid(PG_FUNCTION_ARGS)
 | |
| {
 | |
| 	Oid			reloid = PG_GETARG_OID(0);
 | |
| 
 | |
| 	binary_upgrade_next_index_pg_class_oid = reloid;
 | |
| 
 | |
| 	PG_RETURN_VOID();
 | |
| }
 | |
| 
 | |
| Datum
 | |
| set_next_toast_pg_class_oid(PG_FUNCTION_ARGS)
 | |
| {
 | |
| 	Oid			reloid = PG_GETARG_OID(0);
 | |
| 
 | |
| 	binary_upgrade_next_toast_pg_class_oid = reloid;
 | |
| 
 | |
| 	PG_RETURN_VOID();
 | |
| }
 | |
| 
 | |
| Datum
 | |
| set_next_pg_enum_oid(PG_FUNCTION_ARGS)
 | |
| {
 | |
| 	Oid			enumoid = PG_GETARG_OID(0);
 | |
| 
 | |
| 	binary_upgrade_next_pg_enum_oid = enumoid;
 | |
| 
 | |
| 	PG_RETURN_VOID();
 | |
| }
 | |
| 
 | |
| Datum
 | |
| set_next_pg_authid_oid(PG_FUNCTION_ARGS)
 | |
| {
 | |
| 	Oid			authoid = PG_GETARG_OID(0);
 | |
| 
 | |
| 	binary_upgrade_next_pg_authid_oid = authoid;
 | |
| 	PG_RETURN_VOID();
 | |
| }
 | |
| 
 | |
| Datum
 | |
| create_empty_extension(PG_FUNCTION_ARGS)
 | |
| {
 | |
| 	text	   *extName = PG_GETARG_TEXT_PP(0);
 | |
| 	text	   *schemaName = PG_GETARG_TEXT_PP(1);
 | |
| 	bool		relocatable = PG_GETARG_BOOL(2);
 | |
| 	text	   *extVersion = PG_GETARG_TEXT_PP(3);
 | |
| 	Datum		extConfig;
 | |
| 	Datum		extCondition;
 | |
| 	List	   *requiredExtensions;
 | |
| 
 | |
| 	if (PG_ARGISNULL(4))
 | |
| 		extConfig = PointerGetDatum(NULL);
 | |
| 	else
 | |
| 		extConfig = PG_GETARG_DATUM(4);
 | |
| 
 | |
| 	if (PG_ARGISNULL(5))
 | |
| 		extCondition = PointerGetDatum(NULL);
 | |
| 	else
 | |
| 		extCondition = PG_GETARG_DATUM(5);
 | |
| 
 | |
| 	requiredExtensions = NIL;
 | |
| 	if (!PG_ARGISNULL(6))
 | |
| 	{
 | |
| 		ArrayType  *textArray = PG_GETARG_ARRAYTYPE_P(6);
 | |
| 		Datum	   *textDatums;
 | |
| 		int			ndatums;
 | |
| 		int			i;
 | |
| 
 | |
| 		deconstruct_array(textArray,
 | |
| 						  TEXTOID, -1, false, 'i',
 | |
| 						  &textDatums, NULL, &ndatums);
 | |
| 		for (i = 0; i < ndatums; i++)
 | |
| 		{
 | |
| 			text	   *txtname = DatumGetTextPP(textDatums[i]);
 | |
| 			char	   *extName = text_to_cstring(txtname);
 | |
| 			Oid			extOid = get_extension_oid(extName, false);
 | |
| 
 | |
| 			requiredExtensions = lappend_oid(requiredExtensions, extOid);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	InsertExtensionTuple(text_to_cstring(extName),
 | |
| 						 GetUserId(),
 | |
| 					   get_namespace_oid(text_to_cstring(schemaName), false),
 | |
| 						 relocatable,
 | |
| 						 text_to_cstring(extVersion),
 | |
| 						 extConfig,
 | |
| 						 extCondition,
 | |
| 						 requiredExtensions);
 | |
| 
 | |
| 	PG_RETURN_VOID();
 | |
| }
 |