initial commit
[emacs-init.git] / setup / dpservice-dbspec.el
1 (require 'json)
2 (require 'url-http)
3
4 (defvar dpservice-dbspec-url "http://dpservice.traveltainment.int/dbspec")
5 (defvar dpservice-dbspec)
6
7 (defun dpservice-dbspec-loaded ()
8   (let ((json-array-type 'list)
9                 (json-false nil))
10         (message "Parsing ...")
11         (forward-paragraph)
12         (setq dpservice-dbspec (json-read))
13         (message "Done.")
14         (kill-buffer (current-buffer))))
15
16 (defun dpservice-load-dbspec ()
17   (interactive)
18   (let ((url-http-version "1.0")) ; no chunked response
19         (url-http (url-generic-parse-url dpservice-dbspec-url) 'dpservice-dbspec-loaded '())))
20
21 (defun dpservice-maybe-load-dbspec ()
22   (if (not dpservice-dbspec)
23           (progn
24                 (dpservice-load-dbspec)
25                 (while (not dpservice-dbspec)
26                   (sit-for 1)))))
27
28 (defun dpservice-make-csv-header (type table separator)
29   (loop for lastn = 1 then n
30                 for (n . name) in (sort (loop for spalte in (cdr (assq 'spalten 
31                                                                                                                            (cdr (assq table
32                                                                                                                                                   (cdr (assq type dpservice-dbspec))))))
33                                                                           for n = (cdr (assq 'csvWert spalte))
34                                                                           if (numberp n)
35                                                                           collect (cons n (cdr (assq 'name spalte))))
36                                                                 '(lambda (a b) (< (car a) (car b))))
37                 concat (make-string (- n lastn) separator)
38                 concat name))
39
40 (defun dpservice-types ()
41   (mapcar 'car dpservice-dbspec))
42
43 (defun dpservice-tables (type)
44   (mapcar 'car (cdr (assq type dpservice-dbspec))))
45
46 (defun dpservice-csv-insert-header (type table &optional separator)
47   (interactive 
48    (progn
49          (dpservice-maybe-load-dbspec)
50          (let* ((type (intern (completing-read "Type: " (mapcar 'symbol-name (dpservice-types)))))
51                         (table (intern (completing-read "Table: " (mapcar 'symbol-name (dpservice-tables type))))))
52            (list type table))))
53   (goto-char (point-min))
54   (insert (dpservice-make-csv-header type table (or separator (car csv-separator-chars))) "\n")
55   (csv-align-fields nil (point-min) (point-max)))