/* Tables - the data structures for holding all the info about
 * a table, it's fields, and it's relationships to other tables. */

/* Copyright (C) 2005 The Regents of the University of California 
 * See kent/LICENSE or http://genome.ucsc.edu/license/ for licensing information. */

#ifndef TABLES_H
#define TABLES_H

struct table
/* Information about one of the tables we are making. */
    {
    struct table *next;		/* Next in list. */
    char *name;			/* Name of table. */
    struct field *fieldList;	/* Information about each field. */
    struct hash *fieldHash;	/* Fields keyed by field name. */
    int fieldCount;		/* Count of fields, including made up ones. */
    struct hash *fieldMixedHash;/* Fields keyed by field mixed case name. */
    struct elStat *elStat;	/* Associated elStat structure. */
    struct dtdElement *dtdElement; /* Associated dtd element. */
    struct field *primaryKey;	/* Primary key if any. */
    boolean madeUpPrimary;	/* True if we are creating primary key. */
    int lastId;			/* Last id value if we create key. */
    struct assocRef *parentAssocs;  /* Association table linking to parent. */
    struct fieldRef *parentKeys; /* References to possible parents. */
    boolean linkedParents;	/* True if we have linked parents. */
    boolean isAssoc;		/* True if an association we've created. */
    int usesAsChild;		/* Number of times this is a child of another
                                 * table. */
    FILE *tabFile;		/* Tab oriented file associated with table */
    struct hash *uniqHash;	/* Table to insure unique output. */
    struct assoc *assocList;    /* List of pending associations. */
    boolean promoted;		/* If true table is promoted to be field in parent. */
    };

struct table *tableNew(char *name, struct elStat *elStat,
	struct dtdElement *dtdElement);
/* Create a new table structure. */

struct field
/* Information about a field. */
    {
    struct field *next;		/* Next in list. */
    char *name;			/* Name of field as it is in XML. */
    char *mixedCaseName;	/* Mixed case name - as it is in SQL. */
    struct table *table;	/* Table this is part of. */
    int tablePos;		/* Field position in table (zero based) */
    struct attStat *attStat;	/* Associated attStat structure. */
    struct dtdAttribute *dtdAttribute;	/* Associated dtd attribute. */
    boolean isMadeUpKey;	/* True if it's a made up key. */
    boolean isPrimaryKey;	/* True if it's table's primary key. */
    boolean isString;		/* True if it's a string field. */
    };

struct field *addFieldToTable(struct table *table, 
	char *name, char *mixedCaseName,
	struct attStat *att, boolean isMadeUpKey, boolean atTail, 
	boolean isString, char *textFieldName);
/* Add field to end of table.  Use proposedName if it's unique,
 * otherwise proposed name with some numerical suffix. */

struct fieldRef
/* A reference to a field. */
    {
    struct fieldRef *next;	/* Next in list */
    struct field *field;	/* Associated field. */
    };

struct assocRef
/* A reference to a table. */
    {
    struct assocRef *next;	/* Next in list. */
    struct table *assoc;	/* Association table */
    struct table *parent;	/* Parent table we're associated with */
    };

struct dtdAttribute *findDtdAttribute(struct dtdElement *element, char *name);
/* Find named attribute in element, or NULL if no such attribute. */

#endif /* TABLES_H */
