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

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------
  2.  *
  3.  * $Id: Pg.xs,v 1.12 1999/02/19 23:27:17 tgl Exp $
  4.  *
  5.  * Copyright (c) 1997, 1998  Edmund Mergl
  6.  *
  7.  *-------------------------------------------------------*/
  8. #include "EXTERN.h"
  9. #include "perl.h"
  10. #include "XSUB.h"
  11. #include <string.h>
  12. #include <stdio.h>
  13. #include <fcntl.h>
  14. #include "libpq-fe.h"
  15. typedef struct pg_conn *PG_conn;
  16. typedef struct pg_result *PG_result;
  17. typedef struct pg_results
  18. {
  19.   PGresult *result;
  20.   int row;
  21. } PGresults;
  22. typedef struct pg_results *PG_results;
  23. static double
  24. constant(name, arg)
  25. char *name;
  26. int arg; {
  27.     errno = 0;
  28.     switch (*name) {
  29.     case 'A':
  30. break;
  31.     case 'B':
  32. break;
  33.     case 'C':
  34. break;
  35.     case 'D':
  36. break;
  37.     case 'E':
  38. break;
  39.     case 'F':
  40. break;
  41.     case 'G':
  42. break;
  43.     case 'H':
  44. break;
  45.     case 'I':
  46. break;
  47.     case 'J':
  48. break;
  49.     case 'K':
  50. break;
  51.     case 'L':
  52. break;
  53.     case 'M':
  54. break;
  55.     case 'N':
  56. break;
  57.     case 'O':
  58. break;
  59.     case 'P':
  60. if (strEQ(name, "PGRES_CONNECTION_OK"))
  61. return 0;
  62. if (strEQ(name, "PGRES_CONNECTION_BAD"))
  63. return 1;
  64. if (strEQ(name, "PGRES_INV_SMGRMASK"))
  65. return 0x0000ffff;
  66. if (strEQ(name, "PGRES_INV_ARCHIVE"))
  67. return 0x00010000;
  68. if (strEQ(name, "PGRES_INV_WRITE"))
  69. return 0x00020000;
  70. if (strEQ(name, "PGRES_INV_READ"))
  71. return 0x00040000;
  72. if (strEQ(name, "PGRES_InvalidOid"))
  73. return 0;
  74. if (strEQ(name, "PGRES_EMPTY_QUERY"))
  75. return 0;
  76. if (strEQ(name, "PGRES_COMMAND_OK"))
  77. return 1;
  78. if (strEQ(name, "PGRES_TUPLES_OK"))
  79. return 2;
  80. if (strEQ(name, "PGRES_COPY_OUT"))
  81. return 3;
  82. if (strEQ(name, "PGRES_COPY_IN"))
  83. return 4;
  84. if (strEQ(name, "PGRES_BAD_RESPONSE"))
  85. return 5;
  86. if (strEQ(name, "PGRES_NONFATAL_ERROR"))
  87. return 6;
  88. if (strEQ(name, "PGRES_FATAL_ERROR"))
  89. return 7;
  90. break;
  91.     case 'Q':
  92. break;
  93.     case 'R':
  94. break;
  95.     case 'S':
  96. break;
  97.     case 'T':
  98. break;
  99.     case 'U':
  100. break;
  101.     case 'V':
  102. break;
  103.     case 'W':
  104. break;
  105.     case 'X':
  106. break;
  107.     case 'Y':
  108. break;
  109.     case 'Z':
  110. break;
  111.     case 'a':
  112. break;
  113.     case 'b':
  114. break;
  115.     case 'c':
  116. break;
  117.     case 'd':
  118. break;
  119.     case 'e':
  120. break;
  121.     case 'f':
  122. break;
  123.     case 'g':
  124. break;
  125.     case 'h':
  126. break;
  127.     case 'i':
  128. break;
  129.     case 'j':
  130. break;
  131.     case 'k':
  132. break;
  133.     case 'l':
  134. break;
  135.     case 'm':
  136. break;
  137.     case 'n':
  138. break;
  139.     case 'o':
  140. break;
  141.     case 'p':
  142. break;
  143.     case 'q':
  144. break;
  145.     case 'r':
  146. break;
  147.     case 's':
  148. break;
  149.     case 't':
  150. break;
  151.     case 'u':
  152. break;
  153.     case 'v':
  154. break;
  155.     case 'w':
  156. break;
  157.     case 'x':
  158. break;
  159.     case 'y':
  160. break;
  161.     case 'z':
  162. break;
  163.     }
  164.     errno = EINVAL;
  165.     return 0;
  166. not_there:
  167.     errno = ENOENT;
  168.     return 0;
  169. }
  170. MODULE = Pg PACKAGE = Pg
  171. PROTOTYPES: DISABLE
  172. double
  173. constant(name,arg)
  174. char * name
  175. int arg
  176. PGconn *
  177. PQconnectdb(conninfo)
  178. char * conninfo
  179. CODE:
  180. /* convert dbname to lower case if not surrounded by double quotes */
  181. char *ptr = strstr(conninfo, "dbname");
  182. if (ptr) {
  183. while (*ptr && *ptr != '=') {
  184. ptr++;
  185. }
  186.                         ptr++;
  187. while (*ptr == ' ' || *ptr == 't') {
  188. ptr++;
  189. }
  190. if (*ptr == '"') {
  191. *ptr++ = ' ';
  192. while (*ptr && *ptr != '"') {
  193. ptr++;
  194. }
  195. if (*ptr == '"') {
  196. *ptr++ = ' ';
  197. }
  198. } else {
  199. while (*ptr && *ptr != ' ' && *ptr != 't') {
  200.       *ptr = tolower(*ptr);
  201.       ptr++;
  202. }
  203. }
  204. }
  205. RETVAL = PQconnectdb((const char *)conninfo);
  206. OUTPUT:
  207. RETVAL
  208. PGconn *
  209. PQsetdbLogin(pghost, pgport, pgoptions, pgtty, dbname, login, pwd)
  210. char * pghost
  211. char * pgport
  212. char * pgoptions
  213. char * pgtty
  214. char * dbname
  215. char * login
  216. char * pwd
  217. PGconn *
  218. PQsetdb(pghost, pgport, pgoptions, pgtty, dbname)
  219. char * pghost
  220. char * pgport
  221. char * pgoptions
  222. char * pgtty
  223. char * dbname
  224. HV *
  225. PQconndefaults()
  226. CODE:
  227. PQconninfoOption *infoOption;
  228. RETVAL = newHV();
  229.                 if (infoOption = PQconndefaults()) {
  230. while (infoOption->keyword != NULL) {
  231. if (infoOption->val != NULL) {
  232. hv_store(RETVAL, infoOption->keyword, strlen(infoOption->keyword), newSVpv(infoOption->val, 0), 0);
  233. } else {
  234. hv_store(RETVAL, infoOption->keyword, strlen(infoOption->keyword), newSVpv("", 0), 0);
  235. }
  236. infoOption++;
  237. }
  238. }
  239. OUTPUT:
  240. RETVAL
  241. void
  242. PQfinish(conn)
  243. PGconn * conn
  244. void
  245. PQreset(conn)
  246. PGconn * conn
  247. int
  248. PQrequestCancel(conn)
  249. PGconn * conn
  250. char *
  251. PQdb(conn)
  252. PGconn * conn
  253. char *
  254. PQuser(conn)
  255. PGconn * conn
  256. char *
  257. PQpass(conn)
  258. PGconn * conn
  259. char *
  260. PQhost(conn)
  261. PGconn * conn
  262. char *
  263. PQport(conn)
  264. PGconn * conn
  265. char *
  266. PQtty(conn)
  267. PGconn * conn
  268. char *
  269. PQoptions(conn)
  270. PGconn * conn
  271. ConnStatusType
  272. PQstatus(conn)
  273. PGconn * conn
  274. char *
  275. PQerrorMessage(conn)
  276. PGconn * conn
  277. int
  278. PQsocket(conn)
  279. PGconn * conn
  280. int
  281. PQbackendPID(conn)
  282. PGconn * conn
  283. void
  284. PQtrace(conn, debug_port)
  285. PGconn * conn
  286. FILE * debug_port
  287. void
  288. PQuntrace(conn)
  289. PGconn * conn
  290. PGresult *
  291. PQexec(conn, query)
  292. PGconn * conn
  293. char * query
  294. CODE:
  295. RETVAL = PQexec(conn, query);
  296. if (! RETVAL) {
  297. RETVAL = PQmakeEmptyPGresult(conn, PGRES_FATAL_ERROR);
  298. }
  299. OUTPUT:
  300. RETVAL
  301. void
  302. PQnotifies(conn)
  303. PGconn * conn
  304. PREINIT:
  305. PGnotify *notify;
  306. PPCODE:
  307. notify = PQnotifies(conn);
  308. if (notify) {
  309. XPUSHs(sv_2mortal(newSVpv((char *)notify->relname, 0)));
  310. XPUSHs(sv_2mortal(newSViv(notify->be_pid)));
  311. free(notify);
  312. }
  313. int
  314. PQsendQuery(conn, query)
  315. PGconn * conn
  316. char * query
  317. PGresult *
  318. PQgetResult(conn)
  319. PGconn * conn
  320. CODE:
  321. RETVAL = PQgetResult(conn);
  322. if (! RETVAL) {
  323. RETVAL = PQmakeEmptyPGresult(conn, PGRES_FATAL_ERROR);
  324. }
  325. OUTPUT:
  326. RETVAL
  327. int
  328. PQisBusy(conn)
  329. PGconn * conn
  330. int
  331. PQconsumeInput(conn)
  332. PGconn * conn
  333. int
  334. PQgetline(conn, string, length)
  335. PREINIT:
  336. SV *bufsv = SvROK(ST(1)) ? SvRV(ST(1)) : ST(1);
  337. INPUT:
  338. PGconn * conn
  339. int length
  340. char * string = sv_grow(bufsv, length);
  341. CODE:
  342. RETVAL = PQgetline(conn, string, length);
  343. OUTPUT:
  344. RETVAL
  345. string
  346. int
  347. PQputline(conn, string)
  348. PGconn * conn
  349. char * string
  350. int
  351. PQgetlineAsync(conn, buffer, bufsize)
  352. PREINIT:
  353. SV *bufsv = SvROK(ST(1)) ? SvRV(ST(1)) : ST(1);
  354. INPUT:
  355. PGconn * conn
  356. int bufsize
  357. char * buffer = sv_grow(bufsv, bufsize);
  358. CODE:
  359. RETVAL = PQgetlineAsync(conn, buffer, bufsize);
  360. OUTPUT:
  361. RETVAL
  362. buffer
  363. int
  364. PQputnbytes(conn, buffer, nbytes)
  365. PGconn * conn
  366. char * buffer
  367. int nbytes
  368. int
  369. PQendcopy(conn)
  370. PGconn * conn
  371. PGresult *
  372. PQmakeEmptyPGresult(conn, status)
  373. PGconn * conn
  374. ExecStatusType status
  375. ExecStatusType
  376. PQresultStatus(res)
  377. PGresult * res
  378. int
  379. PQntuples(res)
  380. PGresult * res
  381. int
  382. PQnfields(res)
  383. PGresult * res
  384. int
  385. PQbinaryTuples(res)
  386. PGresult * res
  387. char *
  388. PQfname(res, field_num)
  389. PGresult * res
  390. int field_num
  391. int
  392. PQfnumber(res, field_name)
  393. PGresult * res
  394. char * field_name
  395. Oid
  396. PQftype(res, field_num)
  397. PGresult * res
  398. int field_num
  399. short
  400. PQfsize(res, field_num)
  401. PGresult * res
  402. int field_num
  403. int
  404. PQfmod(res, field_num)
  405. PGresult * res
  406. int field_num
  407. char *
  408. PQcmdStatus(res)
  409. PGresult * res
  410. char *
  411. PQoidStatus(res)
  412. PGresult * res
  413. CODE:
  414. RETVAL = (char *)PQoidStatus(res);
  415. OUTPUT:
  416. RETVAL
  417. char *
  418. PQcmdTuples(res)
  419. PGresult * res
  420. CODE:
  421. RETVAL = (char *)PQcmdTuples(res);
  422. OUTPUT:
  423. RETVAL
  424. char *
  425. PQgetvalue(res, tup_num, field_num)
  426. PGresult * res
  427. int tup_num
  428. int field_num
  429. int
  430. PQgetlength(res, tup_num, field_num)
  431. PGresult * res
  432. int tup_num
  433. int field_num
  434. int
  435. PQgetisnull(res, tup_num, field_num)
  436. PGresult * res
  437. int tup_num
  438. int field_num
  439. void
  440. PQclear(res)
  441. PGresult * res
  442. void
  443. PQprint(fout, res, header, align, standard, html3, expanded, pager, fieldSep, tableOpt, caption, ...)
  444. FILE * fout
  445. PGresult * res
  446. pqbool header
  447. pqbool align
  448. pqbool standard
  449. pqbool html3
  450. pqbool expanded
  451. pqbool pager
  452. char * fieldSep
  453. char * tableOpt
  454. char * caption
  455. PREINIT:
  456. PQprintOpt ps;
  457. int i;
  458. CODE:
  459. ps.header    = header;
  460. ps.align     = align;
  461. ps.standard  = standard;
  462. ps.html3     = html3;
  463. ps.expanded  = expanded;
  464. ps.pager     = pager;
  465. ps.fieldSep  = fieldSep;
  466. ps.tableOpt  = tableOpt;
  467. ps.caption   = caption;
  468. Newz(0, ps.fieldName, items + 1 - 11, char*);
  469. for (i = 11; i < items; i++) {
  470. ps.fieldName[i - 11] = (char *)SvPV(ST(i), na);
  471. }
  472. PQprint(fout, res, &ps);
  473. Safefree(ps.fieldName);
  474. void
  475. PQdisplayTuples(res, fp, fillAlign, fieldSep, printHeader, quiet)
  476. PGresult * res
  477. FILE * fp
  478. int fillAlign
  479. char * fieldSep
  480. int printHeader
  481. int quiet
  482. CODE:
  483. PQdisplayTuples(res, fp, fillAlign, (const char *)fieldSep, printHeader, quiet);
  484. void
  485. PQprintTuples(res, fout, printAttName, terseOutput, width)
  486. PGresult * res
  487. FILE * fout
  488. int printAttName
  489. int terseOutput
  490. int width
  491. int
  492. lo_open(conn, lobjId, mode)
  493. PGconn * conn
  494. Oid lobjId
  495. int mode
  496. ALIAS:
  497. PQlo_open = 1
  498. int
  499. lo_close(conn, fd)
  500. PGconn * conn
  501. int fd
  502. ALIAS:
  503. PQlo_close = 1
  504. int
  505. lo_read(conn, fd, buf, len)
  506. ALIAS:
  507. PQlo_read = 1
  508. PREINIT:
  509. SV *bufsv = SvROK(ST(2)) ? SvRV(ST(2)) : ST(2);
  510. INPUT:
  511. PGconn * conn
  512. int fd
  513. int len
  514. char * buf = sv_grow(bufsv, len + 1);
  515. CODE:
  516. RETVAL = lo_read(conn, fd, buf, len);
  517. if (RETVAL > 0) {
  518. SvCUR_set(bufsv, RETVAL);
  519. *SvEND(bufsv) = '';
  520. }
  521. OUTPUT:
  522. RETVAL
  523. buf
  524. int
  525. lo_write(conn, fd, buf, len)
  526. PGconn * conn
  527. int fd
  528. char * buf
  529. int len
  530. ALIAS:
  531. PQlo_write = 1
  532. int
  533. lo_lseek(conn, fd, offset, whence)
  534. PGconn * conn
  535. int fd
  536. int offset
  537. int whence
  538. ALIAS:
  539. PQlo_lseek = 1
  540. Oid
  541. lo_creat(conn, mode)
  542. PGconn * conn
  543. int mode
  544. ALIAS:
  545. PQlo_creat = 1
  546. int
  547. lo_tell(conn, fd)
  548. PGconn * conn
  549. int fd
  550. ALIAS:
  551. PQlo_tell = 1
  552. int
  553. lo_unlink(conn, lobjId)
  554. PGconn * conn
  555. Oid lobjId
  556. ALIAS:
  557. PQlo_unlink = 1
  558. Oid
  559. lo_import(conn, filename)
  560. PGconn * conn
  561. char * filename
  562. ALIAS:
  563. PQlo_import = 1
  564. int
  565. lo_export(conn, lobjId, filename)
  566. PGconn * conn
  567. Oid lobjId
  568. char * filename
  569. ALIAS:
  570. PQlo_export = 1
  571. PG_conn
  572. connectdb(conninfo)
  573. char * conninfo
  574. CODE:
  575. /* convert dbname to lower case if not surrounded by double quotes */
  576. char *ptr = strstr(conninfo, "dbname");
  577. if (ptr) {
  578. ptr += 6;
  579. while (*ptr && *ptr++ != '=') {
  580. ;
  581. }
  582. while (*ptr && (*ptr == ' ' || *ptr == 't')) {
  583. ptr++;
  584. }
  585. if (*ptr == '"') {
  586. *ptr++ = ' ';
  587. while (*ptr && *ptr != '"') {
  588. ptr++;
  589. }
  590. if (*ptr == '"') {
  591. *ptr++ = ' ';
  592. }
  593. } else {
  594. while (*ptr && *ptr != ' ' && *ptr != 't') {
  595. *ptr = tolower(*ptr);
  596. ptr++;
  597. }
  598. }
  599. }
  600. RETVAL = PQconnectdb((const char *)conninfo);
  601. OUTPUT:
  602. RETVAL
  603. PG_conn
  604. setdbLogin(pghost, pgport, pgoptions, pgtty, dbname, login, pwd)
  605. char * pghost
  606. char * pgport
  607. char * pgoptions
  608. char * pgtty
  609. char * dbname
  610. char * login
  611. char * pwd
  612. CODE:
  613. RETVAL = PQsetdbLogin(pghost, pgport, pgoptions, pgtty, dbname,
  614.   login, pwd);
  615. OUTPUT:
  616. RETVAL
  617. PG_conn
  618. setdb(pghost, pgport, pgoptions, pgtty, dbname)
  619. char * pghost
  620. char * pgport
  621. char * pgoptions
  622. char * pgtty
  623. char * dbname
  624. CODE:
  625. RETVAL = PQsetdb(pghost, pgport, pgoptions, pgtty, dbname);
  626. OUTPUT:
  627. RETVAL
  628. HV *
  629. conndefaults()
  630. CODE:
  631. PQconninfoOption *infoOption;
  632. RETVAL = newHV();
  633.                 if (infoOption = PQconndefaults()) {
  634. while (infoOption->keyword != NULL) {
  635. if (infoOption->val != NULL) {
  636. hv_store(RETVAL, infoOption->keyword, strlen(infoOption->keyword), newSVpv(infoOption->val, 0), 0);
  637. } else {
  638. hv_store(RETVAL, infoOption->keyword, strlen(infoOption->keyword), newSVpv("", 0), 0);
  639. }
  640. infoOption++;
  641. }
  642. }
  643. OUTPUT:
  644. RETVAL
  645. MODULE = Pg PACKAGE = PG_conn PREFIX = PQ
  646. PROTOTYPES: DISABLE
  647. void
  648. DESTROY(conn)
  649. PG_conn conn
  650. CODE:
  651. /* printf("DESTROY connectionn"); */
  652. PQfinish(conn);
  653. void
  654. PQreset(conn)
  655. PG_conn conn
  656. int
  657. PQrequestCancel(conn)
  658. PG_conn conn
  659. char *
  660. PQdb(conn)
  661. PG_conn conn
  662. char *
  663. PQuser(conn)
  664. PG_conn conn
  665. char *
  666. PQpass(conn)
  667. PG_conn conn
  668. char *
  669. PQhost(conn)
  670. PG_conn conn
  671. char *
  672. PQport(conn)
  673. PG_conn conn
  674. char *
  675. PQtty(conn)
  676. PG_conn conn
  677. char *
  678. PQoptions(conn)
  679. PG_conn conn
  680. ConnStatusType
  681. PQstatus(conn)
  682. PG_conn conn
  683. char *
  684. PQerrorMessage(conn)
  685. PG_conn conn
  686. int
  687. PQsocket(conn)
  688. PG_conn conn
  689. int
  690. PQbackendPID(conn)
  691. PG_conn conn
  692. void
  693. PQtrace(conn, debug_port)
  694. PG_conn conn
  695. FILE * debug_port
  696. void
  697. PQuntrace(conn)
  698. PG_conn conn
  699. PG_results
  700. PQexec(conn, query)
  701. PG_conn conn
  702. char * query
  703. CODE:
  704. RETVAL = (PG_results)calloc(1, sizeof(PGresults));
  705. if (RETVAL) {
  706. RETVAL->result = PQexec((PGconn *)conn, query);
  707. if (!RETVAL->result) {
  708. RETVAL->result = PQmakeEmptyPGresult((PGconn *)conn, PGRES_FATAL_ERROR);
  709. }
  710. }
  711. OUTPUT:
  712. RETVAL
  713. void
  714. PQnotifies(conn)
  715. PG_conn conn
  716. PREINIT:
  717. PGnotify *notify;
  718. PPCODE:
  719. notify = PQnotifies(conn);
  720. if (notify) {
  721. XPUSHs(sv_2mortal(newSVpv((char *)notify->relname, 0)));
  722. XPUSHs(sv_2mortal(newSViv(notify->be_pid)));
  723. free(notify);
  724. }
  725. int
  726. PQsendQuery(conn, query)
  727. PG_conn conn
  728. char * query
  729. PG_results
  730. PQgetResult(conn)
  731. PG_conn conn
  732. CODE:
  733. RETVAL = (PG_results)calloc(1, sizeof(PGresults));
  734. if (RETVAL) {
  735. RETVAL->result = PQgetResult((PGconn *)conn);
  736. if (!RETVAL->result) {
  737. RETVAL->result = PQmakeEmptyPGresult((PGconn *)conn, PGRES_FATAL_ERROR);
  738. }
  739. }
  740. OUTPUT:
  741. RETVAL
  742. int
  743. PQisBusy(conn)
  744. PG_conn conn
  745. int
  746. PQconsumeInput(conn)
  747. PG_conn conn
  748. int
  749. PQgetline(conn, string, length)
  750. PREINIT:
  751. SV *bufsv = SvROK(ST(1)) ? SvRV(ST(1)) : ST(1);
  752. INPUT:
  753. PG_conn conn
  754. int length
  755. char * string = sv_grow(bufsv, length);
  756. CODE:
  757. RETVAL = PQgetline(conn, string, length);
  758. OUTPUT:
  759. RETVAL
  760. string
  761. int
  762. PQputline(conn, string)
  763. PG_conn conn
  764. char * string
  765. int
  766. PQgetlineAsync(conn, buffer, bufsize)
  767. PREINIT:
  768. SV *bufsv = SvROK(ST(1)) ? SvRV(ST(1)) : ST(1);
  769. INPUT:
  770. PG_conn conn
  771. int bufsize
  772. char * buffer = sv_grow(bufsv, bufsize);
  773. CODE:
  774. RETVAL = PQgetline(conn, buffer, bufsize);
  775. OUTPUT:
  776. RETVAL
  777. buffer
  778. int
  779. PQendcopy(conn)
  780. PG_conn conn
  781. PG_results
  782. PQmakeEmptyPGresult(conn, status)
  783. PG_conn conn
  784. ExecStatusType status
  785. CODE:
  786. RETVAL = (PG_results)calloc(1, sizeof(PGresults));
  787. if (RETVAL) {
  788. RETVAL->result = PQmakeEmptyPGresult((PGconn *)conn, status);
  789. }
  790. OUTPUT:
  791. RETVAL
  792. int
  793. lo_open(conn, lobjId, mode)
  794. PG_conn conn
  795. Oid lobjId
  796. int mode
  797. int
  798. lo_close(conn, fd)
  799. PG_conn conn
  800. int fd
  801. int
  802. lo_read(conn, fd, buf, len)
  803. PREINIT:
  804. SV *bufsv = SvROK(ST(2)) ? SvRV(ST(2)) : ST(2);
  805. INPUT:
  806. PG_conn conn
  807. int fd
  808. int len
  809. char * buf = sv_grow(bufsv, len + 1);
  810. CODE:
  811. RETVAL = lo_read(conn, fd, buf, len);
  812. if (RETVAL > 0) {
  813. SvCUR_set(bufsv, RETVAL);
  814. *SvEND(bufsv) = '';
  815. }
  816. OUTPUT:
  817. RETVAL
  818. buf
  819. int
  820. lo_write(conn, fd, buf, len)
  821. PG_conn conn
  822. int fd
  823. char * buf
  824. int len
  825. int
  826. lo_lseek(conn, fd, offset, whence)
  827. PG_conn conn
  828. int fd
  829. int offset
  830. int whence
  831. Oid
  832. lo_creat(conn, mode)
  833. PG_conn conn
  834. int mode
  835. int
  836. lo_tell(conn, fd)
  837. PG_conn conn
  838. int fd
  839. int
  840. lo_unlink(conn, lobjId)
  841. PG_conn conn
  842. Oid lobjId
  843. Oid
  844. lo_import(conn, filename)
  845. PG_conn conn
  846. char * filename
  847. int
  848. lo_export(conn, lobjId, filename)
  849. PG_conn conn
  850. Oid lobjId
  851. char * filename
  852. MODULE = Pg PACKAGE = PG_results PREFIX = PQ
  853. PROTOTYPES: DISABLE
  854. void
  855. DESTROY(res)
  856. PG_results res
  857. CODE:
  858. /* printf("DESTROY resultn"); */
  859. PQclear(res->result);
  860. Safefree(res);
  861. ExecStatusType
  862. PQresultStatus(res)
  863. PG_results res
  864. CODE:
  865. RETVAL = PQresultStatus(res->result);
  866. OUTPUT:
  867. RETVAL
  868. int
  869. PQntuples(res)
  870. PG_results res
  871. CODE:
  872. RETVAL = PQntuples(res->result);
  873. OUTPUT:
  874. RETVAL
  875. int
  876. PQnfields(res)
  877. PG_results res
  878. CODE:
  879. RETVAL = PQnfields(res->result);
  880. OUTPUT:
  881. RETVAL
  882. int
  883. PQbinaryTuples(res)
  884. PG_results res
  885. CODE:
  886. RETVAL = PQbinaryTuples(res->result);
  887. OUTPUT:
  888. RETVAL
  889. char *
  890. PQfname(res, field_num)
  891. PG_results res
  892. int field_num
  893. CODE:
  894. RETVAL = PQfname(res->result, field_num);
  895. OUTPUT:
  896. RETVAL
  897. int
  898. PQfnumber(res, field_name)
  899. PG_results res
  900. char * field_name
  901. CODE:
  902. RETVAL = PQfnumber(res->result, field_name);
  903. OUTPUT:
  904. RETVAL
  905. Oid
  906. PQftype(res, field_num)
  907. PG_results res
  908. int field_num
  909. CODE:
  910. RETVAL = PQftype(res->result, field_num);
  911. OUTPUT:
  912. RETVAL
  913. short
  914. PQfsize(res, field_num)
  915. PG_results res
  916. int field_num
  917. CODE:
  918. RETVAL = PQfsize(res->result, field_num);
  919. OUTPUT:
  920. RETVAL
  921. int
  922. PQfmod(res, field_num)
  923. PG_results res
  924. int field_num
  925. CODE:
  926. RETVAL = PQfmod(res->result, field_num);
  927. OUTPUT:
  928. RETVAL
  929. char *
  930. PQcmdStatus(res)
  931. PG_results res
  932. CODE:
  933. RETVAL = PQcmdStatus(res->result);
  934. OUTPUT:
  935. RETVAL
  936. char *
  937. PQoidStatus(res)
  938. PG_results res
  939. CODE:
  940. RETVAL = (char *)PQoidStatus(res->result);
  941. OUTPUT:
  942. RETVAL
  943. char *
  944. PQcmdTuples(res)
  945. PG_results res
  946. CODE:
  947. RETVAL = (char *)PQcmdTuples(res->result);
  948. OUTPUT:
  949. RETVAL
  950. char *
  951. PQgetvalue(res, tup_num, field_num)
  952. PG_results res
  953. int tup_num
  954. int field_num
  955. CODE:
  956. RETVAL = PQgetvalue(res->result, tup_num, field_num);
  957. OUTPUT:
  958. RETVAL
  959. int
  960. PQgetlength(res, tup_num, field_num)
  961. PG_results res
  962. int tup_num
  963. int field_num
  964. CODE:
  965. RETVAL = PQgetlength(res->result, tup_num, field_num);
  966. OUTPUT:
  967. RETVAL
  968. int
  969. PQgetisnull(res, tup_num, field_num)
  970. PG_results res
  971. int tup_num
  972. int field_num
  973. CODE:
  974. RETVAL = PQgetisnull(res->result, tup_num, field_num);
  975. OUTPUT:
  976. RETVAL
  977. void
  978. PQfetchrow(res)
  979. PG_results res
  980. PPCODE:
  981. if (res && res->result) {
  982. int cols = PQnfields(res->result);
  983. if (PQntuples(res->result) > res->row) {
  984. int col = 0;
  985. EXTEND(sp, cols);
  986. while (col < cols) {
  987. if (PQgetisnull(res->result, res->row, col)) {
  988. PUSHs(&sv_undef);
  989. } else {
  990. char *val = PQgetvalue(res->result, res->row, col);
  991. PUSHs(sv_2mortal((SV*)newSVpv(val, 0)));
  992. }
  993. ++col;
  994. }
  995. ++res->row;
  996. }
  997. }
  998. void
  999. PQprint(res, fout, header, align, standard, html3, expanded, pager, fieldSep, tableOpt, caption, ...)
  1000. FILE * fout
  1001. PG_results res
  1002. pqbool header
  1003. pqbool align
  1004. pqbool standard
  1005. pqbool html3
  1006. pqbool expanded
  1007. pqbool pager
  1008. char * fieldSep
  1009. char * tableOpt
  1010. char * caption
  1011. PREINIT:
  1012. PQprintOpt ps;
  1013. int i;
  1014. CODE:
  1015. ps.header    = header;
  1016. ps.align     = align;
  1017. ps.standard  = standard;
  1018. ps.html3     = html3;
  1019. ps.expanded  = expanded;
  1020. ps.pager     = pager;
  1021. ps.fieldSep  = fieldSep;
  1022. ps.tableOpt  = tableOpt;
  1023. ps.caption   = caption;
  1024. Newz(0, ps.fieldName, items + 1 - 11, char*);
  1025. for (i = 11; i < items; i++) {
  1026. ps.fieldName[i - 11] = (char *)SvPV(ST(i), na);
  1027. }
  1028. PQprint(fout, res->result, &ps);
  1029. Safefree(ps.fieldName);
  1030. void
  1031. PQdisplayTuples(res, fp, fillAlign, fieldSep, printHeader, quiet)
  1032. PG_results res
  1033. FILE * fp
  1034. int fillAlign
  1035. char * fieldSep
  1036. int printHeader
  1037. int quiet
  1038. CODE:
  1039. PQdisplayTuples(res->result, fp, fillAlign, (const char *)fieldSep, printHeader, quiet);
  1040. void
  1041. PQprintTuples(res, fout, printAttName, terseOutput, width)
  1042. PG_results res
  1043. FILE * fout
  1044. int printAttName
  1045. int terseOutput
  1046. int width
  1047. CODE:
  1048. PQprintTuples(res->result, fout, printAttName, terseOutput, width);