更多"C/C++、PostgreSQL、编译原理、计算机原理、TCP/IP、数据结构&算法、Linux编程”等技术文章更新于公众号: 君子黎
1. libpq是什么?
libpq是一套使用C语言编写的以供(C)程序员访问PostgreSQL后端服务器的库函数集合。通过使用libpq库函数,使客户端能够像psql程序命令一样登录PostgreSQL数据库,并进行相关的系列操作,比如登录、验证、创建表、插入表数据、删除表、向服务端发送查询请求、接收响应请求等等。同时,libpq也是其他几个postgres应用程序接口的底层引擎,包括libpq++(C++)、libpgtcl(Tcl)、Perl和ecpg。
如下图所示,该图展示了使用不同语言实现的客户端去连接并访问PostgreSQL数据库服务器的示例图。其中C语言实现的客户端即为libpq库。
1.1 libpq哪里获取?
libpq库函数嵌套在PostgreSQL源码发行包中。因此,首先需要从PostgreSQL的官方网站下载你所需要的对应发行版本,然后进行解压、编译。详细下载地址和编译过程请阅读 源码编译安装PostgreSQL 。当解压发行包过后,则可得到该PostgreSQL版本对应的libpq库,其位于src/interfaces/ 目录下,如下图所示:
libpq目录下的文件列表即为libpq的各库函数集合定义与实现。通过libpq同级目录的 Makefile文件,可编译得到libpq的客户端程序所必须链接到的libpq动态库(libpq.so)文件。
1.1.1 libpq目录下文件列表
对于PostgreSQL 13.2版本,libpq目录下的共有34个文件,其中两个是目录文件(红色线框标注的文件),另外32个是常规文件,如下图所示:
1.1.2 libpq目录各文件的作用
该目录下的各文件,其具体功能如下所示:
(1) fe-auth.h , fe-auth.c:
这两个文件是“前端(客户端)网络身份验证、授权的”的相关定义与实现。
(2)fe-connect.c
该文件主要实现了“与建立到后端(PostgreSQL服务器)连接”相关的函数的实现。
(3)fe-exec.c
该文件主要实现了“与向后端(PostgreSQL服务器)发送查询相关的函数”的实现。
(4)fe-gssapi-common.h, fe-gssapi-common.c
这两个文件主要实现了“前端(客户端)GSSAPI公共例行程序”的定义和实现。
(5)fe-lobj.c
该文件实现了“前端(客户端)大对象”操作的接口。
(6)fe-misc.c
该文件提供了与“后端(PostgreSQL服务器)常规通信例行程序”不同的细节实现,这里使用了非阻塞模式的套接字,而不是stdout流,这样可以避免不必要的应用程序的阻塞。
(7)fe-print.c
该文件提供了“用于优美地打印查询结果的函数”。 如果你使用过Mongodb的终端pretty()查询命令(eg: db.a.find().pretty()),想必你一定不陌生,它会使终端展示的数据格式更加符合阅读。
(8)fe-protocol2.c, fe-protocol3.c
这两个文件实现了“特定于前端/后端协议版本2/3的函数”的相关实现。
(9)fe-secure-* 开头的5个函数
这5个函数提供并实现了SSL的支持和实现。
(10)legacy-pqsignal.c
该文件内部使用sigaction函数完成了相关信号集的安装、登记。 对于sigacton()函数的功能,请阅读 Linux信号函数之sigaction系统调用 。
(11)libpq-events.h, libpq-events.c
这两个文件实现了应用程序调用“libpq事件API的相关定义与实现”。
(12)libpq-fe.h
该文件包含了“前端postgres应用程序使用函数的结果和扩展的定义”。
(13)libpq-int.h
该文件包含了“仅供前端libpq库使用的内部定义。” 不提供给调用它的应用程序使用。
(14)pqexpbuffer.h, pqexpbuffer.c
这两个文件实现了“一种无限扩展的字符串数据类型”。更通俗点说,就是C++中的string STL的封装实现。
(15)pthread-win32.c
该文件实现了Win32下的pthread线程的封装、实现。
1.2 如何使用libpq
使用libpq的客户端程序,需要(必须)包含libpq-fe.h头文件,并且必须链接到libpq.so动态库。
这个后面将有演示用例进行说明。