Now printing ADL to file.

This commit is contained in:
Simon Brooke 2018-02-14 18:54:42 +00:00
parent 3dc84787b5
commit 53aa0379ab
2 changed files with 27 additions and 7 deletions

View file

@ -4,4 +4,5 @@
:license {:name "GNU General Public License,version 2.0 or (at your option) any later version" :license {:name "GNU General Public License,version 2.0 or (at your option) any later version"
:url "https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html"} :url "https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html"}
:dependencies [[org.clojure/clojure "1.8.0"] :dependencies [[org.clojure/clojure "1.8.0"]
[clj-time "0.14.2"]
[instaparse "1.4.8"]]) [instaparse "1.4.8"]])

View file

@ -2,6 +2,8 @@
:author "Simon Brooke"} :author "Simon Brooke"}
squirrel-parse.to-adl squirrel-parse.to-adl
(:require [clojure.xml :refer [emit-element]] (:require [clojure.xml :refer [emit-element]]
[clj-time.core :refer [now]]
[clj-time.format :refer [formatters unparse]]
[squirrel-parse.parser :refer [parse]] [squirrel-parse.parser :refer [parse]]
[squirrel-parse.simplify :refer [simplify]])) [squirrel-parse.simplify :refer [simplify]]))
@ -30,6 +32,12 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(def xml-header
"XML header for ADL files."
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<!DOCTYPE application PUBLIC \"-//JOURNEYMAN//DTD ADL 1.4//EN\"
\"http://www.journeyman.cc/adl/stable/adl/schemas/adl-1.4.dtd\">")
(def sql-datatype-to-adl-datatype (def sql-datatype-to-adl-datatype
"Map to convert SQL datatypes to the nearest ADL equivalent." "Map to convert SQL datatypes to the nearest ADL equivalent."
{:DT-BIGINT :integer {:DT-BIGINT :integer
@ -84,7 +92,7 @@
(defn get-name (defn get-name
"Return the value the first top-level :NAME element of this `subtree`." "Return the value the first top-level :NAME element of this `subtree`."
[subtree] [subtree]
(let [name-elt (make-property subtree :NAME)] (let [name-elt (get-first-child-of-type subtree :NAME)]
(if name-elt (second name-elt)))) (if name-elt (second name-elt))))
(defn get-column-datatype (defn get-column-datatype
@ -146,10 +154,21 @@
(reduce table-definition-to-entity {} statements))) (reduce table-definition-to-entity {} statements)))
(defn to-adl [filename name] (defn to-adl
(let [entities (table-definitions-to-entities (simplify (parse (slurp filename))))] "Take this `input` (filename, url, whatever) assumed to contain a stream of SQL
[{:tag :application statements; convert them to ADL with this `application-name`; if `version` is
:name name provided, tag it with that version number else tag it with a version number drawn
from the current date; if `output` is provided write it as XML to that output."
([input application-name]
(to-adl input application-name (unparse (formatters :basic-date) (now))))
([input application-name version]
(let [entities (table-definitions-to-entities (simplify (parse (slurp input))))]
{:tag :application
:attrs {:name application-name
:version version }
:content (vals entities)} :content (vals entities)}
nil])) ))
([input application-name version output]
(let [adl (to-adl input application-name version)]
(spit output (str xml-header "\n" (with-out-str (emit-element adl))))
adl)))