Megatest

Hex Artifact Content
Login

Artifact ed22148f791920deb4093800940eada398937a77:


0000: 0a 3b 3b 20 43 6f 70 79 72 69 67 68 74 20 32 30  .;; Copyright 20
0010: 30 36 2d 32 30 31 31 2c 20 4d 61 74 74 68 65 77  06-2011, Matthew
0020: 20 57 65 6c 6c 61 6e 64 2e 0a 3b 3b 20 0a 3b 3b   Welland..;; .;;
0030: 20 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20 69    This program i
0040: 73 20 6d 61 64 65 20 61 76 61 69 6c 61 62 6c 65  s made available
0050: 20 75 6e 64 65 72 20 74 68 65 20 47 4e 55 20 47   under the GNU G
0060: 50 4c 20 76 65 72 73 69 6f 6e 20 32 2e 30 20 6f  PL version 2.0 o
0070: 72 0a 3b 3b 20 20 67 72 65 61 74 65 72 2e 20 53  r.;;  greater. S
0080: 65 65 20 74 68 65 20 61 63 63 6f 6d 70 61 6e 79  ee the accompany
0090: 69 6e 67 20 66 69 6c 65 20 43 4f 50 59 49 4e 47  ing file COPYING
00a0: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 3b 3b   for details..;;
00b0: 20 0a 3b 3b 20 20 54 68 69 73 20 70 72 6f 67 72   .;;  This progr
00c0: 61 6d 20 69 73 20 64 69 73 74 72 69 62 75 74 65  am is distribute
00d0: 64 20 57 49 54 48 4f 55 54 20 41 4e 59 20 57 41  d WITHOUT ANY WA
00e0: 52 52 41 4e 54 59 3b 20 77 69 74 68 6f 75 74 20  RRANTY; without 
00f0: 65 76 65 6e 20 74 68 65 0a 3b 3b 20 20 69 6d 70  even the.;;  imp
0100: 6c 69 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66  lied warranty of
0110: 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54 59   MERCHANTABILITY
0120: 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f 52 20   or FITNESS FOR 
0130: 41 20 50 41 52 54 49 43 55 4c 41 52 0a 3b 3b 20  A PARTICULAR.;; 
0140: 20 50 55 52 50 4f 53 45 2e 0a 0a 28 72 65 71 75   PURPOSE...(requ
0150: 69 72 65 2d 65 78 74 65 6e 73 69 6f 6e 20 28 73  ire-extension (s
0160: 72 66 69 20 31 38 29 20 65 78 74 72 61 73 20 74  rfi 18) extras t
0170: 63 70 20 72 70 63 29 0a 28 69 6d 70 6f 72 74 20  cp rpc).(import 
0180: 28 70 72 65 66 69 78 20 72 70 63 20 72 70 63 3a  (prefix rpc rpc:
0190: 29 29 0a 0a 28 75 73 65 20 73 71 6c 69 74 65 33  ))..(use sqlite3
01a0: 20 73 72 66 69 2d 31 20 70 6f 73 69 78 20 72 65   srfi-1 posix re
01b0: 67 65 78 20 72 65 67 65 78 2d 63 61 73 65 20 73  gex regex-case s
01c0: 72 66 69 2d 36 39 20 68 6f 73 74 69 6e 66 6f 29  rfi-69 hostinfo)
01d0: 0a 28 69 6d 70 6f 72 74 20 28 70 72 65 66 69 78  .(import (prefix
01e0: 20 73 71 6c 69 74 65 33 20 73 71 6c 69 74 65 33   sqlite3 sqlite3
01f0: 3a 29 29 0a 0a 28 64 65 63 6c 61 72 65 20 28 75  :))..(declare (u
0200: 6e 69 74 20 73 65 72 76 65 72 29 29 0a 0a 28 64  nit server))..(d
0210: 65 63 6c 61 72 65 20 28 75 73 65 73 20 63 6f 6d  eclare (uses com
0220: 6d 6f 6e 29 29 0a 28 64 65 63 6c 61 72 65 20 28  mon)).(declare (
0230: 75 73 65 73 20 64 62 29 29 0a 0a 28 69 6e 63 6c  uses db))..(incl
0240: 75 64 65 20 22 63 6f 6d 6d 6f 6e 5f 72 65 63 6f  ude "common_reco
0250: 72 64 73 2e 73 63 6d 22 29 0a 28 69 6e 63 6c 75  rds.scm").(inclu
0260: 64 65 20 22 64 62 5f 72 65 63 6f 72 64 73 2e 73  de "db_records.s
0270: 63 6d 22 29 0a 0a 3b 3b 20 70 72 6f 63 73 74 72  cm")..;; procstr
0280: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
0290: 74 68 65 20 70 72 6f 63 65 64 75 72 65 20 74 6f  the procedure to
02a0: 20 62 65 20 63 61 6c 6c 65 64 20 61 73 20 61 20   be called as a 
02b0: 73 74 72 69 6e 67 0a 28 64 65 66 69 6e 65 20 28  string.(define (
02c0: 73 65 72 76 65 72 3a 61 75 74 6f 72 65 6d 6f 74  server:autoremot
02d0: 65 20 70 72 6f 63 73 74 72 20 70 61 72 61 6d 73  e procstr params
02e0: 29 0a 20 20 28 68 61 6e 64 6c 65 2d 65 78 63 65  ).  (handle-exce
02f0: 70 74 69 6f 6e 73 0a 20 20 20 65 78 6e 0a 20 20  ptions.   exn.  
0300: 20 28 62 65 67 69 6e 0a 20 20 20 20 20 28 64 65   (begin.     (de
0310: 62 75 67 3a 70 72 69 6e 74 20 31 20 22 52 65 6d  bug:print 1 "Rem
0320: 6f 74 65 20 66 61 69 6c 65 64 20 66 6f 72 20 22  ote failed for "
0330: 20 70 72 6f 63 20 22 20 22 20 70 61 72 61 6d 73   proc " " params
0340: 29 0a 20 20 20 20 20 28 61 70 70 6c 79 20 28 65  ).     (apply (e
0350: 76 61 6c 20 28 73 74 72 69 6e 67 2d 3e 73 79 6d  val (string->sym
0360: 62 6f 6c 20 70 72 6f 63 29 29 20 70 61 72 61 6d  bol proc)) param
0370: 73 29 29 0a 20 20 20 28 69 66 20 2a 72 75 6e 72  s)).   (if *runr
0380: 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 20 28 61  emote*.       (a
0390: 70 70 6c 79 20 28 65 76 61 6c 20 28 73 74 72 69  pply (eval (stri
03a0: 6e 67 2d 3e 73 79 6d 62 6f 6c 20 28 63 6f 6e 63  ng->symbol (conc
03b0: 20 22 72 65 6d 6f 74 65 3a 22 20 70 72 6f 63 73   "remote:" procs
03c0: 74 72 29 29 29 20 70 61 72 61 6d 73 29 0a 20 20  tr))) params).  
03d0: 20 20 20 20 20 28 65 76 61 6c 20 28 73 74 72 69       (eval (stri
03e0: 6e 67 2d 3e 73 79 6d 62 6f 6c 20 70 72 6f 63 73  ng->symbol procs
03f0: 74 72 29 20 70 61 72 61 6d 73 29 29 29 29 0a 0a  tr) params))))..
0400: 28 64 65 66 69 6e 65 20 28 73 65 72 76 65 72 3a  (define (server:
0410: 73 74 61 72 74 20 64 62 20 68 6f 73 74 6e 29 0a  start db hostn).
0420: 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 30    (debug:print 0
0430: 20 22 41 74 74 65 6d 70 74 69 6e 67 20 74 6f 20   "Attempting to 
0440: 73 74 61 72 74 20 74 68 65 20 73 65 72 76 65 72  start the server
0450: 20 2e 2e 2e 22 29 0a 20 20 28 6c 65 74 2a 20 28   ...").  (let* (
0460: 28 72 70 63 3a 6c 69 73 74 65 6e 65 72 20 20 20  (rpc:listener   
0470: 28 73 65 72 76 65 72 3a 66 69 6e 64 2d 66 72 65  (server:find-fre
0480: 65 2d 70 6f 72 74 2d 61 6e 64 2d 6f 70 65 6e 20  e-port-and-open 
0490: 28 72 70 63 3a 64 65 66 61 75 6c 74 2d 73 65 72  (rpc:default-ser
04a0: 76 65 72 2d 70 6f 72 74 29 29 29 0a 09 20 28 74  ver-port))).. (t
04b0: 68 31 20 20 20 20 20 20 20 20 20 20 20 20 28 6d  h1            (m
04c0: 61 6b 65 2d 74 68 72 65 61 64 0a 09 09 09 20 20  ake-thread....  
04d0: 28 63 75 74 65 20 28 72 70 63 3a 6d 61 6b 65 2d  (cute (rpc:make-
04e0: 73 65 72 76 65 72 20 72 70 63 3a 6c 69 73 74 65  server rpc:liste
04f0: 6e 65 72 29 20 22 72 70 63 3a 73 65 72 76 65 72  ner) "rpc:server
0500: 22 29 0a 09 09 09 20 20 27 72 70 63 3a 73 65 72  ")....  'rpc:ser
0510: 76 65 72 29 29 0a 09 20 28 68 6f 73 74 6e 61 6d  ver)).. (hostnam
0520: 65 20 20 20 20 20 20 20 28 69 66 20 28 73 74 72  e       (if (str
0530: 69 6e 67 3d 3f 20 22 2d 22 20 68 6f 73 74 6e 29  ing=? "-" hostn)
0540: 0a 09 09 09 20 20 20 20 20 28 67 65 74 2d 68 6f  ....     (get-ho
0550: 73 74 2d 6e 61 6d 65 29 20 0a 09 09 09 20 20 20  st-name) ....   
0560: 20 20 68 6f 73 74 6e 29 29 0a 09 20 28 69 70 61    hostn)).. (ipa
0570: 64 64 72 73 74 72 20 20 20 20 20 20 28 69 66 20  ddrstr      (if 
0580: 28 73 74 72 69 6e 67 3d 3f 20 22 2d 22 20 68 6f  (string=? "-" ho
0590: 73 74 6e 29 0a 09 09 09 20 20 20 20 20 28 73 74  stn)....     (st
05a0: 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65  ring-intersperse
05b0: 20 28 6d 61 70 20 6e 75 6d 62 65 72 2d 3e 73 74   (map number->st
05c0: 72 69 6e 67 20 28 75 38 76 65 63 74 6f 72 2d 3e  ring (u8vector->
05d0: 6c 69 73 74 20 28 68 6f 73 74 6e 61 6d 65 2d 3e  list (hostname->
05e0: 69 70 20 68 6f 73 74 6e 61 6d 65 29 29 29 20 22  ip hostname))) "
05f0: 2e 22 29 0a 09 09 09 20 20 20 20 20 23 66 29 29  .")....     #f))
0600: 0a 09 20 28 68 6f 73 74 3a 70 6f 72 74 20 20 20  .. (host:port   
0610: 20 20 20 28 63 6f 6e 63 20 28 69 66 20 69 70 61     (conc (if ipa
0620: 64 64 72 73 74 72 20 69 70 61 64 64 72 73 74 72  ddrstr ipaddrstr
0630: 20 68 6f 73 74 6e 61 6d 65 29 20 22 3a 22 20 28   hostname) ":" (
0640: 72 70 63 3a 64 65 66 61 75 6c 74 2d 73 65 72 76  rpc:default-serv
0650: 65 72 2d 70 6f 72 74 29 29 29 29 0a 20 20 20 20  er-port)))).    
0660: 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22  (db:set-var db "
0670: 53 45 52 56 45 52 22 20 68 6f 73 74 3a 70 6f 72  SERVER" host:por
0680: 74 29 0a 20 20 20 20 28 72 70 63 3a 70 75 62 6c  t).    (rpc:publ
0690: 69 73 68 2d 70 72 6f 63 65 64 75 72 65 21 20 0a  ish-procedure! .
06a0: 20 20 20 20 20 27 72 65 6d 6f 74 65 3a 72 75 6e       'remote:run
06b0: 20 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28   .     (lambda (
06c0: 70 72 6f 63 73 74 72 20 2e 20 70 61 72 61 6d 73  procstr . params
06d0: 29 0a 20 20 20 20 20 20 20 28 73 65 72 76 65 72  ).       (server
06e0: 3a 61 75 74 6f 72 65 6d 6f 74 65 20 70 72 6f 63  :autoremote proc
06f0: 73 74 72 20 70 61 72 61 6d 73 29 29 29 0a 0a 20  str params))).. 
0700: 20 20 20 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d     ;;===========
0710: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0720: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0730: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0740: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 20 20 20 20  ===========.    
0750: 3b 3b 20 64 62 20 73 70 65 63 69 61 6c 73 20 68  ;; db specials h
0760: 65 72 65 0a 20 20 20 20 3b 3b 3d 3d 3d 3d 3d 3d  ere.    ;;======
0770: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0780: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0790: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
07a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
07b0: 0a 20 20 20 20 3b 3b 20 2a 2a 20 73 65 74 2d 74  .    ;; ** set-t
07c0: 65 73 74 73 2d 73 74 61 74 65 2d 73 74 61 74 75  ests-state-statu
07d0: 73 0a 20 20 20 20 28 72 70 63 3a 70 75 62 6c 69  s.    (rpc:publi
07e0: 73 68 2d 70 72 6f 63 65 64 75 72 65 21 0a 20 20  sh-procedure!.  
07f0: 20 20 20 27 72 64 62 3a 73 65 74 2d 74 65 73 74     'rdb:set-test
0800: 73 2d 73 74 61 74 65 2d 73 74 61 74 75 73 20 0a  s-state-status .
0810: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 72 75       (lambda (ru
0820: 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 73 20 63  n-id testnames c
0830: 75 72 72 73 74 61 74 65 20 63 75 72 72 73 74 61  urrstate currsta
0840: 74 75 73 20 6e 65 77 73 74 61 74 65 20 6e 65 77  tus newstate new
0850: 73 74 61 74 75 73 29 0a 20 20 20 20 20 20 20 28  status).       (
0860: 64 62 3a 73 65 74 2d 74 65 73 74 73 2d 73 74 61  db:set-tests-sta
0870: 74 65 2d 73 74 61 74 75 73 20 64 62 20 72 75 6e  te-status db run
0880: 2d 69 64 20 74 65 73 74 6e 61 6d 65 73 20 63 75  -id testnames cu
0890: 72 72 73 74 61 74 65 20 63 75 72 72 73 74 61 74  rrstate currstat
08a0: 75 73 20 6e 65 77 73 74 61 74 65 20 6e 65 77 73  us newstate news
08b0: 74 61 74 75 73 29 29 29 0a 0a 20 20 20 20 28 72  tatus)))..    (r
08c0: 70 63 3a 70 75 62 6c 69 73 68 2d 70 72 6f 63 65  pc:publish-proce
08d0: 64 75 72 65 21 0a 20 20 20 20 20 27 72 64 62 3a  dure!.     'rdb:
08e0: 74 65 73 74 73 74 65 70 2d 73 65 74 2d 73 74 61  teststep-set-sta
08f0: 74 75 73 21 0a 20 20 20 20 20 28 6c 61 6d 62 64  tus!.     (lambd
0900: 61 20 28 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e  a (run-id test-n
0910: 61 6d 65 20 74 65 73 74 73 74 65 70 2d 6e 61 6d  ame teststep-nam
0920: 65 20 73 74 61 74 65 2d 69 6e 20 73 74 61 74 75  e state-in statu
0930: 73 2d 69 6e 20 69 74 65 6d 2d 70 61 74 68 20 63  s-in item-path c
0940: 6f 6d 6d 65 6e 74 20 6c 6f 67 66 69 6c 65 29 0a  omment logfile).
0950: 20 20 20 20 20 20 20 28 64 62 3a 74 65 73 74 73         (db:tests
0960: 74 65 70 2d 73 65 74 2d 73 74 61 74 75 73 21 20  tep-set-status! 
0970: 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e  db run-id test-n
0980: 61 6d 65 20 74 65 73 74 73 74 65 70 2d 6e 61 6d  ame teststep-nam
0990: 65 20 73 74 61 74 65 2d 69 6e 20 73 74 61 74 75  e state-in statu
09a0: 73 2d 69 6e 20 69 74 65 6d 2d 70 61 74 68 20 63  s-in item-path c
09b0: 6f 6d 6d 65 6e 74 20 6c 6f 67 66 69 6c 65 29 29  omment logfile))
09c0: 29 0a 0a 20 20 20 20 28 72 70 63 3a 70 75 62 6c  )..    (rpc:publ
09d0: 69 73 68 2d 70 72 6f 63 65 64 75 72 65 21 0a 20  ish-procedure!. 
09e0: 20 20 20 20 27 72 64 62 3a 74 65 73 74 2d 75 70      'rdb:test-up
09f0: 64 61 74 65 2d 6d 65 74 61 2d 69 6e 66 6f 0a 20  date-meta-info. 
0a00: 20 20 20 20 28 6c 61 6d 62 64 61 20 28 72 75 6e      (lambda (run
0a10: 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 69 74 65  -id testname ite
0a20: 6d 2d 70 61 74 68 20 6d 69 6e 75 74 65 73 20 63  m-path minutes c
0a30: 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20  puload diskfree 
0a40: 74 6d 70 66 72 65 65 29 0a 20 20 20 20 20 20 20  tmpfree).       
0a50: 28 64 62 3a 74 65 73 74 2d 75 70 64 61 74 65 2d  (db:test-update-
0a60: 6d 65 74 61 2d 69 6e 66 6f 20 64 62 20 72 75 6e  meta-info db run
0a70: 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 69 74 65  -id testname ite
0a80: 6d 2d 70 61 74 68 20 6d 69 6e 75 74 65 73 20 63  m-path minutes c
0a90: 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20  puload diskfree 
0aa0: 74 6d 70 66 72 65 65 29 29 29 0a 20 20 20 20 20  tmpfree))).     
0ab0: 0a 20 20 20 20 28 72 70 63 3a 70 75 62 6c 69 73  .    (rpc:publis
0ac0: 68 2d 70 72 6f 63 65 64 75 72 65 21 0a 20 20 20  h-procedure!.   
0ad0: 20 20 27 72 64 62 3a 74 65 73 74 2d 73 65 74 2d    'rdb:test-set-
0ae0: 73 74 61 74 65 2d 73 74 61 74 75 73 2d 62 79 2d  state-status-by-
0af0: 72 75 6e 2d 69 64 2d 74 65 73 74 6e 61 6d 65 0a  run-id-testname.
0b00: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 72 75       (lambda (ru
0b10: 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69  n-id test-name i
0b20: 74 65 6d 2d 70 61 74 68 20 73 74 61 74 75 73 20  tem-path status 
0b30: 73 74 61 74 65 29 0a 20 20 20 20 20 20 20 28 64  state).       (d
0b40: 62 3a 74 65 73 74 2d 73 65 74 2d 73 74 61 74 65  b:test-set-state
0b50: 2d 73 74 61 74 75 73 2d 62 79 2d 72 75 6e 2d 69  -status-by-run-i
0b60: 64 2d 74 65 73 74 6e 61 6d 65 20 64 62 20 72 75  d-testname db ru
0b70: 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69  n-id test-name i
0b80: 74 65 6d 2d 70 61 74 68 20 73 74 61 74 75 73 20  tem-path status 
0b90: 73 74 61 74 65 29 29 29 0a 0a 20 20 20 20 28 72  state)))..    (r
0ba0: 70 63 3a 70 75 62 6c 69 73 68 2d 70 72 6f 63 65  pc:publish-proce
0bb0: 64 75 72 65 21 0a 20 20 20 20 20 27 72 64 62 3a  dure!.     'rdb:
0bc0: 63 73 76 2d 3e 74 65 73 74 2d 64 61 74 61 20 0a  csv->test-data .
0bd0: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 74 65       (lambda (te
0be0: 73 74 2d 69 64 20 63 73 76 64 61 74 61 29 0a 20  st-id csvdata). 
0bf0: 20 20 20 20 20 20 28 64 62 3a 63 73 76 2d 3e 64        (db:csv->d
0c00: 61 74 61 20 64 62 20 74 65 73 74 2d 69 64 20 63  ata db test-id c
0c10: 73 76 64 61 74 61 29 29 29 0a 0a 20 20 20 20 28  svdata)))..    (
0c20: 72 70 63 3a 70 75 62 6c 69 73 68 2d 70 72 6f 63  rpc:publish-proc
0c30: 65 64 75 72 65 21 0a 20 20 20 20 20 27 72 64 62  edure!.     'rdb
0c40: 3a 72 6f 6c 6c 2d 75 70 2d 70 61 73 73 2d 66 61  :roll-up-pass-fa
0c50: 69 6c 2d 63 6f 75 6e 74 73 0a 20 20 20 20 20 28  il-counts.     (
0c60: 6c 61 6d 62 64 61 20 28 72 75 6e 2d 69 64 20 74  lambda (run-id t
0c70: 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61  est-name item-pa
0c80: 74 68 20 73 74 61 74 75 73 29 0a 20 20 20 20 20  th status).     
0c90: 20 20 28 64 62 3a 72 6f 6c 6c 2d 75 70 2d 70 61    (db:roll-up-pa
0ca0: 73 73 2d 66 61 69 6c 2d 63 6f 75 6e 74 73 20 64  ss-fail-counts d
0cb0: 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61  b run-id test-na
0cc0: 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 73 74 61  me item-path sta
0cd0: 74 75 73 29 29 29 0a 0a 20 20 20 20 28 72 70 63  tus)))..    (rpc
0ce0: 3a 70 75 62 6c 69 73 68 2d 70 72 6f 63 65 64 75  :publish-procedu
0cf0: 72 65 21 0a 20 20 20 20 20 27 72 64 62 3a 74 65  re!.     'rdb:te
0d00: 73 74 2d 73 65 74 2d 63 6f 6d 6d 65 6e 74 20 0a  st-set-comment .
0d10: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 72 75       (lambda (ru
0d20: 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69  n-id test-name i
0d30: 74 65 6d 2d 70 61 74 68 20 63 6f 6d 6d 65 6e 74  tem-path comment
0d40: 29 0a 20 20 20 20 20 20 20 28 64 62 3a 74 65 73  ).       (db:tes
0d50: 74 2d 73 65 74 2d 63 6f 6d 6d 65 6e 74 20 64 62  t-set-comment db
0d60: 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d   run-id test-nam
0d70: 65 20 69 74 65 6d 2d 70 61 74 68 20 63 6f 6d 6d  e item-path comm
0d80: 65 6e 74 29 29 29 0a 20 20 20 20 0a 20 20 20 20  ent))).    .    
0d90: 28 72 70 63 3a 70 75 62 6c 69 73 68 2d 70 72 6f  (rpc:publish-pro
0da0: 63 65 64 75 72 65 21 0a 20 20 20 20 20 27 72 70  cedure!.     'rp
0db0: 63 3a 74 65 73 74 2d 73 65 74 2d 6c 6f 67 21 0a  c:test-set-log!.
0dc0: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 72 75       (lambda (ru
0dd0: 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69  n-id test-name i
0de0: 74 65 6d 2d 70 61 74 68 20 6c 6f 67 66 29 0a 20  tem-path logf). 
0df0: 20 20 20 20 20 20 28 64 62 3a 74 65 73 74 2d 73        (db:test-s
0e00: 65 74 2d 6c 6f 67 21 20 64 62 20 72 75 6e 2d 69  et-log! db run-i
0e10: 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d  d test-name item
0e20: 2d 70 61 74 68 20 6c 6f 67 66 29 29 29 0a 0a 20  -path logf))).. 
0e30: 20 20 20 28 73 65 74 21 20 2a 72 70 63 3a 6c 69     (set! *rpc:li
0e40: 73 74 65 6e 65 72 2a 20 72 70 63 3a 6c 69 73 74  stener* rpc:list
0e50: 65 6e 65 72 29 0a 20 20 20 20 28 6f 6e 2d 65 78  ener).    (on-ex
0e60: 69 74 20 28 6c 61 6d 62 64 61 20 28 29 0a 09 20  it (lambda ().. 
0e70: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65        (sqlite3:e
0e80: 78 65 63 75 74 65 20 64 62 20 22 44 45 4c 45 54  xecute db "DELET
0e90: 45 20 46 52 4f 4d 20 6d 65 74 61 64 61 74 20 57  E FROM metadat W
0ea0: 48 45 52 45 20 76 61 72 3d 27 53 45 52 56 45 52  HERE var='SERVER
0eb0: 27 20 61 6e 64 20 76 61 6c 3d 3f 3b 22 20 68 6f  ' and val=?;" ho
0ec0: 73 74 3a 70 6f 72 74 29 0a 09 20 20 20 20 20 20  st:port)..      
0ed0: 20 28 73 71 6c 69 74 65 33 3a 66 69 6e 61 6c 69   (sqlite3:finali
0ee0: 7a 65 21 20 64 62 29 29 29 0a 20 20 20 20 28 74  ze! db))).    (t
0ef0: 68 72 65 61 64 2d 73 74 61 72 74 21 20 74 68 31  hread-start! th1
0f00: 29 0a 20 20 20 20 28 74 68 72 65 61 64 2d 6a 6f  ).    (thread-jo
0f10: 69 6e 21 20 74 68 31 29 29 29 20 3b 3b 20 72 70  in! th1))) ;; rp
0f20: 63 3a 73 65 72 76 65 72 29 29 29 0a 0a 28 64 65  c:server)))..(de
0f30: 66 69 6e 65 20 28 73 65 72 76 65 72 3a 66 69 6e  fine (server:fin
0f40: 64 2d 66 72 65 65 2d 70 6f 72 74 2d 61 6e 64 2d  d-free-port-and-
0f50: 6f 70 65 6e 20 70 6f 72 74 29 0a 20 20 28 68 61  open port).  (ha
0f60: 6e 64 6c 65 2d 65 78 63 65 70 74 69 6f 6e 73 0a  ndle-exceptions.
0f70: 20 20 20 65 78 6e 0a 20 20 20 28 62 65 67 69 6e     exn.   (begin
0f80: 0a 20 20 20 20 20 28 70 72 69 6e 74 20 22 46 61  .     (print "Fa
0f90: 69 6c 65 64 20 74 6f 20 62 69 6e 64 20 74 6f 20  iled to bind to 
0fa0: 70 6f 72 74 20 22 20 28 72 70 63 3a 64 65 66 61  port " (rpc:defa
0fb0: 75 6c 74 2d 73 65 72 76 65 72 2d 70 6f 72 74 29  ult-server-port)
0fc0: 20 22 2c 20 74 72 79 69 6e 67 20 6e 65 78 74 20   ", trying next 
0fd0: 70 6f 72 74 22 29 0a 20 20 20 20 20 28 73 65 72  port").     (ser
0fe0: 76 65 72 3a 66 69 6e 64 2d 66 72 65 65 2d 70 6f  ver:find-free-po
0ff0: 72 74 2d 61 6e 64 2d 6f 70 65 6e 20 28 2b 20 70  rt-and-open (+ p
1000: 6f 72 74 20 31 29 29 29 0a 20 20 20 28 72 70 63  ort 1))).   (rpc
1010: 3a 64 65 66 61 75 6c 74 2d 73 65 72 76 65 72 2d  :default-server-
1020: 70 6f 72 74 20 70 6f 72 74 29 0a 20 20 20 28 74  port port).   (t
1030: 63 70 2d 6c 69 73 74 65 6e 20 28 72 70 63 3a 64  cp-listen (rpc:d
1040: 65 66 61 75 6c 74 2d 73 65 72 76 65 72 2d 70 6f  efault-server-po
1050: 72 74 29 29 29 29 0a 0a 28 64 65 66 69 6e 65 20  rt))))..(define 
1060: 28 73 65 72 76 65 72 3a 63 6c 69 65 6e 74 2d 73  (server:client-s
1070: 65 74 75 70 20 64 62 29 0a 20 20 28 6c 65 74 2a  etup db).  (let*
1080: 20 28 28 68 6f 73 74 69 6e 66 6f 20 28 64 62 3a   ((hostinfo (db:
1090: 67 65 74 2d 76 61 72 20 64 62 20 22 53 45 52 56  get-var db "SERV
10a0: 45 52 22 29 29 0a 09 20 28 68 6f 73 74 64 61 74  ER")).. (hostdat
10b0: 20 20 28 69 66 20 68 6f 73 74 69 6e 66 6f 20 28    (if hostinfo (
10c0: 73 74 72 69 6e 67 2d 73 70 6c 69 74 20 68 6f 73  string-split hos
10d0: 74 69 6e 66 6f 20 22 3a 22 29 29 29 0a 09 20 28  tinfo ":"))).. (
10e0: 68 6f 73 74 20 20 20 20 20 28 69 66 20 68 6f 73  host     (if hos
10f0: 74 69 6e 66 6f 20 28 63 61 72 20 68 6f 73 74 64  tinfo (car hostd
1100: 61 74 29 29 29 0a 09 20 28 70 6f 72 74 20 20 20  at))).. (port   
1110: 20 20 28 69 66 20 28 61 6e 64 20 68 6f 73 74 69    (if (and hosti
1120: 6e 66 6f 20 28 3e 20 28 6c 65 6e 67 74 68 20 68  nfo (> (length h
1130: 6f 73 74 64 61 74 29 20 31 29 29 28 63 61 64 72  ostdat) 1))(cadr
1140: 20 68 6f 73 74 64 61 74 29 20 23 66 29 29 29 0a   hostdat) #f))).
1150: 20 20 20 20 28 69 66 20 28 61 6e 64 20 70 6f 72      (if (and por
1160: 74 0a 09 20 20 20 20 20 28 73 74 72 69 6e 67 2d  t..     (string-
1170: 3e 6e 75 6d 62 65 72 20 70 6f 72 74 29 29 0a 09  >number port))..
1180: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 32 20 22  (debug:print 2 "
1190: 49 4e 46 4f 3a 20 53 65 74 74 69 6e 67 20 75 70  INFO: Setting up
11a0: 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20 68   to connect to h
11b0: 6f 73 74 20 22 20 68 6f 73 74 20 22 3a 22 20 70  ost " host ":" p
11c0: 6f 72 74 29 29 0a 20 20 20 20 28 73 65 74 21 20  ort)).    (set! 
11d0: 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 28 69 66 20  *runremote* (if 
11e0: 70 6f 72 74 20 28 76 65 63 74 6f 72 20 68 6f 73  port (vector hos
11f0: 74 20 28 73 74 72 69 6e 67 2d 3e 6e 75 6d 62 65  t (string->numbe
1200: 72 20 70 6f 72 74 29 29 20 23 66 29 29 29 29 0a  r port)) #f)))).
1210: 0a                                               .