mpgsql.c
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:6k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. #include <time.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include "msql.h"
  5. #include "libpq-fe.h"
  6. #define HNDMAX 10
  7. PGconn    *PGh[HNDMAX] = {
  8. NULL, NULL, NULL, NULL, NULL,
  9. NULL, NULL, NULL, NULL, NULL
  10. };
  11. #define E_NOHANDLERS 0
  12. char    *msqlErrors[] = {
  13. "Out of database handlers."
  14. };
  15. char msqlErrMsg[BUFSIZ],
  16.    *tfrom = "dunno";
  17. PGresult   *queryres = NULL;
  18. int
  19. msqlConnect(char *host)
  20. {
  21. int count;
  22. for (count = 0; count < HNDMAX; count++)
  23. if (PGh[count] == NULL)
  24. break;
  25. if (count == HNDMAX)
  26. {
  27. strncpy(msqlErrMsg, msqlErrors[E_NOHANDLERS], BUFSIZ);
  28. return -1;
  29. }
  30. PGh[count] = malloc(sizeof(PGconn));
  31. PGh[count]->pghost = host ? strdup(host) : NULL;
  32. return count;
  33. }
  34. int
  35. msqlSelectDB(int handle, char *dbname)
  36. {
  37. char    *options = calloc(1, BUFSIZ);
  38. char    *e = getenv("PG_OPTIONS");
  39. if (e == NULL)
  40. e = "";
  41. if (PGh[handle]->pghost)
  42. {
  43. strcat(options, "host=");
  44. strncat(options, PGh[handle]->pghost, BUFSIZ);
  45. strncat(options, " ", BUFSIZ);
  46. free(PGh[handle]->pghost);
  47. PGh[handle]->pghost = NULL;
  48. }
  49. strncat(options, "dbname=", BUFSIZ);
  50. strncat(options, dbname, BUFSIZ);
  51. strncat(options, " ", BUFSIZ);
  52. strncat(options, e, BUFSIZ);
  53. free(PGh[handle]);
  54. PGh[handle] = PQconnectdb(options);
  55. free(options);
  56. strncpy(msqlErrMsg, PQerrorMessage(PGh[handle]), BUFSIZ);
  57. return (PQstatus(PGh[handle]) == CONNECTION_BAD ? -1 : 0);
  58. }
  59. int
  60. msqlQuery(int handle, char *query)
  61. {
  62. char    *tq = strdup(query);
  63. char    *p = tq;
  64. PGresult   *res;
  65. PGconn    *conn = PGh[handle];
  66. ExecStatusType rcode;
  67. res = PQexec(conn, p);
  68. rcode = PQresultStatus(res);
  69. if (rcode == PGRES_TUPLES_OK)
  70. {
  71. queryres = res;
  72. return PQntuples(res);
  73. }
  74. else if (rcode == PGRES_FATAL_ERROR || rcode == PGRES_NONFATAL_ERROR)
  75. {
  76. PQclear(res);
  77. queryres = NULL;
  78. return -1;
  79. }
  80. else
  81. {
  82. PQclear(res);
  83. queryres = NULL;
  84. return 0;
  85. }
  86. }
  87. int
  88. msqlCreateDB(int a, char *b)
  89. {
  90. char tbuf[BUFSIZ];
  91. sprintf(tbuf, "create database %s", b);
  92. return msqlQuery(a, tbuf) >= 0 ? 0 : -1;
  93. }
  94. int
  95. msqlDropDB(int a, char *b)
  96. {
  97. char tbuf[BUFSIZ];
  98. sprintf(tbuf, "drop database %s", b);
  99. return msqlQuery(a, tbuf) >= 0 ? 0 : -1;
  100. }
  101. int
  102. msqlShutdown(int a)
  103. {
  104. }
  105. int
  106. msqlGetProtoInfo(void)
  107. {
  108. }
  109. int
  110. msqlReloadAcls(int a)
  111. {
  112. }
  113. char *
  114. msqlGetServerInfo(void)
  115. {
  116. }
  117. char *
  118. msqlGetHostInfo(void)
  119. {
  120. }
  121. char *
  122. msqlUnixTimeToDate(time_t date)
  123. {
  124. }
  125. char *
  126. msqlUnixTimeToTime(time_t time)
  127. {
  128. }
  129. void
  130. msqlClose(int a)
  131. {
  132. PQfinish(PGh[a]);
  133. PGh[a] = NULL;
  134. if (queryres)
  135. {
  136. free(queryres);
  137. queryres = NULL;
  138. }
  139. }
  140. void
  141. msqlDataSeek(m_result * result, int count)
  142. {
  143. int c;
  144. result->cursor = result->queryData;
  145. for (c = 1; c < count; c++)
  146. if (result->cursor->next)
  147. result->cursor = result->cursor->next;
  148. }
  149. void
  150. msqlFieldSeek(m_result * result, int count)
  151. {
  152. int c;
  153. result->fieldCursor = result->fieldData;
  154. for (c = 1; c < count; c++)
  155. if (result->fieldCursor->next)
  156. result->fieldCursor = result->fieldCursor->next;
  157. }
  158. void
  159. msqlFreeResult(m_result * result)
  160. {
  161. if (result)
  162. {
  163. /* Clears fields */
  164. free(result->fieldData);
  165. result->cursor = result->queryData;
  166. while (result->cursor)
  167. {
  168. int c;
  169. m_row m = result->cursor->data;
  170. for (c = 0; m[c]; c++)
  171. free(m[c]);
  172. result->cursor = result->cursor->next;
  173. }
  174. free(result->queryData);
  175. free(result);
  176. }
  177. }
  178. m_row
  179. msqlFetchRow(m_result * row)
  180. {
  181. m_data    *r = row->cursor;
  182. if (r)
  183. {
  184. row->cursor = row->cursor->next;
  185. return (m_row) r->data;
  186. }
  187. return (m_row) NULL;
  188. }
  189. m_seq *
  190. msqlGetSequenceInfo(int a, char *b)
  191. {
  192. }
  193. m_field    *
  194. msqlFetchField(m_result * mr)
  195. {
  196. m_field    *m = (m_field *) mr->fieldCursor;
  197. if (m)
  198. {
  199. mr->fieldCursor = mr->fieldCursor->next;
  200. return m;
  201. }
  202. return NULL;
  203. }
  204. m_result   *
  205. msqlListDBs(int a)
  206. {
  207. m_result   *m;
  208. if (msqlQuery(a, "select datname from pg_database") > 0)
  209. {
  210. m = msqlStoreResult();
  211. return m;
  212. }
  213. else
  214. return NULL;
  215. }
  216. m_result   *
  217. msqlListTables(int a)
  218. {
  219. m_result   *m;
  220. char tbuf[BUFSIZ];
  221. sprintf(tbuf, "select relname from pg_class where relkind='r' and relowner=%d", getuid());
  222. if (msqlQuery(a, tbuf) > 0)
  223. {
  224. m = msqlStoreResult();
  225. return m;
  226. }
  227. else
  228. return NULL;
  229. }
  230. m_result   *
  231. msqlListFields(int a, char *b)
  232. {
  233. }
  234. m_result   *
  235. msqlListIndex(int a, char *b, char *c)
  236. {
  237. m_result   *m;
  238. char tbuf[BUFSIZ];
  239. sprintf(tbuf, "select relname from pg_class where relkind='i' and relowner=%d", getuid());
  240. if (msqlQuery(a, tbuf) > 0)
  241. {
  242. m = msqlStoreResult();
  243. return m;
  244. }
  245. else
  246. return NULL;
  247. }
  248. m_result   *
  249. msqlStoreResult(void)
  250. {
  251. if (queryres)
  252. {
  253. m_result   *mr = malloc(sizeof(m_result));
  254. m_fdata    *mf;
  255. m_data    *md;
  256. int count;
  257. mr->queryData = mr->cursor = NULL;
  258. mr->numRows = PQntuples(queryres);
  259. mr->numFields = PQnfields(queryres);
  260. mf = calloc(PQnfields(queryres), sizeof(m_fdata));
  261. for (count = 0; count < PQnfields(queryres); count++)
  262. {
  263. (m_fdata *) (mf + count)->field.name = strdup(PQfname(queryres, count));
  264. (m_fdata *) (mf + count)->field.table = tfrom;
  265. (m_fdata *) (mf + count)->field.type = CHAR_TYPE;
  266. (m_fdata *) (mf + count)->field.length = PQfsize(queryres, count);
  267. (m_fdata *) (mf + count)->next = (m_fdata *) (mf + count + 1);
  268. }
  269. (m_fdata *) (mf + count - 1)->next = NULL;
  270. md = calloc(PQntuples(queryres), sizeof(m_data));
  271. for (count = 0; count < PQntuples(queryres); count++)
  272. {
  273. m_row rows = calloc(PQnfields(queryres) * sizeof(m_row) + 1, 1);
  274. int c;
  275. for (c = 0; c < PQnfields(queryres); c++)
  276. rows[c] = strdup(PQgetvalue(queryres, count, c));
  277. (m_data *) (md + count)->data = rows;
  278. (m_data *) (md + count)->width = PQnfields(queryres);
  279. (m_data *) (md + count)->next = (m_data *) (md + count + 1);
  280. }
  281. (m_data *) (md + count - 1)->next = NULL;
  282. mr->queryData = mr->cursor = md;
  283. mr->fieldCursor = mr->fieldData = mf;
  284. return mr;
  285. }
  286. else
  287. return NULL;
  288. }
  289. time_t
  290. msqlDateToUnixTime(char *a)
  291. {
  292. }
  293. time_t
  294. msqlTimeToUnixTime(char *b)
  295. {
  296. }
  297. char *
  298. msql_tmpnam(void)
  299. {
  300. return tmpnam("/tmp/msql.XXXXXX");
  301. }
  302. int
  303. msqlLoadConfigFile(char *a)
  304. {
  305. }