babelfishpg_tds插件 支持了TDS 协议扩展,实现 TDS 客户端-服务器协议
先看插件加载时的函数
c
void
_PG_init(void)
{
//是否已加载
static bool inited = false;
if (inited)
return;
//tds插件必须在shared_preload_libraries中,在数据库启动时即加载
if (!process_shared_preload_libraries_in_progress)
ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
errmsg("babelfishpg_tds must be loaded via shared_preload_libraries")));
//初始化guc参数,见下表
TdsDefineGucs();
//创建了一个插件ptr,暂时未看到具体使用
tds_instr_plugin_ptr = (TdsInstrPlugin **) find_rendezvous_variable("TdsInstrPlugin");
//初始化端口监听等,在postgresql中实现tds协议的核心
pe_init();
//内核中新增了relname_lookup_hook hook,返回保存在tvp_lookup_list中的relid
prev_relname_lookup_hook = relname_lookup_hook;
relname_lookup_hook = tvp_lookup;
/* Shmem hooks */
//共享内存中创建TdsStatus,保存每个连接tds的状况
next_shmem_startup_hook = shmem_startup_hook;
shmem_startup_hook = tds_status_shmem_startup;
prev_shmem_request_hook = shmem_request_hook;
shmem_request_hook = tds_shmem_request;
/* Install our object_access_hook into the chain */
next_object_access_hook = object_access_hook;
//object_access_hook,主要检查是否有权限drop user
object_access_hook = babelfish_object_access;
/* Install our process utility hook into the chain */
next_ProcessUtility = ProcessUtility_hook;
//Utility hook,用于在执行ddl前做额外的权限检查,检查的语句有DropRoleStmt,T_RenameStmt,T_DropdbStmt,T_AlterRoleStmt,T_AlterRoleSetStmt,T_GrantRoleStmt,在执行完检查后执行正常的ProcessUtility,通过调用next_ProcessUtility
ProcessUtility_hook = tdsutils_ProcessUtility;
inited = true;
}
新增guc参数
参数 | GucContext | 说明 | 默认值 |
---|---|---|---|
babelfishpg_tds.port | PGC_POSTMASTER(数据库启动时设置) | tds监听的端口 | 1433 |
babelfishpg_tds.listen_addresses | PGC_POSTMASTER(数据库启动时设置) | tds监听的ip | * |
babelfishpg_tds.unix_socket_directories | PGC_POSTMASTER(数据库启动时设置) | TDS server unix socket directories | NULL |
babelfishpg_tds.unix_socket_permissions | PGC_POSTMASTER(数据库启动时设置) | TDS server unix socket permissions | 0777 |
babelfishpg_tds.unix_socket_group | PGC_POSTMASTER | TDS server unix socket group. | NULL |
babelfishpg_tds.default_server_name | PGC_SIGHUP(数据库启动时设置或者reload触发中断设置) | 默认server name | Microsoft SQL Server |
babelfishpg_tds.product_version | PGC_USERSET(用户可修改) | Product Version returned by Babelfish | default |
babelfishpg_tds.tds_default_numeric_precision | PGC_SIGHUP | 默认numeric精度 | 38 |
babelfishpg_tds.tds_default_numeric_scale | PGC_SIGHUP | 默认numeric范围 | 8 |
babelfishpg_tds.tds_ssl_encrypt | PGC_SIGHUP | ssl加密开关 | false |
babelfishpg_tds.tds_default_protocol_version | PGC_SIGHUP | tds协议版本 | TDS_DEFAULT_VERSION |
babelfishpg_tds.tds_ssl_max_protocol_version | PGC_SIGHUP | ssl协议最大版本 | PG_TLS1_2_VERSION |
babelfishpg_tds.tds_ssl_min_protocol_version | PGC_SIGHUP | ssl协议最小版本 | PG_TLS1_VERSION |
babelfishpg_tds.tds_default_packet_size | PGC_SIGHUP | 发送的packet大小 | 4096 |
babelfishpg_tds.tds_debug_log_level | PGC_SIGHUP | 日志级别 | 1 |
enable_drop_babelfish_role | PGC_USERSET | 是否可以删除一个babelfish role | false |
babelfishpg_tds.trigger_fault_enabled | PGC_SUSET | Enable fault injection triggers | true |