r4837: Auto commit for Debian build
[umlisp.git] / sql-create.lisp
index 19be192b05d839cb4a7fc5f348b3fe041bfd888b..1868e12488192619b4eadc066fc5699b03bf91de 100644 (file)
@@ -7,7 +7,7 @@
 ;;;; Programmer:    Kevin M. Rosenberg
 ;;;; Date Started:  Apr 2000
 ;;;;
-;;;; $Id: sql-create.lisp,v 1.8 2003/05/06 01:34:57 kevin Exp $
+;;;; $Id: sql-create.lisp,v 1.16 2003/05/06 06:09:29 kevin Exp $
 ;;;;
 ;;;; This file, part of UMLisp, is
 ;;;;    Copyright (c) 2000-2002 by Kevin M. Rosenberg, M.D.
       (custom-col-values (custom-colstructs-for-file file) values t)))))
 
 
-(defun custom-col-value (col doquote values)
+(defun custom-col-value (col values doquote)
   (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))))
+    (if custom-value
+       (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 (custom-col-value col doquote values)))
-
+  (loop for col in colstructs collect (custom-col-value col values doquote)))
 
 (defun remove-custom-cols (cols)
   "Remove custom cols from a list col umls-cols"
@@ -193,26 +194,24 @@ This is much faster that using create-umls-db-insert."
   (make-noneng-index-file extension)
   (dolist (f *umls-files*) (translate-umls-file f extension)))
 
-(defun translate-file (filename extension files)
-  "Translate a umls file into a format suitable for sql copy cmd"
-  (let ((path (umls-pathname filename extension))
-       (input-files (mklist files)))
-    (if (probe-file path)
-       (format t "File ~A already exists: skipping~%" path)
-       (dolist (input-file input-files)
-         (with-open-file (ostream :direction :output)
-           (with-umls-file (line (umls-file-fil input-file))
-             (umls-translate file line ostream)
-             (princ #\newline ostream)))))))
-
 (defun translate-umls-file (file extension)
   "Translate a umls file into a format suitable for sql copy cmd"
-  (translate-file (umls-file-fil file) extension (umls-file-fil file)))
+  (translate-files (umls-file-fil file) extension (list file)))
 
 (defun make-noneng-index-file (extension)
   "Make non-english index file"
-  (translate-file (find-umls-file "MRXW.NONENG" extension
-                                  (noneng-lang-index-files))))
+  (translate-files "MRXW.NONENG" extension (noneng-lang-index-files)))
+
+(defun translate-files (output-basename extension input-files)
+  "Translate a umls file into a format suitable for sql copy cmd"
+  (let ((output-path (umls-pathname output-basename extension)))
+    (if (probe-file output-path)
+       (format t "File ~A already exists: skipping~%" output-path)
+      (with-open-file (ostream output-path :direction :output)
+       (dolist (input-file input-files)
+         (with-umls-file (line (umls-file-fil input-file))
+           (umls-translate input-file line ostream)
+           (princ #\newline ostream)))))))
 
 (defun pg-copy-cmd (file extension)
   "Return postgresql copy statement for a file"  
@@ -228,9 +227,11 @@ This is much faster that using create-umls-db-insert."
    (umls-pathname (umls-file-fil file) extension) (umls-file-table file)))
 
 (defun col-value (col value)
-  (if (eq (umls-col-datatype col) 'sql-u)
-      (write-to-string (parse-ui value ""))
-      (escape-backslashes value)))
+  (if value
+      (if (eq (umls-col-datatype col) 'sql-u)
+         (write-to-string (parse-ui value ""))
+         (escape-backslashes value))
+      ""))
 
 (defun umls-translate (file line strm)
   "Translate a single line for sql output"
@@ -254,16 +255,21 @@ This is much faster that using create-umls-db-insert."
       (dolist (col (umls-file-colstructs file))
        (let* ((avwaste (- (umls-col-max col) (umls-col-av col)))
               (cwaste (* avwaste (umls-file-rws file))))
-         (unless (zerop cwaste)
+         (when (plusp cwaste)
            (if (<= avwaste 6)
                (progn
                  (incf totalunavoidable cwaste)
-                 (setq unavoidable (append unavoidable (list (list (umls-file-fil file) (umls-col-col col) avwaste cwaste)))))
+                 (push (list (umls-file-fil file) (umls-col-col col)
+                             avwaste cwaste)
+                       unavoidable))
                (progn
                  (incf totalavoidable cwaste)
-                 (setq avoidable (append avoidable (list (list (umls-file-fil file) (umls-col-col col) avwaste cwaste))))))
+                 (push (list (umls-file-fil file) (umls-col-col col)
+                             avwaste cwaste)
+                       avoidable)))
            (incf totalwaste cwaste)))))
-    (values totalwaste totalavoidable totalunavoidable avoidable unavoidable)))
+    (values totalwaste totalavoidable totalunavoidable
+           (nreverse avoidable) (nreverse unavoidable))))
 
 (defun display-waste ()
   (unless *umls-files*