1 ;;;; -*- Mode: LISP; Syntax: ANSI-Common-Lisp; Base: 10 -*-
2 ;;;; *************************************************************************
3 ;;;; FILE IDENTIFICATION
5 ;;;; Name: postgresql.cl
6 ;;;; Purpose: Low-level PostgreSQL interface using UFFI
7 ;;;; Programmers: Kevin M. Rosenberg based on
8 ;;;; Original code by Pierre R. Mai
9 ;;;; Date Started: Feb 2002
13 ;;;; This file, part of CLSQL, is Copyright (c) 2002 by Kevin M. Rosenberg
14 ;;;; and Copyright (c) 1999-2001 by Pierre R. Mai
16 ;;;; CLSQL users are granted the rights to distribute and use this software
17 ;;;; as governed by the terms of the Lisp Lesser GNU Public License
18 ;;;; (http://opensource.franz.com/preamble.html), also known as the LLGPL.
19 ;;;; *************************************************************************
21 (in-package #:postgresql)
24 ;;;; This file implements as little of the FFI bindings to the
25 ;;;; PostgreSQL client libraries as we could get away with.
26 ;;;; Especially all the PostgreSQL-specific goodies aren't there, and
27 ;;;; we just use void pointers where we can get away with it, which
28 ;;;; thanks to the design of the PostgreSQL client libraries is pretty
29 ;;;; much everywhere, in contrast to the MySQL client libraries for
36 (uffi:def-foreign-type pgsql-oid :unsigned-int)
38 (uffi:def-enum pgsql-conn-status-type
42 (uffi:def-enum pgsql-exec-status-type
52 (uffi:def-foreign-type pgsql-conn :pointer-void)
53 (uffi:def-foreign-type pgsql-result :pointer-void)
55 (uffi:def-enum pgsql-ftype
63 ;;(declaim (inline PQsetdbLogin)) ;; causes compile error in LW 4.2.0
64 (uffi:def-function ("PQsetdbLogin" PQsetdbLogin)
72 :returning pgsql-conn)
74 (declaim (inline PQfinish))
75 (uffi:def-function ("PQfinish" PQfinish)
80 (declaim (inline PQstatus))
81 (uffi:def-function ("PQstatus" PQstatus)
84 :returning pgsql-conn-status-type)
86 (declaim (inline PQerrorMessage))
87 (uffi:def-function ("PQerrorMessage" PQerrorMessage)
92 (declaim (inline PQexec))
93 (uffi:def-function ("PQexec" PQexec)
97 :returning pgsql-result)
99 (declaim (inline PQresultStatus))
100 (uffi:def-function ("PQresultStatus" PQresultStatus)
103 :returning pgsql-exec-status-type)
105 (declaim (inline PQresultErrorMessage))
106 (uffi:def-function ("PQresultErrorMessage" PQresultErrorMessage)
111 (declaim (inline PQntuples))
112 (uffi:def-function ("PQntuples" PQntuples)
117 (declaim (inline PQnfields))
118 (uffi:def-function ("PQnfields" PQnfields)
123 (declaim (inline PQfname))
124 (uffi:def-function ("PQfname" PQfname)
130 (declaim (inline PQfnumber))
131 (uffi:def-function ("PQfnumber" PQfnumber)
133 (field-name :cstring))
137 (declaim (inline PQftype))
138 (uffi:def-function ("PQftype" PQftype)
142 :returning pgsql-oid)
144 (declaim (inline PQfsize))
145 (uffi:def-function ("PQfsize" PQfsize)
151 (declaim (inline PQcmdStatus))
152 (uffi:def-function ("PQcmdStatus" PQcmdStatus)
157 (declaim (inline PQoidStatus))
158 (uffi:def-function ("PQoidStatus" PQoidStatus)
163 (declaim (inline PQcmdTuples))
164 (uffi:def-function ("PQcmdTuples" PQcmdTuples)
169 (declaim (inline PQgetvalue))
170 (uffi:def-function ("PQgetvalue" PQgetvalue)
175 :returning (* :unsigned-char))
177 (declaim (inline PQgetlength))
178 (uffi:def-function ("PQgetlength" PQgetlength)
185 (declaim (inline PQgetisnull))
186 (uffi:def-function ("PQgetisnull" PQgetisnull)
193 (declaim (inline PQclear))
194 (uffi:def-function ("PQclear" PQclear)
199 (declaim (inline PQisBusy))
200 (uffi:def-function ("PQisBusy" PQisBusy)
206 ;;; Large objects support (MB)
208 (defconstant +INV_ARCHIVE+ 65536) ; fe-lobj.c
209 (defconstant +INV_WRITE+ 131072)
210 (defconstant +INV_READ+ 262144)
212 (declaim (inline lo-creat))
213 (uffi:def-function ("lo_creat" lo-create)
217 :returning pgsql-oid)
219 (declaim (inline lo-open))
220 (uffi:def-function ("lo_open" lo-open)
227 (declaim (inline lo-write))
228 (uffi:def-function ("lo_write" lo-write)
236 (declaim (inline lo-read))
237 (uffi:def-function ("lo_read" lo-read)
240 (data (* :unsigned-char))
245 (declaim (inline lo-lseek))
246 (uffi:def-function ("lo_lseek" lo-lseek)
254 (declaim (inline lo-close))
255 (uffi:def-function ("lo_close" lo-close)
261 (declaim (inline lo-unlink))
262 (uffi:def-function ("lo_unlink" lo-unlink)