<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:annotation>
 <xsd:documentation xml:lang="en">
  Schema for PEAR MDB2 XML database schemas.
 </xsd:documentation>
</xsd:annotation>

<!-- ROOT -->

<xsd:element name="database">
 <xsd:complexType>
  <xsd:sequence>
   <xsd:element ref="name"/>
   <xsd:element ref="create" minOccurs="0"/>
   <xsd:element ref="overwrite" minOccurs="0"/>
   <xsd:element ref="description" minOccurs="0"/>
   <xsd:element ref="comments" minOccurs="0"/>
   <xsd:element name="table" type="table" maxOccurs="unbounded"/>
   <xsd:element name="sequence" type="sequence" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
 </xsd:complexType>
</xsd:element>

<!-- ROOT CHILDREN -->

<xsd:complexType name="table">
 <xsd:sequence>
  <xsd:element ref="name"/>
  <xsd:element ref="was" minOccurs="0"/>
  <xsd:element ref="description" minOccurs="0"/>
  <xsd:element ref="comments" minOccurs="0"/>
  <xsd:element name="declaration" type="declaration"/>
  <xsd:element name="initialization" type="initialization" minOccurs="0"/>
 </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="declaration">
 <xsd:sequence>
  <xsd:element name="field" type="fieldDef" maxOccurs="unbounded"/>
  <xsd:element name="index" type="index" minOccurs="0" maxOccurs="unbounded"/>
  <xsd:element name="foreign" type="foreign" minOccurs="0" maxOccurs="unbounded"/>
 </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="initialization">
 <xsd:choice maxOccurs="unbounded">
  <xsd:element name="insert" type="insert"/>
  <xsd:element name="update" type="update"/>
  <xsd:element name="delete" type="delete"/>
 </xsd:choice>
</xsd:complexType>

<xsd:complexType name="insert">
 <xsd:choice>
  <xsd:element name="field" type="fieldData" maxOccurs="unbounded"/>
  <xsd:element name="select" type="select"/>
 </xsd:choice>
</xsd:complexType>

<xsd:complexType name="update">
 <xsd:sequence>
  <xsd:element name="field" type="fieldData" maxOccurs="unbounded"/>
  <xsd:element name="where" type="where" minOccurs="0"/>
 </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="delete">
 <xsd:all>
  <xsd:element name="where" type="where"/>
 </xsd:all>
</xsd:complexType>

<xsd:complexType name="select">
 <xsd:sequence>
  <xsd:element ref="table"/>
  <xsd:element name="field" type="fieldData" maxOccurs="unbounded"/>
  <xsd:element name="where" type="where" minOccurs="0"/>
 </xsd:sequence>
</xsd:complexType>

<!-- INNER ELEMENTS -->

<xsd:complexType name="sequence">
 <xsd:all>
  <xsd:element ref="name"/>
  <xsd:element ref="was" minOccurs="0"/>
  <xsd:element ref="start" minOccurs="0"/>
  <xsd:element ref="description" minOccurs="0"/>
  <xsd:element ref="comments" minOccurs="0"/>
  <xsd:element name="on" type="on"/>
 </xsd:all>
</xsd:complexType>

<xsd:complexType name="on">
 <xsd:all>
  <xsd:element ref="table"/>
  <xsd:element ref="field"/>
 </xsd:all>
</xsd:complexType>

<xsd:complexType name="index">
 <xsd:sequence>
  <xsd:element ref="name"/>
  <xsd:element ref="was" minOccurs="0"/>
  <xsd:element ref="unique" minOccurs="0"/>
  <xsd:element ref="primary" minOccurs="0"/>
  <xsd:element name="field" type="fieldIndex" maxOccurs="unbounded"/>
 </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="foreign">
 <xsd:sequence>
  <xsd:element ref="name"/>
  <xsd:element ref="was" minOccurs="0"/>
  <xsd:element ref="match" minOccurs="0"/>
  <xsd:element ref="ondelete" minOccurs="0"/>
  <xsd:element ref="onupdate" minOccurs="0"/>
  <xsd:element ref="deferrable" minOccurs="0"/>
  <xsd:element ref="initiallydeferred" minOccurs="0"/>
  <xsd:element ref="field" maxOccurs="unbounded"/>
  <xsd:element name="references" type="references"/>
 </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="references">
 <xsd:sequence>
  <xsd:element ref="table"/>
  <xsd:element ref="field" minOccurs="0" maxOccurs="unbounded"/>
 </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="where">
 <xsd:all>
  <xsd:element name="expression" type="expression"/>
 </xsd:all>
</xsd:complexType>

<xsd:complexType name="expression">
 <xsd:sequence>
  <xsd:group ref="operant"/>
  <xsd:element ref="operator"/>
  <xsd:group ref="operant"/>
 </xsd:sequence>
</xsd:complexType>

<xsd:group name="operant">
 <xsd:choice>
  <xsd:element ref="value"/>
  <xsd:element ref="column"/>
  <xsd:element name="function" type="function"/>
  <xsd:element name="expression" type="expression"/>
  <xsd:element ref="null"/>
 </xsd:choice>
</xsd:group>

<xsd:complexType name="fieldData">
 <xsd:sequence>
  <xsd:element ref="name"/>
  <xsd:group ref="operant"/>
 </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="fieldDef">
 <xsd:all>
  <xsd:element ref="name"/>
  <xsd:element ref="was" minOccurs="0"/>
  <xsd:element ref="type"/>
  <xsd:element ref="fixed" minOccurs="0"/>
  <xsd:element ref="default" minOccurs="0"/>
  <xsd:element ref="notnull" minOccurs="0"/>
  <xsd:element ref="autoincrement" minOccurs="0"/>
  <xsd:element ref="unsigned" minOccurs="0"/>
  <xsd:element ref="length" minOccurs="0"/>
  <xsd:element ref="description" minOccurs="0"/>
  <xsd:element ref="comments" minOccurs="0"/>
 </xsd:all>
</xsd:complexType>

<xsd:complexType name="fieldIndex">
 <xsd:all>
  <xsd:element ref="name"/>
  <xsd:element ref="sorting" minOccurs="0"/>
  <xsd:element ref="length" minOccurs="0"/>
 </xsd:all>
</xsd:complexType>

<xsd:complexType name="function">
 <xsd:sequence>
  <xsd:element ref="name"/>
  <xsd:group ref="operant" minOccurs="0" maxOccurs="unbounded"/>
 </xsd:sequence>
</xsd:complexType>

<!-- THE BASIC TYPE -->

<xsd:complexType name="basic" mixed="true">
 <xsd:all>
  <xsd:element ref="variable" minOccurs="0"/>
 </xsd:all>
</xsd:complexType>

<!-- BASIC ELEMENTS -->

<xsd:element name="comments" type="basic"/>
<xsd:element name="create" type="basic"/>
<xsd:element name="default" type="basic"/>
<xsd:element name="description" type="basic"/>
<xsd:element name="length" type="basic"/>
<xsd:element name="name" type="basic"/>
<xsd:element name="notnull" type="basic"/>
<xsd:element name="overwrite" type="basic"/>
<xsd:element name="sorting" type="basic"/>
<xsd:element name="start" type="basic"/>
<xsd:element name="type" type="basic"/>
<xsd:element name="unique" type="basic"/>
<xsd:element name="primary" type="basic"/>
<xsd:element name="autoincrement" type="basic"/>
<xsd:element name="unsigned" type="basic"/>
<xsd:element name="value" type="basic"/>
<xsd:element name="column" type="basic"/>
<xsd:element name="operator" type="basic"/>
<xsd:element name="was" type="basic"/>
<xsd:element name="fixed" type="basic"/>
<xsd:element name="null" type="basic"/>
<xsd:element name="match" type="basic"/>
<xsd:element name="ondelete" type="basic"/>
<xsd:element name="onupdate" type="basic"/>
<xsd:element name="deferrable" type="basic"/>
<xsd:element name="initiallydeferred" type="basic"/>
<xsd:element name="table" type="basic"/>
<xsd:element name="field" type="basic"/>

<!-- ATOMIC ELEMENTS -->

<xsd:element name="variable" type="xsd:string"/>

</xsd:schema>
