r9796: * sql/expressions.lisp: reactivate caching of generated SQL
[clsql.git] / sql / package.lisp
1 ;;;; -*- Mode: LISP; Syntax: ANSI-Common-Lisp; Base: 10 -*-
2 ;;;; *************************************************************************
3 ;;;; FILE IDENTIFICATION
4 ;;;;
5 ;;;; Name:          package.lisp
6 ;;;; Purpose:       Package definition for SQL interface
7 ;;;;
8 ;;;; $Id$
9 ;;;; 
10 ;;;; This file is part of CLSQL.
11 ;;;;
12 ;;;; CLSQL users are granted the rights to distribute and use this software
13 ;;;; as governed by the terms of the Lisp Lesser GNU Public License
14 ;;;; (http://opensource.franz.com/preamble.html), also known as the LLGPL.
15 ;;;; *************************************************************************
16
17 (in-package #:cl-user)
18
19 ;;;; This file makes the required package definitions for CLSQL's
20 ;;;; core packages.
21
22 (eval-when (:compile-toplevel :load-toplevel :execute)
23  #+sbcl
24   (if (find-package 'sb-mop)
25       (pushnew :clsql-sbcl-mop cl:*features*)
26       (pushnew :clsql-sbcl-pcl cl:*features*))
27   
28   #+cmu
29   (if (eq (symbol-package 'pcl:find-class)
30           (find-package 'common-lisp))
31       (pushnew :clsql-cmucl-mop cl:*features*)
32       (pushnew :clsql-cmucl-pcl cl:*features*)))
33
34
35 (eval-when (:compile-toplevel :load-toplevel :execute)
36   (defpackage #:clsql-sys
37     (:use #:common-lisp
38           #+clsql-sbcl-mop #:sb-mop
39           #+clsql-cmucl-mop #:mop
40           #+allegro #:mop
41           #+lispworks #:clos
42           #+scl #:clos
43           #+openmcl #:openmcl-mop)
44     
45     #+allegro
46     (:shadowing-import-from 
47      #:excl)
48     #+lispworks
49     (:shadowing-import-from 
50      #:clos)
51     #+clsql-sbcl-mop 
52     (:shadowing-import-from 
53      #:sb-pcl
54      #:generic-function-lambda-list)
55     #+clsql-sbcl-pcl
56     (:shadowing-import-from 
57      #:sb-pcl
58      #:name
59      #:class-direct-slots
60      #:class-of #:class-name #:class-slots #:find-class
61      #:slot-boundp
62      #:standard-class
63      #:slot-definition-name #:finalize-inheritance
64      #:standard-direct-slot-definition
65      #:standard-effective-slot-definition #:validate-superclass
66      #:direct-slot-definition-class #:compute-effective-slot-definition
67      #:effective-slot-definition-class
68      #:slot-value-using-class
69      #:class-prototype #:generic-function-method-class #:intern-eql-specializer
70      #:make-method-lambda #:generic-function-lambda-list
71      #:class-precedence-list #:slot-definition-type
72      #:class-direct-superclasses
73      #:compute-class-precedence-list)
74     #+clsql-cmucl-mop 
75     (:shadowing-import-from 
76      #:pcl
77      #:generic-function-lambda-list)
78     #+clsql-cmucl-pcl
79     (:shadowing-import-from 
80      #:pcl
81      #:class-direct-slots
82      #:name
83      #:class-of  #:class-name #:class-slots #:find-class #:standard-class
84      #:slot-boundp
85      #:slot-definition-name #:finalize-inheritance
86      #:standard-direct-slot-definition #:standard-effective-slot-definition
87      #:validate-superclass #:direct-slot-definition-class
88      #:effective-slot-definition-class
89      #:compute-effective-slot-definition
90      #:slot-value-using-class
91      #:class-prototype #:generic-function-method-class #:intern-eql-specializer
92      #:make-method-lambda #:generic-function-lambda-list
93      #:class-precedence-list #:slot-definition-type
94      #:class-direct-superclasses
95      #:compute-class-precedence-list)
96     #+scl
97     (:shadowing-import-from 
98      #:clos
99      #:class-prototype  ;; note: make-method-lambda is not fbound
100      )
101     
102     (:export
103      ;; "Private" exports for use by interface packages
104      #:check-connection-spec
105      #:database-initialize-database-type
106      #:database-type-load-foreign
107      #:database-connect
108      #:database-disconnect
109      #:database-query
110      #:database-execute-command
111      #:database-create-sequence
112      #:database-drop-sequence
113      #:database-sequence-next
114      #:database-set-sequence-position
115      #:database-query-result-set
116      #:database-dump-result-set
117      #:database-store-next-row
118      #:database-list-tables
119      #:database-list-tables-and-sequences
120      #:database-table-exists-p
121      #:database-list-views
122      #:database-view-exists-p
123      #:database-list-indexes
124      #:database-list-table-indexes
125      #:database-index-exists-p
126      #:database-list-sequences
127      #:database-sequence-last
128      #:database-sequence-exists-p
129      #:database-list-attributes
130      #:database-attribute-type
131      #:database-type-library-loaded
132      #:database-create
133      #:database-destroy
134      #:database-probe
135      #:database-list
136      
137      #:db-backend-has-create/destroy-db?
138      #:db-type-has-views?
139      #:db-type-has-bigint?
140      #:db-type-has-union?
141      #:db-type-has-prepared-stmt?
142      #:db-type-has-subqueries?
143      #:db-type-has-boolean-where?
144      #:db-type-transaction-capable?
145      #:db-type-has-fancy-math?
146      #:db-type-default-case
147      #:db-type-use-column-on-drop-index? 
148      #:database-underlying-type
149      #:database-get-type-specifier
150      #:read-sql-value
151      #:database-output-sql-as-type
152      #:*loaded-database-types*
153      #:reload-database-types
154      #:is-database-open
155
156      ;; Large objects 
157      #:database-create-large-object
158      #:database-write-large-object
159      #:database-read-large-object
160      #:database-delete-large-object
161      #:create-large-object
162      #:write-large-object
163      #:read-large-object
164      #:delete-large-object
165
166      ;; Prepared statments
167      #:database-prepare
168      #:database-run-prepared
169      #:database-bind-parameter
170      #:database-free-prepared
171
172      ;; accessors for database class
173      #:name
174      #:connection-spec
175      #:transaction
176      #:transaction-level
177      #:conn-pool
178      #:command-recording-stream
179      #:result-recording-stream
180      #:record-caches
181      #:view-classes
182      #:database-state
183      #:attribute-cache
184      #:database-autocommit
185
186      ;; utils.lisp
187      #:without-interrupts
188      #:make-process-lock
189      #:with-process-lock
190      #:command-output
191      #:symbol-name-default-case
192      #:convert-to-db-default-case
193      #:ensure-keyword
194      #:getenv
195      #:number-to-sql-string
196      #:float-to-sql-string
197      #:sql-escape-quotes
198      #:sql-escape 
199      #:in
200
201      ;; Generic backends
202      #:generic-postgresql-database
203      #:generic-odbc-database
204
205          ;; Subclasses of sql-expresssion (expressions.lisp) 
206          #:sql-function-exp
207          #:sql-value-exp 
208          #:sql-set-exp 
209          #:sql-query-modifier-exp 
210          #:sql-relational-exp 
211          #:sql-upcase-like 
212          #:sql-assignment-exp 
213          #:sql-typecast-exp 
214          #:sql-between-exp 
215          #:sql-ident 
216          #:sql-ident-attribute
217          #:sql-ident-table 
218
219      .
220
221      ;; Shared exports for re-export by CLSQL package. 
222      #1=(
223
224          ;; Condition system (conditions.lisp) 
225          #:sql-user-error
226          #:sql-database-error
227          #:sql-database-data-error
228          #:sql-connection-error
229          #:sql-temporary-error
230          #:sql-timeout-error 
231          #:sql-fatal-error 
232          #:sql-error-error-id
233          #:sql-error-secondary-error-id
234          #:sql-error-database-message
235          ;; CLSQL Extensions
236          #:sql-condition
237          #:sql-error
238          #:sql-warning
239          #:sql-database-warning
240          #:sql-error-database 
241          #:sql-error-database-type 
242          #:sql-error-connection-spec 
243          #:sql-error-expression 
244          #:sql-warning-database 
245          #:sql-user-error-message 
246          #:*backend-warning-behavior*
247
248          ;; Connection/initialisation (base-classes.lisp, database.lisp, 
249          ;;   initialize.lisp)
250          #:*default-database-type*       
251          #:*default-database*            
252          #:*initialized-database-types*
253          #:initialize-database-type
254          #:connect                     
255          #:disconnect                  
256          #:*connect-if-exists*         
257          #:connected-databases         
258          #:database                    
259          #:database-name               
260          #:reconnect                   
261          #:find-database               
262          #:status                      
263          ;; CLSQL Extensions 
264          #:database-name-from-spec
265          #:database-type 
266          #:with-database
267          #:with-default-database
268          #:disconnect-pooled
269          #:list-databases
270          #:create-database
271          #:destroy-database
272          #:probe-database
273
274          ;; I/O Recording (recording.lisp) 
275          #:add-sql-stream             
276          #:delete-sql-stream          
277          #:list-sql-streams           
278          #:sql-recording-p            
279          #:sql-stream                   
280          #:start-sql-recording          
281          #:stop-sql-recording           
282
283          ;; FDDL (fddl.lisp) 
284          #:create-table                   
285          #:drop-table                     
286          #:list-tables                    
287          #:table-exists-p                 
288          #:list-attributes                
289          #:attribute-type                 
290          #:list-attribute-types           
291          #:create-view                    
292          #:drop-view                      
293          #:create-index                   
294          #:drop-index                     
295          ;; CLSQL Extensions 
296          #:truncate-database
297          #:list-views                  
298          #:view-exists-p               
299          #:list-indexes                
300          #:index-exists-p              
301          #:create-sequence             
302          #:drop-sequence               
303          #:list-sequences              
304          #:sequence-exists-p           
305          #:sequence-next               
306          #:sequence-last               
307          #:set-sequence-position       
308
309          ;; FDML (fdml.lisp) 
310          #:select 
311          #:cache-table-queries     
312          #:*cache-table-queries-default*
313          #:delete-records               
314          #:insert-records               
315          #:update-records               
316          #:execute-command              
317          #:query                        
318          #:print-query                  
319          #:do-query                     
320          #:map-query                    
321          #:loop
322          ;; CLSQL Extensions 
323          #:prepare-sql
324          #:bind-parameter
325          #:run-prepared-sql
326          #:free-prepared-sql
327
328          ;; Transaction handling (transaction.lisp) 
329          #:with-transaction
330          #:commit                        
331          #:rollback                      
332          ;; CLSQL Extensions 
333          #:add-transaction-commit-hook
334          #:add-transaction-rollback-hook
335          #:start-transaction             
336          #:in-transaction-p              
337          #:set-autocommit
338
339          ;; OODDL (ooddl.lisp) 
340          #:standard-db-object               
341          #:def-view-class                   
342          #:create-view-from-class           
343          #:drop-view-from-class             
344          #:list-classes                     
345          #:universal-time    
346          ;; CLSQL Extensions 
347          #:view-table        
348          #:bigint
349          #:varchar
350          #:generalized-boolean
351          #:smallint
352          #:tinyint
353          #:*default-string-length*
354
355          ;; OODML (oodml.lisp) 
356          #:instance-refreshed               
357          #:update-objects-joins             
358          #:*default-update-objects-max-len* 
359          #:update-slot-from-record          
360          #:update-instance-from-records     
361          #:update-records-from-instance     
362          #:update-record-from-slot          
363          #:update-record-from-slots         
364          #:delete-instance-records          
365          ;; CLSQL Extensions 
366          #:*db-auto-sync*    
367          #:write-instance-to-stream
368          #:read-instance-from-stream
369          
370          ;; Symbolic SQL Syntax (syntax.lisp) 
371          #:sql                              
372          #:sql-expression                   
373          #:sql-operation                    
374          #:sql-operator                     
375          #:disable-sql-reader-syntax        
376          #:enable-sql-reader-syntax         
377          #:locally-disable-sql-reader-syntax
378          #:locally-enable-sql-reader-syntax 
379          #:restore-sql-reader-syntax-state  
380          
381          ;; SQL operations (operations.lisp) 
382          #:sql-query
383          #:sql-object-query
384          #:sql-any
385          #:sql-some 
386          #:sql-all
387          #:sql-not
388          #:sql-union
389          #:sql-intersect
390          #:sql-minus
391          #:sql-except 
392          #:sql-order-by 
393          #:sql-null
394          #:sql-*
395          #:sql-+
396          #:sql-/
397          #:sql--
398          #:sql-like
399          #:sql-and
400          #:sql-or
401          #:sql-in
402          #:sql-substr 
403          #:sql-concat-op 
404          #:sql-=
405          #:sql-<
406          #:sql->
407          #:sql->=
408          #:sql-<=
409          #:sql-<>
410          #:sql-count
411          #:sql-max
412          #:sql-min
413          #:sql-avg
414          #:sql-sum
415          #:sql-function 
416          #:sql-between 
417          #:sql-distinct 
418          #:sql-nvl 
419          #:sql-slot-value
420          #:sql-userenv 
421          ;; CLSQL Extensions 
422          #:sql-concat
423          #:sql-substring 
424          #:sql-limit 
425          #:sql-group-by
426          #:sql-having
427          #:sql-not-null
428          #:sql-exists
429          #:sql-uplike
430          #:sql-is
431          #:sql-==
432          #:sql-the 
433          #:sql-coalesce 
434          #:sql-view-class
435
436          ;; Time handling (time.lisp) 
437          #:bad-component
438          #:current-day
439          #:current-month
440          #:current-year
441          #:day-duration
442          #:db-timestring
443          #:decode-duration
444          #:decode-time
445          #:duration
446          #:duration+
447          #:duration<
448          #:duration<=
449          #:duration=
450          #:duration>
451          #:duration>=
452          #:duration-day
453          #:duration-hour
454          #:duration-minute
455          #:duration-month
456          #:duration-second
457          #:duration-year
458          #:duration-reduce 
459          #:duration-timestring
460          #:extract-roman 
461          #:format-duration
462          #:format-time
463          #:get-time
464          #:utime->time
465          #:interval-clear
466          #:interval-contained
467          #:interval-data
468          #:interval-edit
469          #:interval-end
470          #:interval-match
471          #:interval-push
472          #:interval-relation
473          #:interval-start
474          #:interval-type
475          #:make-duration
476          #:make-interval
477          #:make-time
478          #:merged-time
479          #:midnight
480          #:month-name
481          #:parse-date-time
482          #:parse-timestring
483          #:parse-yearstring
484          #:print-date
485          #:roll
486          #:roll-to
487          #:time
488          #:time+
489          #:time-
490          #:time-by-adding-duration
491          #:time-compare
492          #:time-difference
493          #:time-dow
494          #:time-element
495          #:time-max
496          #:time-min
497          #:time-mjd
498          #:time-msec
499          #:time-p
500          #:time-sec
501          #:time-well-formed
502          #:time-ymd
503          #:time<
504          #:time<=
505          #:time=
506          #:time>
507          #:time>=
508          #:timezone
509          #:universal-time
510          #:wall-time
511          #:wall-timestring
512          #:week-containing
513          #:gregorian-to-mjd
514          #:mjd-to-gregorian
515          ))
516     (:documentation "This is the INTERNAL SQL-Interface package of CLSQL."))
517
518
519 (defpackage #:clsql
520   (:use #:common-lisp)
521   (:import-from #:clsql-sys . #1#)
522   (:export . #1#)
523   (:documentation "This is the user package with CLSQL symbols."))
524
525 (defpackage #:clsql-user
526   (:use #:common-lisp)
527   (:import-from #:clsql-sys . #1#)
528   (:export . #1#)
529   (:documentation "This is the user package with CLSQL symbols."))
530
531   ;; This is from USQL's pcl-patch  
532   #+(or clsql-sbcl-pcl clsql-cmucl-pcl)
533   (progn
534     ;; Note that this will no longer required for cmucl as of version 19a. 
535     (in-package #+cmu :pcl #+sbcl :sb-pcl)
536     (defmacro pv-binding1 ((pv calls pv-table-symbol pv-parameters slot-vars) 
537                            &body body)
538       `(pv-env (,pv ,calls ,pv-table-symbol ,pv-parameters)
539         (let (,@(mapcar #'(lambda (slot-var p) `(,slot-var (get-slots-or-nil ,p)))
540                         slot-vars pv-parameters))
541           ,@(mapcar #'(lambda (slot-var) `(declare (ignorable ,slot-var))) slot-vars)
542           ,@body))))
543
544 ;; see http://thread.gmane.org/gmane.lisp.lispworks.general/681
545 #+lispworks
546 (setf *packages-for-warn-on-redefinition* 
547       (delete "SQL" *packages-for-warn-on-redefinition* :test 'string=))
548
549   #+sbcl
550   (if (find-package 'sb-mop)
551       (setq cl:*features* (delete :clsql-sbcl-mop cl:*features*))
552       (setq cl:*features* (delete :clsql-sbcl-pcl cl:*features*)))
553   
554   #+cmu
555   (if (find-package 'mop)
556       (setq cl:*features* (delete :clsql-cmucl-mop cl:*features*))
557       (setq cl:*features* (delete :clsql-cmucl-pcl cl:*features*)))
558
559 ) ;eval-when                                      
560