当前位置: 首页 > news >正文

阿里云做网站需要些什么条件美做天然居家居网站

阿里云做网站需要些什么条件,美做天然居家居网站,上虞网站建设,西安网络公司网站建设1 概述 PostgreSQL 社区提供了丰富的插件#xff0c;但由于 openGauss 和 PostgreSQL 存在一定的差异#xff0c;如线程/进程模型、系统表和视图等#xff0c;无法直接为 openGauss 所用#xff0c;不可避免的需要在插件上做整改。 本文档主要对 Postgresql 插件移植到 o…1 概述 PostgreSQL 社区提供了丰富的插件但由于 openGauss 和 PostgreSQL 存在一定的差异如线程/进程模型、系统表和视图等无法直接为 openGauss 所用不可避免的需要在插件上做整改。 本文档主要对 Postgresql 插件移植到 openGauss 的过程提供指导说明旨在让开发人员对 PG 插件所需要的修改有一个具体的了解基于该文档可基本实现 PG 插件移植到 openGauss。 2 约束 由于 openGauss 与 PostgreSQL 在内核上存在不少差异这篇文档未能覆盖所有这些差异因此仅依赖该文档有可能无法实现 PG 插件的完全迁移部分差异需要开发者深入内核源码识别然后可将识别出来的差异补充到该博客的第 9 章对应小节的表格中博客对应的 gitee 地址将 PostgreSQL 插件移植到 openGauss 指导具体操作可见 blog 仓库的README.md有任何问题可在博客下方留言讨论。 3 移植步骤 将 PG 插件的代码拷贝到 openGauss 源码的 contrib 目录下 配置环境变量需要将数据库的 bin 和 lib 加在操作系统的环境变量 PATH 和 LD_LIBRARY_PATH 中 到插件目录下执行make make install编译安装插件。 编译成功后到数据库中执行create extension extension_name即可使用。 通常步骤 3 和 4 不会直接成功需要一些必须的修改。下面分类别说明移植 PG 插件所需要做的修改。 4 Makefile 文件 当前有两种方式支持插件编译一种是依赖源码编译一种是用 pgxs 的方式编译支持插件在一个已经安装的数据库服务上进行编译。建议选择前者的方式如果采用后者需要定义 USE_PGXS但是可能出现部分头文件找不到的问题这时候需要到源码拷贝头文件到目标目录。 ifdef USE_PGXS PG_CONFIG pg_config PGXS : $(shell $(PG_CONFIG) --pgxs) include $(PGXS) else subdir contrib/pg_freespacemap top_builddir ../.. include $(top_builddir)/src/Makefile.global include $(top_srcdir)/contrib/contrib-global.mk endif-fPIC 作用于编译阶段告诉编译器产生与位置无关代码(Position-Independent Code)。使用-fPIC可以使得动态库可以被多个程序共享。不加 fPIC 加载的 so要在加载时根据加载到的位置再次重定位。 override CPPFLAGS :$(filter-out -fPIE, $(CPPFLAGS)) -fPIC5 类型转换 ANSI C 规定void 指针可以复制给其他任意类型的指针其他任意类型的指针也可以复制给 void 指针他们之间复制不需要强制类型转换。但是 c不支持需要做强制类型转换。 buffer palloc(MAX_LINESIZE); - buffer (char*)palloc(MAX_LINESIZE);部分 c编译器不支持 const char*到 char*的隐式转换需要做强制类型转换。 6 函数声明 C 语言中并没有重载和类这些特性编译出的符号与 C不同例如 print(int i)不会被编译为_print_int而是直接编译为_print 等。因此如果直接在 C中调用 C 的函数会失败例如调用 print(3)c中实际上会去找_print_int(3)这样就会找不到。加上 extern “C”指示编译器这部分代码按 C 语言来进行编译而不是 C。 extern PGDLLEXPORT Datum orafce_to_char_timestamp(PG_FUNCTION_ARGS); - extern C PGDLLEXPORT Datum orafce_to_char_timestamp(PG_FUNCTION_ARGS);可以通过 nm -D so 文件查看生成的符号。 7 安全函数整改 推荐使用安全函数可见 securec.h并对安全函数的返回值作检查openGauss 定义了几个常用的检查宏如下。 #define check_memcpy_s(r) securec_check_c((r), , ) #define check_memmove_s(r) securec_check_c((r), , ) #define check_memset_s(r) securec_check_c((r), , ) #define check_strcpy_s(r) securec_check_c((r), , ) #define check_strncpy_s(r) securec_check_c((r), , ) #define check_strcat_s(r) securec_check_c((r), , ) #define check_strncat_s(r) securec_check_c((r), , ) #define check_gets_s(r) securec_check_ss_c((r), , ) #define check_sprintf_s(r) securec_check_ss_c((r), , ) #define check_snprintf_s(r) securec_check_ss_c((r), , ) #define check_scanf_s(r) securec_check_ss_c((r), , )下面是安全函数整改的示例。 memcpy(d, u, clen); - check_memcpy_s(memcpy_s(d, strlen(d), u, clen));为了方便和完全地作安全函数整改这里提供一个查找危险函数的正则表达式。 (wmemcpy\()|(wmemove\()|(memmove\()|(wcscpy\()|(wcsncpy\()|(strcat\()|(wcscat\()|(strncat\()|(wcsncat\()|(strtok\()|(wcstok\()|(sprintf\()|(swprintf\()|(vsprintf\()|(vswprintf\()|(snprintf\()|(vsnprintf\()|(vsnprintf_truncated\()|(snprintf_truncated\()|(scanf\()|(wscanf\()|(vscanf\()|(vwscanf\()|(fscanf\()|(fwscanf\()|(vfscanf\()|(vfwscanf\()|(sscanf\()|(swscanf\()|(vsscanf\()|(vswscanf\()|(gets\()|(strcpy\()|(strcpy\()|(strncpy\()|(strncpy\()|(strcat\()|(strncat\()|(memcpy\()|(memcpy\()|(memset\()|(memset\()8 变量转换 对比 PostgreSQLopenGauss 收集了原有的全局变量将其收集在了 g_instance、t_thrd、u_sess分别是全局变量、线程变量和会话变量等结构体内因此需要作相应替换通过编译报错体现需要到内核代码层面查看变量具体存放位置。插件的全局变量可通过 nm -D so | grep ‘B’排查。具体见 7.7 econtext error_context_stack; - econtext t_thrd.log_cxt.error_context_stack;PG 采用进程模型用户会话进来时会创建一个独立的进程去处理此时插件定义的全局变量在该进程内就是唯一的会话变量。而 openGauss 采用线程模型所有会话共享同一份全局变量因此需要将全局变量修改为会话变量。对于只读的全局变量保持原样即可而对于多次修改的变量需要作如下修改。 a. 如果不考虑在线程池模式下使用插件将全局变量修改为 THR_LOCAL 变量即线程变量因为用户会话进来会创建一个独立的线程。 b. 如果需要线程池就需要作额外的修改。线程池模式下一个用户会话可能会切换多个线程单纯的将全局变量改为线程变量在切换线程时会丢失对该变量的修改。openGauss 提供了插件自定义会话变量的方式具体实现如下。以 dblink 为例 内核侧在 u_sess 中定义一个指针数组extension_session_vars_array和标识数组大小的变量extension_session_vars_array_size数组用于存放插件会话变量的结构体。 typedef struct knl_session_attr_common {…uint32 extension_session_vars_array_size;void** extension_session_vars_array; } knl_session_attr_common;插件侧需定义一个全局的下标变量用于获取数组元素并且提供set_extension_index函数内核侧会调用该函数来设置下标。示例如下。 static uint32 dblink_index; void set_extension_index(uint32 index) {dblink_index index; }此外插件侧还需要定义步骤 1 提到的会话变量结构体存放该插件自身所有的会话变量以及提供函数 init_session_vars主要是初始化该结构体并把指针存放在数组的对应下标位置。示例如下。 #include commands/extension.h typedef struct dblink_session_context {remoteConn* pconn;HTAB* remoteConnHash; } dblink_session_context;void init_session_vars(void) {RepallocSessionVarsArrayIfNecessary();dblink_session_context* psc (dblink_session_context*)MemoryContextAllocZero(u_sess-self_mem_cxt, sizeof(dblink_session_context));u_sess-attr.attr_common.extension_session_vars_array[dblink_index] psc;psc-pconn NULL;psc-remoteConnHash NULL; }最终在插件使用会话变量时根据下标到数组中获取对应的结构体指针即可。 dblink_session_context* get_session_context() {if (u_sess-attr.attr_common.extension_session_vars_array[dblink_index] NULL) {init_session_vars();}return (dblink_session_context*)u_sess-attr.attr_common.extension_session_vars_array[dblink_index]; } void example() {remoteConn* pconn get_session_context()-pconn; }具体方案实现可见社区 PRhttps://gitee.com/opengauss/openGauss-server/pulls/1101插件整改可参考其中对dblink的整改。 9 其他 除了上述修改点还存在很多一些较为细节的地方其中包括有 C 和 C的差异例如在 C中 new 关键字不能作标识符等大多数还是 openGauss 和 PostgreSQL 内核上的差异下文会对这些差异作详细说明。此外有些插件可能是基于 PG 内核新特性开发的openGauss 并不支持可以考虑将特性整合到插件必要时修改内核。 下面列举 openGauss 和 PostgreSQLREL_13_STABLE内核上的差异第 2 章中提到该部分需要不断更新完善目前仅列出极少部分。 9.1 API 序号API_01PostgreSQLvoid table_close(Relation relation, LOCKMODE lockmode);openGauss#define heap_close(r,l) relation_close(r,l) void relation_close(Relation relation, LOCKMODE lockmode);作用close any relation差异名称不同 序号API_02PostgreSQLRelation table_open(Oid relationId, LOCKMODE lockmode)openGaussRelation heap_open(Oid relationId, LOCKMODE lockmode, int2 bucketid-1);作用open a heap relation by relation OID差异名称不同openGauss 的 heap_open 增加了一个可选参数 bucketid 9.2 系统表 div stylewidth: 150pt序号/divSYSTAB_01系统表pg_class差异openGauss 新增字段reltoastidxid, reldeltarelid, reldeltaidx, relcudescrelid, relcudescidx, relhasoids, relhaspkey, relcmprs, relhasclusterkey, relrowmovement, parttype, relfrozenxid64, relbucket, relbucketkey PostgreSQL 新增字段relrowsecurity, relforcerowsecurity, relispopulated, relispartition, relrewrite , relminmxid , relpartbound relkind 字段可选值差异PostgreSQL 中用 p 和 I 表示分区表和分区索引openGauss 用字段 parttype 表示。 | | 备注 | 具体描述可见《开发者指南》-系统表和系统视图-系统表-PG_CLASS | 9.3 系统视图 序号SYSVIEW_01系统表pg_tables差异openGauss 新增字段tablecreator, created, last_ddl_time PostgreSQL 新增字段rowsecurity备注具体描述可见《开发者指南》-系统表和系统视图-系统视图-PG_TABLES 9.4 系统函数 9.5 LOCK 9.6 Memory Context 9.7 全局变量 PostgreSQLopenGauss作用域error_context_stackt_thrd.log_cxt.error_context_stackThreadWalSndCaughtUpt_thrd.walsender_cxt.walSndCaughtUpThreaddisable_costg_instance.cost_cxt.disable_costInstancecpu_tuple_costu_sess-attr.attr_sql.cpu_tuple_costcpu_tuple_cost 10 常见错误信息 编译安装时报错dangerous relocation: unsupported relocation 解决方法参考 4.2在 Makefile 中添加下面一句。 override CPPFLAGS :$(filter-out -fPIE, $(CPPFLAGS)) -fPIC 编译安装时报错error: invalid conversion from ‘void’ to ‘char’ [-fpermissive] 解决方法参考 5 类型转换 create extension 时报错could not find function “xxx” in file “xxx.so” 解决方法参考 6 函数声明。
http://www.zqtcl.cn/news/768278/

相关文章:

  • 北京网站建设搜q.479185700模特公司网站模板
  • 网站设置什么意思wordpress 专题页面
  • 网站推广要具备什么购物网站多少钱
  • 重庆免费做网站在线做ppt
  • wordpress固定链接设置404阳江seo优化
  • 响应网站模板下载wordpress恢复网站
  • 公司网站建设的定位语要怎么取网站开发中常见的注册界面
  • 免费企业查询网站wordpress侧边栏加载过慢
  • 网站写好了怎么做后台管理链接是什么意思
  • 低价格制作网站wordpress 注册用户
  • 免费发布租房信息网站wordpress页面回收站
  • 长网页网站信息技术教案 建设我们的网站
  • 免费网站建设可信吗wordpress divi布局
  • 网站百度不收录wordpress偽靜態
  • 沈阳php网站建网站需要学什么
  • WordPress多站点绑定域名百度帐号注册
  • 网站营销队伍网站建设明薇通网络
  • 做网站的公司重庆万网x5 wordpress
  • 印刷设计营销网站网站设置成黑白
  • 百度自助建站官网上海徐汇网站建设
  • 网站定制 北京贵阳网站建设公司哪家好
  • 如何做logo模板下载网站企业策划
  • 合肥做网站的公司讯登欧亚达网站是哪家公司做的
  • 网站模板带有sql后台下载企业网站建设平台的功能
  • 网站推广的实际案例电子商务网站建设的要求
  • 永平建设有限公司网站2023一般纳税人企业所得税怎么算
  • 创业网站推广怎么做简单的网站首页
  • 外贸网站模板 外贸网站制作如何推广宣传一个品牌
  • 中企动力企业邮箱 手机邮箱河南网站建设优化推广
  • 广州seo网站多少钱王野天津音乐广播电台图片