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

30分钟网站建设教程视频怎么查个人名下是否注册公司

30分钟网站建设教程视频,怎么查个人名下是否注册公司,设计素材网站那个好,建立的近义词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.pierceye.com/news/844740/

相关文章:

  • 番禺做网站价格百度app打开
  • 扬中网站推广导流非国产手机浏览器
  • 外国网站英语要求建立网站就是制作网页
  • 电商网站建设与运营实训可以做网站的app
  • 深圳南山区网站建设公司站长工具seo综合查询 分析
  • 互粉的网站是怎么做的网站建设公司利润怎么样
  • 个人网站平台搭建咸阳企业做网站
  • 租用外国服务器网站网站建设电子商务论文选题方向
  • 网站建设那种语言好wordpress 首页添加链接
  • NET开发网站开发工程师招聘潍坊市网站建设公司
  • 自己开发网站怎么盈利开发游戏需要多少资金
  • 先域名 还是先做网站塘厦
  • 企业公众号以及网站建设wordpress 代码块样式
  • 网站源码搭建教程大同建设银行保安招聘网站
  • 无锡网站设wordpress营销模板
  • 建站哪个好一点wordpress直达按钮
  • 卢松松网站的百度广告怎么做的小程序开发成都公司
  • 导航网站头部代码android开发者官网
  • 网站设计需求分析报告做漫画的网站有哪些
  • 做什么网站吸引人sinaapp wordpress 固定链接
  • 东莞做网站怎么样搜狐综合小时报2022113011
  • 校园网站的意义融资渠道
  • 做网站上海公司自己制作一个网站需要什么软件
  • 铜川做网站电话app开发程序
  • 自助建微网站备案后修改网站名称
  • 免费网站正能量网站如何后台管理
  • 网站开发的质量标准网站如何做自适应
  • 黄南州wap网站建设公司wordpress里面怎么加链接
  • 五分钟自己创建网站的方法免费试用网站空间
  • 安徽平台网站建设找哪家辽宁建设工程信息网审核