libpq PQpingParams PQconnectdbParams 示例

xiaoxiao2025-08-01  28

2020-08-14修改

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <libpq-fe.h> /* PQconnectdbParams连接参数数量 * 最后一个元素为NULL,表示数组结束 * 所以数组头实际大小要+1 */ #define SE_LIBPQPARAM_COUNT (9) /*多字节单个字符最大内存大小,如果关键字和值仅由英文和数字组成时为1,否则修改为4*/ #define SE_UNI_SINGLE_CHAR_SIZE (1) /*连接参数字符串最大字符数*/ #define SE_LIBPQ_CONN_MAXCOUNT (16) /* PQconnectdbParams连接参数key字符串的最大内存大小*/ #define SE_LIBPQKEY_MAX_MEMLEN (SE_LIBPQ_CONN_MAXCOUNT * SE_UNI_SINGLE_CHAR_SIZE + sizeof(char)) /* PQconnectdbParams连接参数values字符串的最大内存大小*/ #define SE_LIBPQVALUE_MAX_MEMLEN (SE_LIBPQ_CONN_MAXCOUNT * SE_UNI_SINGLE_CHAR_SIZE+ sizeof(char)) /*检查并释放内存*/ #define SE_SAFE_FREE(x)\ do {\ if(NULL != x) { \ free(x); x = NULL; \ } \ } while (0) /*检查并关闭连接*/ #define SE_SAFE_DBCLOSE(x)\ do {\ if(NULL != x) { \ PQfinish(x); x = NULL; \ } \ } while (0) const char* getPGPingName(PGPing val) { switch (val) { case PQPING_OK: return "PQPING_OK"; case PQPING_REJECT: return "PQPING_REJECT"; case PQPING_NO_RESPONSE: return "PQPING_NO_RESPONSE"; case PQPING_NO_ATTEMPT: return "PQPING_NO_ATTEMPT"; default:return"UNKNOWN"; } } int main() { PGconn *conn = NULL; PGPing result = PQPING_OK; char **keys = NULL, *tmpKeys; char **vals = NULL, *tmpVals; /*数组实际具有9个元素,其中8个为有效信息,最后一个元素为NULL表示数组结束(libpq格式) */ size_t arrHeadSize= (sizeof(char*) * SE_LIBPQPARAM_COUNT) + sizeof(char*); /*一次性为数组分配存储空间*/ keys = (char **)malloc(arrHeadSize+ (SE_LIBPQPARAM_COUNT * SE_LIBPQKEY_MAX_MEMLEN)); if (NULL == keys) exit(-1); vals = (char **)malloc(arrHeadSize+ (SE_LIBPQPARAM_COUNT * SE_LIBPQVALUE_MAX_MEMLEN)); if (NULL == vals) { SE_SAFE_FREE(keys); exit(-1); } /*跳过数组头*/ tmpKeys = (char *)keys + arrHeadSize; tmpVals = (char *)vals + arrHeadSize; /*设置数组各项目指针*/ for (int i = 0; i < SE_LIBPQPARAM_COUNT; ++i) { keys[i] = tmpKeys; tmpKeys += SE_LIBPQKEY_MAX_MEMLEN; vals[i] = tmpVals; tmpVals += SE_LIBPQVALUE_MAX_MEMLEN; } //最后一个元素为NULL, 表示数组结束 keys[SE_LIBPQPARAM_COUNT-1] = NULL; vals[SE_LIBPQPARAM_COUNT-1] = NULL; /*设置连接参数名,最多SE_LIBPQ_CONN_MAXCOUNT个字符*/ strncpy(keys[0], "hostaddr", SE_LIBPQKEY_MAX_MEMLEN); //主机ip,必须使用ip地址,如要用名称,修改为host strncpy(keys[1], "port", SE_LIBPQKEY_MAX_MEMLEN); //端口 strncpy(keys[2], "dbname", SE_LIBPQKEY_MAX_MEMLEN); //数据库名 strncpy(keys[3], "user", SE_LIBPQKEY_MAX_MEMLEN); //用户名 strncpy(keys[4], "password", SE_LIBPQKEY_MAX_MEMLEN); //密码 strncpy(keys[5], "connect_timeout", SE_LIBPQKEY_MAX_MEMLEN); //连接超时,单位为毫秒 strncpy(keys[6], "client_encoding", SE_LIBPQKEY_MAX_MEMLEN); //客户端字符串编码 strncpy(keys[7], "application_name", SE_LIBPQKEY_MAX_MEMLEN); //应用程序名称,用于区分链接来自那里 /*设置连接参数值,最多SE_LIBPQ_CONN_MAXCOUNT个字符,注意数组下标必须和keys对应*/ strncpy(vals[0], "192.168.1.252", SE_LIBPQVALUE_MAX_MEMLEN); //使用hostaddr时必须是一个ip地址.使用host时为主机名,host较hostaddr将发生一次主机名查找 strncpy(vals[1], "5432", SE_LIBPQVALUE_MAX_MEMLEN); strncpy(vals[2], "数据库名", SE_LIBPQVALUE_MAX_MEMLEN); strncpy(vals[3], "用户名", SE_LIBPQVALUE_MAX_MEMLEN); strncpy(vals[4], "密码", SE_LIBPQVALUE_MAX_MEMLEN); strncpy(vals[5], "10", SE_LIBPQVALUE_MAX_MEMLEN); strncpy(vals[6], "GBK", SE_LIBPQVALUE_MAX_MEMLEN); strncpy(vals[7], "libpq12345678915", SE_LIBPQVALUE_MAX_MEMLEN); /*打印连接参数*/ for (int i = 0; i < SE_LIBPQPARAM_COUNT; ++i) printf("%s:%s\n", keys[i], vals[i]); /*获取PostgreSQL数据库的状态,keys和vals只需要主机名和端口号即可,数据库/用户/密码等其它参数不需要*/ result = PQpingParams(keys, vals, 1); printf("连接状态:%s(%d)\n", getPGPingName(result), result); /*连接至数据库*/ conn = PQconnectdbParams(keys, vals, 1); if (NULL == conn) { SE_SAFE_FREE(keys); SE_SAFE_FREE(vals); exit(-1); } SE_SAFE_DBCLOSE(conn); SE_SAFE_FREE(keys); SE_SAFE_FREE(vals); return 0; }

转载请注明原文地址: https://www.6miu.com/read-5034113.html

最新回复(0)