PostgreSQL 中 libpq 相关代码解析之建立链接 (一)

链接到数据库的 API 共有六种:PQsetdb()PQsetdbLogin() 不再推荐使用,因为它们无法向 backend 传递参数缺乏扩展性,剩余的四个 API 就可以接收一串字符串(URI)作为参数传向 backend;同步(阻塞)模式使用 PQconnectdb()PQconnectdbParams() 这两个 API;异步(非阻塞)模式使用 PQconnectStart()PQconnectStartParams()

PQconnectdb() 解析

PQconnectStart() 解析

makeEmptyPGconn() 解析

  • 设置 conn->statusCONNECTION_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->statusCONNECTION_NEEDED
  • 调用 PQconnectPoll(),该函数后续会有详细讲解

connectDBComplete() 解析

未完待续……

相关推荐

PostgreSQL 中 libpq 相关代码解析之大纲

PostgreSQL 中 libpq 相关代码解析之建立链接 (一)

PostgreSQL 中 libpq 相关代码解析之建立链接 (二)

PostgreSQL 中 libpq 相关代码解析之建立链接 (三)

PostgreSQL 中 libpq 相关代码解析之流复制(四)

Advertisements

分类:默认目录, PostgreSQL

Tagged as:

4 replies

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

You are commenting using your WordPress.com account. Log Out /  更改 )

Google+ photo

You are commenting using your Google+ account. Log Out /  更改 )

Twitter picture

You are commenting using your Twitter account. Log Out /  更改 )

Facebook photo

You are commenting using your Facebook account. Log Out /  更改 )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.