X-Git-Url: http://git.kpe.io/?p=clsql.git;a=blobdiff_plain;f=sql%2Ffdml.lisp;fp=sql%2Ffdml.lisp;h=50ab024ec38129421c3fb784963e2b7ca0e6bd0c;hp=283f2dd95e866738e8031c755fcd3ac91f16e875;hb=44cd3f817f6f59ffe495db4cf2b9ea4637a57f75;hpb=2f1b6b521b5c68e249428209a7da57f75e55da47 diff --git a/sql/fdml.lisp b/sql/fdml.lisp index 283f2dd..50ab024 100644 --- a/sql/fdml.lisp +++ b/sql/fdml.lisp @@ -415,10 +415,8 @@ computed for each field." (database-query-result-set query-expression database :full-set nil :result-types result-types) (let ((flatp (and (= columns 1) - (typecase query-expression - (string t) - (sql-query - (slot-value query-expression 'flatp)))))) + (typep query-expression 'sql-query) + (slot-value query-expression 'flatp)))) (when result-set (unwind-protect (do ((row (make-list columns))) @@ -434,10 +432,8 @@ computed for each field." (database-query-result-set query-expression database :full-set nil :result-types result-types) (let ((flatp (and (= columns 1) - (typecase query-expression - (string t) - (sql-query - (slot-value query-expression 'flatp)))))) + (typep query-expression 'sql-query) + (slot-value query-expression 'flatp)))) (when result-set (unwind-protect (let ((result (list nil))) @@ -456,10 +452,8 @@ computed for each field." (database-query-result-set query-expression database :full-set t :result-types result-types) (let ((flatp (and (= columns 1) - (typecase query-expression - (string t) - (sql-query - (slot-value query-expression 'flatp)))))) + (typep query-expression 'sql-query) + (slot-value query-expression 'flatp)))) (when result-set (unwind-protect (if rows @@ -583,3 +577,30 @@ computed for each field." (database-delete-large-object object-id database)) +;;; Prepared statements + +(defun prepare-sql (sql-stmt types &key (database *default-database*) (result-types :auto) field-names) + "Prepares a SQL statement for execution. TYPES contains a +list of UFFI primitive types corresponding to the input parameters. Returns a +prepared-statement object." + (unless (db-type-has-prepared-stmt? (database-type database)) + (error 'sql-user-error + :message + (format nil + "Database backend type ~:@(~A~) does not support prepared statements." + (database-type database)))) + + (database-prepare sql-stmt types database result-types field-names)) + +(defun bind-parameter (prepared-stmt position value) + "Sets the value of a parameter is in prepared statement." + (database-bind-parameter prepared-stmt position value) + value) + +(defun run-prepared-sql (prepared-stmt) + "Execute the prepared sql statment. All input parameters must be bound." + (database-run-prepared prepared-stmt)) + +(defun free-prepared-sql (prepared-stmt) + "Delete the objects associated with a prepared statement." + (database-free-prepared prepared-stmt))