r11103: 2006 umls updates
[umlisp.git] / create-sql.lisp
index fdc444c9cf2bd8fb1279674bff3f8e5c0e414cf0..f2762861637a5422dc055db70f43fecc5bbaf844 100644 (file)
@@ -46,7 +46,7 @@
                " MAX_ROWS=200000000"
              "")
            (if (eq *umls-sql-type* :mysql)
-               " TYPE=MYISAM DEFAULT CHARACTER latin1"
+               " TYPE=MYISAM CHARACTER SET utf8"
                ""))))
 
 (defun create-custom-table-cmd (tablename sql-cmd)
@@ -277,18 +277,53 @@ This is much faster that using create-umls-db-insert."
   (translate-files (find-ufile "MRXW_NONENG.RRF")
                   extension (noneng-lang-index-files)))
 
+(defun verify-translation-file (output-path input-ufiles)
+  "Returns t if translation file exists and is correct size. Warns and deletes incomplete translation file."
+  (when (probe-file output-path)
+    (let ((translated-lines 0)
+          (input-lines 0)
+          (eof (cons nil nil)))
+      (catch 'done-counting
+        (with-open-file (ts output-path :direction :input
+                            #+(and clisp unicode) :external-format
+                            #+(and clisp unicode) charset:utf-8)
+          (do ()
+              ((eq (read-line ts nil eof) eof))
+            (incf translated-lines)))
+        (dolist (input-ufile input-ufiles)
+          (with-umls-ufile (line input-ufile)
+            (incf input-lines)
+            (when (> input-lines translated-lines)
+              (throw 'done-counting 'incomplete)))))
+      (cond
+        ((eql input-lines 0)
+          (error "Input lines is 0")
+          nil)
+        ((< input-lines translated-lines)
+          (format t "Translated file ~A incomplete, deleting...~%" output-path)
+          (delete-file output-path)
+          nil)
+        ((eql input-lines translated-lines)
+          (format t "Translated file ~A already exists: skipping...~%" output-path)
+          t)
+        ((> translated-lines input-lines)
+          (error "Shouldn't happen. Translated lines of ~A is ~D, greater than input lines ~D"
+                 output-path translated-lines input-lines)
+          (delete-file output-path)
+          nil)))))
+
 (defun translate-files (out-ufile extension input-ufiles)
   "Translate a umls file into a format suitable for sql copy cmd"
   (let ((output-path (ufile-pathname out-ufile extension)))
-    (if (probe-file output-path)
-       (format t "File ~A already exists: skipping~%" output-path)
-      (with-open-file (ostream output-path :direction :output
-                               #+(and clisp unicode) :external-format
-                               #+(and clisp unicode) charset:utf-8)
-       (dolist (input-ufile input-ufiles)
-         (with-umls-ufile (line input-ufile)
-           (translate-line out-ufile line ostream)
-           (princ #\newline ostream)))))))
+    (when (verify-translation-file output-path input-ufiles)
+      (return-from translate-files output-path))
+    (with-open-file (ostream output-path :direction :output
+                             #+(and clisp unicode) :external-format
+                             #+(and clisp unicode) charset:utf-8)
+      (dolist (input-ufile input-ufiles)
+        (with-umls-ufile (line input-ufile)
+          (translate-line out-ufile line ostream)
+          (princ #\newline ostream))))))
 
 (defun translate-line (file line strm)
   "Translate a single line for sql output"