Artifact f8cd7b37890a13c1bf7f6167889588c01f529819:


0000: 3b 3b 20 43 6f 70 79 72 69 67 68 74 20 32 30 30  ;; Copyright 200
0010: 37 2d 32 30 31 31 2c 20 4d 61 74 74 68 65 77 20  7-2011, Matthew 
0020: 57 65 6c 6c 61 6e 64 2e 0a 3b 3b 20 0a 3b 3b 20  Welland..;; .;; 
0030: 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73   This program is
0040: 20 6d 61 64 65 20 61 76 61 69 6c 61 62 6c 65 20   made available 
0050: 75 6e 64 65 72 20 74 68 65 20 47 4e 55 20 47 50  under the GNU GP
0060: 4c 20 76 65 72 73 69 6f 6e 20 32 2e 30 20 6f 72  L version 2.0 or
0070: 0a 3b 3b 20 20 67 72 65 61 74 65 72 2e 20 53 65  .;;  greater. Se
0080: 65 20 74 68 65 20 61 63 63 6f 6d 70 61 6e 79 69  e the accompanyi
0090: 6e 67 20 66 69 6c 65 20 43 4f 50 59 49 4e 47 20  ng file COPYING 
00a0: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 3b 3b 20  for details..;; 
00b0: 0a 3b 3b 20 20 54 68 69 73 20 70 72 6f 67 72 61  .;;  This progra
00c0: 6d 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64  m is distributed
00d0: 20 57 49 54 48 4f 55 54 20 41 4e 59 20 57 41 52   WITHOUT ANY WAR
00e0: 52 41 4e 54 59 3b 20 77 69 74 68 6f 75 74 20 65  RANTY; without e
00f0: 76 65 6e 20 74 68 65 0a 3b 3b 20 20 69 6d 70 6c  ven the.;;  impl
0100: 69 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 20  ied warranty of 
0110: 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54 59 20  MERCHANTABILITY 
0120: 6f 72 20 46 49 54 4e 45 53 53 20 46 4f 52 20 41  or FITNESS FOR A
0130: 20 50 41 52 54 49 43 55 4c 41 52 0a 3b 3b 20 20   PARTICULAR.;;  
0140: 50 55 52 50 4f 53 45 2e 0a 0a 28 64 65 63 6c 61  PURPOSE...(decla
0150: 72 65 20 28 75 6e 69 74 20 73 65 74 75 70 29 29  re (unit setup))
0160: 0a 28 64 65 63 6c 61 72 65 20 28 75 73 65 73 20  .(declare (uses 
0170: 73 65 73 73 69 6f 6e 29 29 0a 28 72 65 71 75 69  session)).(requi
0180: 72 65 2d 65 78 74 65 6e 73 69 6f 6e 20 73 72 66  re-extension srf
0190: 69 2d 36 39 29 0a 28 72 65 71 75 69 72 65 2d 65  i-69).(require-e
01a0: 78 74 65 6e 73 69 6f 6e 20 72 65 67 65 78 29 0a  xtension regex).
01b0: 0a 3b 3b 20 6d 61 63 72 6f 73 20 69 6e 20 73 75  .;; macros in su
01c0: 67 61 72 20 64 6f 6e 27 74 20 77 6f 72 6b 2c 20  gar don't work, 
01d0: 68 61 76 65 20 74 6f 20 6c 6f 61 64 20 69 6e 20  have to load in 
01e0: 61 6c 6c 20 66 69 6c 65 73 20 6f 72 20 75 73 65  all files or use
01f0: 20 63 6f 6d 70 69 6c 65 64 20 6d 6f 64 65 3f 0a   compiled mode?.
0200: 3b 3b 0a 3b 3b 20 28 69 6e 63 6c 75 64 65 20 22  ;;.;; (include "
0210: 73 75 67 61 72 2e 73 63 6d 22 29 0a 0a 3b 3b 20  sugar.scm")..;; 
0220: 75 73 65 20 74 68 69 73 20 66 6f 72 20 67 65 74  use this for get
0230: 74 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 20 70  ting data from p
0240: 61 67 65 20 74 6f 20 70 61 67 65 20 77 68 65 6e  age to page when
0250: 20 73 63 6f 70 65 20 61 6e 64 20 65 76 61 6c 73   scope and evals
0260: 0a 3b 3b 20 67 65 74 20 69 6e 20 74 68 65 20 77  .;; get in the w
0270: 61 79 0a 28 64 65 66 69 6e 65 20 73 3a 6c 6f 63  ay.(define s:loc
0280: 61 6c 2d 76 61 72 73 20 28 6d 61 6b 65 2d 68 61  al-vars (make-ha
0290: 73 68 2d 74 61 62 6c 65 29 29 0a 0a 28 64 65 66  sh-table))..(def
02a0: 69 6e 65 20 28 73 3a 6c 6f 63 61 6c 2d 73 65 74  ine (s:local-set
02b0: 21 20 6b 20 76 29 0a 20 20 28 68 61 73 68 2d 74  ! k v).  (hash-t
02c0: 61 62 6c 65 2d 73 65 74 21 20 73 3a 6c 6f 63 61  able-set! s:loca
02d0: 6c 2d 76 61 72 73 20 6b 20 76 29 29 0a 0a 28 64  l-vars k v))..(d
02e0: 65 66 69 6e 65 20 28 73 3a 6c 6f 63 61 6c 2d 67  efine (s:local-g
02f0: 65 74 20 6b 29 0a 20 20 28 68 61 73 68 2d 74 61  et k).  (hash-ta
0300: 62 6c 65 2d 72 65 66 2f 64 65 66 61 75 6c 74 20  ble-ref/default 
0310: 73 3a 6c 6f 63 61 6c 2d 76 61 72 73 20 6b 20 23  s:local-vars k #
0320: 66 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 73 3a  f))..(define (s:
0330: 6c 6f 67 20 2e 20 6d 73 67 29 0a 20 20 28 61 70  log . msg).  (ap
0340: 70 6c 79 20 73 65 73 73 69 6f 6e 3a 6c 6f 67 20  ply session:log 
0350: 73 3a 73 65 73 73 69 6f 6e 20 6d 73 67 29 29 0a  s:session msg)).
0360: 0a 28 64 65 66 69 6e 65 20 28 73 3a 73 65 74 2d  .(define (s:set-
0370: 65 72 72 20 2e 20 61 72 67 73 29 0a 20 20 28 73  err . args).  (s
0380: 64 61 74 2d 73 65 74 2d 63 75 72 72 2d 65 72 72  dat-set-curr-err
0390: 21 20 73 3a 73 65 73 73 69 6f 6e 20 61 72 67 73  ! s:session args
03a0: 29 29 0a 0a 3b 3b 20 55 73 61 67 65 3a 20 28 73  ))..;; Usage: (s
03b0: 3a 67 65 74 2d 65 72 72 20 73 3a 62 69 67 29 0a  :get-err s:big).
03c0: 28 64 65 66 69 6e 65 20 28 73 3a 67 65 74 2d 65  (define (s:get-e
03d0: 72 72 20 77 72 61 70 70 65 72 66 75 6e 63 29 0a  rr wrapperfunc).
03e0: 20 20 28 6c 65 74 20 28 28 65 72 72 6d 73 67 20    (let ((errmsg 
03f0: 28 73 64 61 74 2d 67 65 74 2d 63 75 72 72 2d 65  (sdat-get-curr-e
0400: 72 72 20 73 3a 73 65 73 73 69 6f 6e 29 29 29 0a  rr s:session))).
0410: 20 20 20 20 28 69 66 20 65 72 72 6d 73 67 20 28      (if errmsg (
0420: 28 69 66 20 77 72 61 70 70 65 72 66 75 6e 63 0a  (if wrapperfunc.
0430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0440: 20 20 20 20 77 72 61 70 70 65 72 66 75 6e 63 0a      wrapperfunc.
0450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0460: 20 20 20 20 73 3a 73 74 72 6f 6e 67 29 20 65 72      s:strong) er
0470: 72 6d 73 67 29 20 27 28 29 29 29 29 0a 0a 28 64  rmsg) '())))..(d
0480: 65 66 69 6e 65 20 28 73 3a 63 75 72 72 65 6e 74  efine (s:current
0490: 2d 70 61 67 65 29 0a 20 20 28 73 64 61 74 2d 67  -page).  (sdat-g
04a0: 65 74 2d 70 61 67 65 20 73 3a 73 65 73 73 69 6f  et-page s:sessio
04b0: 6e 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 73 3a  n))..(define (s:
04c0: 64 65 6c 65 74 65 2d 73 65 73 73 69 6f 6e 29 0a  delete-session).
04d0: 20 20 28 73 65 73 73 69 6f 6e 3a 64 65 6c 65 74    (session:delet
04e0: 65 2d 73 65 73 73 69 6f 6e 20 73 3a 73 65 73 73  e-session s:sess
04f0: 69 6f 6e 20 28 73 64 61 74 2d 67 65 74 2d 73 65  ion (sdat-get-se
0500: 73 73 69 6f 6e 2d 6b 65 79 20 73 3a 73 65 73 73  ssion-key s:sess
0510: 69 6f 6e 29 29 29 0a 0a 28 64 65 66 69 6e 65 20  ion)))..(define 
0520: 28 73 3a 63 61 6c 6c 20 70 61 67 65 20 2e 20 70  (s:call page . p
0530: 61 72 74 73 6c 29 0a 20 20 28 69 66 20 28 6e 75  artsl).  (if (nu
0540: 6c 6c 3f 20 70 61 72 74 73 6c 29 0a 20 20 20 20  ll? partsl).    
0550: 20 20 28 73 65 73 73 69 6f 6e 3a 63 61 6c 6c 20    (session:call 
0560: 73 3a 73 65 73 73 69 6f 6e 20 70 61 67 65 20 23  s:session page #
0570: 66 29 0a 20 20 20 20 20 20 28 73 65 73 73 69 6f  f).      (sessio
0580: 6e 3a 63 61 6c 6c 20 73 3a 73 65 73 73 69 6f 6e  n:call s:session
0590: 20 70 61 67 65 20 28 63 61 72 20 70 61 72 74 73   page (car parts
05a0: 6c 29 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  l))))..(define (
05b0: 73 3a 6c 69 6e 6b 2d 74 6f 20 70 61 67 65 20 2e  s:link-to page .
05c0: 20 70 61 72 61 6d 73 29 0a 20 20 28 73 65 73 73   params).  (sess
05d0: 69 6f 6e 3a 6c 69 6e 6b 2d 74 6f 20 73 3a 73 65  ion:link-to s:se
05e0: 73 73 69 6f 6e 20 70 61 67 65 20 70 61 72 61 6d  ssion page param
05f0: 73 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 73 3a  s))..(define (s:
0600: 67 65 74 2d 70 61 72 61 6d 20 6b 65 79 20 2e 20  get-param key . 
0610: 74 79 70 65 2d 70 61 72 61 6d 73 29 0a 20 20 28  type-params).  (
0620: 73 65 73 73 69 6f 6e 3a 67 65 74 2d 70 61 72 61  session:get-para
0630: 6d 20 73 3a 73 65 73 73 69 6f 6e 20 6b 65 79 20  m s:session key 
0640: 74 79 70 65 2d 70 61 72 61 6d 73 29 29 0a 0a 3b  type-params))..;
0650: 3b 20 74 68 65 73 65 20 61 72 65 20 70 61 67 65  ; these are page
0660: 20 6c 6f 63 61 6c 0a 28 64 65 66 69 6e 65 20 28   local.(define (
0670: 73 3a 67 65 74 20 6b 65 79 29 20 0a 20 20 28 73  s:get key) .  (s
0680: 65 73 73 69 6f 6e 3a 70 61 67 65 2d 67 65 74 20  ession:page-get 
0690: 73 3a 73 65 73 73 69 6f 6e 20 6b 65 79 29 29 0a  s:session key)).
06a0: 0a 28 64 65 66 69 6e 65 20 28 73 3a 73 65 74 21  .(define (s:set!
06b0: 20 6b 65 79 20 76 61 6c 29 0a 20 20 28 73 65 73   key val).  (ses
06c0: 73 69 6f 6e 3a 63 75 72 72 2d 70 61 67 65 2d 73  sion:curr-page-s
06d0: 65 74 21 20 73 3a 73 65 73 73 69 6f 6e 20 6b 65  et! s:session ke
06e0: 79 20 76 61 6c 29 29 0a 0a 28 64 65 66 69 6e 65  y val))..(define
06f0: 20 28 73 3a 64 65 6c 21 20 6b 65 79 29 0a 20 20   (s:del! key).  
0700: 28 73 65 73 73 69 6f 6e 3a 70 61 67 65 2d 76 61  (session:page-va
0710: 72 2d 64 65 6c 21 20 73 3a 73 65 73 73 69 6f 6e  r-del! s:session
0720: 20 6b 65 79 29 29 0a 0a 28 64 65 66 69 6e 65 20   key))..(define 
0730: 28 73 3a 67 65 74 2d 6e 2d 64 65 6c 21 20 6b 65  (s:get-n-del! ke
0740: 79 29 0a 20 20 28 6c 65 74 20 28 28 76 61 6c 20  y).  (let ((val 
0750: 28 73 65 73 73 69 6f 6e 3a 70 61 67 65 2d 67 65  (session:page-ge
0760: 74 20 73 3a 73 65 73 73 69 6f 6e 20 6b 65 79 29  t s:session key)
0770: 29 29 0a 20 20 20 20 28 73 65 73 73 69 6f 6e 3a  )).    (session:
0780: 64 65 6c 21 20 73 3a 73 65 73 73 69 6f 6e 20 6b  del! s:session k
0790: 65 79 29 0a 20 20 20 20 76 61 6c 29 29 0a 0a 3b  ey).    val))..;
07a0: 3b 20 74 68 65 73 65 20 61 72 65 20 73 65 73 73  ; these are sess
07b0: 69 6f 6e 20 77 69 64 65 0a 28 64 65 66 69 6e 65  ion wide.(define
07c0: 20 28 73 3a 73 65 73 73 69 6f 6e 2d 76 61 72 2d   (s:session-var-
07d0: 67 65 74 20 6b 65 79 20 2e 20 70 61 72 61 6d 73  get key . params
07e0: 29 20 0a 20 20 28 73 65 73 73 69 6f 6e 3a 67 65  ) .  (session:ge
07f0: 74 20 73 3a 73 65 73 73 69 6f 6e 20 22 2a 73 65  t s:session "*se
0800: 73 73 69 6f 6e 76 61 72 73 2a 22 20 6b 65 79 20  ssionvars*" key 
0810: 70 61 72 61 6d 73 29 29 0a 0a 28 64 65 66 69 6e  params))..(defin
0820: 65 20 28 73 3a 73 65 73 73 69 6f 6e 2d 76 61 72  e (s:session-var
0830: 2d 73 65 74 21 20 6b 65 79 20 76 61 6c 29 0a 20  -set! key val). 
0840: 20 28 73 65 73 73 69 6f 6e 3a 73 65 74 21 20 73   (session:set! s
0850: 3a 73 65 73 73 69 6f 6e 20 22 2a 73 65 73 73 69  :session "*sessi
0860: 6f 6e 76 61 72 73 2a 22 20 6b 65 79 20 76 61 6c  onvars*" key val
0870: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 73 3a 73  ))..(define (s:s
0880: 65 73 73 69 6f 6e 2d 76 61 72 2d 67 65 74 2d 6e  ession-var-get-n
0890: 2d 64 65 6c 21 20 6b 65 79 29 0a 20 20 28 6c 65  -del! key).  (le
08a0: 74 20 28 28 76 61 6c 20 28 73 65 73 73 69 6f 6e  t ((val (session
08b0: 3a 70 61 67 65 2d 67 65 74 20 73 3a 73 65 73 73  :page-get s:sess
08c0: 69 6f 6e 20 6b 65 79 29 29 29 0a 20 20 20 20 20  ion key))).     
08d0: 28 73 65 73 73 69 6f 6e 3a 64 65 6c 21 20 73 3a  (session:del! s:
08e0: 73 65 73 73 69 6f 6e 20 22 2a 73 65 73 73 69 6f  session "*sessio
08f0: 6e 76 61 72 73 2a 22 20 6b 65 79 29 0a 20 20 20  nvars*" key).   
0900: 20 20 76 61 6c 29 29 0a 0a 28 64 65 66 69 6e 65    val))..(define
0910: 20 28 73 3a 73 65 73 73 69 6f 6e 2d 76 61 72 2d   (s:session-var-
0920: 64 65 6c 21 20 6b 65 79 29 0a 20 20 28 73 65 73  del! key).  (ses
0930: 73 69 6f 6e 3a 64 65 6c 21 20 73 3a 73 65 73 73  sion:del! s:sess
0940: 69 6f 6e 20 22 2a 73 65 73 73 69 6f 6e 76 61 72  ion "*sessionvar
0950: 73 2a 22 20 6b 65 79 29 29 0a 0a 28 64 65 66 69  s*" key))..(defi
0960: 6e 65 20 73 3a 73 65 73 73 69 6f 6e 2d 76 61 72  ne s:session-var
0970: 2d 64 65 6c 65 74 65 21 20 73 3a 73 65 73 73 69  -delete! s:sessi
0980: 6f 6e 2d 76 61 72 2d 64 65 6c 21 29 0a 0a 3b 3b  on-var-del!)..;;
0990: 20 75 74 69 6c 69 74 79 20 74 6f 20 67 65 74 20   utility to get 
09a0: 61 6c 6c 20 76 61 72 73 20 61 73 20 68 61 73 68  all vars as hash
09b0: 20 74 61 62 6c 65 0a 28 64 65 66 69 6e 65 20 28   table.(define (
09c0: 73 3a 73 65 73 73 69 6f 6e 2d 67 65 74 2d 73 65  s:session-get-se
09d0: 73 73 69 6f 6e 76 61 72 73 29 0a 20 20 28 73 64  ssionvars).  (sd
09e0: 61 74 2d 67 65 74 2d 73 65 73 73 69 6f 6e 76 61  at-get-sessionva
09f0: 72 73 20 73 3a 73 65 73 73 69 6f 6e 29 29 0a 0a  rs s:session))..
0a00: 3b 3b 20 69 6e 70 75 74 73 0a 3b 3b 0a 3b 3b 20  ;; inputs.;;.;; 
0a10: 70 61 72 61 6d 3a 20 28 64 74 79 70 65 20 5b 74  param: (dtype [t
0a20: 61 67 31 20 74 61 67 32 20 2e 2e 2e 5d 29 0a 3b  ag1 tag2 ...]).;
0a30: 3b 20 64 74 79 70 65 3a 0a 3b 3b 20 20 20 20 27  ; dtype:.;;    '
0a40: 72 61 77 20 20 20 20 20 3a 20 64 6f 20 6e 6f 20  raw     : do no 
0a50: 63 6f 6e 76 65 72 73 69 6f 6e 0a 3b 3b 20 20 20  conversion.;;   
0a60: 20 27 6e 75 6d 62 65 72 20 20 3a 20 63 6f 6e 76   'number  : conv
0a70: 65 72 74 20 74 6f 20 6e 75 6d 62 65 72 2c 20 72  ert to number, r
0a80: 65 74 75 72 6e 20 23 66 20 69 66 20 66 61 69 6c  eturn #f if fail
0a90: 73 0a 3b 3b 20 20 20 20 27 65 73 63 61 70 65 64  s.;;    'escaped
0aa0: 20 3a 20 75 73 65 20 68 74 6d 6c 2d 65 73 63 61   : use html-esca
0ab0: 70 65 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68  pe to protect th
0ac0: 65 20 69 6e 70 75 74 0a 3b 3b 0a 28 64 65 66 69  e input.;;.(defi
0ad0: 6e 65 20 28 73 3a 67 65 74 2d 69 6e 70 75 74 20  ne (s:get-input 
0ae0: 6b 65 79 20 2e 20 70 61 72 61 6d 73 29 0a 20 20  key . params).  
0af0: 28 73 65 73 73 69 6f 6e 3a 67 65 74 2d 69 6e 70  (session:get-inp
0b00: 75 74 20 73 3a 73 65 73 73 69 6f 6e 20 6b 65 79  ut s:session key
0b10: 20 70 61 72 61 6d 73 29 29 0a 0a 28 64 65 66 69   params))..(defi
0b20: 6e 65 20 28 73 3a 67 65 74 2d 69 6e 70 75 74 2d  ne (s:get-input-
0b30: 6b 65 79 73 29 0a 20 20 28 73 65 73 73 69 6f 6e  keys).  (session
0b40: 3a 67 65 74 2d 69 6e 70 75 74 2d 6b 65 79 73 20  :get-input-keys 
0b50: 73 3a 73 65 73 73 69 6f 6e 29 29 0a 0a 28 64 65  s:session))..(de
0b60: 66 69 6e 65 20 28 73 3a 6c 6f 61 64 2d 6d 6f 64  fine (s:load-mod
0b70: 65 6c 20 6d 6f 64 65 6c 29 0a 20 20 28 73 65 73  el model).  (ses
0b80: 73 69 6f 6e 3a 6c 6f 61 64 2d 6d 6f 64 65 6c 20  sion:load-model 
0b90: 73 3a 73 65 73 73 69 6f 6e 20 6d 6f 64 65 6c 29  s:session model)
0ba0: 29 0a 0a 28 64 65 66 69 6e 65 20 28 73 3a 6d 6f  )..(define (s:mo
0bb0: 64 65 6c 2d 70 61 74 68 20 6d 6f 64 65 6c 29 0a  del-path model).
0bc0: 20 20 28 73 65 73 73 69 6f 6e 3a 6d 6f 64 65 6c    (session:model
0bd0: 2d 70 61 74 68 20 73 3a 73 65 73 73 69 6f 6e 20  -path s:session 
0be0: 6d 6f 64 65 6c 29 29 0a 0a 3b 3b 20 73 68 61 72  model))..;; shar
0bf0: 65 20 64 61 74 61 20 62 65 74 77 65 65 6e 20 70  e data between p
0c00: 61 67 65 73 20 63 61 6c 6c 73 2e 20 4e 4f 54 45  ages calls. NOTE
0c10: 3a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 70 65  : This is not pe
0c20: 72 73 69 73 74 65 6e 74 0a 3b 3b 20 62 65 74 77  rsistent.;; betw
0c30: 65 65 6e 20 63 67 69 20 63 61 6c 6c 73 2e 20 55  een cgi calls. U
0c40: 73 65 20 73 65 73 73 69 6f 6e 76 61 72 73 20 66  se sessionvars f
0c50: 6f 72 20 74 68 61 74 2e 0a 3b 3b 0a 28 64 65 66  or that..;;.(def
0c60: 69 6e 65 20 28 73 3a 73 68 61 72 65 64 2d 68 61  ine (s:shared-ha
0c70: 73 68 29 0a 20 20 28 73 64 61 74 2d 67 65 74 2d  sh).  (sdat-get-
0c80: 73 68 61 72 65 64 2d 68 61 73 68 20 73 3a 73 65  shared-hash s:se
0c90: 73 73 69 6f 6e 29 29 0a 0a 28 64 65 66 69 6e 65  ssion))..(define
0ca0: 20 28 73 3a 73 68 61 72 65 64 2d 73 65 74 21 20   (s:shared-set! 
0cb0: 6b 65 79 20 76 61 6c 29 0a 20 20 28 68 61 73 68  key val).  (hash
0cc0: 2d 74 61 62 6c 65 2d 73 65 74 21 20 28 73 64 61  -table-set! (sda
0cd0: 74 2d 67 65 74 2d 73 68 61 72 65 64 2d 68 61 73  t-get-shared-has
0ce0: 68 20 73 3a 73 65 73 73 69 6f 6e 29 20 6b 65 79  h s:session) key
0cf0: 20 76 61 6c 29 29 0a 0a 3b 3b 20 57 68 61 74 20   val))..;; What 
0d00: 74 6f 20 72 65 74 75 72 6e 20 77 68 65 6e 20 6e  to return when n
0d10: 6f 20 76 61 6c 75 65 20 66 6f 72 20 6b 65 79 3f  o value for key?
0d20: 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28 73 3a 73  .;;.(define (s:s
0d30: 68 61 72 65 64 2d 67 65 74 20 6b 65 79 29 0a 20  hared-get key). 
0d40: 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 72 65 66   (hash-table-ref
0d50: 2f 64 65 66 61 75 6c 74 20 28 73 64 61 74 2d 67  /default (sdat-g
0d60: 65 74 2d 73 68 61 72 65 64 2d 68 61 73 68 20 73  et-shared-hash s
0d70: 3a 73 65 73 73 69 6f 6e 29 20 6b 65 79 20 23 66  :session) key #f
0d80: 29 29 0a 0a 3b 3b 20 68 74 74 70 3a 2f 2f 66 6f  ))..;; http://fo
0d90: 6f 2e 62 61 72 2e 63 6f 6d 2f 70 61 67 65 6e 61  o.bar.com/pagena
0da0: 6d 65 2f 70 31 2f 70 32 20 3d 3e 20 27 28 22 70  me/p1/p2 => '("p
0db0: 31 22 20 22 70 32 22 29 0a 3b 3b 20 20 23 23 23  1" "p2").;;  ###
0dc0: 23 20 44 45 50 52 45 43 41 54 45 44 20 23 23 23  # DEPRECATED ###
0dd0: 23 0a 28 64 65 66 69 6e 65 20 28 73 3a 67 65 74  #.(define (s:get
0de0: 2d 70 61 67 65 2d 70 61 72 61 6d 73 29 0a 20 20  -page-params).  
0df0: 28 73 64 61 74 2d 67 65 74 2d 70 61 74 68 2d 70  (sdat-get-path-p
0e00: 61 72 61 6d 73 20 73 3a 73 65 73 73 69 6f 6e 29  arams s:session)
0e10: 29 0a 0a 28 64 65 66 69 6e 65 20 28 73 3a 67 65  )..(define (s:ge
0e20: 74 2d 70 61 74 68 2d 70 61 72 61 6d 73 29 0a 20  t-path-params). 
0e30: 20 28 73 64 61 74 2d 67 65 74 2d 70 61 74 68 2d   (sdat-get-path-
0e40: 70 61 72 61 6d 73 20 73 3a 73 65 73 73 69 6f 6e  params s:session
0e50: 29 29 0a 09 0a 0a 28 64 65 66 69 6e 65 20 28 73  ))....(define (s
0e60: 3a 64 62 29 0a 20 20 28 73 64 61 74 2d 67 65 74  :db).  (sdat-get
0e70: 2d 63 6f 6e 6e 20 73 3a 73 65 73 73 69 6f 6e 29  -conn s:session)
0e80: 29 0a 0a 28 64 65 66 69 6e 65 20 28 73 3a 6e 65  )..(define (s:ne
0e90: 76 65 72 2d 63 61 6c 6c 65 64 2d 70 61 67 65 3f  ver-called-page?
0ea0: 20 70 61 67 65 29 0a 20 20 28 73 65 73 73 69 6f   page).  (sessio
0eb0: 6e 3a 6e 65 76 65 72 2d 63 61 6c 6c 65 64 2d 70  n:never-called-p
0ec0: 61 67 65 3f 20 73 3a 73 65 73 73 69 6f 6e 20 70  age? s:session p
0ed0: 61 67 65 29 29 0a 0a 3b 3b 20 66 69 6e 64 20 6f  age))..;; find o
0ee0: 75 74 20 69 66 20 77 65 20 61 72 65 20 69 6e 20  ut if we are in 
0ef0: 64 65 62 75 67 6d 6f 64 65 0a 28 64 65 66 69 6e  debugmode.(defin
0f00: 65 20 28 73 3a 64 65 62 75 67 2d 6d 6f 64 65 3f  e (s:debug-mode?
0f10: 29 0a 20 20 28 73 64 61 74 2d 67 65 74 2d 64 65  ).  (sdat-get-de
0f20: 62 75 67 6d 6f 64 65 20 73 3a 73 65 73 73 69 6f  bugmode s:sessio
0f30: 6e 29 29 0a 0a                                   n))..