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