sql源码分享网站 sql数据库源码

大家好,今天小编来为大家解答sql源码分享网站这个问题,sql数据库源码很多人还不知道,现在让我们一起来看看吧!

PostgreSQL是一个功能强大的开源关系数据库管理系统。它使用附加功能扩展了SQL语言。DBMS的定义不仅在于其性能和开箱即用的功能,还在于其支持定制/附加用户特定功能的能力。其中一些功能可能采用数据库结构或模块的形式,如存储过程或函数,但它们的范围通常仅限于DBMS公开的功能。例如,将如何编写驻留在你的DBMS中的自定义查询分析应用程序?

推荐:用NSDT设计器快速搭建可编程3D场景。

为了支持这些选项,PostgreSQL提供了一个可插入的架构,允许你安装扩展(extension)。扩展可能包括配置(控制)文件、SQL文件的组合和动态可加载的库。

这意味着你可以根据扩展的定义指南编写自己的代码并将其插入PostgreSQL实例,而无需更改实际的PostgreSQL代码树。根据定义,扩展扩展了PostgreSQL的功能,但不仅如此,它还使你能够与外部实体进行交互。这些外部实体可以是其他数据库管理系统,如ClickHouse、Mongo或HDF(通常称为外部数据包装器),或其他解释器或编译器(因此允许我们用另一种语言编写数据库功能,如Java、Python、Perl或TCL,ETC。)。扩展的另一个潜在用例是代码混淆,它允许你保护你的超级机密代码免遭窥探。

1、开发自己的PostgreSQL扩展

要构建自己的扩展,不需要完整的PostgreSQL代码库。可以使用已安装的PostgreSQL构建和安装扩展(它可能需要您安装develRPM或Debian软件包)。有关扩展的详细信息,请参阅PostgreSQL的官方文档。在PostgreSQL源代码的contrib目录中有许多可用于不同功能的扩展。除了contrib目录之外,人们还在编写可在Internet上轻松获得但目前不属于PostgreSQL源代码树的扩展。pg_stat_statements、PL/pgSQL和PostGIS是最著名或使用最广泛的扩展示例。

一般可用的PostgreSQL扩展可以分为四个主要类别:

添加对新语言扩展的支持(PL/pgSQL、PL/Python和PL/Java)可以在其中引入新的数据类型扩展((Hstore、cube和hstore)杂项扩展(contrib文件夹有很多杂项扩展)外部数据包装器扩展(postgres_fdw、mysqldb_fdw、clickhousedb_fdw)

构建扩展需要四种基本文件类型:

Makefile:它使用PGXSPostgreSQL的扩展构建基础设施。控制文件:携带有关扩展名的信息。SQL文件:如果扩展有任何SQL代码,它可能驻留在表单SQL文件中(可选)C代码:我们要构建的共享对象(可选)。

2、PostgreSQL扩展的makefile

要编译C代码,我们需要一个makefile。这是一个非常简单的makefile,除了“PGXS”,它是PostgreSQL用于创建扩展的基础makefile。“PGXS”的包含是通过调用带有“–pgxs”标志的pg_config二进制文件来完成的。该文件的详细信息可以在GitHub上找到。

这是一个示例makefile,可用于编译C代码。

EXTENSION=log\nMODULE_big=log\nDATA=log–0.0.1.sql\nOBJS=log.o\nPG_CONFIG=pg_config\nPGXS:=$(shell$(PG_CONFIG)–pgxs)\ninclude$(PGXS)

3、PostgreSQL扩展的控制文件

此文件必须命名为[EXTENSIONNAME].control。控制文件可以包含许多选项,这些选项可以在官方文档中找到。但在这个例子中,我使用了一些基本选项。

comments:关于扩展的注解。default_version:这是扩展的SQL版本。SQL文件的名称在文件名中包含此信息。relocatable:是否可以将包含的对象移动到不同的架构(schema)中。module_pathname:该信息被替换为实际的lib文件路径。

comment=&39;default_version=&39;\nrelocatable=true\nmodule_pathname=&39;

可以使用psql命令\\dxpsql查看文件的内容。

postgres=39;MODULE_PATHNAME&39;pg_all_queries&include&34;\n/*OSIncludes*/\n/*PostgreSQLIncludes*/\nPG_MODULE_MAGIC;\nvoid_PG_init(void);\nvoid_PG_fini(void);\nDatumpg_all_queries(PG_FUNCTION_ARGS);\nPG_FUNCTION_INFO_V1(pg_all_queries);\nstaticvoidprocess_utility(PlannedStmt*pstmt,constchar*queryString,ProcessUtilityContextcontext,ParamListInfoparams,QueryEnvironment*queryEnv,DestReceiver*dest,char*completionTag);

你需要为扩展包含postgres.h。可以根据需要包括其他PostgreSQL。PG_MODULE_MAGIC是一个宏,你需要将其包含在C文件中以进行扩展。_PG_init和_PG_fini分别是加载或卸载扩展时调用的函数。

下面是一个扩展的加载和卸载函数的示例。

void_PG_init(void)\n{\n/*…Ccodehereattimeofextensionloading…*/\nProcessUtility_hook=process_utility;\n}\n\nVoid_PG_fini(void)\n{\n/*…Ccodehereattimeofextensionunloading…*/\n}

下面是一个回调函数的示例,可以在调用实用程序语句时调用该回调函数,例如任何DDL语句。“queryString”变量包含实际的查询文本。

staticvoidprocess_utility(PlannedStmt*pstmt,\nconstchar*queryString,\nProcessUtilityContextcontext,\nParamListInfoparams,\nQueryEnvironment*queryEnv,DestReceiver*dest,\nchar*completionTag)\n{\n/*…Ccodehere…*/\nstandard_ProcessUtility(pstmt,\nqueryString,\ncontext,\nparams,\nqueryEnv,\ndest,\ncompletionTag);\n/*…Ccodehere…*/\n}

最后是一个通过用户定义的SQL函数调用的C函数示例。这会在内部调用共享对象中包含的C函数。

Datumpg_all_queries(PG_FUNCTION_ARGS)\n{\n/*…Ccodehere…*/\ntupstore=tuplestore_begin_heap(true,false,work_mem);\n/*…Ccodehere…*/\nvalues[0]=CStringGetTextDatum(query);\nvalues[1]=CStringGetTextDatum(pid);\n/*…Ccodehere…*/\ntuplestore_donestoring(tupstore);\nreturn(Datum)0;\n}

6、PostgrepSQL扩展的编译安装

编译前,如果系统路径中没有pg_config,需要设置PostgreSQL的bin目录的PATH:

exportPATH=/usr/local/pgsql/bin:$PATH

构建PostgrepSQL扩展:

makeUSE_PGXS=1

安装PostgrepSQL扩展:

makeUSE_PGXS=1install

7、PostgreSQL扩展的输出

我们现在可以通过一个简单的SQL查询来使用我们的扩展。以下是直接来自用C编程语言编写的扩展的输出。

postgres=#select*frompg_all_queries();\nquery|pid\n————————–+|——\ncreatetablefoo(aint);+|8196\ncreatetablebar(aint);+|8196\ndroptablefoo;+|8196\n(3rows)

8、结束语

我希望这个示例可以作为你创建更多有用的PostgreSQL扩展的起点,这些扩展不仅可以帮助您和您的公司,还可以让你有机会分享和帮助PostgreSQL社区发展。

完整的示例可以在Github上找到。

原文链接:http://www.bimant.com/blog/postgresql-extension-dev-tutorial/

文章到此结束,如果本次分享的sql源码分享网站和sql数据库源码的问题解决了您的问题,那么我们由衷的感到高兴!

Published by

风君子

独自遨游何稽首 揭天掀地慰生平