Major rewrite of table/column name output escaping system wide.
[clsql.git] / sql / generics.lisp
index d8066cf04a8709fbcddaf58e9c766af737ac380b..0d1a4da4bcac85582e4a4bb24d568934bef07d97 100644 (file)
@@ -4,12 +4,10 @@
 ;;;;
 ;;;; Name:     generics.lisp
 ;;;; Purpose:  Generic function definitions for DB interfaces
 ;;;;
 ;;;; Name:     generics.lisp
 ;;;; Purpose:  Generic function definitions for DB interfaces
-;;;; Author:   Kevin M. Rosenberg based on
+;;;; Author:   Kevin M. Rosenberg
 ;;;; Created:  Apr 2004
 ;;;;
 ;;;; Created:  Apr 2004
 ;;;;
-;;;; $Id$
-;;;;
-;;;; This file, part of CLSQL, is Copyright (c) 2002-2004 by Kevin M. Rosenberg
+;;;; This file, part of CLSQL, is Copyright (c) 2004-2010 by Kevin M. Rosenberg
 ;;;;
 ;;;; CLSQL users are granted the rights to distribute and use this software
 ;;;; as governed by the terms of the Lisp Lesser GNU Public License
 ;;;;
 ;;;; CLSQL users are granted the rights to distribute and use this software
 ;;;; as governed by the terms of the Lisp Lesser GNU Public License
 (in-package #:clsql-sys)
 
 
 (in-package #:clsql-sys)
 
 
-;; FDML 
+;; FDML
+(defgeneric choose-database-for-instance (object &optional database)
+  (:documentation "Used by the oodml functions to select which
+ database object to use. Chooses the database associated with the
+ object primarily, falls back to the database provided as an argument
+ or the *DEFAULT-DATABASE*."))
 
 (defgeneric execute-command (expression &key database)
   (:documentation
 
 (defgeneric execute-command (expression &key database)
   (:documentation
@@ -48,7 +51,7 @@ record selected by QUERY-EXPRESSION, the results are returned as
 elements of a list."))
 
 
 elements of a list."))
 
 
-;; OODML 
+;; OODML
 
 (defgeneric update-record-from-slot (object slot &key database)
   (:documentation
 
 (defgeneric update-record-from-slot (object slot &key database)
   (:documentation
@@ -63,7 +66,7 @@ attributes having default values. Furthermore, OBJECT becomes
 associated with DATABASE."))
 
 (defgeneric update-record-from-slots (object slots &key database)
 associated with DATABASE."))
 
 (defgeneric update-record-from-slots (object slots &key database)
-  (:documentation 
+  (:documentation
    "Updates the values stored in the columns represented by the
 slots, specified by the CLOS slot names SLOTS, of View Class
 instance OBJECT. DATABASE defaults to *DEFAULT-DATABASE* and
    "Updates the values stored in the columns represented by the
 slots, specified by the CLOS slot names SLOTS, of View Class
 instance OBJECT. DATABASE defaults to *DEFAULT-DATABASE* and
@@ -74,7 +77,7 @@ represented by SLOTS are initialised from the values of the
 supplied slots with other attributes having default
 values. Furthermore, OBJECT becomes associated with DATABASE."))
 
 supplied slots with other attributes having default
 values. Furthermore, OBJECT becomes associated with DATABASE."))
 
-(defgeneric update-records-from-instance (object &key database)
+(defgeneric update-records-from-instance (object &key database this-class)
   (:documentation
    "Using an instance of a View Class, OBJECT, update the table
 that stores its instance data. DATABASE defaults to
   (:documentation
    "Using an instance of a View Class, OBJECT, update the table
 that stores its instance data. DATABASE defaults to
@@ -84,13 +87,13 @@ case, a record is created in the appropriate table of DATABASE
 using values from the slot values of OBJECT, and OBJECT becomes
 associated with DATABASE."))
 
 using values from the slot values of OBJECT, and OBJECT becomes
 associated with DATABASE."))
 
-(defgeneric delete-instance-records (object)
+(defgeneric delete-instance-records (object &key database)
   (:documentation
    "Deletes the records represented by OBJECT in the appropriate
 table of the database associated with OBJECT. If OBJECT is not
 yet associated with a database, an error is signalled."))
 
   (:documentation
    "Deletes the records represented by OBJECT in the appropriate
 table of the database associated with OBJECT. If OBJECT is not
 yet associated with a database, an error is signalled."))
 
-(defgeneric update-instance-from-records (object &key database)
+(defgeneric update-instance-from-records (object &key database this-class)
   (:documentation
    "Updates the slot values of the View Class instance OBJECT
 using the attribute values of the appropriate table of DATABASE
   (:documentation
    "Updates the slot values of the View Class instance OBJECT
 using the attribute values of the appropriate table of DATABASE
@@ -109,8 +112,8 @@ database, *DEFAULT-DATABASE*.  Join slots are updated but
 instances of the class on which the join is made are not
 updated."))
 
 instances of the class on which the join is made are not
 updated."))
 
-(defgeneric instance-refreshed (object) 
-  (:documentation 
+(defgeneric instance-refreshed (object)
+  (:documentation
    "Provides a hook which is called within an object oriented
 call to SELECT with a non-nil value of REFRESH when the View
 Class instance OBJECT has been updated from the database. A
    "Provides a hook which is called within an object oriented
 call to SELECT with a non-nil value of REFRESH when the View
 Class instance OBJECT has been updated from the database. A
@@ -141,9 +144,30 @@ DATABASE-NULL-VALUE on the type of the slot."))
   )
 (defgeneric read-sql-value  (val type database db-type)
   )
   )
 (defgeneric read-sql-value  (val type database db-type)
   )
+(defgeneric database-add-autoincrement-sequence (class database)
+  (:method (class database) nil)
+  (:documentation "If a database needs to add a sequence for its
+    autoincrement to work, this is where it should go.  Default is
+    that it doesnt so just return nil"))
+(defgeneric database-remove-autoincrement-sequence (class database)
+  (:method (class database) nil)
+  (:documentation "If a database needs to add a sequence for its
+    autoincrement to work, this is where it should go.  Default is
+    that it doesnt so just return nil"))
+(defgeneric auto-increment-sequence-name (class slotdef database)
+  (:documentation "The sequence name to create for this autoincremnt column on this class
+   if returns nil, there is no associated sequence "))
+
+(defmethod auto-increment-sequence-name :around (class slot database)
+  (when (auto-increment-column-p slot database)
+    (call-next-method)))
+
+(defgeneric database-last-auto-increment-id (database table column)
+  )
+
 
 
 
 
-;; Generation of SQL strings from lisp expressions 
+;; Generation of SQL strings from lisp expressions
 
 (defgeneric output-sql (expr database)
   (:documentation "Writes an SQL string appropriate for DATABASE
 
 (defgeneric output-sql (expr database)
   (:documentation "Writes an SQL string appropriate for DATABASE