PostgreSQL数据库扩展包——原理get_extension_script_filename扩展SQL文件解析
filename = get_extension_script_filename(pcontrol, NULL, versionName);
get_extension_script_directory函数获取sharepath/control->directory目录,get_extension_script_filename函数获取:
- from_version为NULL,返回sharepath/control->directory/control->name–version.sql
from_version不为NULL,返回sharepath/control->directory/control->name–from_version–version.sql
get_extension_script_filename获取sql文件名,规则如下:
版本命名的规则:扩展名 +“–”+“版本号”+ .sql (eg:cube–1.2.sql)
版本与版本之间的升级采用“–”连接。(eg:cube–1.2–1.3.sql)
Target 版本由控制文件中的default_version确定。
根据目标版本选择最短路径。static char get_extension_script_filename(ExtensionControlFile control, const char from_version, const char version) {
char *result;
char *scriptdir;
scriptdir = get_extension_script_directory(control);
result = (char *) palloc(MAXPGPATH);
if (from_version)
snprintf(result, MAXPGPATH, "%s/%s--%s--%s.sql", scriptdir, control->name, from_version, version);
else
snprintf(result, MAXPGPATH, "%s/%s--%s.sql", scriptdir, control->name, version);
pfree(scriptdir);
return result;
}
static char get_extension_script_directory(ExtensionControlFile control) {
char sharepath[MAXPGPATH];
char *result;
/* The directory parameter can be omitted, absolute, or relative to the installation's share directory. */
if (!control->directory) return get_extension_control_directory();
if (is_absolute_path(control->directory)) return pstrdup(control->directory);
get_share_path(my_exec_path, sharepath);
result = (char *) palloc(MAXPGPATH);
snprintf(result, MAXPGPATH, "%s/%s", sharepath, control->directory);
return result;
}
调用get_extension_script_filename函数后,后续处理如下:
- get_ext_ver_list():遍历所有.sql文件获取所有版本节点。
- find_install_path():根据目标节点选择最短路径以及相对应的起始节点。
find_update_path():最短路径算法Dijkstra的实现。
filename = get_extension_script_filename(pcontrol, NULL, versionName);
/* Look for best way to install this version */
List *evi_list;
ExtensionVersionInfo *evi_start;
ExtensionVersionInfo *evi_target;
/* Extract the version update graph from the script directory */
evi_list = get_ext_ver_list(pcontrol);
/* Identify the target version */
evi_target = get_ext_ver_info(versionName, &evi_list);
/* Identify best path to reach target */
evi_start = find_install_path(evi_list, evi_target, &updateVersions);
/* Fail if no path ... */
if (evi_start == NULL) ereport(ERROR,(errcode(ERRCODE_INVALID_PARAMETER_VALUE),errmsg("extension \"%s\" has no installation script nor update path for version \"%s\"",pcontrol->name, versionName)));
/* Otherwise, install best starting point and then upgrade */
versionName = evi_start->name;
还没有评论,来说两句吧...