PostgreSQL数据库扩展包——原理get_extension_script_filename扩展SQL文件解析

落日映苍穹つ 2022-10-13 01:59 293阅读 0赞
  1. 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) {

    1. char *result;
    2. char *scriptdir;
    3. scriptdir = get_extension_script_directory(control);
    4. result = (char *) palloc(MAXPGPATH);
    5. if (from_version)
    6. snprintf(result, MAXPGPATH, "%s/%s--%s--%s.sql", scriptdir, control->name, from_version, version);
    7. else
    8. snprintf(result, MAXPGPATH, "%s/%s--%s.sql", scriptdir, control->name, version);
    9. pfree(scriptdir);
    10. return result;

    }

    static char get_extension_script_directory(ExtensionControlFile control) {

    1. char sharepath[MAXPGPATH];
    2. char *result;
    3. /* The directory parameter can be omitted, absolute, or relative to the installation's share directory. */
    4. if (!control->directory) return get_extension_control_directory();
    5. if (is_absolute_path(control->directory)) return pstrdup(control->directory);
    6. get_share_path(my_exec_path, sharepath);
    7. result = (char *) palloc(MAXPGPATH);
    8. snprintf(result, MAXPGPATH, "%s/%s", sharepath, control->directory);
    9. return result;

    }

调用get_extension_script_filename函数后,后续处理如下:

  1. get_ext_ver_list():遍历所有.sql文件获取所有版本节点。
  2. find_install_path():根据目标节点选择最短路径以及相对应的起始节点。
  3. find_update_path():最短路径算法Dijkstra的实现。

    filename = get_extension_script_filename(pcontrol, NULL, versionName);

    1. /* Look for best way to install this version */
    2. List *evi_list;
    3. ExtensionVersionInfo *evi_start;
    4. ExtensionVersionInfo *evi_target;
    5. /* Extract the version update graph from the script directory */
    6. evi_list = get_ext_ver_list(pcontrol);
    7. /* Identify the target version */
    8. evi_target = get_ext_ver_info(versionName, &evi_list);
    9. /* Identify best path to reach target */
    10. evi_start = find_install_path(evi_list, evi_target, &updateVersions);
    11. /* Fail if no path ... */
    12. 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)));
    13. /* Otherwise, install best starting point and then upgrade */
    14. versionName = evi_start->name;

发表评论

表情:
评论列表 (有 0 条评论,293人围观)

还没有评论,来说两句吧...

相关阅读

    相关 postgresql扩展Geometry类型

    【需求】:最近开发项目的过程中,需要用到Geometry类型,所以对与Geometry对象进行了一点点学习。在数据库中, 地理坐标系类型是 geography;投影坐标系的类型