/
core.clj
executable file
·96 lines (72 loc) · 2.03 KB
/
core.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
(ns athena-cmd.core
(:gen-class)
(:require [cheshire.core :refer :all]))
(import '(java.sql DriverManager)
'java.util.Properties
'com.amazonaws.athena.jdbc.AthenaDriver)
(use '[clojure.pprint :only [print-table]])
(def log_path
(.getAbsolutePath
(java.io.File/createTempFile "athena" ".log")))
(defn get_properties
[folder]
(let [info (Properties.)
s3_path_env "ATHENA_S3_PATH"
s3_path (str (System/getenv s3_path_env))]
(doto info
(.put "s3_staging_dir"
(if s3_path (str s3_path folder)
(throw (Exception. (str s3_path_env " is not set.")))))
(.put "aws_credentials_provider_class"
"com.amazonaws.auth.DefaultAWSCredentialsProviderChain")
(.put "log_path" log_path))
info))
(defn get_stmt
[folder]
(let [
aws_region_env (str (System/getenv "AWS_DEFAULT_REGION"))
athenaURI
(str
"jdbc:awsathena://athena."
aws_region_env
".amazonaws.com:443")
info (get_properties folder)
conn (DriverManager/getConnection athenaURI info)
stmt (.createStatement conn)] [stmt info]))
(defn read_row
[rs]
(let [m (.getMetaData rs)
cnt (.getColumnCount m)]
(reduce
#(assoc %1 (.getColumnName m %2)
(.getString rs %2))
{}
(range 1 (+ 1 cnt)))))
(defn exec
[query & {:keys [folder]
:or {folder ""}}]
(let [[stmt info] (get_stmt folder)
rs (.executeQuery stmt query)
f (get info "log_path")]
(loop [res []
more (.next rs)]
(if-not more
res
(do
(recur
(conj res (read_row rs))
(.next rs)))))))
(defn query
[file]
(exec (slurp file)))
(defn query-table
[file]
(print-table (query file)))
(defn exec-table
[query]
(print-table (exec query)))
(defn -main
[& args]
(let [file (nth args 0)]
(println
(generate-string (query file) {:pretty true}))))