libpq PQpingParams PQconnectdbParams 示例

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;
}

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kmblack1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值