PostgreSQL 7.3.2 Documentation | ||
---|---|---|
Prev | Chapter 1. libpq -- C Library |
Example 1-1. libpq Example Program 1
;;; testlibpq.scm ;;; ;;; Test the Scheme version of libpq, the PostgreSQL frontend library. (require (lib "libpq-fe.scm" "libpq")) (define (exit-nicely conn) (PQ-finish conn) (exit 1)) (define (testlibpq) ;; Begin by setting the parameters for a backend connection. If the ;; parameters are false, then the system will try to use reasonable ;; defaults by looking up environment variables or, failing that, ;; using hardwired constants (let ((pghost #f) ;host name of the backend server (pgport #f) ;port of the backend server (pgoptions #f) ;special options to start up the backend server (pgtty #f) ;debugging tty for the backend server (db-name "template1")) ;; Make a connection to the database (let ((conn (PQ-setdb pghost pgport pgoptions pgtty db-name))) ;; Check to see that the backend connection was successfully made (when (= (PQ-status conn) CONNECTION-BAD) (fprintf (current-error-port) "Connection to database '~a' failed.\n" db-name) (fprintf (current-error-port) "~a" (PQ-error-message conn)) (exit-nicely conn)) ;; Start a transaction block (let ((res (PQ-exec conn "BEGIN"))) (unless (and res (= (PQ-result-status res) PGRES-COMMAND-OK))) (fprintf (current-error-port) "BEGIN command failed\n") (PQ-clear res) (exit-nicely conn)) ;; Should PQ-clear PGresult whenever it is no longer needed to avoid ;; memory leaks (PQ-clear res) ;; Fetch instances from the pg_database, the system catalog of ;; databases (set! res (PQ-exec conn "DECLARE mycursor CURSOR FOR select * from pg_database")) (unless (and res (= (PQ-result-status res) PGRES-COMMAND-OK)) (fprintf (current-error-port) "DECLARE CURSOR command failed\n") (PQ-clear res) (exit-nicely conn)) (PQ-clear res) (set! res (PQ-exec conn "FETCH ALL IN mycursor")) (unless (and res (= (PQ-result-status res) PGRES-TUPLES-OK)) (fprintf (current-error-port) "FETCH ALL command didn't return tuples properly\n") (PQ-clear res) (exit-nicely conn)) ;; First, print out the attribute names (let ((n-fields (PQ-nfields res))) (do ((i 0 (+ i 1))) ((>= i n-fields)) (printf "~a" (PQ-fname res i))) (printf "\n\n") ;; Next, print out the rows (do ((i 0 (+ i 1))) ((>= i (PQ-ntuples res))) (do ((j 0 (+ j 1))) ((>= j n-fields)) (printf "~a" (PQ-getvalue res i j))) (printf "\n"))) (PQ-clear res) ;; Close the cursor (set! res (PQ-exec conn "CLOSE mycursor")) (PQ-clear res) ;; Commit the transaction (set! res (PQ-exec conn "COMMIT")) (PQ-clear res)) ;; Close the connection to the database and cleanup (PQ-finish conn))) (exit 0))