Artifact e4b4a90ad76089fd89c6b64d49ea5fa423b02a7f:
File
tools/cvs2fossil/lib/c2f_state.tcl
part of check-in
[74854a30b8]
- Added ability to declare indices on tables in the persistent state. Used this to declare indices on critical columns. Slows down the transactions saving changesets, this however is made up when it comes to successor/predecessor retrieval of changesets.
by
aku on
2007-12-02 03:40:56.
0000: 23 23 20 2d 2a 2d 20 74 63 6c 20 2d 2a 2d 0a 23 ## -*- tcl -*-.#
0010: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 # ## ### #####
0020: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 ######## #######
0030: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 ###### #########
0040: 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 20 ############.##
0050: 43 6f 70 79 72 69 67 68 74 20 28 63 29 20 32 30 Copyright (c) 20
0060: 30 37 20 41 6e 64 72 65 61 73 20 4b 75 70 72 69 07 Andreas Kupri
0070: 65 73 2e 0a 23 0a 23 20 54 68 69 73 20 73 6f 66 es..#.# This sof
0080: 74 77 61 72 65 20 69 73 20 6c 69 63 65 6e 73 65 tware is license
0090: 64 20 61 73 20 64 65 73 63 72 69 62 65 64 20 69 d as described i
00a0: 6e 20 74 68 65 20 66 69 6c 65 20 4c 49 43 45 4e n the file LICEN
00b0: 53 45 2c 20 77 68 69 63 68 0a 23 20 79 6f 75 20 SE, which.# you
00c0: 73 68 6f 75 6c 64 20 68 61 76 65 20 72 65 63 65 should have rece
00d0: 69 76 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 ived as part of
00e0: 74 68 69 73 20 64 69 73 74 72 69 62 75 74 69 6f this distributio
00f0: 6e 2e 0a 23 0a 23 20 54 68 69 73 20 73 6f 66 74 n..#.# This soft
0100: 77 61 72 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 ware consists of
0110: 20 76 6f 6c 75 6e 74 61 72 79 20 63 6f 6e 74 72 voluntary contr
0120: 69 62 75 74 69 6f 6e 73 20 6d 61 64 65 20 62 79 ibutions made by
0130: 20 6d 61 6e 79 0a 23 20 69 6e 64 69 76 69 64 75 many.# individu
0140: 61 6c 73 2e 20 20 46 6f 72 20 65 78 61 63 74 20 als. For exact
0150: 63 6f 6e 74 72 69 62 75 74 69 6f 6e 20 68 69 73 contribution his
0160: 74 6f 72 79 2c 20 73 65 65 20 74 68 65 20 72 65 tory, see the re
0170: 76 69 73 69 6f 6e 0a 23 20 68 69 73 74 6f 72 79 vision.# history
0180: 20 61 6e 64 20 6c 6f 67 73 2c 20 61 76 61 69 6c and logs, avail
0190: 61 62 6c 65 20 61 74 20 68 74 74 70 3a 2f 2f 66 able at http://f
01a0: 6f 73 73 69 6c 2d 73 63 6d 2e 68 77 61 63 69 2e ossil-scm.hwaci.
01b0: 63 6f 6d 2f 66 6f 73 73 69 6c 0a 23 20 23 20 23 com/fossil.# # #
01c0: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 # ### ##### ####
01d0: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 #### ###########
01e0: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 ## #############
01f0: 23 23 23 23 23 23 23 23 0a 0a 23 23 20 53 74 61 ########..## Sta
0200: 74 65 20 6d 61 6e 61 67 65 72 2e 20 4d 61 69 6e te manager. Main
0210: 74 61 69 6e 73 20 74 68 65 20 73 71 6c 69 74 65 tains the sqlite
0220: 20 64 61 74 61 62 61 73 65 20 75 73 65 64 20 62 database used b
0230: 79 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 0a y all the other.
0240: 23 23 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 ## parts of the
0250: 73 79 73 74 65 6d 2c 20 65 73 70 65 63 69 61 6c system, especial
0260: 6c 79 20 74 68 65 20 70 61 73 73 65 73 20 61 6e ly the passes an
0270: 64 20 74 68 65 69 72 20 73 75 70 70 6f 72 74 20 d their support
0280: 63 6f 64 65 2c 0a 23 23 20 74 6f 20 70 65 72 73 code,.## to pers
0290: 69 73 74 20 61 6e 64 20 72 65 73 74 6f 72 65 20 ist and restore
02a0: 74 68 65 69 72 20 73 74 61 74 65 20 61 63 72 6f their state acro
02b0: 73 73 20 69 6e 76 6f 6b 61 74 69 6f 6e 73 2e 0a ss invokations..
02c0: 0a 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 .# # ## ### ####
02d0: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 # ######## #####
02e0: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 ######## #######
02f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 ##############.#
0300: 23 20 52 65 71 75 69 72 65 6d 65 6e 74 73 0a 0a # Requirements..
0310: 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 package require
0320: 54 63 6c 20 38 2e 34 20 20 20 20 20 20 20 20 20 Tcl 8.4
0330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0340: 20 3b 20 23 20 52 65 71 75 69 72 65 64 20 72 75 ; # Required ru
0350: 6e 74 69 6d 65 2e 0a 70 61 63 6b 61 67 65 20 72 ntime..package r
0360: 65 71 75 69 72 65 20 73 6e 69 74 20 20 20 20 20 equire snit
0370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0380: 20 20 20 20 20 20 20 20 3b 20 23 20 4f 4f 20 73 ; # OO s
0390: 79 73 74 65 6d 2e 0a 70 61 63 6b 61 67 65 20 72 ystem..package r
03a0: 65 71 75 69 72 65 20 66 69 6c 65 75 74 69 6c 20 equire fileutil
03b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
03c0: 20 20 20 20 20 20 20 20 3b 20 23 20 46 69 6c 65 ; # File
03d0: 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 70 61 63 operations..pac
03e0: 6b 61 67 65 20 72 65 71 75 69 72 65 20 73 71 6c kage require sql
03f0: 69 74 65 33 20 20 20 20 20 20 20 20 20 20 20 20 ite3
0400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 ;
0410: 23 20 44 61 74 61 62 61 73 65 20 61 63 63 65 73 # Database acces
0420: 73 2e 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 s..package requi
0430: 72 65 20 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 74 72 re vc::tools::tr
0440: 6f 75 62 6c 65 20 20 20 20 20 20 20 20 20 20 20 ouble
0450: 20 20 20 20 3b 20 23 20 45 72 72 6f 72 20 72 65 ; # Error re
0460: 70 6f 72 74 69 6e 67 2e 0a 70 61 63 6b 61 67 65 porting..package
0470: 20 72 65 71 75 69 72 65 20 76 63 3a 3a 74 6f 6f require vc::too
0480: 6c 73 3a 3a 6c 6f 67 20 20 20 20 20 20 20 20 20 ls::log
0490: 20 20 20 20 20 20 20 20 20 20 3b 20 23 20 55 73 ; # Us
04a0: 65 72 20 66 65 65 64 62 61 63 6b 2e 0a 0a 23 20 er feedback...#
04b0: 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 # ## ### ##### #
04c0: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 ####### ########
04d0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 ##### ##########
04e0: 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 0a 0a ###########.##..
04f0: 73 6e 69 74 3a 3a 74 79 70 65 20 3a 3a 76 63 3a snit::type ::vc:
0500: 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a :fossil::import:
0510: 3a 63 76 73 3a 3a 73 74 61 74 65 20 7b 0a 20 20 :cvs::state {.
0520: 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 # # ## ### ###
0530: 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 ## ######## ####
0540: 23 23 23 23 23 23 23 23 23 0a 20 20 20 20 23 23 #########. ##
0550: 20 50 75 62 6c 69 63 20 41 50 49 0a 0a 20 20 20 Public API..
0560: 20 74 79 70 65 6d 65 74 68 6f 64 20 75 73 65 20 typemethod use
0570: 7b 70 61 74 68 7d 20 7b 0a 09 23 20 49 6d 6d 65 {path} {..# Imme
0580: 64 69 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e diate validation
0590: 2e 20 54 68 65 72 65 20 61 72 65 20 61 72 65 20 . There are are
05a0: 74 77 6f 20 70 6f 73 73 69 62 69 6c 69 74 69 65 two possibilitie
05b0: 73 20 74 6f 0a 09 23 20 63 6f 6e 73 69 64 65 72 s to..# consider
05c0: 2e 20 54 68 65 20 70 61 74 68 20 65 78 69 73 74 . The path exist
05d0: 73 20 6f 72 20 69 74 20 64 6f 65 73 6e 27 74 2e s or it doesn't.
05e0: 0a 0a 09 23 20 49 6e 20 74 68 65 20 66 69 72 73 ...# In the firs
05f0: 74 20 63 61 73 65 20 69 74 20 68 61 73 20 74 6f t case it has to
0600: 20 62 65 20 61 20 72 65 61 64 61 62 6c 65 20 61 be a readable a
0610: 6e 64 20 77 72 69 74 61 62 6c 65 20 66 69 6c 65 nd writable file
0620: 2c 0a 09 23 20 61 6e 64 20 69 74 20 68 61 73 20 ,..# and it has
0630: 74 6f 20 62 65 20 61 20 70 72 6f 70 65 72 20 73 to be a proper s
0640: 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 qlite database.
0650: 46 75 72 74 68 65 72 20 63 68 65 63 6b 73 0a 09 Further checks..
0660: 23 20 72 65 67 61 72 64 69 6e 67 20 74 68 65 20 # regarding the
0670: 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 73 20 required tables
0680: 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 6c 61 74 will be done lat
0690: 65 72 2c 20 62 79 20 74 68 65 0a 09 23 20 70 61 er, by the..# pa
06a0: 73 73 65 73 2c 20 64 75 72 69 6e 67 20 74 68 65 sses, during the
06b0: 69 72 20 73 65 74 75 70 2e 0a 0a 09 23 20 49 6e ir setup....# In
06c0: 20 74 68 65 20 73 65 63 6f 6e 64 20 63 61 73 65 the second case
06d0: 20 77 65 20 68 61 76 65 20 74 6f 20 62 65 20 61 we have to be a
06e0: 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 74 68 ble to create th
06f0: 65 20 66 69 6c 65 2c 0a 09 23 20 61 6e 64 20 63 e file,..# and c
0700: 68 65 63 6b 20 74 68 61 74 2e 20 54 68 69 73 20 heck that. This
0710: 69 73 20 64 6f 6e 65 20 62 79 20 6f 70 65 6e 69 is done by openi
0720: 6e 67 20 69 74 2c 20 73 71 6c 69 74 65 20 77 69 ng it, sqlite wi
0730: 6c 6c 20 74 68 65 6e 0a 09 23 20 74 72 79 20 74 ll then..# try t
0740: 6f 20 63 72 65 61 74 65 20 69 74 2c 20 61 6e 64 o create it, and
0750: 20 6d 61 79 20 66 61 69 6c 2e 0a 0a 09 69 66 20 may fail....if
0760: 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 70 {[file exists $p
0770: 61 74 68 5d 7d 20 7b 0a 09 20 20 20 20 69 66 20 ath]} {.. if
0780: 7b 21 5b 66 69 6c 65 75 74 69 6c 3a 3a 74 65 73 {![fileutil::tes
0790: 74 20 24 70 61 74 68 20 66 72 77 20 6d 73 67 20 t $path frw msg
07a0: 7b 63 76 73 32 66 6f 73 73 69 6c 20 73 74 61 74 {cvs2fossil stat
07b0: 65 7d 5d 7d 20 7b 0a 09 09 74 72 6f 75 62 6c 65 e}]} {...trouble
07c0: 20 66 61 74 61 6c 20 24 6d 73 67 0a 09 09 72 65 fatal $msg...re
07d0: 74 75 72 6e 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a turn.. }..}..
07e0: 09 69 66 20 7b 5b 63 61 74 63 68 20 7b 0a 09 20 .if {[catch {..
07f0: 20 20 20 73 71 6c 69 74 65 33 20 24 7b 74 79 70 sqlite3 ${typ
0800: 65 7d 3a 3a 54 45 4d 50 20 24 70 61 74 68 0a 09 e}::TEMP $path..
0810: 7d 20 72 65 73 5d 7d 20 7b 0a 09 20 20 20 20 74 } res]} {.. t
0820: 72 6f 75 62 6c 65 20 66 61 74 61 6c 20 24 72 65 rouble fatal $re
0830: 73 0a 09 20 20 20 20 72 65 74 75 72 6e 0a 09 7d s.. return..}
0840: 0a 0a 09 23 20 41 20 70 72 65 76 69 6f 75 73 6c ...# A previousl
0850: 79 20 64 65 66 69 6e 65 64 20 73 74 61 74 65 20 y defined state
0860: 64 61 74 61 62 61 73 65 20 69 73 20 63 6c 6f 73 database is clos
0870: 65 64 20 62 65 66 6f 72 65 0a 09 23 20 63 6f 6d ed before..# com
0880: 6d 69 74 74 69 6e 67 20 74 6f 20 74 68 65 20 6e mitting to the n
0890: 65 77 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 57 ew definition. W
08a0: 65 20 64 6f 20 6e 6f 74 20 73 74 6f 72 65 20 74 e do not store t
08b0: 68 65 20 70 61 74 68 0a 09 23 20 69 74 73 65 6c he path..# itsel
08c0: 66 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 f, this ensures
08d0: 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 69 73 that the file is
08e0: 20 5f 6e 6f 74 5f 20 63 6c 65 61 6e 65 64 20 75 _not_ cleaned u
08f0: 70 20 61 66 74 65 72 0a 09 23 20 61 20 72 75 6e p after..# a run
0900: 2e 0a 0a 09 73 65 74 20 6d 79 73 74 61 74 65 20 ....set mystate
0910: 24 7b 74 79 70 65 7d 3a 3a 53 54 41 54 45 0a 09 ${type}::STATE..
0920: 73 65 74 20 6d 79 70 61 74 68 20 20 7b 7d 0a 0a set mypath {}..
0930: 09 63 61 74 63 68 20 7b 20 24 6d 79 73 74 61 74 .catch { $mystat
0940: 65 20 63 6c 6f 73 65 20 7d 0a 09 72 65 6e 61 6d e close }..renam
0950: 65 20 20 24 7b 74 79 70 65 7d 3a 3a 54 45 4d 50 e ${type}::TEMP
0960: 20 24 6d 79 73 74 61 74 65 0a 0a 09 6c 6f 67 20 $mystate...log
0970: 77 72 69 74 65 20 32 20 73 74 61 74 65 20 22 69 write 2 state "i
0980: 73 20 24 70 61 74 68 22 0a 09 72 65 74 75 72 6e s $path"..return
0990: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 . }.. type
09a0: 6d 65 74 68 6f 64 20 73 65 74 75 70 20 7b 7d 20 method setup {}
09b0: 7b 0a 09 23 20 49 66 2c 20 61 6e 64 20 6f 6e 6c {..# If, and onl
09c0: 79 20 69 66 20 6e 6f 20 73 74 61 74 65 20 64 61 y if no state da
09d0: 74 61 62 61 73 65 20 77 61 73 20 64 65 66 69 6e tabase was defin
09e0: 65 64 20 62 79 20 74 68 65 20 75 73 65 72 0a 09 ed by the user..
09f0: 23 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 77 # then it is now
0a00: 20 74 68 65 20 74 69 6d 65 20 74 6f 20 63 72 65 the time to cre
0a10: 61 74 65 20 6f 75 72 20 6f 77 6e 20 75 73 69 6e ate our own usin
0a20: 67 20 61 20 74 65 6d 70 66 69 6c 65 2e 0a 0a 09 g a tempfile....
0a30: 69 66 20 7b 24 6d 79 73 74 61 74 65 20 6e 65 20 if {$mystate ne
0a40: 22 22 7d 20 72 65 74 75 72 6e 0a 0a 09 73 65 74 ""} return...set
0a50: 20 6d 79 70 61 74 68 20 20 5b 66 69 6c 65 75 74 mypath [fileut
0a60: 69 6c 3a 3a 74 65 6d 70 66 69 6c 65 20 63 76 73 il::tempfile cvs
0a70: 32 66 6f 73 73 69 6c 5f 73 74 61 74 65 5f 5d 0a 2fossil_state_].
0a80: 09 73 65 74 20 6d 79 73 74 61 74 65 20 24 7b 74 .set mystate ${t
0a90: 79 70 65 7d 3a 3a 53 54 41 54 45 0a 09 73 71 6c ype}::STATE..sql
0aa0: 69 74 65 33 20 24 6d 79 73 74 61 74 65 20 24 6d ite3 $mystate $m
0ab0: 79 70 61 74 68 0a 0a 09 6c 6f 67 20 77 72 69 74 ypath...log writ
0ac0: 65 20 32 20 73 74 61 74 65 20 22 75 73 69 6e 67 e 2 state "using
0ad0: 20 24 6d 79 70 61 74 68 22 0a 09 72 65 74 75 72 $mypath"..retur
0ae0: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 n. }.. typ
0af0: 65 6d 65 74 68 6f 64 20 72 65 6c 65 61 73 65 20 emethod release
0b00: 7b 7d 20 7b 0a 09 6c 6f 67 20 77 72 69 74 65 20 {} {..log write
0b10: 32 20 73 74 61 74 65 20 72 65 6c 65 61 73 65 0a 2 state release.
0b20: 09 24 7b 74 79 70 65 7d 3a 3a 53 54 41 54 45 20 .${type}::STATE
0b30: 63 6c 6f 73 65 0a 09 69 66 20 7b 24 6d 79 70 61 close..if {$mypa
0b40: 74 68 20 65 71 20 22 22 7d 20 72 65 74 75 72 6e th eq ""} return
0b50: 0a 09 66 69 6c 65 20 64 65 6c 65 74 65 20 24 6d ..file delete $m
0b60: 79 70 61 74 68 0a 09 72 65 74 75 72 6e 0a 20 20 ypath..return.
0b70: 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 }.. typemet
0b80: 68 6f 64 20 77 72 69 74 69 6e 67 20 7b 6e 61 6d hod writing {nam
0b90: 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 7b 69 6e e definition {in
0ba0: 64 69 63 65 73 20 7b 7d 7d 7d 20 7b 0a 09 23 20 dices {}}} {..#
0bb0: 4d 65 74 68 6f 64 20 66 6f 72 20 61 20 75 73 65 Method for a use
0bc0: 72 20 74 6f 20 64 65 63 6c 61 72 65 20 61 20 74 r to declare a t
0bd0: 61 62 6c 65 20 69 74 73 20 6e 65 65 64 73 20 66 able its needs f
0be0: 6f 72 20 73 74 6f 72 69 6e 67 0a 09 23 20 70 65 or storing..# pe
0bf0: 72 73 69 73 74 65 6e 74 20 73 74 61 74 65 2c 20 rsistent state,
0c00: 61 6e 64 20 74 68 65 20 65 78 70 65 63 74 65 64 and the expected
0c10: 20 73 74 72 75 63 74 75 72 65 2e 20 41 20 70 6f structure. A po
0c20: 73 73 69 62 6c 79 0a 09 23 20 70 72 65 76 69 6f ssibly..# previo
0c30: 75 73 6c 79 20 65 78 69 73 74 69 6e 67 20 64 65 usly existing de
0c40: 66 69 6e 69 74 69 6f 6e 20 69 73 20 64 72 6f 70 finition is drop
0c50: 70 65 64 2e 0a 0a 09 6c 6f 67 20 77 72 69 74 65 ped....log write
0c60: 20 31 20 73 74 61 74 65 20 22 77 72 69 74 69 6e 1 state "writin
0c70: 67 20 24 6e 61 6d 65 22 20 3b 20 23 20 54 4f 44 g $name" ; # TOD
0c80: 4f 20 6d 6f 76 65 20 74 6f 20 6c 65 76 65 6c 20 O move to level
0c90: 35 20 6f 72 20 73 6f 0a 0a 09 24 6d 79 73 74 61 5 or so...$mysta
0ca0: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b te transaction {
0cb0: 0a 09 20 20 20 20 63 61 74 63 68 20 7b 20 24 6d .. catch { $m
0cc0: 79 73 74 61 74 65 20 65 76 61 6c 20 22 44 52 4f ystate eval "DRO
0cd0: 50 20 54 41 42 4c 45 20 24 6e 61 6d 65 22 20 7d P TABLE $name" }
0ce0: 0a 09 20 20 20 20 24 6d 79 73 74 61 74 65 20 65 .. $mystate e
0cf0: 76 61 6c 20 22 43 52 45 41 54 45 20 54 41 42 4c val "CREATE TABL
0d00: 45 20 24 6e 61 6d 65 20 28 20 24 64 65 66 69 6e E $name ( $defin
0d10: 69 74 69 6f 6e 20 29 22 0a 0a 09 20 20 20 20 73 ition )"... s
0d20: 65 74 20 69 64 20 30 0a 09 20 20 20 20 66 6f 72 et id 0.. for
0d30: 65 61 63 68 20 63 6f 6c 75 6d 6e 73 20 24 69 6e each columns $in
0d40: 64 69 63 65 73 20 7b 0a 09 09 6c 6f 67 20 77 72 dices {...log wr
0d50: 69 74 65 20 31 20 73 74 61 74 65 20 22 69 6e 64 ite 1 state "ind
0d60: 65 78 20 20 20 24 6e 61 6d 65 24 69 64 22 20 3b ex $name$id" ;
0d70: 20 23 20 54 4f 44 4f 20 6d 6f 76 65 20 74 6f 20 # TODO move to
0d80: 6c 65 76 65 6c 20 35 20 6f 72 20 73 6f 0a 0a 09 level 5 or so...
0d90: 09 24 6d 79 73 74 61 74 65 20 65 76 61 6c 20 22 .$mystate eval "
0da0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 24 7b 6e CREATE INDEX ${n
0db0: 61 6d 65 7d 24 69 64 20 4f 4e 20 24 7b 6e 61 6d ame}$id ON ${nam
0dc0: 65 7d 20 28 20 5b 6a 6f 69 6e 20 24 63 6f 6c 75 e} ( [join $colu
0dd0: 6d 6e 73 20 2c 5d 20 29 22 0a 09 09 69 6e 63 72 mns ,] )"...incr
0de0: 20 69 64 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 72 id.. }..}..r
0df0: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 eturn. }..
0e00: 20 74 79 70 65 6d 65 74 68 6f 64 20 72 65 61 64 typemethod read
0e10: 69 6e 67 20 7b 6e 61 6d 65 7d 20 7b 0a 09 6c 6f ing {name} {..lo
0e20: 67 20 77 72 69 74 65 20 31 20 73 74 61 74 65 20 g write 1 state
0e30: 22 72 65 61 64 69 6e 67 20 24 6e 61 6d 65 22 20 "reading $name"
0e40: 3b 20 23 20 54 4f 44 4f 20 6d 6f 76 65 20 74 6f ; # TODO move to
0e50: 20 6c 65 76 65 6c 20 35 20 6f 72 20 73 6f 0a 0a level 5 or so..
0e60: 09 23 20 4d 65 74 68 6f 64 20 66 6f 72 20 61 20 .# Method for a
0e70: 75 73 65 72 20 74 6f 20 64 65 63 6c 61 72 65 20 user to declare
0e80: 61 20 74 61 62 6c 65 20 69 74 20 77 69 73 68 65 a table it wishe
0e90: 73 20 74 6f 20 72 65 61 64 0a 09 23 20 66 72 6f s to read..# fro
0ea0: 6d 2e 20 41 20 6d 69 73 73 69 6e 67 20 74 61 62 m. A missing tab
0eb0: 6c 65 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 le is an interna
0ec0: 6c 20 65 72 72 6f 72 20 63 61 75 73 69 6e 67 20 l error causing
0ed0: 61 6e 0a 09 23 20 69 6d 6d 65 64 69 61 74 65 20 an..# immediate
0ee0: 65 78 69 74 2e 0a 0a 09 73 65 74 20 66 6f 75 6e exit....set foun
0ef0: 64 20 5b 6c 6c 65 6e 67 74 68 20 5b 24 6d 79 73 d [llength [$mys
0f00: 74 61 74 65 20 65 76 61 6c 20 7b 0a 09 20 20 20 tate eval {..
0f10: 20 53 45 4c 45 43 54 20 6e 61 6d 65 0a 09 20 20 SELECT name..
0f20: 20 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 FROM sqlite_ma
0f30: 73 74 65 72 0a 09 20 20 20 20 57 48 45 52 45 20 ster.. WHERE
0f40: 74 79 70 65 20 3d 20 27 74 61 62 6c 65 27 0a 09 type = 'table'..
0f50: 20 20 20 20 41 4e 44 20 20 20 6e 61 6d 65 20 3d AND name =
0f60: 20 24 6e 61 6d 65 0a 09 20 20 20 20 3b 0a 09 7d $name.. ;..}
0f70: 5d 5d 0a 0a 09 23 20 4e 6f 20 61 73 73 65 72 74 ]]...# No assert
0f80: 2c 20 77 6f 75 6c 64 20 63 61 75 73 65 20 63 79 , would cause cy
0f90: 63 6c 65 20 69 6e 20 70 61 63 6b 61 67 65 20 64 cle in package d
0fa0: 65 70 65 6e 64 65 6e 63 69 65 73 0a 09 69 66 20 ependencies..if
0fb0: 7b 24 66 6f 75 6e 64 7d 20 72 65 74 75 72 6e 0a {$found} return.
0fc0: 09 74 72 6f 75 62 6c 65 20 69 6e 74 65 72 6e 61 .trouble interna
0fd0: 6c 20 22 54 68 65 20 72 65 71 75 69 72 65 64 20 l "The required
0fe0: 74 61 62 6c 65 20 5c 22 24 6e 61 6d 65 5c 22 20 table \"$name\"
0ff0: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2e 22 is not defined."
1000: 0a 09 23 20 4e 6f 74 20 72 65 61 63 68 65 64 0a ..# Not reached.
1010: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 .return. }..
1020: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 64 69 typemethod di
1030: 73 63 61 72 64 20 7b 6e 61 6d 65 7d 20 7b 0a 09 scard {name} {..
1040: 23 20 4d 65 74 68 6f 64 20 66 6f 72 20 61 20 75 # Method for a u
1050: 73 65 72 20 74 6f 20 72 65 6d 6f 76 65 20 6f 75 ser to remove ou
1060: 74 64 61 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 tdated informati
1070: 6f 6e 20 66 72 6f 6d 20 74 68 65 0a 09 23 20 70 on from the..# p
1080: 65 72 73 69 73 74 65 6e 74 20 73 74 61 74 65 2c ersistent state,
1090: 20 74 61 62 6c 65 20 62 79 20 74 61 62 6c 65 2e table by table.
10a0: 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 31 20 73 ...log write 1 s
10b0: 74 61 74 65 20 22 64 69 73 63 61 72 64 20 24 6e tate "discard $n
10c0: 61 6d 65 22 20 3b 20 23 20 54 4f 44 4f 20 6d 6f ame" ; # TODO mo
10d0: 76 65 20 74 6f 20 6c 65 76 65 6c 20 35 20 6f 72 ve to level 5 or
10e0: 20 73 6f 0a 0a 09 24 6d 79 73 74 61 74 65 20 74 so...$mystate t
10f0: 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 09 20 20 ransaction {..
1100: 20 20 63 61 74 63 68 20 7b 20 24 6d 79 73 74 61 catch { $mysta
1110: 74 65 20 65 76 61 6c 20 22 44 52 4f 50 20 54 41 te eval "DROP TA
1120: 42 4c 45 20 24 6e 61 6d 65 22 20 7d 0a 09 7d 0a BLE $name" }..}.
1130: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 .return. }..
1140: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 72 75 typemethod ru
1150: 6e 20 7b 61 72 67 73 7d 20 7b 0a 09 72 65 74 75 n {args} {..retu
1160: 72 6e 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c rn [uplevel 1 [l
1170: 69 6e 73 65 72 74 20 24 61 72 67 73 20 30 20 24 insert $args 0 $
1180: 6d 79 73 74 61 74 65 20 65 76 61 6c 5d 5d 0a 20 mystate eval]].
1190: 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 }.. typeme
11a0: 74 68 6f 64 20 6f 6e 65 20 7b 61 72 67 73 7d 20 thod one {args}
11b0: 7b 0a 09 72 65 74 75 72 6e 20 5b 6c 69 6e 64 65 {..return [linde
11c0: 78 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 x [uplevel 1 [li
11d0: 6e 73 65 72 74 20 24 61 72 67 73 20 30 20 24 6d nsert $args 0 $m
11e0: 79 73 74 61 74 65 20 65 76 61 6c 5d 5d 20 30 5d ystate eval]] 0]
11f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 . }.. type
1200: 6d 65 74 68 6f 64 20 74 72 61 6e 73 61 63 74 69 method transacti
1210: 6f 6e 20 7b 73 63 72 69 70 74 7d 20 7b 0a 09 72 on {script} {..r
1220: 65 74 75 72 6e 20 5b 75 70 6c 65 76 65 6c 20 31 eturn [uplevel 1
1230: 20 5b 6c 69 73 74 20 24 6d 79 73 74 61 74 65 20 [list $mystate
1240: 74 72 61 6e 73 61 63 74 69 6f 6e 20 24 73 63 72 transaction $scr
1250: 69 70 74 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 ipt]]. }..
1260: 20 74 79 70 65 6d 65 74 68 6f 64 20 69 64 20 7b typemethod id {
1270: 7d 20 7b 0a 09 72 65 74 75 72 6e 20 5b 24 6d 79 } {..return [$my
1280: 73 74 61 74 65 20 6c 61 73 74 5f 69 6e 73 65 72 state last_inser
1290: 74 5f 72 6f 77 69 64 5d 0a 20 20 20 20 7d 0a 0a t_rowid]. }..
12a0: 20 20 20 20 23 20 23 20 23 23 20 23 23 23 20 23 # # ## ### #
12b0: 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 #### ######## ##
12c0: 23 23 23 23 23 23 23 23 23 23 23 0a 20 20 20 20 ###########.
12d0: 23 23 20 53 74 61 74 65 0a 0a 20 20 20 20 74 79 ## State.. ty
12e0: 70 65 76 61 72 69 61 62 6c 65 20 6d 79 73 74 61 pevariable mysta
12f0: 74 65 20 7b 7d 20 3b 20 23 20 53 71 6c 69 74 65 te {} ; # Sqlite
1300: 20 64 61 74 61 62 61 73 65 20 28 63 6f 6d 6d 61 database (comma
1310: 6e 64 29 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 nd) holding the
1320: 63 6f 6e 76 65 72 74 65 72 20 73 74 61 74 65 2e converter state.
1330: 0a 20 20 20 20 74 79 70 65 76 61 72 69 61 62 6c . typevariabl
1340: 65 20 6d 79 70 61 74 68 20 20 7b 7d 20 3b 20 23 e mypath {} ; #
1350: 20 50 61 74 68 20 74 6f 20 74 68 65 20 64 61 74 Path to the dat
1360: 61 62 61 73 65 2c 20 66 6f 72 20 63 6c 65 61 6e abase, for clean
1370: 75 70 20 6f 66 20 61 20 74 65 6d 70 20 64 61 74 up of a temp dat
1380: 61 62 61 73 65 2e 0a 0a 20 20 20 20 23 20 23 20 abase... # #
1390: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 ## ### ##### ###
13a0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 ##### ##########
13b0: 23 23 23 0a 20 20 20 20 23 23 20 49 6e 74 65 72 ###. ## Inter
13c0: 6e 61 6c 20 6d 65 74 68 6f 64 73 0a 0a 0a 20 20 nal methods...
13d0: 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 # # ## ### ###
13e0: 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 ## ######## ####
13f0: 23 23 23 23 23 23 23 23 23 0a 20 20 20 20 23 23 #########. ##
1400: 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0a 0a Configuration..
1410: 20 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73 69 pragma -hasi
1420: 6e 73 74 61 6e 63 65 73 20 20 20 6e 6f 20 3b 20 nstances no ;
1430: 23 20 73 69 6e 67 6c 65 74 6f 6e 0a 20 20 20 20 # singleton.
1440: 70 72 61 67 6d 61 20 2d 68 61 73 74 79 70 65 69 pragma -hastypei
1450: 6e 66 6f 20 20 20 20 6e 6f 20 3b 20 23 20 6e 6f nfo no ; # no
1460: 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 0a 20 introspection.
1470: 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73 74 79 pragma -hasty
1480: 70 65 64 65 73 74 72 6f 79 20 6e 6f 20 3b 20 23 pedestroy no ; #
1490: 20 69 6d 6d 6f 72 74 61 6c 0a 0a 20 20 20 20 23 immortal.. #
14a0: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 # ## ### #####
14b0: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 ######## #######
14c0: 23 23 23 23 23 23 0a 7d 0a 0a 6e 61 6d 65 73 70 ######.}..namesp
14d0: 61 63 65 20 65 76 61 6c 20 3a 3a 76 63 3a 3a 66 ace eval ::vc::f
14e0: 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 ossil::import::c
14f0: 76 73 20 7b 0a 20 20 20 20 6e 61 6d 65 73 70 61 vs {. namespa
1500: 63 65 20 65 78 70 6f 72 74 20 73 74 61 74 65 0a ce export state.
1510: 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 65 76 namespace ev
1520: 61 6c 20 73 74 61 74 65 20 7b 0a 09 6e 61 6d 65 al state {..name
1530: 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 space import ::v
1540: 63 3a 3a 74 6f 6f 6c 73 3a 3a 74 72 6f 75 62 6c c::tools::troubl
1550: 65 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 e..namespace imp
1560: 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a ort ::vc::tools:
1570: 3a 6c 6f 67 0a 09 6c 6f 67 20 72 65 67 69 73 74 :log..log regist
1580: 65 72 20 73 74 61 74 65 0a 20 20 20 20 7d 0a 7d er state. }.}
1590: 0a 0a 23 20 23 20 23 23 20 23 23 23 20 23 23 23 ..# # ## ### ###
15a0: 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 ## ######## ####
15b0: 23 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 ######### ######
15c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a ###############.
15d0: 23 23 20 52 65 61 64 79 0a 0a 70 61 63 6b 61 67 ## Ready..packag
15e0: 65 20 70 72 6f 76 69 64 65 20 76 63 3a 3a 66 6f e provide vc::fo
15f0: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 ssil::import::cv
1600: 73 3a 3a 73 74 61 74 65 20 31 2e 30 0a 72 65 74 s::state 1.0.ret
1610: 75 72 6e 0a urn.