123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- //
- // Created by lloyd on 2020/10/14.
- //
- #include <iostream>
- #include "libpq-fe.h"
- #include "gtpgcnn.h"
- #include "../gtrunconf.h"
- gtpgcnn::gtpgcnn() {
- cnnstr = postgresql_connector_string_libpqC;
- }
- void gtpgcnn::openCnn() {
- try {
- cnn = PQconnectdb(cnnstr.c_str());
- switch (PQstatus(cnn)) {
- case CONNECTION_OK:
- //连接已经准备好
- //std::cout << "PG connect successfully" << std::endl;
- break;
- case CONNECTION_BAD:
- //连接过程已经失败
- // break;
- //在一个异步连接过程中(也只有在这个过程中)也可能出现其他状态
- case CONNECTION_STARTED:
- //等待连接被建立
- // break;
- case CONNECTION_MADE:
- //连接 OK,等待发送
- // break;
- case CONNECTION_AWAITING_RESPONSE:
- //等待来自服务器的一个回应
- // break;
- case CONNECTION_AUTH_OK:
- //收到认证,等待后端启动结束
- // break;
- case CONNECTION_SETENV:
- //协商环境驱动的参数设置
- // break;
- case CONNECTION_SSL_STARTUP:
- //协商 SSL 加密
- // break;
- case CONNECTION_NEEDED:
- // break;
- case CONNECTION_CHECK_WRITABLE:
- //检查连接是否能够处理写入事务
- // break;
- case CONNECTION_CONSUME:
- //在连接上消费任何剩余的响应消息
- std::cout << "PG connect CONNECTION_FAULT" << std::endl;
- break;
- }
- } catch (const std::exception &e) {
- std::cerr << e.what() << std::endl;
- }
- }
- bool gtpgcnn::closeCnn() {
- if (cnn == NULL) return true;
- bool r = true;
- try {
- PQfinish(cnn);
- //std::cout << "PG close successfully" << std::endl;
- } catch (const std::exception &e) {
- r = false;
- std::cerr << "a fault occruent in closing cnn " << std::endl;
- std::cerr << e.what() << std::endl;
- }
- return r;
- }
- bool gtpgcnn::readContent(std::string sql) {
- bool r = true;
- try {
- res = PQexec(cnn, sql.c_str());
- /**运行query命令*/
- switch (PQresultStatus(res)) {
- case PGRES_TUPLES_OK :
- r = true;
- break;
- case PGRES_EMPTY_QUERY:
- // break;
- case PGRES_COMMAND_OK:
- // break;
- case PGRES_COPY_OUT:
- // break;
- case PGRES_COPY_IN:
- // break;
- case PGRES_BAD_RESPONSE:
- // break;
- case PGRES_NONFATAL_ERROR:
- // break;
- case PGRES_FATAL_ERROR:
- // break;
- case PGRES_COPY_BOTH:
- // break;
- case PGRES_SINGLE_TUPLE:
- fprintf(stderr, "Exec query command fauled! %s\\n", PQerrorMessage(cnn));
- clearRes();
- r = false;
- break;
- }
- } catch (const std::exception &e) {
- r = false;
- clearRes();
- std::cerr << "a fault exec q sql " << std::endl;
- std::cerr << e.what() << std::endl;
- }
- return r;
- }
- bool gtpgcnn::writeContent(std::string sql) {
- bool r = true;
- try {
- res = PQexec(cnn, sql.c_str());
- /**运行命令*/
- switch (PQresultStatus(res)) {
- case PGRES_COMMAND_OK:
- //成功地执行命令,并且没有返回任何数据
- r = true;
- break;
- case PGRES_EMPTY_QUERY:
- //送给服务器的查询字符串为空
- // break;
- case PGRES_TUPLES_OK:
- //成功地执行命令,并且返回了数据(例如SELECT和SHOW命令)
- // break;
- case PGRES_COPY_OUT:
- //服务器已经开始向客户端传送数据
- // break;
- case PGRES_COPY_IN:
- //客户端已经开始向服务器传送数据
- // break;
- case PGRES_BAD_RESPONSE:
- //无法识别服务器返回的信息
- // break;
- case PGRES_NONFATAL_ERROR:
- //出现一个非致命的错误(提示或警告)
- // break;
- case PGRES_FATAL_ERROR:
- //出现一个致命的错误
- // break;
- case PGRES_COPY_BOTH:
- //向服务器复制数据/从服务器复制数据的传输开始。这个特性当前只被用于流复制,因此这个状态应该不会在普通应用中出现
- // break;
- case PGRES_SINGLE_TUPLE:
- //PGresult包含来自于当前命令的一个单一结果元组。这个状态只在查询选择了单一行模式时发生
- fprintf(stderr, "Exec alter command fauled!********\n%s\n", PQerrorMessage(cnn));
- clearRes();
- r = false;
- break;
- }
- } catch (const std::exception &e) {
- r = false;
- std::cerr << "a fault exec t sql " << std::endl;
- std::cerr << e.what() << std::endl;
- }
- }
- int gtpgcnn::getRowsNumFromResult() {
- if (res == NULL) return 0;
- return PQntuples(res);
- }
- int gtpgcnn::getColsNumFromResult() {
- if (res == NULL) return 0;
- return PQnfields(res);
- }
- std::string gtpgcnn::getValueFromResult(int row, int col) {
- if (res == NULL) return NULL;
- return std::string(PQgetvalue(res, row, col));
- }
- char *gtpgcnn::getValueFromResultChar(int row, int col) {
- if (res == NULL) return NULL;
- return PQgetvalue(res, row, col);
- }
- void gtpgcnn::clearRes() {
- if (res == NULL) return;
- PQclear(res);
- res = NULL;
- }
|