链接到数据库的 API 共有六种:PQsetdb()
和 PQsetdbLogin()
不再推荐使用,因为它们无法向 backend 传递参数缺乏扩展性,剩余的四个 API 就可以接收一串字符串(URI)作为参数传向 backend;同步(阻塞)模式使用 PQconnectdb()
、PQconnectdbParams()
这两个 API;异步(非阻塞)模式使用 PQconnectStart()
和 PQconnectStartParams()
。
PQconnectdb()
解析
PQconnectStart()
解析
makeEmptyPGconn()
解析
- 设置
conn->status
为CONNECTION_BAD
connectOptions1()
解析
parse_connection_string()
解析传入的 URI conninfo 字符串,比如postgresql://uri-user:secret@host:12345/db
,或者是[key=value]
键值对,放入临时动态申请的PQconninfoOption connOptions
结构体中fillPGconn()
将结果connOptions
存入conn
- 释放
connOptions
技巧
- 结构体
internalPQconninfoOption
内除最后一个变量connofs
外的变量和结构体PQconninfoOption
内的变量保持了同步一致 - 静态全局变量
static const internalPQconninfoOption PQconninfoOptions[]
存放了所有已知的 key 的相关信息,比如dbname
这个 key 的信息{"dbname", "PGDATABASE", NULL, NULL, "Database-Name", "", 20, offsetof(struct pg_conn, dbName)},
,最后一个变量存放了该 key 在pg_conn
中的偏移位置 - 依据
PQconninfoOptions
,从connOptions
获取 key-value 后通过偏移就可以直接写入到conn
connectOptions2()
解析
- 确定
conn->connhost
数量(现在支持配置多 IP) - 将 host、hostaddr、port 字符串解析后存入
conn->connhost
- 设置
pguser
dbName
pgpass
sslmode
client_encoding_initial
target_session_attrs
等
connectDBStart()
解析
- 获取目标主机的
struct addrinfo
,存放到conn->connhost[i]->addrlist
中 - 设置状态
conn->status
为CONNECTION_NEEDED
- 调用
PQconnectPoll()
,该函数后续会有详细讲解
connectDBComplete()
解析
未完待续……
相关推荐
PostgreSQL 中 libpq 相关代码解析之建立链接 (一)
PostgreSQL 中 libpq 相关代码解析之建立链接 (二)
“PostgreSQL 中 libpq 相关代码解析之建立链接 (一)”的一个响应