gtpgcnn.cpp 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. //
  2. // Created by lloyd on 2020/10/14.
  3. //
  4. #include <iostream>
  5. #include "libpq-fe.h"
  6. #include "gtpgcnn.h"
  7. #include "../gtrunconf.h"
  8. gtpgcnn::gtpgcnn() {
  9. cnnstr = postgresql_connector_string_libpqC;
  10. }
  11. void gtpgcnn::openCnn() {
  12. try {
  13. cnn = PQconnectdb(cnnstr.c_str());
  14. switch (PQstatus(cnn)) {
  15. case CONNECTION_OK:
  16. //连接已经准备好
  17. //std::cout << "PG connect successfully" << std::endl;
  18. break;
  19. case CONNECTION_BAD:
  20. //连接过程已经失败
  21. // break;
  22. //在一个异步连接过程中(也只有在这个过程中)也可能出现其他状态
  23. case CONNECTION_STARTED:
  24. //等待连接被建立
  25. // break;
  26. case CONNECTION_MADE:
  27. //连接 OK,等待发送
  28. // break;
  29. case CONNECTION_AWAITING_RESPONSE:
  30. //等待来自服务器的一个回应
  31. // break;
  32. case CONNECTION_AUTH_OK:
  33. //收到认证,等待后端启动结束
  34. // break;
  35. case CONNECTION_SETENV:
  36. //协商环境驱动的参数设置
  37. // break;
  38. case CONNECTION_SSL_STARTUP:
  39. //协商 SSL 加密
  40. // break;
  41. case CONNECTION_NEEDED:
  42. // break;
  43. case CONNECTION_CHECK_WRITABLE:
  44. //检查连接是否能够处理写入事务
  45. // break;
  46. case CONNECTION_CONSUME:
  47. //在连接上消费任何剩余的响应消息
  48. std::cout << "PG connect CONNECTION_FAULT" << std::endl;
  49. break;
  50. }
  51. } catch (const std::exception &e) {
  52. std::cerr << e.what() << std::endl;
  53. }
  54. }
  55. bool gtpgcnn::closeCnn() {
  56. if (cnn == NULL) return true;
  57. bool r = true;
  58. try {
  59. PQfinish(cnn);
  60. //std::cout << "PG close successfully" << std::endl;
  61. } catch (const std::exception &e) {
  62. r = false;
  63. std::cerr << "a fault occruent in closing cnn " << std::endl;
  64. std::cerr << e.what() << std::endl;
  65. }
  66. return r;
  67. }
  68. bool gtpgcnn::readContent(std::string sql) {
  69. bool r = true;
  70. try {
  71. res = PQexec(cnn, sql.c_str());
  72. /**运行query命令*/
  73. switch (PQresultStatus(res)) {
  74. case PGRES_TUPLES_OK :
  75. r = true;
  76. break;
  77. case PGRES_EMPTY_QUERY:
  78. // break;
  79. case PGRES_COMMAND_OK:
  80. // break;
  81. case PGRES_COPY_OUT:
  82. // break;
  83. case PGRES_COPY_IN:
  84. // break;
  85. case PGRES_BAD_RESPONSE:
  86. // break;
  87. case PGRES_NONFATAL_ERROR:
  88. // break;
  89. case PGRES_FATAL_ERROR:
  90. // break;
  91. case PGRES_COPY_BOTH:
  92. // break;
  93. case PGRES_SINGLE_TUPLE:
  94. fprintf(stderr, "Exec query command fauled! %s\\n", PQerrorMessage(cnn));
  95. clearRes();
  96. r = false;
  97. break;
  98. }
  99. } catch (const std::exception &e) {
  100. r = false;
  101. clearRes();
  102. std::cerr << "a fault exec q sql " << std::endl;
  103. std::cerr << e.what() << std::endl;
  104. }
  105. return r;
  106. }
  107. bool gtpgcnn::writeContent(std::string sql) {
  108. bool r = true;
  109. try {
  110. res = PQexec(cnn, sql.c_str());
  111. /**运行命令*/
  112. switch (PQresultStatus(res)) {
  113. case PGRES_COMMAND_OK:
  114. //成功地执行命令,并且没有返回任何数据
  115. r = true;
  116. break;
  117. case PGRES_EMPTY_QUERY:
  118. //送给服务器的查询字符串为空
  119. // break;
  120. case PGRES_TUPLES_OK:
  121. //成功地执行命令,并且返回了数据(例如SELECT和SHOW命令)
  122. // break;
  123. case PGRES_COPY_OUT:
  124. //服务器已经开始向客户端传送数据
  125. // break;
  126. case PGRES_COPY_IN:
  127. //客户端已经开始向服务器传送数据
  128. // break;
  129. case PGRES_BAD_RESPONSE:
  130. //无法识别服务器返回的信息
  131. // break;
  132. case PGRES_NONFATAL_ERROR:
  133. //出现一个非致命的错误(提示或警告)
  134. // break;
  135. case PGRES_FATAL_ERROR:
  136. //出现一个致命的错误
  137. // break;
  138. case PGRES_COPY_BOTH:
  139. //向服务器复制数据/从服务器复制数据的传输开始。这个特性当前只被用于流复制,因此这个状态应该不会在普通应用中出现
  140. // break;
  141. case PGRES_SINGLE_TUPLE:
  142. //PGresult包含来自于当前命令的一个单一结果元组。这个状态只在查询选择了单一行模式时发生
  143. fprintf(stderr, "Exec alter command fauled!********\n%s\n", PQerrorMessage(cnn));
  144. clearRes();
  145. r = false;
  146. break;
  147. }
  148. } catch (const std::exception &e) {
  149. r = false;
  150. std::cerr << "a fault exec t sql " << std::endl;
  151. std::cerr << e.what() << std::endl;
  152. }
  153. }
  154. int gtpgcnn::getRowsNumFromResult() {
  155. if (res == NULL) return 0;
  156. return PQntuples(res);
  157. }
  158. int gtpgcnn::getColsNumFromResult() {
  159. if (res == NULL) return 0;
  160. return PQnfields(res);
  161. }
  162. std::string gtpgcnn::getValueFromResult(int row, int col) {
  163. if (res == NULL) return NULL;
  164. return std::string(PQgetvalue(res, row, col));
  165. }
  166. char *gtpgcnn::getValueFromResultChar(int row, int col) {
  167. if (res == NULL) return NULL;
  168. return PQgetvalue(res, row, col);
  169. }
  170. void gtpgcnn::clearRes() {
  171. if (res == NULL) return;
  172. PQclear(res);
  173. res = NULL;
  174. }