15dfecf96Smrg;; Postgresql C library interface, example program 1, using the xedit 25dfecf96Smrg;; lisp interface 35dfecf96Smrg 45dfecf96Smrg;; Test the C version of libpq, the PostgreSQL frontend library. 55dfecf96Smrg(require "psql") 65dfecf96Smrg 75dfecf96Smrg(defun exit-nicely (conn) 85dfecf96Smrg (pq-finish conn) 95dfecf96Smrg (quit 1) 105dfecf96Smrg) 115dfecf96Smrg 125dfecf96Smrg;; begin, by setting the parameters for a backend connection if the 135dfecf96Smrg;; parameters are null, then the system will try to use reasonable 145dfecf96Smrg;; defaults by looking up environment variables or, failing that, 155dfecf96Smrg;; using hardwired constants 165dfecf96Smrg(setq pghost nil) ; host name of the backend server 175dfecf96Smrg(setq pgport nil) ; port of the backend server 185dfecf96Smrg(setq pgoptions nil) ; special options to start up the backend server 195dfecf96Smrg(setq pgtty nil) ; debugging tty for the backend server 205dfecf96Smrg(setq pgdbname "template1") 215dfecf96Smrg 225dfecf96Smrg;; make a connection to the database 235dfecf96Smrg(setq conn (pq-setdb pghost pgport pgoptions pgtty pgdbname)) 245dfecf96Smrg 255dfecf96Smrg;; check to see that the backend connection was successfully made 265dfecf96Smrg(when (= (pq-status conn) pg-connection-bad) 275dfecf96Smrg (format t "Connection to database '~A' failed.~%" pgdbname) 285dfecf96Smrg (format t "~A" (pq-error-message conn)) 295dfecf96Smrg (exit-nicely conn)) 305dfecf96Smrg 315dfecf96Smrg;; start a transaction block 325dfecf96Smrg(setq res (pq-exec conn "BEGIN")) 335dfecf96Smrg(when (or (null res) (not (= (pq-result-status res) pgres-command-ok))) 345dfecf96Smrg (format t "BEGIN command failed~%") 355dfecf96Smrg (pq-clear res) 365dfecf96Smrg (exit-nicely conn)) 375dfecf96Smrg 385dfecf96Smrg;; Should PQclear PGresult whenever it is no longer needed to avoid memory leaks 395dfecf96Smrg(pq-clear res) 405dfecf96Smrg 415dfecf96Smrg;; fetch rows from the pg_database, the system catalog of databases 425dfecf96Smrg(setq res (pq-exec conn "DECLARE mycursor CURSOR FOR select * from pg_database")) 435dfecf96Smrg(when (or (null res) (not (= (pq-result-status res) pgres-command-ok))) 445dfecf96Smrg (format t "DECLARE CURSOR command failed~%") 455dfecf96Smrg (pq-clear res) 465dfecf96Smrg (exit-nicely conn)) 475dfecf96Smrg(pq-clear res) 485dfecf96Smrg(setq res (pq-exec conn "FETCH ALL in mycursor")) 495dfecf96Smrg(when (or (null res) (not (= (pq-result-status res) pgres-tuples-ok))) 505dfecf96Smrg (format t "FETCH ALL command didn't return tuples properly~%") 515dfecf96Smrg (pq-clear res) 525dfecf96Smrg (exit-nicely conn)) 535dfecf96Smrg 545dfecf96Smrg;; first, print out the attribute names 555dfecf96Smrg(setq nfields (pq-nfields res)) 565dfecf96Smrg(dotimes (i nfields) 575dfecf96Smrg (format t "~15@<~A~>" (pq-fname res i)) 585dfecf96Smrg) 595dfecf96Smrg(format t "~%") 605dfecf96Smrg 615dfecf96Smrg;; next, print out the rows 625dfecf96Smrg(setq ntuples (pq-ntuples res)) 635dfecf96Smrg(dotimes (i ntuples) 645dfecf96Smrg (dotimes (j nfields) 655dfecf96Smrg (format t "~15@<~A~>" (pq-getvalue res i j)) 665dfecf96Smrg ) 675dfecf96Smrg (format t "~%") 685dfecf96Smrg) 695dfecf96Smrg(pq-clear res) 705dfecf96Smrg 715dfecf96Smrg;; close the cursor 725dfecf96Smrg(setq res (pq-exec conn "CLOSE mycursor")) 735dfecf96Smrg(pq-clear res) 745dfecf96Smrg 755dfecf96Smrg;; commit the transaction 765dfecf96Smrg(setq res (pq-exec conn "COMMIT")) 775dfecf96Smrg(pq-clear res) 785dfecf96Smrg 795dfecf96Smrg;; close the connection to the database and cleanup 805dfecf96Smrg(pq-finish conn) 81