︙ | | | ︙ | |
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
|
;; (declare (uses misc-stml))
(use regex)
;; The (usually global) sdat contains everything about the session
;;
(defstruct sdat
(dbtype 'pg)
(dbinit #f)
(conn #f)
(page "home")
(page-type 'html)
(toppage "index")
(content-type "Content-type: text/html; charset=iso-8859-1\n\n")
(formdat #f)
(params '())
(path-params '())
(session-key #f)
(pagedat '())
(curr-page "home")
(alt-page-dat #f)
(sroot "./")
(session-cookie #f)
(curr-err #f)
(log-port (current-error-port))
(logfile "/tmp/stml.log")
(seen-pages '())
(page-dir-style #t)
(debug-mode #f)
(session-id #f)
(pagevars (make-hash-table))
(pagevars-before (make-hash-table))
(sessionvars (make-hash-table))
(sessionvars-before (make-hash-table))
(globalvars (make-hash-table))
(globalvars-before (make-hash-table))
(request-method #f)
(domain "localhost")
(twikidir #f)
(script #f)
(force-ssl #f)
(shared-hash (make-hash-table)))
(define (apply-config-file session #!optional (configf #f))
(let* ((rawconfigdat (session:read-config session configf))
(configdat (if rawconfigdat (eval rawconfigdat) '()))
(sroot (s:find-param 'sroot configdat))
(logfile (s:find-param 'logfile configdat))
(dbtype (s:find-param 'dbtype configdat))
(dbinit (s:find-param 'dbinit configdat))
(domain (s:find-param 'domain configdat))
(twikidir (s:find-param 'twikidir configdat))
(page-dir (s:find-param 'page-dir-style configdat))
(debugmode (s:find-param 'debugmode configdat))
(script (s:find-param 'script configdat))
(force-ssl (s:find-param 'force-ssl configdat)))
(if sroot (sdat-sroot-set! session sroot))
(if logfile (sdat-logfile-set! session logfile))
(if dbtype (sdat-dbtype-set! session dbtype))
(if dbinit (sdat-dbinit-set! session dbinit))
(if domain (sdat-domain-set! session domain))
(if twikidir (sdat-twikidir-set! session twikidir))
(if debugmode (sdat-debug-mode-set! session debugmode))
(if script (sdat-script-set! session script))
|
>
>
>
>
<
<
>
>
>
>
>
>
>
<
<
<
<
<
<
|
>
>
>
>
|
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
;; (declare (uses misc-stml))
(use regex)
;; The (usually global) sdat contains everything about the session
;;
(defstruct sdat
;; database
(dbtype 'pg)
(dbinit #f)
(conn #f)
;; page info
(page "home")
(page-type 'html)
(toppage "index")
(curr-page "home")
(content-type "Content-type: text/html; charset=iso-8859-1\n\n")
;; forms and variables
(formdat #f)
(params '())
(path-params '())
(session-key #f)
(pagedat '())
(alt-page-dat #f)
(session-cookie #f)
(pagevars (make-hash-table))
(pagevars-before (make-hash-table))
(sessionvars (make-hash-table))
(sessionvars-before (make-hash-table))
(globalvars (make-hash-table))
(globalvars-before (make-hash-table))
;; ports and log file
(curr-err #f)
(log-port (current-error-port))
(logfile "/tmp/stml.log")
(seen-pages '())
(page-dir-style #t)
(debug-mode #f)
(session-id #f)
(request-method #f)
(domain "localhost")
(twikidir #f)
(script #f)
(force-ssl #f)
(shared-hash (make-hash-table))
;; paths
(sroot "./")
(models #f)
(views #f)
)
(define (sdat-set-if session configdat var settor)
(let ((val (s:find-param var configdat)))
(if val (settor session val))))
(define (session:initialize session #!optional (configf #f))
;; (let* ((rawconfigdat (session:read-config session configf))
;; (configdat (if rawconfigdat (eval rawconfigdat) '())))
;; (sdat-set-if session configdat 'sroot sdat-root-set!)
;; (sdat-set-if session configdat 'logfile sdat-logfile-set!)
;; (sdat-set-if session configdat 'dbtype sdat-dbtype-set!)
;; (sdat-set-if session configdat 'dbinit sdat-dbinit-set!)
;; (sdat-set-if session configdat 'domain sdat-domain-set!)
;; (sdat-set-if session configdat 'twikidir sdat-twikidir-set!)
;; (sdat-set-if session configdat 'page-dir-style sdat-page-set!)
;; (sdat-set-if session configdat 'sroot sdat-root-set!)
;; (sdat-set-if session configdat 'sroot sdat-root-set!)
;; (sdat-set-if session configdat 'sroot sdat-root-set!)
;; following are set always from config
;; (sdat-page-dir-style-set! session (s:find-param 'page-dir-style configdat))
(let* ((rawconfigdat (session:read-config session configf))
(configdat (if rawconfigdat (eval rawconfigdat) '()))
(sroot (s:find-param 'sroot configdat))
(models (s:find-param 'models configdat))
(views (s:find-param 'views configdat))
(logfile (s:find-param 'logfile configdat))
(dbtype (s:find-param 'dbtype configdat))
(dbinit (s:find-param 'dbinit configdat))
(domain (s:find-param 'domain configdat))
(twikidir (s:find-param 'twikidir configdat))
(page-dir (s:find-param 'page-dir-style configdat))
(debugmode (s:find-param 'debugmode configdat))
(script (s:find-param 'script configdat))
(force-ssl (s:find-param 'force-ssl configdat)))
(if sroot (sdat-sroot-set! session sroot))
(if models (sdat-models-set! session models))
(if views (sdat-views-set! session views))
(if logfile (sdat-logfile-set! session logfile))
(if dbtype (sdat-dbtype-set! session dbtype))
(if dbinit (sdat-dbinit-set! session dbinit))
(if domain (sdat-domain-set! session domain))
(if twikidir (sdat-twikidir-set! session twikidir))
(if debugmode (sdat-debug-mode-set! session debugmode))
(if script (sdat-script-set! session script))
|
︙ | | | ︙ | |
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
|
;; get-input else, get-param else #f
;;
(define (s:get-inp key . params)
(or (apply s:get-input key params)
(apply s:get-param key params)))
#;(define (s:load-model model)
(session:load-model s:session model))
#;(define (s:model-path model)
(session:model-path s:session model))
;; share data between pages calls. NOTE: This is not persistent
;; between cgi calls. Use sessionvars for that.
;;
(define (s:shared-hash)
(sdat-shared-hash s:session))
|
|
|
|
|
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
|
;; get-input else, get-param else #f
;;
(define (s:get-inp key . params)
(or (apply s:get-input key params)
(apply s:get-param key params)))
(define (s:load-model model)
(session:load-model s:session model))
(define (s:model-path)
(session:model-path s:session))
;; share data between pages calls. NOTE: This is not persistent
;; between cgi calls. Use sessionvars for that.
;;
(define (s:shared-hash)
(sdat-shared-hash s:session))
|
︙ | | | ︙ | |
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
|
;; Used for the strangely inconsistent handling of the config file. A better way is needed.
;;
;; (let ((dbtype (sdat-dbtype self)))
;; (print "dbtype: " dbtype)
;; (sdat-dbtype-set! self (eval dbtype))))
(define (session:setup self)
(let ((dbtype (sdat-dbtype self))
(debugmode (sdat-debug-mode self))
(dbinit (eval (sdat-dbinit self)))
(dbexists #f))
(let ((dbfname (alist-ref 'dbname dbinit)))
(if debugmode (session:log self "session:setup dbfname=" dbfname ", dbtype=" dbtype ", dbinit=" dbinit))
(if (eq? dbtype 'sqlite3)
|
|
>
|
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
|
;; Used for the strangely inconsistent handling of the config file. A better way is needed.
;;
;; (let ((dbtype (sdat-dbtype self)))
;; (print "dbtype: " dbtype)
;; (sdat-dbtype-set! self (eval dbtype))))
(define (session:setup self #!optional (configf #f))
(session:initialize self configf)
(let ((dbtype (sdat-dbtype self))
(debugmode (sdat-debug-mode self))
(dbinit (eval (sdat-dbinit self)))
(dbexists #f))
(let ((dbfname (alist-ref 'dbname dbinit)))
(if debugmode (session:log self "session:setup dbfname=" dbfname ", dbtype=" dbtype ", dbinit=" dbinit))
(if (eq? dbtype 'sqlite3)
|
︙ | | | ︙ | |
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
|
((dir) "ERROR: dir style not yet re-implemented")
(else
(list "ERROR: page-dir-style must be stored, dir or flat, got " dir-style)))))
(define (session:call self page parts)
(session:call-parts self page 'both))
;; (define (session:load-model self model)
;; (let ((model.scm (string-append (sdat-sroot self) "/models/" model ".scm"))
;; (model.so (string-append (sdat-sroot self) "/models/" model ".so")))
;; (if (file-exists? model.so)
;; (load model.so)
;; (if (file-exists? model.scm)
;; (load model.scm)
;; (s:log "ERROR: model " model.scm " not found")))))
;; (define (session:model-path self model)
;; (string-append (sdat-sroot self) "/models/" model ".scm"))
(define (session:pp-formdat self)
(let ((dat (formdat:all->strings (sdat-formdat self))))
(string-intersperse dat "<br> ")))
(define (session:param->string params)
;; (err:log "params=" params)
|
|
>
|
|
|
|
|
|
|
|
>
|
|
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
|
((dir) "ERROR: dir style not yet re-implemented")
(else
(list "ERROR: page-dir-style must be stored, dir or flat, got " dir-style)))))
(define (session:call self page parts)
(session:call-parts self page 'both))
(define (session:load-model self model)
(let* ((mpath (session:model-path self))
(model.scm (string-append mpath "/" model ".scm"))
(model.so (string-append mpath "/" model ".so")))
(if (file-exists? model.so)
(load model.so)
(if (file-exists? model.scm)
(load model.scm)
(s:log "ERROR: model " model.scm " not found")))))
(define (session:model-path self)
(or (sdat-models self)
(string-append (sdat-sroot self) "/models/")))
(define (session:pp-formdat self)
(let ((dat (formdat:all->strings (sdat-formdat self))))
(string-intersperse dat "<br> ")))
(define (session:param->string params)
;; (err:log "params=" params)
|
︙ | | | ︙ | |
2529
2530
2531
2532
2533
2534
2535
2536
2537
|
(session:del! s:session "*sessionvars*" key))
(define s:session-var-delete! s:session-var-del!)
;; utility to get all vars as hash table
(define (s:session-get-sessionvars)
(sdat-sessionvars s:session))
)
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
|
(session:del! s:session "*sessionvars*" key))
(define s:session-var-delete! s:session-var-del!)
;; utility to get all vars as hash table
(define (s:session-get-sessionvars)
(sdat-sessionvars s:session))
;;======================================================================
;; Sugar
;;======================================================================
;;
;; (require 'syntax-case)
;;
;; (define-syntax s:if-param
;; (syntax-rules ()
;; [(_ s x) (if (s:get s) x (s:comment "s:if not"))]
;; [(_ s x y) (if (s:get s) x y)]))
;; ;;
;; (define-syntax s:if-test
;; (syntax-rules ()
;; [(_ s x) (if (string=? "yep" s) x (list "s:if not"))]
;; [(_ s x y) (if (string=? "yep" s) x y)]))
;; Some of these routines use:
;;
;; http://www.cs.toronto.edu/~gfb/scheme/simple-macros.html
;;
;; Syntax for defining macros in a simple style similar to function definiton,
;; when there is a single pattern for the argument list and there are no keywords.
;;
;; (define-simple-syntax (name arg ...) body ...)
;;
(define-syntax define-simple-syntax
(syntax-rules ()
((_ (name arg ...) body ...)
(define-syntax name (syntax-rules () ((name arg ...) (begin body ...)))))))
;;======================================================================
;; syntatic sugar items
;;======================================================================
;; We often seem to want to include stuff if a conditional is met
;; otherwise not include it. This routine makes that slightly cleaner
;; since using a pure if results in #<undefined> objects. (admittedly they
;; should be ignored but this is slightly cleaner I think).
;;
;; NOTE: This has to be a macro or the true clause will be evaluated
;; whether "a" is true or false
;; If a is true return b, else return '()
(define-simple-syntax (s:if a b)
(if a b '()))
;; Using the Simple-Syntax System
;;
;; The syntax for defining macros in this system is similar to that for defining functions. In fact if the macro has a fixed number of arguments the syntax is identical. For example:
;;
;; ; Define a simple macro to add a value to a variable.
;; ;
;; (define-simple-syntax (+= variable value)
;; (set! variable (+ variable value)))
;;
;; ; Use it.
;; ;
;; (define v 2)
;; (+= v 7)
;; v ; => 9
;;
;; For a fixed number of arguments followed by an unknown number of arguments we use ... after a single argument to represent the unknown number (possibly zero) of arguments. For example, let's revise our definition of += to allow zero or more values to be added:
;;
;; ; Define a simple macro to add a zero or more values to a variable
;; ;
;; (define-simple-syntax (+= variable value ...)
;; (set! variable (+ variable value ...)))
;;
;; ; Use it
;; ;
;; (define v 2)
;; (+= v 7)
;; v ; => 9
;; (+= v 3 4)
;; v ; => 16
;; (+= v)
;; v ; => 16
;;
(define-simple-syntax (s:if-param varname first ...)
(if (s:get varname)
first
...))
(define-simple-syntax (s:if-sessionvar varname first ...)
(if (s:session-var-get varname)
first
...))
;; (define-macro (s:if-param varname ...)
;; (match dat
;; (() '())
;; ((a) `(if (s:get ,varname) ,a '()))
;; ((a b) `(if (s:get ,varname) ,a ,b))))
;;
;; (define-macro (s:if-sessionvar varname . dat)
;; (match dat
;; (() '())
;; ((a) `(if (s:session-var-get ,varname) ,a '()))
;; ((a b) `(if (s:session-var-get ,varname) ,a ,b))))
;;
)
|