// // Created by lloyd on 2020/10/14. // #include #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; }