Megatest

Hex Artifact Content
Login

Artifact 8e4eb733dadf74db262f7462fb39a5f372b3ca5b:


0000: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
0010: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0040: 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 43 6f 70 79  ========.;; Copy
0050: 72 69 67 68 74 20 32 30 30 36 2d 32 30 31 31 2c  right 2006-2011,
0060: 20 4d 61 74 74 68 65 77 20 57 65 6c 6c 61 6e 64   Matthew Welland
0070: 2e 0a 3b 3b 20 0a 3b 3b 20 20 54 68 69 73 20 70  ..;; .;;  This p
0080: 72 6f 67 72 61 6d 20 69 73 20 6d 61 64 65 20 61  rogram is made a
0090: 76 61 69 6c 61 62 6c 65 20 75 6e 64 65 72 20 74  vailable under t
00a0: 68 65 20 47 4e 55 20 47 50 4c 20 76 65 72 73 69  he GNU GPL versi
00b0: 6f 6e 20 32 2e 30 20 6f 72 0a 3b 3b 20 20 67 72  on 2.0 or.;;  gr
00c0: 65 61 74 65 72 2e 20 53 65 65 20 74 68 65 20 61  eater. See the a
00d0: 63 63 6f 6d 70 61 6e 79 69 6e 67 20 66 69 6c 65  ccompanying file
00e0: 20 43 4f 50 59 49 4e 47 20 66 6f 72 20 64 65 74   COPYING for det
00f0: 61 69 6c 73 2e 0a 3b 3b 20 0a 3b 3b 20 20 54 68  ails..;; .;;  Th
0100: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69  is program is di
0110: 73 74 72 69 62 75 74 65 64 20 57 49 54 48 4f 55  stributed WITHOU
0120: 54 20 41 4e 59 20 57 41 52 52 41 4e 54 59 3b 20  T ANY WARRANTY; 
0130: 77 69 74 68 6f 75 74 20 65 76 65 6e 20 74 68 65  without even the
0140: 0a 3b 3b 20 20 69 6d 70 6c 69 65 64 20 77 61 72  .;;  implied war
0150: 72 61 6e 74 79 20 6f 66 20 4d 45 52 43 48 41 4e  ranty of MERCHAN
0160: 54 41 42 49 4c 49 54 59 20 6f 72 20 46 49 54 4e  TABILITY or FITN
0170: 45 53 53 20 46 4f 52 20 41 20 50 41 52 54 49 43  ESS FOR A PARTIC
0180: 55 4c 41 52 0a 3b 3b 20 20 50 55 52 50 4f 53 45  ULAR.;;  PURPOSE
0190: 2e 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ..;;============
01a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 3d 3d  ==========..;;==
01e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0200: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0210: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0220: 3d 3d 3d 3d 0a 3b 3b 20 44 61 74 61 62 61 73 65  ====.;; Database
0230: 20 61 63 63 65 73 73 0a 3b 3b 3d 3d 3d 3d 3d 3d   access.;;======
0240: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0250: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0260: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0270: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0280: 0a 0a 28 64 65 66 69 6e 65 20 28 6f 70 65 6e 2d  ..(define (open-
0290: 64 62 29 20 3b 3b 20 20 28 63 6f 6e 63 20 2a 74  db) ;;  (conc *t
02a0: 6f 70 70 61 74 68 2a 20 22 2f 6d 65 67 61 74 65  oppath* "/megate
02b0: 73 74 2e 64 62 22 29 20 28 63 61 72 20 2a 63 6f  st.db") (car *co
02c0: 6e 66 69 67 69 6e 66 6f 2a 29 29 29 0a 20 20 28  nfiginfo*))).  (
02d0: 6c 65 74 2a 20 28 28 64 62 70 61 74 68 20 20 20  let* ((dbpath   
02e0: 20 28 63 6f 6e 63 20 2a 74 6f 70 70 61 74 68 2a   (conc *toppath*
02f0: 20 22 2f 6d 65 67 61 74 65 73 74 2e 64 62 22 29   "/megatest.db")
0300: 29 20 3b 3b 20 66 6e 61 6d 65 29 0a 09 20 28 63  ) ;; fname).. (c
0310: 6f 6e 66 69 67 64 61 74 20 28 63 61 72 20 2a 63  onfigdat (car *c
0320: 6f 6e 66 69 67 69 6e 66 6f 2a 29 29 0a 09 20 28  onfiginfo*)).. (
0330: 64 62 65 78 69 73 74 73 20 20 28 66 69 6c 65 2d  dbexists  (file-
0340: 65 78 69 73 74 73 3f 20 64 62 70 61 74 68 29 29  exists? dbpath))
0350: 0a 09 20 28 64 62 20 20 20 20 20 20 20 20 28 73  .. (db        (s
0360: 71 6c 69 74 65 33 3a 6f 70 65 6e 2d 64 61 74 61  qlite3:open-data
0370: 62 61 73 65 20 64 62 70 61 74 68 29 29 20 3b 3b  base dbpath)) ;;
0380: 20 28 6e 65 76 65 72 2d 67 69 76 65 2d 75 70 2d   (never-give-up-
0390: 6f 70 65 6e 2d 64 62 20 64 62 70 61 74 68 29 29  open-db dbpath))
03a0: 0a 09 20 28 68 61 6e 64 6c 65 72 20 20 20 28 6d  .. (handler   (m
03b0: 61 6b 65 2d 62 75 73 79 2d 74 69 6d 65 6f 75 74  ake-busy-timeout
03c0: 20 33 36 30 30 30 29 29 29 0a 20 20 20 20 28 73   36000))).    (s
03d0: 71 6c 69 74 65 33 3a 73 65 74 2d 62 75 73 79 2d  qlite3:set-busy-
03e0: 68 61 6e 64 6c 65 72 21 20 64 62 20 68 61 6e 64  handler! db hand
03f0: 6c 65 72 29 0a 20 20 20 20 28 69 66 20 28 6e 6f  ler).    (if (no
0400: 74 20 64 62 65 78 69 73 74 73 29 0a 09 28 6c 65  t dbexists)..(le
0410: 74 2a 20 28 28 6b 65 79 73 20 20 20 20 20 28 63  t* ((keys     (c
0420: 6f 6e 66 69 67 2d 67 65 74 2d 66 69 65 6c 64 73  onfig-get-fields
0430: 20 63 6f 6e 66 69 67 64 61 74 29 29 0a 09 20 20   configdat))..  
0440: 20 20 20 20 20 28 68 61 76 65 6b 65 79 73 20 28       (havekeys (
0450: 3e 20 28 6c 65 6e 67 74 68 20 6b 65 79 73 29 20  > (length keys) 
0460: 30 29 29 0a 09 20 20 20 20 20 20 20 28 6b 65 79  0))..       (key
0470: 73 74 72 20 20 20 28 6b 65 79 73 2d 3e 6b 65 79  str   (keys->key
0480: 73 74 72 20 6b 65 79 73 29 29 0a 09 20 20 20 20  str keys))..    
0490: 20 20 20 28 66 69 65 6c 64 73 74 72 20 28 6b 65     (fieldstr (ke
04a0: 79 73 2d 3e 6b 65 79 2f 66 69 65 6c 64 20 6b 65  ys->key/field ke
04b0: 79 73 29 29 29 0a 09 20 20 3b 3b 20 28 73 71 6c  ys)))..  ;; (sql
04c0: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
04d0: 22 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e  "PRAGMA synchron
04e0: 6f 75 73 20 3d 20 4f 46 46 3b 22 29 0a 09 20 20  ous = OFF;")..  
04f0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
0500: 20 64 62 20 22 43 52 45 41 54 45 20 54 41 42 4c   db "CREATE TABL
0510: 45 20 6b 65 79 73 20 28 69 64 20 49 4e 54 45 47  E keys (id INTEG
0520: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
0530: 66 69 65 6c 64 6e 61 6d 65 20 54 45 58 54 2c 20  fieldname TEXT, 
0540: 66 69 65 6c 64 74 79 70 65 20 54 45 58 54 2c 20  fieldtype TEXT, 
0550: 43 4f 4e 53 54 52 41 49 4e 54 20 6b 65 79 63 6f  CONSTRAINT keyco
0560: 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20  nstraint UNIQUE 
0570: 28 66 69 65 6c 64 6e 61 6d 65 29 29 3b 22 29 0a  (fieldname));").
0580: 09 20 20 28 66 6f 72 2d 65 61 63 68 20 28 6c 61  .  (for-each (la
0590: 6d 62 64 61 20 28 6b 65 79 29 0a 09 09 20 20 20  mbda (key)...   
05a0: 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63     (sqlite3:exec
05b0: 75 74 65 20 64 62 20 22 49 4e 53 45 52 54 20 49  ute db "INSERT I
05c0: 4e 54 4f 20 6b 65 79 73 20 28 66 69 65 6c 64 6e  NTO keys (fieldn
05d0: 61 6d 65 2c 66 69 65 6c 64 74 79 70 65 29 20 56  ame,fieldtype) V
05e0: 41 4c 55 45 53 20 28 3f 2c 3f 29 3b 22 20 28 6b  ALUES (?,?);" (k
05f0: 65 79 3a 67 65 74 2d 66 69 65 6c 64 6e 61 6d 65  ey:get-fieldname
0600: 20 6b 65 79 29 28 6b 65 79 3a 67 65 74 2d 66 69   key)(key:get-fi
0610: 65 6c 64 74 79 70 65 20 6b 65 79 29 29 29 0a 09  eldtype key)))..
0620: 09 20 20 20 20 6b 65 79 73 29 0a 09 20 20 28 73  .    keys)..  (s
0630: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64  qlite3:execute d
0640: 62 20 28 63 6f 6e 63 20 0a 09 09 09 20 20 20 20  b (conc ....    
0650: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 72 75  "CREATE TABLE ru
0660: 6e 73 20 28 69 64 20 49 4e 54 45 47 45 52 20 50  ns (id INTEGER P
0670: 52 49 4d 41 52 59 20 4b 45 59 2c 20 22 20 0a 09  RIMARY KEY, " ..
0680: 09 09 20 20 20 20 66 69 65 6c 64 73 74 72 20 28  ..    fieldstr (
0690: 69 66 20 68 61 76 65 6b 65 79 73 20 22 2c 22 20  if havekeys "," 
06a0: 22 22 29 0a 09 09 09 20 20 20 20 22 72 75 6e 6e  "")....    "runn
06b0: 61 6d 65 20 54 45 58 54 2c 22 0a 09 09 09 20 20  ame TEXT,"....  
06c0: 20 20 22 73 74 61 74 65 20 54 45 58 54 20 44 45    "state TEXT DE
06d0: 46 41 55 4c 54 20 27 27 2c 22 0a 09 09 09 20 20  FAULT '',"....  
06e0: 20 20 22 73 74 61 74 75 73 20 54 45 58 54 20 44    "status TEXT D
06f0: 45 46 41 55 4c 54 20 27 27 2c 22 0a 09 09 09 20  EFAULT '',".... 
0700: 20 20 20 22 6f 77 6e 65 72 20 54 45 58 54 20 44     "owner TEXT D
0710: 45 46 41 55 4c 54 20 27 27 2c 22 0a 09 09 09 20  EFAULT '',".... 
0720: 20 20 20 22 65 76 65 6e 74 5f 74 69 6d 65 20 54     "event_time T
0730: 49 4d 45 53 54 41 4d 50 2c 22 0a 09 09 09 20 20  IMESTAMP,"....  
0740: 20 20 22 63 6f 6d 6d 65 6e 74 20 54 45 58 54 20    "comment TEXT 
0750: 44 45 46 41 55 4c 54 20 27 27 2c 22 0a 09 09 09  DEFAULT '',"....
0760: 20 20 20 20 22 43 4f 4e 53 54 52 41 49 4e 54 20      "CONSTRAINT 
0770: 72 75 6e 73 63 6f 6e 73 74 72 61 69 6e 74 20 55  runsconstraint U
0780: 4e 49 51 55 45 20 28 72 75 6e 6e 61 6d 65 22 20  NIQUE (runname" 
0790: 28 69 66 20 68 61 76 65 6b 65 79 73 20 22 2c 22  (if havekeys ","
07a0: 20 22 22 29 20 6b 65 79 73 74 72 20 22 29 29 3b   "") keystr "));
07b0: 22 29 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a  "))..  (sqlite3:
07c0: 65 78 65 63 75 74 65 20 64 62 20 28 63 6f 6e 63  execute db (conc
07d0: 20 22 43 52 45 41 54 45 20 49 4e 44 45 58 20 72   "CREATE INDEX r
07e0: 75 6e 73 5f 69 6e 64 65 78 20 4f 4e 20 72 75 6e  uns_index ON run
07f0: 73 20 28 72 75 6e 6e 61 6d 65 22 20 28 69 66 20  s (runname" (if 
0800: 68 61 76 65 6b 65 79 73 20 22 2c 22 20 22 22 29  havekeys "," "")
0810: 20 6b 65 79 73 74 72 20 22 29 3b 22 29 29 0a 09   keystr ");"))..
0820: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
0830: 74 65 20 64 62 20 0a 09 09 09 22 43 52 45 41 54  te db ...."CREAT
0840: 45 20 54 41 42 4c 45 20 74 65 73 74 73 20 0a 20  E TABLE tests . 
0850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0860: 20 20 20 28 69 64 20 49 4e 54 45 47 45 52 20 50     (id INTEGER P
0870: 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20  RIMARY KEY,.    
0880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0890: 20 72 75 6e 5f 69 64 20 20 20 20 20 49 4e 54 45   run_id     INTE
08a0: 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20  GER,.           
08b0: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 6e 61            testna
08c0: 6d 65 20 20 20 54 45 58 54 2c 0a 20 20 20 20 20  me   TEXT,.     
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08e0: 69 74 65 6d 70 61 74 68 20 20 20 54 45 58 54 2c  itempath   TEXT,
08f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0900: 20 20 20 20 20 20 68 6f 73 74 20 20 20 20 20 20        host      
0910: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 6e   TEXT DEFAULT 'n
0920: 2f 61 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20  /a',.           
0930: 20 20 20 20 20 20 20 20 20 20 63 70 75 6c 6f 61            cpuloa
0940: 64 20 20 20 20 52 45 41 4c 20 44 45 46 41 55 4c  d    REAL DEFAUL
0950: 54 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20  T -1,.          
0960: 20 20 20 20 20 20 20 20 20 20 20 64 69 73 6b 66             diskf
0970: 72 65 65 20 20 20 49 4e 54 45 47 45 52 20 44 45  ree   INTEGER DE
0980: 46 41 55 4c 54 20 2d 31 2c 0a 20 20 20 20 20 20  FAULT -1,.      
0990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75                 u
09a0: 6e 61 6d 65 20 20 20 20 20 20 54 45 58 54 20 44  name      TEXT D
09b0: 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 20 0a 20  EFAULT 'n/a', . 
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09d0: 20 20 20 20 72 75 6e 64 69 72 20 20 20 20 20 54      rundir     T
09e0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 6e 2f 61  EXT DEFAULT 'n/a
09f0: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ',.             
0a00: 20 20 20 20 20 20 20 20 69 74 65 6d 5f 70 61 74          item_pat
0a10: 68 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20  h  TEXT DEFAULT 
0a20: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '',.            
0a30: 20 20 20 20 20 20 20 20 20 73 74 61 74 65 20 20           state  
0a40: 20 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54      TEXT DEFAULT
0a50: 20 27 4e 4f 54 5f 53 54 41 52 54 45 44 27 2c 0a   'NOT_STARTED',.
0a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a70: 20 20 20 20 20 73 74 61 74 75 73 20 20 20 20 20       status     
0a80: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 6e 2f  TEXT DEFAULT 'n/
0a90: 61 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  a',.            
0aa0: 20 20 20 20 20 20 20 20 20 61 74 74 65 6d 70 74           attempt
0ab0: 6e 75 6d 20 49 4e 54 45 47 45 52 20 44 45 46 41  num INTEGER DEFA
0ac0: 55 4c 54 20 30 2c 0a 20 20 20 20 20 20 20 20 20  ULT 0,.         
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6e 61              fina
0ae0: 6c 5f 6c 6f 67 66 20 54 45 58 54 20 44 45 46 41  l_logf TEXT DEFA
0af0: 55 4c 54 20 27 6c 6f 67 73 2f 66 69 6e 61 6c 2e  ULT 'logs/final.
0b00: 6c 6f 67 27 2c 0a 20 20 20 20 20 20 20 20 20 20  log',.          
0b10: 20 20 20 20 20 20 20 20 20 20 20 6c 6f 67 64 61             logda
0b20: 74 20 20 20 20 20 42 4c 4f 42 2c 20 0a 20 20 20  t     BLOB, .   
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b40: 20 20 72 75 6e 5f 64 75 72 61 74 69 6f 6e 20 49    run_duration I
0b50: 4e 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 30  NTEGER DEFAULT 0
0b60: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
0b70: 20 20 20 20 20 20 20 63 6f 6d 6d 65 6e 74 20 20         comment  
0b80: 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27    TEXT DEFAULT '
0b90: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ',.             
0ba0: 20 20 20 20 20 20 20 20 65 76 65 6e 74 5f 74 69          event_ti
0bb0: 6d 65 20 54 49 4d 45 53 54 41 4d 50 2c 0a 20 20  me TIMESTAMP,.  
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bd0: 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 65     CONSTRAINT te
0be0: 73 74 73 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e  stsconstraint UN
0bf0: 49 51 55 45 20 28 72 75 6e 5f 69 64 2c 20 74 65  IQUE (run_id, te
0c00: 73 74 6e 61 6d 65 2c 20 69 74 65 6d 5f 70 61 74  stname, item_pat
0c10: 68 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 22  h).          );"
0c20: 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65 78  )..  (sqlite3:ex
0c30: 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54 45  ecute db "CREATE
0c40: 20 49 4e 44 45 58 20 74 65 73 74 73 5f 69 6e 64   INDEX tests_ind
0c50: 65 78 20 4f 4e 20 74 65 73 74 73 20 28 72 75 6e  ex ON tests (run
0c60: 5f 69 64 2c 20 74 65 73 74 6e 61 6d 65 29 3b 22  _id, testname);"
0c70: 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65 78  )..  (sqlite3:ex
0c80: 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54 45  ecute db "CREATE
0c90: 20 56 49 45 57 20 72 75 6e 73 5f 74 65 73 74 73   VIEW runs_tests
0ca0: 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
0cb0: 4d 20 72 75 6e 73 20 49 4e 4e 45 52 20 4a 4f 49  M runs INNER JOI
0cc0: 4e 20 74 65 73 74 73 20 4f 4e 20 72 75 6e 73 2e  N tests ON runs.
0cd0: 69 64 3d 74 65 73 74 73 2e 72 75 6e 5f 69 64 3b  id=tests.run_id;
0ce0: 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65  ")..  (sqlite3:e
0cf0: 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54  xecute db "CREAT
0d00: 45 20 54 41 42 4c 45 20 74 65 73 74 5f 73 74 65  E TABLE test_ste
0d10: 70 73 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ps .            
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d30: 20 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52    (id INTEGER PR
0d40: 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20  IMARY KEY,.     
0d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d60: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 69            test_i
0d70: 64 20 49 4e 54 45 47 45 52 2c 20 0a 20 20 20 20  d INTEGER, .    
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d90: 20 20 20 20 20 20 20 20 20 20 20 73 74 65 70 6e             stepn
0da0: 61 6d 65 20 54 45 58 54 2c 20 0a 20 20 20 20 20  ame TEXT, .     
0db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0dc0: 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65 20            state 
0dd0: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 4e 4f  TEXT DEFAULT 'NO
0de0: 54 5f 53 54 41 52 54 45 44 27 2c 20 0a 20 20 20  T_STARTED', .   
0df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e00: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74              stat
0e10: 75 73 20 54 45 58 54 20 44 45 46 41 55 4c 54 20  us TEXT DEFAULT 
0e20: 27 6e 2f 61 27 2c 65 76 65 6e 74 5f 74 69 6d 65  'n/a',event_time
0e30: 20 54 49 4d 45 53 54 41 4d 50 2c 0a 20 20 20 20   TIMESTAMP,.    
0e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e50: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65             comme
0e60: 6e 74 20 54 45 58 54 20 44 45 46 41 55 4c 54 20  nt TEXT DEFAULT 
0e70: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '',.            
0e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e90: 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 65     CONSTRAINT te
0ea0: 73 74 5f 73 74 65 70 73 5f 63 6f 6e 73 74 72 61  st_steps_constra
0eb0: 69 6e 74 20 55 4e 49 51 55 45 20 28 74 65 73 74  int UNIQUE (test
0ec0: 5f 69 64 2c 73 74 65 70 6e 61 6d 65 2c 73 74 61  _id,stepname,sta
0ed0: 74 65 29 29 3b 22 29 0a 09 20 20 28 73 71 6c 69  te));")..  (sqli
0ee0: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22  te3:execute db "
0ef0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 65 78 74  CREATE TABLE ext
0f00: 72 61 64 61 74 20 28 69 64 20 49 4e 54 45 47 45  radat (id INTEGE
0f10: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 72  R PRIMARY KEY, r
0f20: 75 6e 5f 69 64 20 49 4e 54 45 47 45 52 2c 20 6b  un_id INTEGER, k
0f30: 65 79 20 54 45 58 54 2c 20 76 61 6c 20 54 45 58  ey TEXT, val TEX
0f40: 54 29 3b 22 29 0a 09 20 20 28 73 71 6c 69 74 65  T);")..  (sqlite
0f50: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 43 52  3:execute db "CR
0f60: 45 41 54 45 20 54 41 42 4c 45 20 61 63 63 65 73  EATE TABLE acces
0f70: 73 5f 6c 6f 67 20 28 69 64 20 49 4e 54 45 47 45  s_log (id INTEGE
0f80: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 75  R PRIMARY KEY, u
0f90: 73 65 72 20 54 45 58 54 2c 20 61 63 63 65 73 73  ser TEXT, access
0fa0: 65 64 20 54 49 4d 45 53 54 41 4d 50 2c 20 61 72  ed TIMESTAMP, ar
0fb0: 67 73 20 54 45 58 54 29 3b 22 29 29 29 0a 20 20  gs TEXT);"))).  
0fc0: 20 20 64 62 29 29 0a 0a 3b 3b 20 28 69 66 20 28    db))..;; (if (
0fd0: 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22 2d 64  args:get-arg "-d
0fe0: 62 22 29 0a 3b 3b 20 20 20 20 20 28 73 65 74 21  b").;;     (set!
0ff0: 20 64 62 20 28 6f 70 65 6e 2d 64 62 20 28 61 72   db (open-db (ar
1000: 67 73 3a 67 65 74 2d 61 72 67 20 22 2d 64 62 22  gs:get-arg "-db"
1010: 29 29 29 29 0a 0a 3b 3b 20 54 4f 44 4f 0a 3b 3b  ))))..;; TODO.;;
1020: 20 0a 3b 3b 20 31 2e 20 49 6d 70 6c 65 6d 65 6e   .;; 1. Implemen
1030: 74 20 62 61 73 69 63 20 72 65 67 69 73 74 65 72  t basic register
1040: 69 6e 67 20 6f 66 20 72 65 63 6f 72 64 73 0a 3b  ing of records.;
1050: 3b 20 32 2e 20 49 6d 70 6c 65 6d 65 6e 74 20 62  ; 2. Implement b
1060: 61 73 69 63 20 71 75 65 72 79 69 6e 67 20 6f 66  asic querying of
1070: 20 72 65 63 6f 72 64 73 0a 3b 3b 20 65 68 3f 0a   records.;; eh?.
1080: 0a 28 64 65 66 69 6e 65 20 28 64 62 2d 67 65 74  .(define (db-get
1090: 2d 6b 65 79 73 20 64 62 29 0a 20 20 28 6c 65 74  -keys db).  (let
10a0: 20 28 28 72 65 73 20 27 28 29 29 29 0a 20 20 20   ((res '())).   
10b0: 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61   (sqlite3:for-ea
10c0: 63 68 2d 72 6f 77 20 0a 20 20 20 20 20 28 6c 61  ch-row .     (la
10d0: 6d 62 64 61 20 28 6b 65 79 20 6b 65 79 74 79 70  mbda (key keytyp
10e0: 65 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20  e).       (set! 
10f0: 72 65 73 20 28 63 6f 6e 73 20 28 76 65 63 74 6f  res (cons (vecto
1100: 72 20 6b 65 79 20 6b 65 79 74 79 70 65 29 20 72  r key keytype) r
1110: 65 73 29 29 29 0a 20 20 20 20 20 64 62 0a 20 20  es))).     db.  
1120: 20 20 20 22 53 45 4c 45 43 54 20 66 69 65 6c 64     "SELECT field
1130: 6e 61 6d 65 2c 66 69 65 6c 64 74 79 70 65 20 46  name,fieldtype F
1140: 52 4f 4d 20 6b 65 79 73 20 4f 52 44 45 52 20 42  ROM keys ORDER B
1150: 59 20 69 64 20 44 45 53 43 3b 22 29 0a 20 20 20  Y id DESC;").   
1160: 20 72 65 73 29 29 0a 0a 0a 28 64 65 66 69 6e 65   res))...(define
1170: 2d 69 6e 6c 69 6e 65 20 28 64 62 3a 67 65 74 2d  -inline (db:get-
1180: 68 65 61 64 65 72 20 76 65 63 29 28 76 65 63 74  header vec)(vect
1190: 6f 72 2d 72 65 66 20 76 65 63 20 30 29 29 0a 28  or-ref vec 0)).(
11a0: 64 65 66 69 6e 65 2d 69 6e 6c 69 6e 65 20 28 64  define-inline (d
11b0: 62 3a 67 65 74 2d 72 6f 77 73 20 20 20 76 65 63  b:get-rows   vec
11c0: 29 28 76 65 63 74 6f 72 2d 72 65 66 20 76 65 63  )(vector-ref vec
11d0: 20 31 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64   1))..(define (d
11e0: 62 2d 67 65 74 2d 76 61 6c 75 65 2d 62 79 2d 68  b-get-value-by-h
11f0: 65 61 64 65 72 20 72 6f 77 20 68 65 61 64 65 72  eader row header
1200: 20 66 69 65 6c 64 29 0a 20 20 28 69 66 20 28 6e   field).  (if (n
1210: 75 6c 6c 3f 20 68 65 61 64 65 72 29 20 23 66 0a  ull? header) #f.
1220: 20 20 20 20 20 20 28 6c 65 74 20 6c 6f 6f 70 20        (let loop 
1230: 28 28 68 65 64 20 28 63 61 72 20 68 65 61 64 65  ((hed (car heade
1240: 72 29 29 0a 09 09 20 28 74 61 6c 20 28 63 64 72  r))... (tal (cdr
1250: 20 68 65 61 64 65 72 29 29 0a 09 09 20 28 6e 20   header))... (n 
1260: 20 20 30 29 29 0a 09 28 69 66 20 28 65 71 75 61    0))..(if (equa
1270: 6c 3f 20 68 65 64 20 66 69 65 6c 64 29 0a 09 20  l? hed field).. 
1280: 20 20 20 28 76 65 63 74 6f 72 2d 72 65 66 20 72     (vector-ref r
1290: 6f 77 20 6e 29 0a 09 20 20 20 20 28 69 66 20 28  ow n)..    (if (
12a0: 6e 75 6c 6c 3f 20 74 61 6c 29 20 23 66 20 28 6c  null? tal) #f (l
12b0: 6f 6f 70 20 28 63 61 72 20 74 61 6c 29 28 63 64  oop (car tal)(cd
12c0: 72 20 74 61 6c 29 28 2b 20 6e 20 31 29 29 29 29  r tal)(+ n 1))))
12d0: 29 29 29 0a 09 20 20 20 20 0a 28 64 65 66 69 6e  )))..    .(defin
12e0: 65 20 28 64 62 2d 67 65 74 2d 72 75 6e 73 20 64  e (db-get-runs d
12f0: 62 20 72 75 6e 70 61 74 74 20 2e 20 63 6f 75 6e  b runpatt . coun
1300: 74 29 0a 20 20 28 6c 65 74 2a 20 28 28 72 65 73  t).  (let* ((res
1310: 20 20 20 20 20 20 27 28 29 29 0a 09 20 28 6b 65        '()).. (ke
1320: 79 73 20 20 20 20 20 20 28 64 62 2d 67 65 74 2d  ys      (db-get-
1330: 6b 65 79 73 20 64 62 29 29 0a 09 20 28 72 65 6d  keys db)).. (rem
1340: 66 69 65 6c 64 73 20 28 6c 69 73 74 20 22 69 64  fields (list "id
1350: 22 20 22 72 75 6e 6e 61 6d 65 22 20 22 73 74 61  " "runname" "sta
1360: 74 65 22 20 22 73 74 61 74 75 73 22 20 22 6f 77  te" "status" "ow
1370: 6e 65 72 22 20 22 65 76 65 6e 74 5f 74 69 6d 65  ner" "event_time
1380: 22 29 29 0a 09 20 28 68 65 61 64 65 72 20 20 20  ")).. (header   
1390: 20 28 61 70 70 65 6e 64 20 28 6d 61 70 20 6b 65   (append (map ke
13a0: 79 3a 67 65 74 2d 66 69 65 6c 64 6e 61 6d 65 20  y:get-fieldname 
13b0: 6b 65 79 73 29 0a 09 09 09 20 20 20 20 72 65 6d  keys)....    rem
13c0: 66 69 65 6c 64 73 29 29 0a 09 20 28 6b 65 79 73  fields)).. (keys
13d0: 74 72 20 20 20 20 28 63 6f 6e 63 20 28 6b 65 79  tr    (conc (key
13e0: 73 2d 3e 6b 65 79 73 74 72 20 6b 65 79 73 29 20  s->keystr keys) 
13f0: 22 2c 22 0a 09 09 09 20 20 28 73 74 72 69 6e 67  ","....  (string
1400: 2d 69 6e 74 65 72 73 70 65 72 73 65 20 72 65 6d  -intersperse rem
1410: 66 69 65 6c 64 73 20 22 2c 22 29 29 29 29 0a 20  fields ",")))). 
1420: 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d     (sqlite3:for-
1430: 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c  each-row.     (l
1440: 61 6d 62 64 61 20 28 61 20 2e 20 78 29 0a 20 20  ambda (a . x).  
1450: 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28       (set! res (
1460: 63 6f 6e 73 20 28 61 70 70 6c 79 20 76 65 63 74  cons (apply vect
1470: 6f 72 20 61 20 78 29 20 72 65 73 29 29 29 0a 20  or a x) res))). 
1480: 20 20 20 20 64 62 0a 20 20 20 20 20 28 63 6f 6e      db.     (con
1490: 63 20 22 53 45 4c 45 43 54 20 22 20 6b 65 79 73  c "SELECT " keys
14a0: 74 72 20 22 20 46 52 4f 4d 20 72 75 6e 73 20 57  tr " FROM runs W
14b0: 48 45 52 45 20 72 75 6e 6e 61 6d 65 20 4c 49 4b  HERE runname LIK
14c0: 45 20 3f 20 4f 52 44 45 52 20 42 59 20 65 76 65  E ? ORDER BY eve
14d0: 6e 74 5f 74 69 6d 65 20 44 45 53 43 20 22 0a 09  nt_time DESC "..
14e0: 20 20 20 28 69 66 20 28 61 6e 64 20 28 6e 6f 74     (if (and (not
14f0: 20 28 6e 75 6c 6c 3f 20 63 6f 75 6e 74 29 29 0a   (null? count)).
1500: 09 09 20 20 20 20 28 6e 75 6d 62 65 72 3f 20 28  ..    (number? (
1510: 63 61 72 20 63 6f 75 6e 74 29 29 29 0a 09 20 20  car count)))..  
1520: 20 20 20 20 20 28 63 6f 6e 63 20 22 20 4c 49 4d       (conc " LIM
1530: 49 54 20 22 20 28 63 61 72 20 63 6f 75 6e 74 29  IT " (car count)
1540: 29 0a 09 20 20 20 20 20 20 20 22 22 29 0a 09 20  )..       "").. 
1550: 20 20 28 69 66 20 28 61 6e 64 20 28 3e 20 28 6c    (if (and (> (l
1560: 65 6e 67 74 68 20 63 6f 75 6e 74 29 20 31 29 0a  ength count) 1).
1570: 09 09 20 20 20 20 28 6e 75 6d 62 65 72 3f 20 28  ..    (number? (
1580: 63 61 64 72 20 63 6f 75 6e 74 29 29 29 0a 09 20  cadr count))).. 
1590: 20 20 20 20 20 20 28 63 6f 6e 63 20 22 20 4f 46        (conc " OF
15a0: 46 53 45 54 20 22 20 28 63 61 64 72 20 63 6f 75  FSET " (cadr cou
15b0: 6e 74 29 29 0a 09 20 20 20 20 20 20 20 22 22 29  nt))..       "")
15c0: 29 0a 20 20 20 20 20 72 75 6e 70 61 74 74 29 0a  ).     runpatt).
15d0: 20 20 20 20 28 76 65 63 74 6f 72 20 68 65 61 64      (vector head
15e0: 65 72 20 72 65 73 29 29 29 0a 0a 3b 3b 20 75 73  er res)))..;; us
15f0: 65 20 74 68 69 73 20 6f 6e 65 20 66 6f 72 20 64  e this one for d
1600: 62 2d 67 65 74 2d 72 75 6e 2d 69 6e 66 6f 0a 28  b-get-run-info.(
1610: 64 65 66 69 6e 65 2d 69 6e 6c 69 6e 65 20 28 64  define-inline (d
1620: 62 3a 67 65 74 2d 72 6f 77 20 20 20 20 76 65 63  b:get-row    vec
1630: 29 28 76 65 63 74 6f 72 2d 72 65 66 20 76 65 63  )(vector-ref vec
1640: 20 31 29 29 0a 0a 3b 3b 20 75 73 65 20 28 67 65   1))..;; use (ge
1650: 74 2d 76 61 6c 75 65 2d 62 79 2d 68 65 61 64 65  t-value-by-heade
1660: 72 20 28 64 62 3a 67 65 74 2d 68 65 61 64 65 72  r (db:get-header
1670: 20 72 75 6e 69 6e 66 6f 29 28 64 62 3a 67 65 74   runinfo)(db:get
1680: 2d 72 6f 77 20 72 75 6e 69 6e 66 6f 29 29 0a 28  -row runinfo)).(
1690: 64 65 66 69 6e 65 20 28 64 62 2d 67 65 74 2d 72  define (db-get-r
16a0: 75 6e 2d 69 6e 66 6f 20 64 62 20 72 75 6e 2d 69  un-info db run-i
16b0: 64 29 0a 20 20 28 6c 65 74 2a 20 28 28 72 65 73  d).  (let* ((res
16c0: 20 20 20 20 20 20 23 66 29 0a 09 20 28 6b 65 79        #f).. (key
16d0: 73 20 20 20 20 20 20 28 64 62 2d 67 65 74 2d 6b  s      (db-get-k
16e0: 65 79 73 20 64 62 29 29 0a 09 20 28 72 65 6d 66  eys db)).. (remf
16f0: 69 65 6c 64 73 20 28 6c 69 73 74 20 22 69 64 22  ields (list "id"
1700: 20 22 72 75 6e 6e 61 6d 65 22 20 22 73 74 61 74   "runname" "stat
1710: 65 22 20 22 73 74 61 74 75 73 22 20 22 6f 77 6e  e" "status" "own
1720: 65 72 22 20 22 65 76 65 6e 74 5f 74 69 6d 65 22  er" "event_time"
1730: 29 29 0a 09 20 28 68 65 61 64 65 72 20 20 20 20  )).. (header    
1740: 28 61 70 70 65 6e 64 20 28 6d 61 70 20 6b 65 79  (append (map key
1750: 3a 67 65 74 2d 66 69 65 6c 64 6e 61 6d 65 20 6b  :get-fieldname k
1760: 65 79 73 29 0a 09 09 09 20 20 20 20 72 65 6d 66  eys)....    remf
1770: 69 65 6c 64 73 29 29 0a 09 20 28 6b 65 79 73 74  ields)).. (keyst
1780: 72 20 20 20 20 28 63 6f 6e 63 20 28 6b 65 79 73  r    (conc (keys
1790: 2d 3e 6b 65 79 73 74 72 20 6b 65 79 73 29 20 22  ->keystr keys) "
17a0: 2c 22 0a 09 09 09 20 20 28 73 74 72 69 6e 67 2d  ,"....  (string-
17b0: 69 6e 74 65 72 73 70 65 72 73 65 20 72 65 6d 66  intersperse remf
17c0: 69 65 6c 64 73 20 22 2c 22 29 29 29 29 0a 20 20  ields ",")))).  
17d0: 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65    (sqlite3:for-e
17e0: 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61  ach-row.     (la
17f0: 6d 62 64 61 20 28 61 20 2e 20 78 29 0a 20 20 20  mbda (a . x).   
1800: 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28 61      (set! res (a
1810: 70 70 6c 79 20 76 65 63 74 6f 72 20 61 20 78 29  pply vector a x)
1820: 29 29 0a 20 20 20 20 20 64 62 0a 20 20 20 20 20  )).     db.     
1830: 28 63 6f 6e 63 20 22 53 45 4c 45 43 54 20 22 20  (conc "SELECT " 
1840: 6b 65 79 73 74 72 20 22 20 46 52 4f 4d 20 72 75  keystr " FROM ru
1850: 6e 73 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 29  ns WHERE id=?;")
1860: 0a 20 20 20 20 20 72 75 6e 2d 69 64 29 0a 20 20  .     run-id).  
1870: 20 20 28 76 65 63 74 6f 72 20 68 65 61 64 65 72    (vector header
1880: 20 72 65 73 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d   res)))..;;=====
1890: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
18a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
18b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
18c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
18d0: 3d 0a 3b 3b 20 20 54 20 45 20 53 20 54 20 53 0a  =.;;  T E S T S.
18e0: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
18f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1900: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1910: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1920: 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69 6e  ========..(defin
1930: 65 20 28 6d 61 6b 65 2d 64 62 3a 74 65 73 74 29  e (make-db:test)
1940: 28 6d 61 6b 65 2d 76 65 63 74 6f 72 20 36 29 29  (make-vector 6))
1950: 0a 28 64 65 66 69 6e 65 2d 69 6e 6c 69 6e 65 20  .(define-inline 
1960: 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 69 64 20  (db:test-get-id 
1970: 20 20 20 20 20 20 20 20 20 20 76 65 63 29 20 28            vec) (
1980: 76 65 63 74 6f 72 2d 72 65 66 20 76 65 63 20 30  vector-ref vec 0
1990: 29 29 0a 28 64 65 66 69 6e 65 2d 69 6e 6c 69 6e  )).(define-inlin
19a0: 65 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 72  e (db:test-get-r
19b0: 75 6e 5f 69 64 20 20 20 20 20 20 20 76 65 63 29  un_id       vec)
19c0: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76 65 63   (vector-ref vec
19d0: 20 31 29 29 0a 28 64 65 66 69 6e 65 2d 69 6e 6c   1)).(define-inl
19e0: 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 67 65 74  ine (db:test-get
19f0: 2d 74 65 73 74 6e 61 6d 65 20 20 20 20 20 76 65  -testname     ve
1a00: 63 29 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76  c) (vector-ref v
1a10: 65 63 20 32 29 29 0a 28 64 65 66 69 6e 65 2d 69  ec 2)).(define-i
1a20: 6e 6c 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 67  nline (db:test-g
1a30: 65 74 2d 73 74 61 74 65 20 20 20 20 20 20 20 20  et-state        
1a40: 76 65 63 29 20 28 76 65 63 74 6f 72 2d 72 65 66  vec) (vector-ref
1a50: 20 76 65 63 20 33 29 29 0a 28 64 65 66 69 6e 65   vec 3)).(define
1a60: 2d 69 6e 6c 69 6e 65 20 28 64 62 3a 74 65 73 74  -inline (db:test
1a70: 2d 67 65 74 2d 73 74 61 74 75 73 20 20 20 20 20  -get-status     
1a80: 20 20 76 65 63 29 20 28 76 65 63 74 6f 72 2d 72    vec) (vector-r
1a90: 65 66 20 76 65 63 20 34 29 29 0a 28 64 65 66 69  ef vec 4)).(defi
1aa0: 6e 65 2d 69 6e 6c 69 6e 65 20 28 64 62 3a 74 65  ne-inline (db:te
1ab0: 73 74 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d  st-get-event_tim
1ac0: 65 20 20 20 76 65 63 29 20 28 76 65 63 74 6f 72  e   vec) (vector
1ad0: 2d 72 65 66 20 76 65 63 20 35 29 29 0a 28 64 65  -ref vec 5)).(de
1ae0: 66 69 6e 65 2d 69 6e 6c 69 6e 65 20 28 64 62 3a  fine-inline (db:
1af0: 74 65 73 74 2d 67 65 74 2d 68 6f 73 74 20 20 20  test-get-host   
1b00: 20 20 20 20 20 20 76 65 63 29 20 28 76 65 63 74        vec) (vect
1b10: 6f 72 2d 72 65 66 20 76 65 63 20 36 29 29 0a 28  or-ref vec 6)).(
1b20: 64 65 66 69 6e 65 2d 69 6e 6c 69 6e 65 20 28 64  define-inline (d
1b30: 62 3a 74 65 73 74 2d 67 65 74 2d 63 70 75 6c 6f  b:test-get-cpulo
1b40: 61 64 20 20 20 20 20 20 76 65 63 29 20 28 76 65  ad      vec) (ve
1b50: 63 74 6f 72 2d 72 65 66 20 76 65 63 20 37 29 29  ctor-ref vec 7))
1b60: 0a 28 64 65 66 69 6e 65 2d 69 6e 6c 69 6e 65 20  .(define-inline 
1b70: 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 64 69 73  (db:test-get-dis
1b80: 6b 66 72 65 65 20 20 20 20 20 76 65 63 29 20 28  kfree     vec) (
1b90: 76 65 63 74 6f 72 2d 72 65 66 20 76 65 63 20 38  vector-ref vec 8
1ba0: 29 29 0a 28 64 65 66 69 6e 65 2d 69 6e 6c 69 6e  )).(define-inlin
1bb0: 65 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 75  e (db:test-get-u
1bc0: 6e 61 6d 65 20 20 20 20 20 20 20 20 76 65 63 29  name        vec)
1bd0: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76 65 63   (vector-ref vec
1be0: 20 39 29 29 0a 28 64 65 66 69 6e 65 2d 69 6e 6c   9)).(define-inl
1bf0: 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 67 65 74  ine (db:test-get
1c00: 2d 72 75 6e 64 69 72 20 20 20 20 20 20 20 76 65  -rundir       ve
1c10: 63 29 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76  c) (vector-ref v
1c20: 65 63 20 31 30 29 29 0a 28 64 65 66 69 6e 65 2d  ec 10)).(define-
1c30: 69 6e 6c 69 6e 65 20 28 64 62 3a 74 65 73 74 2d  inline (db:test-
1c40: 67 65 74 2d 69 74 65 6d 2d 70 61 74 68 20 20 20  get-item-path   
1c50: 20 76 65 63 29 20 28 76 65 63 74 6f 72 2d 72 65   vec) (vector-re
1c60: 66 20 76 65 63 20 31 31 29 29 0a 28 64 65 66 69  f vec 11)).(defi
1c70: 6e 65 2d 69 6e 6c 69 6e 65 20 28 64 62 3a 74 65  ne-inline (db:te
1c80: 73 74 2d 67 65 74 2d 72 75 6e 5f 64 75 72 61 74  st-get-run_durat
1c90: 69 6f 6e 20 76 65 63 29 20 28 76 65 63 74 6f 72  ion vec) (vector
1ca0: 2d 72 65 66 20 76 65 63 20 31 32 29 29 0a 28 64  -ref vec 12)).(d
1cb0: 65 66 69 6e 65 2d 69 6e 6c 69 6e 65 20 28 64 62  efine-inline (db
1cc0: 3a 74 65 73 74 2d 67 65 74 2d 66 69 6e 61 6c 5f  :test-get-final_
1cd0: 6c 6f 67 66 20 20 20 76 65 63 29 20 28 76 65 63  logf   vec) (vec
1ce0: 74 6f 72 2d 72 65 66 20 76 65 63 20 31 33 29 29  tor-ref vec 13))
1cf0: 0a 28 64 65 66 69 6e 65 2d 69 6e 6c 69 6e 65 20  .(define-inline 
1d00: 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 63 6f 6d  (db:test-get-com
1d10: 6d 65 6e 74 20 20 20 20 20 20 76 65 63 29 20 28  ment      vec) (
1d20: 76 65 63 74 6f 72 2d 72 65 66 20 76 65 63 20 31  vector-ref vec 1
1d30: 34 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62  4))..(define (db
1d40: 2d 67 65 74 2d 74 65 73 74 73 2d 66 6f 72 2d 72  -get-tests-for-r
1d50: 75 6e 20 64 62 20 72 75 6e 2d 69 64 29 0a 20 20  un db run-id).  
1d60: 28 6c 65 74 20 28 28 72 65 73 20 27 28 29 29 29  (let ((res '()))
1d70: 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f  .    (sqlite3:fo
1d80: 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 20  r-each-row .    
1d90: 20 28 6c 61 6d 62 64 61 20 28 69 64 20 72 75 6e   (lambda (id run
1da0: 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 73 74 61  -id testname sta
1db0: 74 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d  te status event-
1dc0: 74 69 6d 65 20 68 6f 73 74 20 63 70 75 6c 6f 61  time host cpuloa
1dd0: 64 20 64 69 73 6b 66 72 65 65 20 75 6e 61 6d 65  d diskfree uname
1de0: 20 72 75 6e 64 69 72 20 69 74 65 6d 2d 70 61 74   rundir item-pat
1df0: 68 20 72 75 6e 2d 64 75 72 61 74 69 6f 6e 20 66  h run-duration f
1e00: 69 6e 61 6c 2d 6c 6f 67 66 20 63 6f 6d 6d 65 6e  inal-logf commen
1e10: 74 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20  t).       (set! 
1e20: 72 65 73 20 28 63 6f 6e 73 20 28 76 65 63 74 6f  res (cons (vecto
1e30: 72 20 69 64 20 72 75 6e 2d 69 64 20 74 65 73 74  r id run-id test
1e40: 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61 74 75  name state statu
1e50: 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73  s event-time hos
1e60: 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72  t cpuload diskfr
1e70: 65 65 20 75 6e 61 6d 65 20 72 75 6e 64 69 72 20  ee uname rundir 
1e80: 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 2d 64 75  item-path run-du
1e90: 72 61 74 69 6f 6e 20 66 69 6e 61 6c 2d 6c 6f 67  ration final-log
1ea0: 66 20 63 6f 6d 6d 65 6e 74 29 20 72 65 73 29 29  f comment) res))
1eb0: 29 0a 20 20 20 20 20 64 62 20 0a 20 20 20 20 20  ).     db .     
1ec0: 22 53 45 4c 45 43 54 20 69 64 2c 72 75 6e 5f 69  "SELECT id,run_i
1ed0: 64 2c 74 65 73 74 6e 61 6d 65 2c 73 74 61 74 65  d,testname,state
1ee0: 2c 73 74 61 74 75 73 2c 65 76 65 6e 74 5f 74 69  ,status,event_ti
1ef0: 6d 65 2c 68 6f 73 74 2c 63 70 75 6c 6f 61 64 2c  me,host,cpuload,
1f00: 64 69 73 6b 66 72 65 65 2c 75 6e 61 6d 65 2c 72  diskfree,uname,r
1f10: 75 6e 64 69 72 2c 69 74 65 6d 5f 70 61 74 68 2c  undir,item_path,
1f20: 72 75 6e 5f 64 75 72 61 74 69 6f 6e 2c 66 69 6e  run_duration,fin
1f30: 61 6c 5f 6c 6f 67 66 2c 63 6f 6d 6d 65 6e 74 20  al_logf,comment 
1f40: 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45  FROM tests WHERE
1f50: 20 72 75 6e 5f 69 64 3d 3f 20 4f 52 44 45 52 20   run_id=? ORDER 
1f60: 42 59 20 69 64 20 44 45 53 43 3b 22 0a 20 20 20  BY id DESC;".   
1f70: 20 20 72 75 6e 2d 69 64 29 0a 20 20 20 20 72 65    run-id).    re
1f80: 73 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62  s))..(define (db
1f90: 3a 64 65 6c 65 74 65 2d 74 65 73 74 2d 73 74 65  :delete-test-ste
1fa0: 70 2d 72 65 63 6f 72 64 73 20 64 62 20 72 75 6e  p-records db run
1fb0: 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 29 0a 20  -id test-name). 
1fc0: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
1fd0: 65 20 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f  e db "DELETE FRO
1fe0: 4d 20 74 65 73 74 5f 73 74 65 70 73 20 57 48 45  M test_steps WHE
1ff0: 52 45 20 74 65 73 74 5f 69 64 20 69 6e 20 28 53  RE test_id in (S
2000: 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 74 65  ELECT id FROM te
2010: 73 74 73 20 57 48 45 52 45 20 72 75 6e 5f 69 64  sts WHERE run_id
2020: 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d  =? AND testname=
2030: 3f 29 3b 22 20 72 75 6e 2d 69 64 20 74 65 73 74  ?);" run-id test
2040: 2d 6e 61 6d 65 29 29 0a 0a 28 64 65 66 69 6e 65  -name))..(define
2050: 20 28 64 62 3a 67 65 74 2d 63 6f 75 6e 74 2d 74   (db:get-count-t
2060: 65 73 74 73 2d 72 75 6e 6e 69 6e 67 20 64 62 29  ests-running db)
2070: 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20 30 29  .  (let ((res 0)
2080: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66  ).    (sqlite3:f
2090: 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 20  or-each-row.    
20a0: 20 28 6c 61 6d 62 64 61 20 28 63 6f 75 6e 74 29   (lambda (count)
20b0: 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72 65  .       (set! re
20c0: 73 20 63 6f 75 6e 74 29 29 0a 20 20 20 20 20 64  s count)).     d
20d0: 62 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20 63  b.     "SELECT c
20e0: 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74 65  ount(id) FROM te
20f0: 73 74 73 20 57 48 45 52 45 20 73 74 61 74 65 20  sts WHERE state 
2100: 3d 20 27 52 55 4e 4e 49 4e 47 27 20 4f 52 20 73  = 'RUNNING' OR s
2110: 74 61 74 65 20 3d 20 27 4c 41 55 4e 43 48 45 44  tate = 'LAUNCHED
2120: 27 20 4f 52 20 73 74 61 74 65 20 3d 20 27 52 45  ' OR state = 'RE
2130: 4d 4f 54 45 48 4f 53 54 53 54 41 52 54 27 3b 22  MOTEHOSTSTART';"
2140: 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 3b 3b 20  ).    res))..;; 
2150: 4e 42 2f 2f 20 53 79 6e 63 20 74 68 69 73 20 77  NB// Sync this w
2160: 69 74 68 20 72 75 6e 73 3a 67 65 74 2d 74 65 73  ith runs:get-tes
2170: 74 2d 69 6e 66 6f 0a 28 64 65 66 69 6e 65 20 28  t-info.(define (
2180: 64 62 3a 67 65 74 2d 74 65 73 74 2d 69 6e 66 6f  db:get-test-info
2190: 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 6e   db run-id testn
21a0: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 0a 20  ame item-path). 
21b0: 20 28 6c 65 74 20 28 28 72 65 73 20 27 28 29 29   (let ((res '())
21c0: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66  ).    (sqlite3:f
21d0: 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 20  or-each-row.    
21e0: 20 28 6c 61 6d 62 64 61 20 28 69 64 20 72 75 6e   (lambda (id run
21f0: 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 73 74 61  -id testname sta
2200: 74 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d  te status event-
2210: 74 69 6d 65 20 68 6f 73 74 20 63 70 75 6c 6f 61  time host cpuloa
2220: 64 20 64 69 73 6b 66 72 65 65 20 75 6e 61 6d 65  d diskfree uname
2230: 20 72 75 6e 64 69 72 20 69 74 65 6d 2d 70 61 74   rundir item-pat
2240: 68 20 72 75 6e 5f 64 75 72 61 74 69 6f 6e 20 66  h run_duration f
2250: 69 6e 61 6c 5f 6c 6f 67 66 20 63 6f 6d 6d 65 6e  inal_logf commen
2260: 74 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20  t).       (set! 
2270: 72 65 73 20 28 76 65 63 74 6f 72 20 69 64 20 72  res (vector id r
2280: 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 73  un-id testname s
2290: 74 61 74 65 20 73 74 61 74 75 73 20 65 76 65 6e  tate status even
22a0: 74 2d 74 69 6d 65 20 68 6f 73 74 20 63 70 75 6c  t-time host cpul
22b0: 6f 61 64 20 64 69 73 6b 66 72 65 65 20 75 6e 61  oad diskfree una
22c0: 6d 65 20 72 75 6e 64 69 72 20 69 74 65 6d 2d 70  me rundir item-p
22d0: 61 74 68 20 72 75 6e 5f 64 75 72 61 74 69 6f 6e  ath run_duration
22e0: 20 66 69 6e 61 6c 5f 6c 6f 67 66 20 63 6f 6d 6d   final_logf comm
22f0: 65 6e 74 29 29 29 0a 20 20 20 20 20 64 62 20 0a  ent))).     db .
2300: 20 20 20 20 20 22 53 45 4c 45 43 54 20 69 64 2c       "SELECT id,
2310: 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d 65 2c  run_id,testname,
2320: 73 74 61 74 65 2c 73 74 61 74 75 73 2c 65 76 65  state,status,eve
2330: 6e 74 5f 74 69 6d 65 2c 68 6f 73 74 2c 63 70 75  nt_time,host,cpu
2340: 6c 6f 61 64 2c 64 69 73 6b 66 72 65 65 2c 75 6e  load,diskfree,un
2350: 61 6d 65 2c 72 75 6e 64 69 72 2c 69 74 65 6d 5f  ame,rundir,item_
2360: 70 61 74 68 2c 72 75 6e 5f 64 75 72 61 74 69 6f  path,run_duratio
2370: 6e 2c 66 69 6e 61 6c 5f 6c 6f 67 66 2c 63 6f 6d  n,final_logf,com
2380: 6d 65 6e 74 20 46 52 4f 4d 20 74 65 73 74 73 20  ment FROM tests 
2390: 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41  WHERE run_id=? A
23a0: 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e  ND testname=? AN
23b0: 44 20 69 74 65 6d 5f 70 61 74 68 3d 3f 3b 22 0a  D item_path=?;".
23c0: 20 20 20 20 20 72 75 6e 2d 69 64 20 74 65 73 74       run-id test
23d0: 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 0a  name item-path).
23e0: 20 20 20 20 72 65 73 29 29 0a 0a 3b 3b 20 53 74      res))..;; St
23f0: 65 70 73 0a 3b 3b 20 52 75 6e 20 73 74 65 70 73  eps.;; Run steps
2400: 0a 3b 3b 20 6d 61 6b 65 2d 76 65 63 74 6f 72 2d  .;; make-vector-
2410: 72 65 63 6f 72 64 20 22 52 75 6e 20 73 74 65 70  record "Run step
2420: 73 22 20 64 62 20 73 74 65 70 20 69 64 20 74 65  s" db step id te
2430: 73 74 5f 69 64 20 73 74 65 70 6e 61 6d 65 20 73  st_id stepname s
2440: 74 65 70 5f 63 6f 6d 70 6c 65 74 65 20 73 74 65  tep_complete ste
2450: 70 5f 70 61 73 73 20 65 76 65 6e 74 5f 74 69 6d  p_pass event_tim
2460: 65 20 20 20 20 0a 28 64 65 66 69 6e 65 20 28 6d  e    .(define (m
2470: 61 6b 65 2d 64 62 3a 73 74 65 70 29 28 6d 61 6b  ake-db:step)(mak
2480: 65 2d 76 65 63 74 6f 72 20 36 29 29 0a 28 64 65  e-vector 6)).(de
2490: 66 69 6e 65 2d 69 6e 6c 69 6e 65 20 28 64 62 3a  fine-inline (db:
24a0: 73 74 65 70 2d 67 65 74 2d 69 64 20 20 20 20 20  step-get-id     
24b0: 20 20 20 20 20 20 20 20 20 76 65 63 29 20 20 20           vec)   
24c0: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 20 76 65   (vector-ref  ve
24d0: 63 20 30 29 29 0a 28 64 65 66 69 6e 65 2d 69 6e  c 0)).(define-in
24e0: 6c 69 6e 65 20 28 64 62 3a 73 74 65 70 2d 67 65  line (db:step-ge
24f0: 74 2d 74 65 73 74 5f 69 64 20 20 20 20 20 20 20  t-test_id       
2500: 20 20 76 65 63 29 20 20 20 20 28 76 65 63 74 6f    vec)    (vecto
2510: 72 2d 72 65 66 20 20 76 65 63 20 31 29 29 0a 28  r-ref  vec 1)).(
2520: 64 65 66 69 6e 65 2d 69 6e 6c 69 6e 65 20 28 64  define-inline (d
2530: 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 65 70 6e  b:step-get-stepn
2540: 61 6d 65 20 20 20 20 20 20 20 20 76 65 63 29 20  ame        vec) 
2550: 20 20 20 28 76 65 63 74 6f 72 2d 72 65 66 20 20     (vector-ref  
2560: 76 65 63 20 32 29 29 0a 28 64 65 66 69 6e 65 2d  vec 2)).(define-
2570: 69 6e 6c 69 6e 65 20 28 64 62 3a 73 74 65 70 2d  inline (db:step-
2580: 67 65 74 2d 73 74 61 74 65 20 20 20 20 20 20 20  get-state       
2590: 20 20 20 20 76 65 63 29 20 20 20 20 28 76 65 63      vec)    (vec
25a0: 74 6f 72 2d 72 65 66 20 20 76 65 63 20 33 29 29  tor-ref  vec 3))
25b0: 0a 28 64 65 66 69 6e 65 2d 69 6e 6c 69 6e 65 20  .(define-inline 
25c0: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61  (db:step-get-sta
25d0: 74 75 73 20 20 20 20 20 20 20 20 20 20 76 65 63  tus          vec
25e0: 29 20 20 20 20 28 76 65 63 74 6f 72 2d 72 65 66  )    (vector-ref
25f0: 20 20 76 65 63 20 34 29 29 0a 28 64 65 66 69 6e    vec 4)).(defin
2600: 65 2d 69 6e 6c 69 6e 65 20 28 64 62 3a 73 74 65  e-inline (db:ste
2610: 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65  p-get-event_time
2620: 20 20 20 20 20 20 76 65 63 29 20 20 20 20 28 76        vec)    (v
2630: 65 63 74 6f 72 2d 72 65 66 20 20 76 65 63 20 35  ector-ref  vec 5
2640: 29 29 0a 28 64 65 66 69 6e 65 2d 69 6e 6c 69 6e  )).(define-inlin
2650: 65 20 28 64 62 3a 73 74 65 70 2d 73 65 74 2d 69  e (db:step-set-i
2660: 64 21 20 20 20 20 20 20 20 20 20 20 20 20 20 76  d!             v
2670: 65 63 20 76 61 6c 29 28 76 65 63 74 6f 72 2d 73  ec val)(vector-s
2680: 65 74 21 20 76 65 63 20 30 20 76 61 6c 29 29 0a  et! vec 0 val)).
2690: 28 64 65 66 69 6e 65 2d 69 6e 6c 69 6e 65 20 28  (define-inline (
26a0: 64 62 3a 73 74 65 70 2d 73 65 74 2d 74 65 73 74  db:step-set-test
26b0: 5f 69 64 21 20 20 20 20 20 20 20 20 76 65 63 20  _id!        vec 
26c0: 76 61 6c 29 28 76 65 63 74 6f 72 2d 73 65 74 21  val)(vector-set!
26d0: 20 76 65 63 20 31 20 76 61 6c 29 29 0a 28 64 65   vec 1 val)).(de
26e0: 66 69 6e 65 2d 69 6e 6c 69 6e 65 20 28 64 62 3a  fine-inline (db:
26f0: 73 74 65 70 2d 73 65 74 2d 73 74 65 70 6e 61 6d  step-set-stepnam
2700: 65 21 20 20 20 20 20 20 20 76 65 63 20 76 61 6c  e!       vec val
2710: 29 28 76 65 63 74 6f 72 2d 73 65 74 21 20 76 65  )(vector-set! ve
2720: 63 20 32 20 76 61 6c 29 29 0a 28 64 65 66 69 6e  c 2 val)).(defin
2730: 65 2d 69 6e 6c 69 6e 65 20 28 64 62 3a 73 74 65  e-inline (db:ste
2740: 70 2d 73 65 74 2d 73 74 61 74 65 21 20 20 20 20  p-set-state!    
2750: 20 20 20 20 20 20 76 65 63 20 76 61 6c 29 28 76        vec val)(v
2760: 65 63 74 6f 72 2d 73 65 74 21 20 76 65 63 20 33  ector-set! vec 3
2770: 20 76 61 6c 29 29 0a 28 64 65 66 69 6e 65 2d 69   val)).(define-i
2780: 6e 6c 69 6e 65 20 28 64 62 3a 73 74 65 70 2d 73  nline (db:step-s
2790: 65 74 2d 73 74 61 74 75 73 21 20 20 20 20 20 20  et-status!      
27a0: 20 20 20 76 65 63 20 76 61 6c 29 28 76 65 63 74     vec val)(vect
27b0: 6f 72 2d 73 65 74 21 20 76 65 63 20 34 20 76 61  or-set! vec 4 va
27c0: 6c 29 29 0a 28 64 65 66 69 6e 65 2d 69 6e 6c 69  l)).(define-inli
27d0: 6e 65 20 28 64 62 3a 73 74 65 70 2d 73 65 74 2d  ne (db:step-set-
27e0: 65 76 65 6e 74 5f 74 69 6d 65 21 20 20 20 20 20  event_time!     
27f0: 76 65 63 20 76 61 6c 29 28 76 65 63 74 6f 72 2d  vec val)(vector-
2800: 73 65 74 21 20 76 65 63 20 35 20 76 61 6c 29 29  set! vec 5 val))
2810: 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 2d 67 65  ..(define (db-ge
2820: 74 2d 74 65 73 74 2d 73 74 65 70 73 2d 66 6f 72  t-test-steps-for
2830: 2d 72 75 6e 20 64 62 20 74 65 73 74 2d 69 64 29  -run db test-id)
2840: 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20 27 28  .  (let ((res '(
2850: 29 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33  ))).    (sqlite3
2860: 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20  :for-each-row . 
2870: 20 20 20 20 28 6c 61 6d 62 64 61 20 28 69 64 20      (lambda (id 
2880: 74 65 73 74 2d 69 64 20 73 74 65 70 6e 61 6d 65  test-id stepname
2890: 20 73 74 61 74 65 20 73 74 61 74 75 73 20 65 76   state status ev
28a0: 65 6e 74 2d 74 69 6d 65 29 0a 20 20 20 20 20 20  ent-time).      
28b0: 20 28 73 65 74 21 20 72 65 73 20 28 63 6f 6e 73   (set! res (cons
28c0: 20 28 76 65 63 74 6f 72 20 69 64 20 74 65 73 74   (vector id test
28d0: 2d 69 64 20 73 74 65 70 6e 61 6d 65 20 73 74 61  -id stepname sta
28e0: 74 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d  te status event-
28f0: 74 69 6d 65 29 20 72 65 73 29 29 29 0a 20 20 20  time) res))).   
2900: 20 20 64 62 0a 20 20 20 20 20 22 53 45 4c 45 43    db.     "SELEC
2910: 54 20 69 64 2c 74 65 73 74 5f 69 64 2c 73 74 65  T id,test_id,ste
2920: 70 6e 61 6d 65 2c 73 74 61 74 65 2c 73 74 61 74  pname,state,stat
2930: 75 73 2c 65 76 65 6e 74 5f 74 69 6d 65 20 46 52  us,event_time FR
2940: 4f 4d 20 74 65 73 74 5f 73 74 65 70 73 20 57 48  OM test_steps WH
2950: 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 20 4f 52  ERE test_id=? OR
2960: 44 45 52 20 42 59 20 65 76 65 6e 74 5f 74 69 6d  DER BY event_tim
2970: 65 20 44 45 53 43 3b 22 0a 20 20 20 20 20 74 65  e DESC;".     te
2980: 73 74 2d 69 64 29 0a 20 20 20 20 72 65 73 29 29  st-id).    res))
2990: 0a 0a 3b 3b 20 63 68 65 63 6b 20 74 68 61 74 20  ..;; check that 
29a0: 2a 61 6c 6c 2a 20 74 68 65 20 70 72 65 72 65 71  *all* the prereq
29b0: 73 20 61 72 65 20 22 43 4f 4d 50 4c 45 54 45 44  s are "COMPLETED
29c0: 22 0a 28 64 65 66 69 6e 65 20 28 64 62 2d 67 65  ".(define (db-ge
29d0: 74 2d 70 72 65 72 65 71 73 2d 6d 65 74 20 64 62  t-prereqs-met db
29e0: 20 72 75 6e 2d 69 64 20 77 61 69 74 6f 6e 29 0a   run-id waiton).
29f0: 20 20 28 6c 65 74 20 28 28 72 65 73 20 20 20 20    (let ((res    
2a00: 20 20 20 20 20 20 23 66 29 0a 09 28 6e 6f 74 2d        #f)..(not-
2a10: 63 6f 6d 70 6c 65 74 65 20 30 29 0a 09 28 74 65  complete 0)..(te
2a20: 73 74 73 20 20 20 20 20 20 20 20 28 64 62 2d 67  sts        (db-g
2a30: 65 74 2d 74 65 73 74 73 2d 66 6f 72 2d 72 75 6e  et-tests-for-run
2a40: 20 64 62 20 72 75 6e 2d 69 64 29 29 29 0a 20 20   db run-id))).  
2a50: 20 20 28 66 6f 72 2d 65 61 63 68 0a 20 20 20 20    (for-each.    
2a60: 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74 2d 6e   (lambda (test-n
2a70: 61 6d 65 29 0a 20 20 20 20 20 20 20 28 66 6f 72  ame).       (for
2a80: 2d 65 61 63 68 20 0a 09 28 6c 61 6d 62 64 61 20  -each ..(lambda 
2a90: 28 74 65 73 74 29 0a 09 20 20 28 69 66 20 28 65  (test)..  (if (e
2aa0: 71 75 61 6c 3f 20 28 64 62 3a 74 65 73 74 2d 67  qual? (db:test-g
2ab0: 65 74 2d 74 65 73 74 6e 61 6d 65 20 74 65 73 74  et-testname test
2ac0: 29 20 74 65 73 74 2d 6e 61 6d 65 29 0a 09 20 20  ) test-name)..  
2ad0: 20 20 20 20 28 62 65 67 69 6e 0a 09 09 28 73 65      (begin...(se
2ae0: 74 21 20 72 65 73 20 23 74 29 0a 09 09 28 69 66  t! res #t)...(if
2af0: 20 28 6e 6f 74 20 28 65 71 75 61 6c 3f 20 28 64   (not (equal? (d
2b00: 62 3a 74 65 73 74 2d 67 65 74 2d 73 74 61 74 65  b:test-get-state
2b10: 20 74 65 73 74 29 20 22 43 4f 4d 50 4c 45 54 45   test) "COMPLETE
2b20: 44 22 29 29 0a 09 09 20 20 20 20 28 73 65 74 21  D"))...    (set!
2b30: 20 6e 6f 74 2d 63 6f 6d 70 6c 65 74 65 20 28 2b   not-complete (+
2b40: 20 31 20 6e 6f 74 2d 63 6f 6d 70 6c 65 74 65 29   1 not-complete)
2b50: 29 29 29 29 29 0a 09 74 65 73 74 73 29 29 0a 20  )))))..tests)). 
2b60: 20 20 20 20 77 61 69 74 6f 6e 29 0a 20 20 20 20      waiton).    
2b70: 28 61 6e 64 20 28 6f 72 20 28 6e 75 6c 6c 3f 20  (and (or (null? 
2b80: 77 61 69 74 6f 6e 29 20 72 65 73 29 0a 09 20 28  waiton) res).. (
2b90: 65 71 3f 20 6e 6f 74 2d 63 6f 6d 70 6c 65 74 65  eq? not-complete
2ba0: 20 30 29 29 29 29 0a 0a 3b 3b 20 55 53 45 3a 20   0))))..;; USE: 
2bb0: 28 6c 73 65 74 2d 64 69 66 66 65 72 65 6e 63 65  (lset-difference
2bc0: 20 73 74 72 69 6e 67 3d 3f 20 27 28 22 61 22 20   string=? '("a" 
2bd0: 22 62 22 20 22 63 22 29 20 27 28 22 64 22 20 22  "b" "c") '("d" "
2be0: 63 22 20 22 65 22 20 22 61 22 29 29 0a 3b 3b 0a  c" "e" "a")).;;.
2bf0: 3b 3b 20 52 65 74 75 72 6e 20 61 20 6c 69 73 74  ;; Return a list
2c00: 20 6f 66 20 70 72 65 72 65 71 73 20 74 68 61 74   of prereqs that
2c10: 20 77 65 72 65 20 4e 4f 54 20 6d 65 74 0a 3b 3b   were NOT met.;;
2c20: 20 20 54 65 73 74 73 20 28 61 6e 64 20 61 6c 6c    Tests (and all
2c30: 20 69 74 65 6d 73 29 20 69 6e 20 77 61 69 74 6f   items) in waito
2c40: 6e 20 6c 69 73 74 20 6d 75 73 74 20 62 65 20 22  n list must be "
2c50: 43 4f 4d 50 4c 45 54 45 44 22 20 61 6e 64 20 22  COMPLETED" and "
2c60: 50 41 53 53 22 0a 28 64 65 66 69 6e 65 20 28 64  PASS".(define (d
2c70: 62 2d 67 65 74 2d 70 72 65 72 65 71 73 2d 6e 6f  b-get-prereqs-no
2c80: 74 2d 6d 65 74 20 64 62 20 72 75 6e 2d 69 64 20  t-met db run-id 
2c90: 77 61 69 74 6f 6e 29 0a 20 20 28 69 66 20 28 6e  waiton).  (if (n
2ca0: 75 6c 6c 3f 20 77 61 69 74 6f 6e 29 0a 20 20 20  ull? waiton).   
2cb0: 20 20 20 27 28 29 0a 20 20 20 20 20 20 28 6c 65     '().      (le
2cc0: 74 2a 20 28 28 75 6e 6d 65 74 2d 70 72 65 2d 72  t* ((unmet-pre-r
2cd0: 65 71 73 20 27 28 29 29 0a 09 20 20 20 20 20 28  eqs '())..     (
2ce0: 74 65 73 74 73 20 20 20 20 20 20 20 20 20 20 20  tests           
2cf0: 28 64 62 2d 67 65 74 2d 74 65 73 74 73 2d 66 6f  (db-get-tests-fo
2d00: 72 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69 64 29  r-run db run-id)
2d10: 29 0a 09 20 20 20 20 20 28 72 65 73 75 6c 74 20  )..     (result 
2d20: 20 20 20 20 20 20 20 20 27 28 29 29 29 0a 09 28          '()))..(
2d30: 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d 62 64 61  for-each (lambda
2d40: 20 28 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d   (waitontest-nam
2d50: 65 29 0a 09 09 20 20 20 20 28 6c 65 74 20 28 28  e)...    (let ((
2d60: 65 76 65 72 2d 73 65 65 6e 20 23 66 29 29 0a 09  ever-seen #f))..
2d70: 09 20 20 20 20 20 20 28 66 6f 72 2d 65 61 63 68  .      (for-each
2d80: 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74 29 0a   (lambda (test).
2d90: 09 09 09 09 20 20 28 69 66 20 28 65 71 75 61 6c  ....  (if (equal
2da0: 3f 20 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d  ? waitontest-nam
2db0: 65 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 74  e (db:test-get-t
2dc0: 65 73 74 6e 61 6d 65 20 74 65 73 74 29 29 0a 09  estname test))..
2dd0: 09 09 09 20 20 20 20 20 20 28 62 65 67 69 6e 0a  ...      (begin.
2de0: 09 09 09 09 09 28 73 65 74 21 20 65 76 65 72 2d  .....(set! ever-
2df0: 73 65 65 6e 20 23 74 29 0a 09 09 09 09 09 28 69  seen #t)......(i
2e00: 66 20 28 6e 6f 74 20 28 61 6e 64 20 28 65 71 75  f (not (and (equ
2e10: 61 6c 3f 20 28 64 62 3a 74 65 73 74 2d 67 65 74  al? (db:test-get
2e20: 2d 73 74 61 74 65 20 74 65 73 74 29 20 22 43 4f  -state test) "CO
2e30: 4d 50 4c 45 54 45 44 22 29 0a 09 09 09 09 09 09  MPLETED").......
2e40: 20 20 20 20 20 20 28 65 71 75 61 6c 3f 20 28 64        (equal? (d
2e50: 62 3a 74 65 73 74 2d 67 65 74 2d 73 74 61 74 75  b:test-get-statu
2e60: 73 20 74 65 73 74 29 20 22 50 41 53 53 22 29 29  s test) "PASS"))
2e70: 29 0a 09 09 09 09 09 20 20 20 20 28 73 65 74 21  )......    (set!
2e80: 20 72 65 73 75 6c 74 20 28 63 6f 6e 73 20 77 61   result (cons wa
2e90: 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 72 65  itontest-name re
2ea0: 73 75 6c 74 29 29 29 29 29 29 0a 09 09 09 09 74  sult)))))).....t
2eb0: 65 73 74 73 29 0a 09 09 20 20 20 20 20 20 28 69  ests)...      (i
2ec0: 66 20 28 6e 6f 74 20 65 76 65 72 2d 73 65 65 6e  f (not ever-seen
2ed0: 29 28 73 65 74 21 20 72 65 73 75 6c 74 20 28 63  )(set! result (c
2ee0: 6f 6e 73 20 77 61 69 74 6f 6e 74 65 73 74 2d 6e  ons waitontest-n
2ef0: 61 6d 65 20 72 65 73 75 6c 74 29 29 29 29 29 0a  ame result))))).
2f00: 09 09 20 20 77 61 69 74 6f 6e 29 0a 09 28 64 65  ..  waiton)..(de
2f10: 6c 65 74 65 2d 64 75 70 6c 69 63 61 74 65 73 20  lete-duplicates 
2f20: 72 65 73 75 6c 74 29 29 29 29 0a 3b 3b 20 20 0a  result)))).;;  .
2f30: 3b 3b 20 20 09 20 20 20 20 20 3b 3b 20 73 75 62  ;;  .     ;; sub
2f40: 74 72 61 63 74 20 66 72 6f 6d 20 74 68 65 20 77  tract from the w
2f50: 61 69 74 6f 6e 20 6c 69 73 74 20 74 68 65 20 22  aiton list the "
2f60: 43 4f 4d 50 4c 45 54 45 44 22 20 74 65 73 74 73  COMPLETED" tests
2f70: 0a 3b 3b 20 20 09 20 20 20 20 20 3b 3b 28 63 6f  .;;  .     ;;(co
2f80: 6d 70 6c 65 74 65 64 2d 74 65 73 74 73 20 28 66  mpleted-tests (f
2f90: 69 6c 74 65 72 20 28 6c 61 6d 62 64 61 20 28 78  ilter (lambda (x
2fa0: 29 0a 3b 3b 20 20 09 20 20 20 20 20 3b 3b 20 20  ).;;  .     ;;  
2fb0: 20 09 09 09 28 65 71 75 61 6c 3f 20 28 64 62 3a   ...(equal? (db:
2fc0: 74 65 73 74 2d 67 65 74 2d 73 74 61 74 65 20 78  test-get-state x
2fd0: 29 20 22 43 4f 4d 50 4c 45 54 45 44 22 29 29 0a  ) "COMPLETED")).
2fe0: 3b 3b 20 20 09 20 20 20 20 20 3b 3b 20 20 20 09  ;;  .     ;;   .
2ff0: 09 20 20 20 20 20 20 74 65 73 74 73 29 29 0a 3b  .      tests)).;
3000: 3b 20 20 09 20 20 20 20 20 28 63 6f 6d 70 6c 65  ;  .     (comple
3010: 74 65 64 2d 74 65 73 74 73 20 28 6c 65 74 20 28  ted-tests (let (
3020: 28 6e 6f 6e 2d 63 6f 6d 70 6c 65 74 65 64 20 28  (non-completed (
3030: 6d 61 6b 65 2d 68 61 73 68 2d 74 61 62 6c 65 29  make-hash-table)
3040: 29 29 0a 3b 3b 20 20 09 09 09 09 28 66 6f 72 2d  )).;;  ....(for-
3050: 65 61 63 68 20 28 6c 61 6d 62 64 61 20 28 78 29  each (lambda (x)
3060: 0a 3b 3b 20 20 09 09 09 09 09 20 20 20 20 3b 3b  .;;  .....    ;;
3070: 20 63 6f 75 6c 64 20 61 64 64 20 63 68 65 63 6b   could add check
3080: 20 66 6f 72 20 50 41 53 53 20 68 65 72 65 0a 3b   for PASS here.;
3090: 3b 20 20 09 09 09 09 09 20 20 20 20 28 69 66 20  ;  .....    (if 
30a0: 28 6e 6f 74 20 28 61 6e 64 20 28 65 71 75 61 6c  (not (and (equal
30b0: 3f 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 73  ? (db:test-get-s
30c0: 74 61 74 65 20 78 29 20 22 43 4f 4d 50 4c 45 54  tate x) "COMPLET
30d0: 45 44 22 29 0a 3b 3b 20 20 09 09 09 09 09 09 09  ED").;;  .......
30e0: 20 20 28 65 71 75 61 6c 3f 20 28 64 62 3a 74 65    (equal? (db:te
30f0: 73 74 2d 67 65 74 2d 73 74 61 74 75 73 20 78 29  st-get-status x)
3100: 20 22 50 41 53 53 22 29 29 29 0a 3b 3b 20 20 09   "PASS"))).;;  .
3110: 09 09 09 09 09 28 68 61 73 68 2d 74 61 62 6c 65  .....(hash-table
3120: 2d 73 65 74 21 20 6e 6f 6e 2d 63 6f 6d 70 6c 65  -set! non-comple
3130: 74 65 64 20 28 64 62 3a 74 65 73 74 2d 67 65 74  ted (db:test-get
3140: 2d 74 65 73 74 6e 61 6d 65 20 78 29 20 78 29 29  -testname x) x))
3150: 29 0a 3b 3b 20 20 09 09 09 09 09 20 20 20 20 3b  ).;;  .....    ;
3160: 3b 20 28 70 72 69 6e 74 20 22 43 6f 6d 70 6c 65  ; (print "Comple
3170: 74 65 64 3a 20 22 20 28 64 62 3a 74 65 73 74 2d  ted: " (db:test-
3180: 67 65 74 2d 74 65 73 74 6e 61 6d 65 20 78 29 29  get-testname x))
3190: 29 29 0a 3b 3b 20 20 09 09 09 09 09 20 20 74 65  )).;;  .....  te
31a0: 73 74 73 29 0a 3b 3b 20 20 09 09 09 09 28 66 69  sts).;;  ....(fi
31b0: 6c 74 65 72 20 28 6c 61 6d 62 64 61 20 28 78 29  lter (lambda (x)
31c0: 0a 3b 3b 20 20 09 09 09 09 09 20 20 28 6e 6f 74  .;;  .....  (not
31d0: 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 72 65 66   (hash-table-ref
31e0: 2f 64 65 66 61 75 6c 74 20 6e 6f 6e 2d 63 6f 6d  /default non-com
31f0: 70 6c 65 74 65 64 20 28 64 62 3a 74 65 73 74 2d  pleted (db:test-
3200: 67 65 74 2d 74 65 73 74 6e 61 6d 65 20 78 29 20  get-testname x) 
3210: 23 66 29 29 29 0a 3b 3b 20 20 09 09 09 09 09 74  #f))).;;  .....t
3220: 65 73 74 73 29 29 29 0a 3b 3b 20 20 09 20 20 20  ests))).;;  .   
3230: 20 20 28 70 72 65 2d 64 65 70 2d 6e 61 6d 65 73    (pre-dep-names
3240: 20 20 20 28 6d 61 70 20 64 62 3a 74 65 73 74 2d     (map db:test-
3250: 67 65 74 2d 74 65 73 74 6e 61 6d 65 20 63 6f 6d  get-testname com
3260: 70 6c 65 74 65 64 2d 74 65 73 74 73 29 29 0a 3b  pleted-tests)).;
3270: 3b 20 20 09 20 20 20 20 20 28 72 65 73 75 6c 74  ;  .     (result
3280: 20 20 20 20 20 20 20 20 20 20 28 6c 73 65 74 2d            (lset-
3290: 64 69 66 66 65 72 65 6e 63 65 20 73 74 72 69 6e  difference strin
32a0: 67 3d 3f 20 77 61 69 74 6f 6e 20 70 72 65 2d 64  g=? waiton pre-d
32b0: 65 70 2d 6e 61 6d 65 73 29 29 29 0a 3b 3b 20 20  ep-names))).;;  
32c0: 09 28 70 72 69 6e 74 20 22 70 72 65 2d 64 65 70  .(print "pre-dep
32d0: 2d 6e 61 6d 65 73 3a 20 22 20 70 72 65 2d 64 65  -names: " pre-de
32e0: 70 2d 6e 61 6d 65 73 20 22 20 77 61 69 74 6f 6e  p-names " waiton
32f0: 3a 20 22 20 77 61 69 74 6f 6e 20 22 20 72 65 73  : " waiton " res
3300: 75 6c 74 3a 20 22 20 72 65 73 75 6c 74 29 0a     ult: " result).