网站开发技术的发展流程图碑林微网站建设

张小明 2026/1/11 9:24:02
网站开发技术的发展流程图,碑林微网站建设,网络推广方式和方法,广州番禺区房价pg兼容mysql框架之整体架构 前言: 本文简述了openHalo兼容mysql框架的基本思路和逻辑。 1 整体架构图图1#xff08;源于openhalo官方手册#xff09; 2 源码实现 区分mysql和pg的配置参数unvdb_database_mode实现 首先#xff0c;以GUC参数 unvdb_database_mode 作为PG模式…pg兼容mysql框架之整体架构前言: 本文简述了openHalo兼容mysql框架的基本思路和逻辑。1 整体架构图图1源于openhalo官方手册2 源码实现区分mysql和pg的配置参数unvdb_database_mode实现首先以GUC参数 unvdb_database_mode 作为PG模式和MySQL模式的区分参数参数定义 /* GUC variable */ int unvdb_database_mode UNVDBTX_COMPAT_MODE; guc定义 {unvdb_database_mode, PGC_UNVDBSVR, CUSTOM_OPTIONS, gettext_noop(Sets the database compat mode.), NULL, GUC_SUPERUSER_ONLY }, unvdb_database_mode, UNVDBTX_COMPAT_MODE, unvdb_database_mode_options, NULL, NULL, NULL }, static const struct config_enum_entry unvdb_database_mode_options[] { {unvdbtx, UNVDBTX_COMPAT_MODE, false}, {mysql, MYSQL_COMPAT_MODE, false}, {NULL, 0, false} };以unvdb_database_mode_options[]下标作为unvdb_database_mode 值 0为pg模式 ,1为Mysql模式对应枚举类型typedef enum { UNVDBTX_COMPAT_MODE, MYSQL_COMPAT_MODE, } DatabaseCompatModeType;因此通过上述转换在内核源码中以UNVDBTX_COMPAT_MODE,MYSQL_COMPAT_MODE 作为区分pg和mysql的最终依据。在每个关键模块入口用此参数走不同的执行逻辑。3 整体架构实现源码如图1所示 每个模块都设置了标准化引擎在init阶段根据上述所说的unvdb_database_mode 配置情况给相关模块的引擎赋于对应模式pg/mysql以下是初始化代码src/backend/utils/init/postinit.c 1142 /* set default namespace search path */ InitializeSearchPath(); /* initialize client encoding */ InitializeClientEncoding(); /* Initialize this backends session state. */ InitializeSession(); /* Initialize Parser Engine */ InitParserEngine(); /* Initialize Planner Engine */ InitPlannerEngine(); /* Initialize Exector Engine */ InitExecutorEngine(); /* Initialize ADT Extension */ InitADTExt(); /* Initialize fmgr extension */ InitFmgrExtension(); /* report this backend in the PgBackendStatus array */ if (!bootstrap) pgstat_bestart();每个引擎里定义了引擎类型和一些必要的函数指针成员 在初始化阶段会根据模式pg/mysql给引擎赋值不同的对应成员参数。引擎结构体以ParserEngine为例typedef struct ParserRoutine { NodeTag type; bool is_standard_parser; bool need_standard_parser; const ScanKeywordList *keywordlist; const uint16 *keyword_tokens; const uint8 *keyword_categories; raw_parser_function raw_parser; transformStmt_function transformStmt; transformSelectStmt_function transformSelectStmt; transformInsertStmt_function transformInsertStmt; transformDeleteStmt_function transformDeleteStmt; transformUpdateStmt_function transformUpdateStmt; transformSetOperationStmt_function transformSetOperationStmt; transformCallStmt_function transformCallStmt; transformOptionalSelectInto_function transformOptionalSelectInto; transformSetOperationTree_function transformSetOperationTree; analyze_requires_snapshot_function analyze_requires_snapshot; parse_sub_analyze_function parse_sub_analyze; transformGroupClause_function transformGroupClause; transformDistinctClause_function transformDistinctClause; transformOnConflictArbiter_function transformOnConflictArbiter; transformExpr_function transformExpr; transformCreateStmt_function transformCreateStmt; transformAlterTableStmt_function transformAlterTableStmt; assign_query_collations_function assign_query_collations; assign_list_collations_function assign_list_collations; assign_expr_collations_function assign_expr_collations; select_common_collation_function select_common_collation; preTransformWindowAgg_fn preTransformWindowAgg; finalTransformColumnRef_fn finalTransformColumnRef; ParseFuncOrColumn_function ParseFuncOrColumn; func_get_detail_function func_get_detail; make_fn_arguments_function make_fn_arguments; RewriteInterface rewrite; } ParserRoutine;相关引擎初始化代码以ParserEngine为例void InitParserEngine(void) { switch (unvdb_database_mode) { case UNVDBTX_COMPAT_MODE: parserengine GetStandardParserEngine(); break; case MYSQL_COMPAT_MODE: if ((MyProcPort ! NULL) (nodeTag(MyProcPort-protocol_handler) T_MySQLProtocol)) { parserengine GetMysParserEngine(); } else { parserengine GetStandardParserEngine(); } /* parserengine GetMysParserEngine(); */ break; default: parserengine GetStandardParserEngine(); break; } }假设我们是mysql模式unvdb模式相同在初始化函数中 GetMysParserEngine()函数会返回已经赋值了mysql相关函数的引擎因此在后续的调用中 统一采用 例如parserengine-keywordlist 方式就可以访问对应模式下的处理函数。赋值代码/* * MySQL Parser Engine */ static const ParserRoutine mys_parser_engine { .type T_ParserRoutine, .is_standard_parser false, .need_standard_parser true, .keywordlist MysScanKeywords, .keyword_tokens MysScanKeywordTokens, .keyword_categories MysScanKeywordCategories, .transformStmt mys_transformStmt, .transformSelectStmt mys_transformSelectStmt, .transformInsertStmt mys_transformInsertStmt, .transformUpdateStmt mys_transformUpdateStmt, .transformDeleteStmt mys_transformDeleteStmt, .transformCallStmt mys_transformCallStmt, .transformOptionalSelectInto mys_transformOptionalSelectInto, .transformSetOperationStmt mys_transformSetOperationStmt, .transformSetOperationTree mys_transformSetOperationTree, .analyze_requires_snapshot mys_analyze_requires_snapshot, .transformOnConflictArbiter mys_transformOnConflictArbiter, .raw_parser mys_raw_parser, .transformExpr mys_transformExpr, .transformGroupClause mys_transformGroupClause, .transformDistinctClause mys_transformDistinctClause, .transformCreateStmt mys_transformCreateStmt, .transformAlterTableStmt mys_transformAlterTableStmt, .ParseFuncOrColumn mys_ParseFuncOrColumn, .func_get_detail mys_func_get_detail, .make_fn_arguments mys_make_fn_arguments };4 引擎执行源码解析以语法解析为例当以mysql模式运行时代码正常执行进入语法解析阶段。代码如下List * raw_parser(const char *str, RawParseMode mode) { List *raw_parsetree NIL; MemoryContext oldctx CurrentMemoryContext; if (parserengine NULL) parserengine GetStandardParserEngine(); Assert(parserengine ! NULL); Assert(parserengine-raw_parser ! NULL); PG_TRY(); { raw_parsetree parserengine-raw_parser(str, mode); } PG_CATCH();当执行到raw_parsetree parserengine-raw_parser(str, mode); 片段时为进入语法解析的入口此时由于parserengine 已经被赋值为mysql的引擎所以调用的函数raw_parser成员对应的是mys_raw_parser函数。到此正式进入mysql raw_parser 解析逻辑。其他引擎略有出入但总体上实现逻辑是一样的。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

电子商务网站建设 第二版江西建设单位网站

Langchain-Chatchat 支持风电运维知识管理 在风电行业,一线运维人员常常面临一个尴尬的现实:面对风机报错代码 E038,手边堆着厚厚的《故障处理手册》《变桨系统维护指南》和历年巡检记录,却要花上半小时翻找对应章节。更糟的是&am…

张小明 2026/1/7 13:41:12 网站建设

阿里云可以建设网站吗百度云搜索引擎入口网盘搜索神器

摘要 随着高校与企业合作的不断深入,实习信息管理成为高校就业指导工作中的重要环节。传统实习信息发布方式存在信息分散、更新滞后、管理效率低下等问题,难以满足学生和企业的需求。高校实习信息管理系统通过信息化手段整合实习资源,实现信息…

张小明 2026/1/4 21:48:18 网站建设

唐山网站建设学徒wordpress 全局置顶

你有没有过这样的时刻? 看到一片晚霞,心里涌起一种说不清的情绪,想拍下来,却发现照片怎么也还原不了那一刻的氛围; 或者读到一句诗,“落花流水春去也”,脑子里浮现出画面,却不知道怎…

张小明 2026/1/5 1:37:55 网站建设

下载ppt模板免费的网站wordpress商城制作教程

第一章:Open-AutoGLM 手机部署教程在移动设备上部署 Open-AutoGLM 模型,能够实现本地化、低延迟的自然语言处理能力。本章介绍如何将模型适配并运行于主流安卓手机平台,利用 TensorFlow Lite 实现高效推理。环境准备 一台搭载 Android 8.0 或…

张小明 2026/1/5 5:13:46 网站建设

长春建站模板评测做盗版电影网站教程

英国内政部电子签证(eVisa)系统的技术错误正在给英国移民造成"高度的压力、恐惧和疲惫",他们在几乎没有支持的情况下被迫应对移民身份数字化转换,研究发现。这份题为《设计排斥:数字身份识别和移民敌对环境》…

张小明 2026/1/6 7:04:46 网站建设

hemi网站怎么做热图小小影视大全免费高清版

如何快速将B站缓存视频转换为MP4:完整操作指南 【免费下载链接】m4s-converter 将bilibili缓存的m4s转成mp4(读PC端缓存目录) 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 还在为B站缓存的视频无法在其他播放器观看而困扰吗?m4s-…

张小明 2026/1/5 14:06:39 网站建设