r9209: read tinyint as integer for odbc, handle boolean reading/writing fields
[clsql.git] / sql / generics.lisp
index eabb8e5336f1fb07b745ca3271d59c1b6a1d373f..f38b80bb01d37900386f7f8ac8b69fe8b22c96f7 100644 (file)
 
 (in-package #:clsql-sys)
 
+(defgeneric select (&rest args) 
+  (:documentation
+   "The function SELECT selects data from DATABASE, which has a
+default value of *DEFAULT-DATABASE*, given the constraints
+specified by the rest of the ARGS. It returns a list of objects
+as specified by SELECTIONS. By default, the objects will each be
+represented as lists of attribute values. The argument SELECTIONS
+consists either of database identifiers, type-modified database
+identifiers or literal strings. A type-modifed database
+identifier is an expression such as [foo :string] which means
+that the values in column foo are returned as Lisp strings.  The
+FLATP argument, which has a default value of nil, specifies if
+full bracketed results should be returned for each matched
+entry. If FLATP is nil, the results are returned as a list of
+lists. If FLATP is t, the results are returned as elements of a
+list, only if there is only one result per row. The arguments
+ALL, SET-OPERATION, DISTINCT, FROM, WHERE, GROUP-BY, HAVING and
+ORDER-by have the same function as the equivalent SQL expression.
+The SELECT function is common across both the functional and
+object-oriented SQL interfaces. If selections refers to View
+Classes then the select operation becomes object-oriented. This
+means that SELECT returns a list of View Class instances, and
+SLOT-VALUE becomes a valid SQL operator for use within the where
+clause. In the View Class case, a second equivalent select call
+will return the same View Class instance objects. If REFRESH is
+true, then existing instances are updated if necessary, and in
+this case you might need to extend the hook INSTANCE-REFRESHED.
+The default value of REFRESH is nil. SQL expressions used in the
+SELECT function are specified using the square bracket syntax,
+once this syntax has been enabled using
+ENABLE-SQL-READER-SYNTAX."))
+
+(defgeneric update-record-from-slot (object slot &key database)
+  (:documentation
+   "The generic function UPDATE-RECORD-FROM-SLOT updates an individual
+data item in the column represented by SLOT. The DATABASE is only used
+if OBJECT is not yet associated with any database, in which case a
+record is created in DATABASE. Only SLOT is initialized in this case;
+other columns in the underlying database receive default values. The
+argument SLOT is the CLOS slot name; the corresponding column names
+are derived from the View Class definition."))
+
+(defgeneric update-record-from-slots (object slots &key database)
+  (:documentation 
+   "The generic function UPDATE-RECORD-FROM-SLOTS updates data in the
+columns represented by SLOTS. The DATABASE is only used if OBJECT is
+not yet associated with any database, in which case a record is
+created in DATABASE. Only slots are initialized in this case; other
+columns in the underlying database receive default values. The
+argument SLOTS contains the CLOS slot names; the corresponding column
+names are derived from the view class definition."))
+
+(defgeneric update-records-from-instance (object &key database)
+  (:documentation
+   "Using an instance of a view class, OBJECT, update the database
+table that stores its instance data. If OBJECT is already associated
+with a database, that database is used, and DATABASE is ignored. If
+OBJECT is not yet associated with a database, a record is created for
+instance in the appropriate table of DATABASE and the instance becomes
+associated with that database."))
+
+(defgeneric delete-instance-records (instance)
+  (:documentation
+   "Deletes the records represented by INSTANCE from the database
+associated with it. If INSTANCE has no associated database, an error
+is signalled."))
+
+(defgeneric update-instance-from-records (instance &key database)
+  (:documentation
+   "The generic function UPDATE-INSTANCE-FROM-RECORDS updates the
+values in the slots of the View Class instance INSTANCE using the data
+in the database DATABASE which defaults to the DATABASE that instance
+is associated with, or the value of *DEFAULT-DATABASE*. If INSTANCE is
+associated with a database, then DATABASE must be that same
+database. The update is not recursive on joins. Join slots (that is,
+slots with :db-kind :join ) are updated, but the joined objects are
+not updated."))
+
+(defgeneric update-slot-from-record (instance slot &key database)
+  (:documentation
+   "Updates the value in the slot SLOT of the View Class instance
+INSTANCE using the data in the database DATABASE which defaults to the
+database that INSTANCE is associated with, or the value of
+*DEFAULT-DATABASE*. The argument SLOT is the CLOS slot name, the
+corresponding column names are derived from the View Class
+definition. The update is not recursive on joins. Join slots (that is,
+slots with :db-kind :join) are updated, but the joined objects are not
+updated."))
+
+(defgeneric instance-refreshed (instance) 
+  (:documentation 
+   "The function INSTANCE-REFRESHED is called inside SELECT when its
+REFRESH argument is true and the instance INSTANCE has just been
+updated. The supplied method on STANDARD-DB-OBJECT does nothing. If
+your application needs to take action when a View Class instance has
+been updated by (select ... :refresh t) then add an INSTANCE-REFRESH
+method specializing on your subclass of STANDARD-DB-OBJECT."))
+
+(defgeneric update-slot-with-null (instance slotname slotdef)
+  (:documentation "Called to update a slot when its column has a NULL
+value.  If nulls are allowed for the column, the slot's value will be
+nil, otherwise its value will be set to the result of calling
+DATABASE-NULL-VALUE on the type of the slot."))
+
 (defgeneric output-sql (expr database)
   )
 
 (defgeneric output-sql-hash-key (arg database)
   )
 
+(defgeneric collect-table-refs (sql)
+  )
+(defgeneric database-output-sql (arg database)
+  )
+(defgeneric database-constraint-description  (constraint database)
+  )
+(defgeneric database-pkey-constraint  (class database)
+  )
+(defgeneric database-constraint-statement  (constraints database)
+  )
+(defgeneric %install-class  (class database)
+  )
+(defgeneric database-generate-column-definition  (class slotdef database)
+  )
+(defgeneric update-slot-from-db  (instance slotdef val)
+  )
+(defgeneric key-value-from-db  (slotdef value database)
+  )
+(defgeneric get-slot-values-from-view  (obj slotdeflist values)
+  )
+(defgeneric database-output-sql-as-type  (type val database)
+  )
+(defgeneric read-sql-value  (val type database)
+  )
+(defgeneric add-to-relation  (target slot-name value)
+  )
+(defgeneric remove-from-relation  (target slot-name value)
+  )