first previous next last contents

The GapIO Structure

The main object passed around between the I/O functions is the GapIO structure. This is returned from the open_db function and is then passed around in much the same manner as a unix file descriptor or FILE pointer is. The structure, held in `gap4/IO.h', is as follows.

typedef struct {
    GapServer *server;		/* our server */
    GapClient *client;		/* ourselves */

    int Nviews;			/* number of locked views */
    Array views;		/* all locked views */

    GDatabase db;		/* main database record */
    Bitmap freerecs;		/* bitmap of unused */
    Array contigs;		/* list of contig */
    Array readings;		/* list of reading records */
    Array annotations;		/* list of annotation records */
    Array templates;		/* list of template records */
    Array clones;		/* list of clone records */
    Array vectors;		/* list of vector records */

    int4 *relpos;		/* relpg[] */
    int4 *length;		/* length[] */
    int4 *lnbr;			/* lnbr[] */
    int4 *rnbr;			/* rnbr[] */

    char db_name[DB_FILELEN];	/* database "file.version" */

    Array contig_order;		/* order of contigs */
    Array contig_reg;		/* Registration arrays for each contig */

#ifdef GAP_CACHE
    Array reading;		/* Array of GReading _structures_ */
    Array read_names;		/* Array of reading names */
    int freerecs_changed;	/* Whether to flush freerecs bitmap */
    Bitmap updaterecs;		/* bitmap of updated records */
    Bitmap tounlock;		/* bitmap of records to unlock at next flush */
} GapIO;

Many of the items held within this structure are used internally by the I/O functions. However it's worth describing all very briefly.

The server and client pointers are used in the low level g library communication. They need not be used by any external code.
Each record in the database needs to be locked before it can be accessed. A view is returned for each independent lock of a record. These are used internally by the low level reading and writing function.
This is a direct copy of the GDatabase structure for this database. This needs to be kept up to date with the on disk copy whenever changes are made (eg by adding a new reading).
This is a copy of the free records bitmap referenced by the io->db.freerecs field. It is kept up to date internally.
These are lookup arrays to convert structure numbers to record numbers. For instance, all readings are numbered from 1 upwards. Similarly for contigs. However reading number 1 and contig number 1 will have their own unique record numbers in the g database. The extensible array package is used for storing this information. To translate from reading number N to the record number use "arr(GCardinal, io->readings, N-1)".
These are arrays of 4-byte integers of size io->db.actual_db_size. They hold information about both readings and contigs. For readings, the array contents hold copies of the position, sequence_length, left and right fields of the GReadings structures. Reading number R has this data stored in array elements R (counting from element 0, which is left blank). For contigs, the array contents hold copies of the length, left and right fields of the GContigs structure. For historical reasons the contig length is held in the relpos array with the length array left blank. Contig number C has this data stored in array elements io->db.actual_db_size-C. For ease of use and future compatibility several macros have been defined for accessing this data. See section IO.h Macros. These should be used instead of direct access. Thus to find the length of reading R we use io_length(io,R) and to find the length of contig C we use io_clength(io,C). NOTE: These arrays are not updated automatically. If you modify data using one of the write functions you also need to update the arrays in sync. This is one of the problems that the check database command looks for so mistakes should be obvious.
The name of the database in a file.version syntax. This array is allocated to be DB_FILELEN bytes long. The io_name macro should be used for accessing this field.
An array loaded from io->db.contig_order. This holds the left to right ordering of contigs. It is automatically undated by the create and delete contig function.
The contig registration scheme information. There's an entire chapter on this topic. See section Contig Registration Scheme.
These are cached copies of the GReadings structures and the reading names referenced by the fields. They are updated automatically when using the correct functions (gel_read and gel_write). Use of lower level functions is disallowed for accessing this data.
These three are used internally for maintaining the update and data flushing scheme. freerecs_changed is a flag to state whether or not the freerecs bitmap needs writing to disk. updaterecs and tounlock are bitmaps with a bit per record to signify whether the record needs rewriting or unlocking. Their use is not required outside of the low level functions.

first previous next last contents
This page is maintained by staden-package. Last generated on 1 March 2001.