;;;; Programmer: Kevin M. Rosenberg
;;;; Date Started: Apr 2000
;;;;
-;;;; $Id: sql-create.lisp,v 1.4 2002/11/07 23:19:02 kevin Exp $
+;;;; $Id: sql-create.lisp,v 1.5 2003/05/04 08:52:13 kevin Exp $
;;;;
;;;; This file, part of UMLisp, is
;;;; Copyright (c) 2000-2002 by Kevin M. Rosenberg, M.D.
(declaim (optimize (speed 3) (safety 1) (compilation-speed 0) (debug 3)))
-(defun create-table-cmd (file)
+(defun create-table-cmd-old (file)
"Return sql command to create a table"
(let ((col-func
(lambda (c)
(string-trim-last-character
(mapcar-append-string col-func (umls-cols-for-umls-file file))))))
+
+(defun create-table-cmd (file)
+ "Return sql command to create a table"
+ (let ((col-func
+ (lambda (c)
+ (let ((sqltype (umls-col-sqltype c)))
+ (concatenate 'string
+ (umls-col-col c)
+ " "
+ (if (or (string-equal sqltype "VARCHAR")
+ (string-equal sqltype "CHAR"))
+ (format nil "~a (~a)" sqltype (umls-col-max c))
+ sqltype))))))
+ (format nil "CREATE TABLE ~a (~{~a~^,~})" (umls-file-table file)
+ (mapcar col-func (umls-cols-for-umls-file file))))))
+
(defun create-custom-table-cmd (tablename sql-cmd)
"Return SQL command to create a custom table"
(format nil "CREATE TABLE ~a AS ~a;" tablename sql-cmd))
-(defun insert-values-cmd (file values)
+(defun insert-values-cmd-old (file values)
"Return sql insert command for a row of values"
(let ((insert-func
(lambda (col value)
(custom-col-values (custom-colstructs-for-file file) values "," t)))
)))
-(defun custom-col-values (colstructs values delim doquote)
- "Returns string of column values for SQL inserts for custom columns"
+(defun insert-col-value (col value)
+ (if (null (umls-col-parsefunc col))
+ value
+ (format nil "~A" (funcall (umls-col-parsefunc col) value))))
+
+(defun insert-values-cmd (file values)
+ "Return sql insert command for a row of values"
+ (let ((insert-func
+ (lambda (col value)
+ (let ((q (umls-col-quotechar col)))
+ (concatenate 'string q (insert-col-value col value) q)))))
+ (format
+ nil "INSERT INTO ~a (~{~a~^,~}) VALUES (~{~a~^,~})"
+ (umls-file-table file)
+ (umls-file-fields file)
+ (append
+ (mapcar insert-func (remove-custom-cols (umls-file-colstructs file)) values)
+ (custom-col-values (custom-colstructs-for-file file) values t)))))
+
+(defun custom-col-values-old (colstructs values delim doquote)
+ "Returns a string of column values for SQL inserts for custom columns"
(let ((result ""))
(dolist (col colstructs)
(let* ((func (umls-col-custom-value-func col))
delim)))
result))
+(defun col-value (col doquote values)
+ (let ((custom-value (funcall (umls-col-custom-value-func col) values)))
+ (if doquote
+ (let ((q (umls-col-quotechar col)))
+ (concatenate 'string q (escape-backslashes custom-value) q))
+ (escape-backslashes custom-value))))
+
+(defun custom-col-values (colstructs values doquote)
+ "Returns a list of string column values for SQL inserts for custom columns"
+ (loop for col in colstructs collect (col-value col doquote values)))
+
+
(defun remove-custom-cols (cols)
"Remove custom cols from a list col umls-cols"
(remove-if #'umls-col-custom-value-func cols))
(format nil "LOAD DATA LOCAL INFILE \"~a\" INTO TABLE ~a FIELDS TERMINATED BY \"|\""
(umls-pathname (umls-file-fil file) extension) (umls-file-table file)))
-(defun umls-translate (file line)
+(defun umls-translate-old (file line)
"Translate a single line for sql output"
(string-trim-last-character
(concatenate 'string
(remove-custom-cols (umls-file-colstructs file))
line)
(custom-col-values (custom-colstructs-for-file file) line "|" nil))))
+
+(defun umls-translate (file line)
+ "Translate a single line for sql output"
+ (format nil "~{~A~^|~}"
+ (append
+ (mapcar
+ (lambda (col value)
+ (concatenate
+ 'string
+ (if (eq (umls-col-datatype col) 'sql-u)
+ (format nil "~d" (parse-ui value ""))
+ (escape-backslashes value))))
+ (remove-custom-cols (umls-file-colstructs file))
+ line)
+ (custom-col-values (custom-colstructs-for-file file) line nil))))
;;; Routines for analyzing cost of fixed size storage