TclVSdb-1.1a1 ============= (Dec. 8. 1995) Version 1.1 - Alpha Release 1 TclVSdb is a native Tcl database facility, written entirely in vanilla Tcl code, and is suitable in any Tcl application environment. The features of TclVSdb are: o The paradigm for a database is one or more tables consisting of rows and fields. Each database element may be a string, a Tcl list of any length, or a list of row numbers of another table (giving hierarchical data structuring). o Each open database is associated with a Tcl associative array. Each table has its current row stored in this array variable. access to a field within the current row is achieved by: set field-contents $dbvar(tablename,fieldname) Modifying the contents of a field within the current row is achieved by: set dbvar(tablename,fieldname) some-valid-Tcl-assignment o Each table consists of two files, an index files (.idx) and a data file (.tbl). A directory of .idx and .tbl files are a database. o No database read operation takes more than two file accesses. o Table and row locking are transparently implemented, allowing multiple concurrent user access to a database. o An application may have any number of databases open concurrently. o Database operations supported are: - dbCreate: table create - dbOpen: database open - dbClose: database close - dbCleanup: database cleanup (eliminate voids, resequence data table files) - dbNewRow: create a new row in a table - dbClearRow: clear contents of current row of a table - dbGetRow: get an arbitrary row from a table - dbPutRow: commit and store current row of a table. - dbDelRow: delete the current row of a table - dbFirstRow: get first data-full row from a table - dbNextRow: get next data-full row from a table - dbPrevRow: get prior data-full row from a table - dbLastRow: get last data-full row from a table - dbEOF: return "1" if stepped beyond bounds of a table o Database utility operations supported are: - dbuDateToday: return current date as "Mmm dd, yyyy" - dbuDateToTs: transform date string into sortable numeric timestamp value - dbuDateFromTs: convert a numeric timestamp value into a date string - dbuSearchString: return a list of row numbers from a table who have a named field's contents matching a "glob"bed string pattern - dbuSearchDate: return a list of row numbers from a table who have a named field's contents falling within the range given by two date strings - dbuSearchValue: return a list of row numbers from a table who have a named field's contents falling within the range specified by two numeric values. o Planned utility operations: - dbuSort: resequence a list of row numbers for a table (such as given by the dbuSearch* procedures) so as to provide access to rows within a table by ascending / descending order, by either string, numeric, date, or user provided collation order. This is the first alpha release of TclVSdb-1.1. As a result, you will have to examine the contents of the TclVSdb.tcl file for procedure calling conventions. You will have to issue a "parray" call giving a database array variable as the argument to see what information is maintained for the database. Documentation and an installation procedure will come with either the beta or final release. Testing of TclVSdb-1.1a1 has been limited, but basic operations are known to work. A compatibility package will be provided in the next update to allow applications which used tclvsdb (version 1) to work with TclVSdb-1.1 without modification. Please send your feedback on TclVSdb to: steven@cirque.com Quicky example of a TclVSdb application: 1) Create two tables in current directory: $ tclsh > source TclVSdb.tcl > dbCreate . db friends "name address city state zip email phonelist" > dbCreate . db phones "friendrow description phonenum" > dbClose 2) Open the database and add some entries > dbOpen . db > set frow [dbNewRow db friends] > set db(friends,name) "Bill Jones" > set db(friends,address) "123 Main St." > set db(friends,city) "St. Paul" > set db(friends,state) "MN" > set db(friends,zip) 99999 > set db(friends,email) "billj@megacorp.com" > lappend db(friends,phonelist) [dbNewRow db phones] > set db(phones,friendrow) $frow > set db(phones,description) "Home" > set db(phones,phonenum) "612-555-3434" > dbPutRow db phones > set db(phones,friendrow) $frow > set db(phones,description) "Work" > set db(phones,phonenum) "612-555-0000 ext. 2345" > dbPutRow db phones > dbPutRow db friends > dbClose db 3) Traverse the database and report > dbOpen . db > dbFirstRow db friends > while {![dbEOF db friends]} { puts stdout "Name: $db(friends,name)" foreach rownum $db(friends,phonelist) { dbGetRow db phones $rownum puts stdout " $db(phones,description): $db(phones,phonenum)" } puts stdout " " dbNextRow db friends } Name: Bill Jones Home: 612-555-3434 Work: 612-555-0000 ext 2345 > dbClose db > exit $