tie(n) | Tcl Data Structures | tie(n) |
tie - Array persistence
package require Tcl 8.4
package require tie ?1.1?
::tie::tie arrayvarname options... dstype dsname...
::tie::untie arrayvarname ?token?
::tie::info ties arrayvarname
::tie::info types
::tie::info type dstype
::tie::register dsclasscmd as dstype
dsclasscmd objname ?dsname...?
ds destroy
ds names
ds size
ds get
ds set dict
ds unset ?pattern?
ds setv index value
ds unsetv index
ds getv index
The tie package provides a framework for the creation of persistent Tcl array variables. It should be noted that the provided mechanism is generic enough to also allow its usage for the distribution of the contents of Tcl arrays over multiple threads and processes, i.e. communication.
This, persistence and communication, is accomplished by tying) a Tcl array variable to a data source. Examples of data sources are other Tcl arrays and files.
It should be noted that a single Tcl array variable can be tied to more than one data source. It is this feature which allows the framework to be used for communication as well. Just tie several Tcl arrays in many client processes to a Tcl array in a server and all changes to any of them will be distributed to all. Less centralized variants of this are of course possible as well.
This section describes the basic API used to establish and remove ties between Tcl array variables and data sources. This interface is the only one a casual user has to be concerned about. The following sections about the various internal interfaces can be safely skipped.
The result of the command is always a token which identifies the new tie. This token can be used later to destroy this specific tie.
The command understands a number of additional options which guide the process of setting up the connection between Tcl array and data source.
This option and the option -save exclude each other. If neither this nor option -save are specified then this option is assumed as default.
This option and the option -open exclude each other. If neither this nor option -open are specified then option -open is assumed as default.
When used with -open data in the data source has precedence. In other words, for duplicates the data in the data source is loaded into the Tcl array.
When used with -save data in the Tcl array has precedence. In other words, for duplicates the data in the Tcl array is saved into the data source.
It should be noted that while severing a tie will destroy management information internal to the package the data source which was handled by the tie will not be touched, only closed.
After the command returns none of changes made to the array will be saved to the data source anymore.
The result of the command is an empty string.
This package provides the six following types as examples and standard data sources.
It accepts three identifying arguments, the name of the other Tcl array, the command prefix for the send-like accessor command, and an identifier for the remote entity hosting the array, in this order. All changes are mirrored to that array, via the command prefix. All commands will be executed in the context of the global namespace.
send-like means that the command prefix has to have send syntax and semantics. I.e. it is a channel over which we can send arbitrary commands to some other entity. The remote array data source however uses only the commands set, unset, array exists, array names, array set, and array get to retrieve and set values in the remote array.
The command prefix and the entity id are separate to allow the data source to use options like -async when assembling the actual commands.
Examples of command prefixes, listed with the id of the remote entity, without options. In reality only the part before the id is the command prefix:
All changes are saved in the file, as proper Tcl commands, one command per operation. In other words, the file will always contain a proper Tcl script.
If the file exists when the tie using it is set up, then it will be compacted, i.e. superfluous operations are removed, if the operations log stored in it contains either at least one operation clearing the whole array, or at least 1.5 times more operations than entries in the loaded array.
This restriction allows us to simplify both file format and access to the file radically. For one, the file is read only once and the internal cache cannot be invalidated. Second, writing data is reduced to a simple append, and no compaction step is necessary. The format of the contents is the string representation of a dictionary which can be incrementally extended forever at the end.
To use this type it is necessary to know how the framework manages ties and what data source objects are.
All changes are delegated to the specified object.
This section is of no interest to the casual user of ties. Only developers wishing to create new data sources have to know the information provided herein.
All ties are represented internally by an in-memory object which mediates between the tie framework and the specific data source, like an array, file, etc. This is the data source object.
Its class, the data source class is not generic, but specific to the type of the data source. Writing a new data source requires us to write such a class, and then registering it with the framework as a new type.
The following subsections describe the various APIs a data source class and the objects it generates will have to follow to be compatible with the tie framework.
Data source objects are normally automatically created and destroyed by the framework when a tie is created, or removed. This management can be explicitly bypassed through the usage of the "dsource" type. The data source for this type is a data source object itself, and this object is outside of the scope of the tie framework and not managed by it. In other words, this type allows the creation of ties which talk to pre-existing data source objects, and these objects will survive the removal of the ties using them as well.
After a data source class has been written it is necessary to register it as a new type with the framework.
After the call the argument dstype of the basic user command ::tie::tie will accept dstype as a type name and translate it internally to the appropriate class command for the creation of data source objects for the new data source.
Each data source class is represented by a single command, also called the class command, or object creation command. Its syntax is
This is followed by a series of arguments identifying the data source the new object is for. These are the same dsname arguments which are given to the basic user command ::tie::tie. Their actual meaning is dependent on the data source class.
The result of the class command has to be the fully-qualified name of the new data source object, i.e. the name of the object command. The interface this command has to follow is described in the section DATA SOURCE OBJECT API
Please read the section DATA SOURCE CLASS first, to know how to generate new object commands.
Each object command for a data source object has to provide at least the methods listed below for proper inter-operation with the tie framework. Note that the names of most of the methods match the subcommands of the builtin array command.
The result of the command is ignored. If an error is thrown then this error will show up as error of the set operation which caused the method call.
The result of the command is ignored. If an error is thrown then this error will show up as error of the unset operation which caused the method call.
And here a small table comparing the data source methods to the regular Tcl commands for accessing an array.
Regular Tcl Data source ----------- ----------- array names a ds names array size a ds size array get a ds get array set a dict ds set dict array unset a pattern ds unset ?pattern? ----------- ----------- set a($idx) $val ds setv idx val unset a($idx) ds unsetv idx $a($idx) ds getv idx ----------- -----------
This document, and the package it describes, will undoubtedly contain bugs and other problems. Please report such in the category tie of the Tcllib SF Trackers [http://sourceforge.net/tracker/?group_id=12883]. Please also report any ideas for enhancements you may have for either package and/or documentation.
array, database, file, metakit, persistence, tie, untie
Programming tools
Copyright (c) 2004-2008 Andreas Kupries <andreas_kupries@users.sourceforge.net>
1.1 | tie |