﻿<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://schemas.webs.idu.de/cardo3/DataExchange"
    elementFormDefault="qualified"
    xmlns="http://schemas.webs.idu.de/cardo3/DataExchange"
    xmlns:mstns="http://tempuri.org/XMLSchema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
		xmlns:sql="http://schemas.webs.idu.de/db/sqlUpdate"
		xmlns:lyr="http://schemas.webs.idu.de/cardo3/layerdefinition"
>
	<xs:annotation>
		<xs:documentation>
			Schema für den Datenimport Dienst DataExchangeServices.asmx.
		</xs:documentation>
	</xs:annotation>
	<xs:import namespace="http://schemas.webs.idu.de/cardo3/layerdefinition" schemaLocation="..\sources\Cardo3LayerSource.xsd"/>
	<xs:import namespace="http://schemas.webs.idu.de/db/sqlUpdate" schemaLocation="..\SqlUpdater\SqlupdateDescription.xsd"/>
	<!--
		uniqueIdString
	-->
	<xs:simpleType name="uniqueIdString">
		<xs:annotation>
			<xs:documentation>
				Definition für eine Unique-Id. Die Länge ist auf 255 Zeichen begrenzt.
			</xs:documentation>
		</xs:annotation>
		<xs:restriction base="xs:string">
			<xs:whiteSpace value="collapse"/>
			<xs:minLength value="1"/>
			<xs:maxLength value="255"/>
		</xs:restriction>
	</xs:simpleType>
	<!--
		TableIdentifierType
	-->
	<xs:complexType name="TableIdentifierType">
		<xs:choice minOccurs="1" maxOccurs="1">
			<xs:element name="TableName" type="sql:databaseObjectNameStringType" nillable="false" minOccurs="1" maxOccurs="1">
				<xs:annotation>
					<xs:documentation>Der Name einer vorhandenen Tabelle</xs:documentation>
				</xs:annotation>
			</xs:element>
			<xs:element name="AlterTable" type="sql:AlterTableType" nillable="false" minOccurs="1" maxOccurs="1">
				<xs:annotation>
					<xs:documentation>Ändert die Struktur einer vorhandenen Tabelle</xs:documentation>
				</xs:annotation>
			</xs:element>
			<xs:element name="CreateTable" type="sql:DefineTableType" nillable="false" minOccurs="1" maxOccurs="1">
				<xs:annotation>
					<xs:documentation>Legt die Tabelle an, wenn diese nicht bereits vorhanden ist</xs:documentation>
				</xs:annotation>
			</xs:element>
		</xs:choice>
	</xs:complexType>
	<!--
		TableIdentifierType
	-->
	<xs:complexType name="LayerIdentifierType">
		<xs:choice>
			<xs:element name="LayerGuid" type="uniqueIdString">
				<xs:annotation>
					<xs:documentation>Die Unique-Id einer vorhandenen Ebene (nicht die des Admin-Tree). Der Aufrufer muss über Admin-Berechtigungen an dieser Ebene verfügen.</xs:documentation>
				</xs:annotation>
			</xs:element>
			<xs:element name="CreateLayer">
				<xs:complexType>
					<xs:sequence>
						<xs:element name="ParentAdminTreeUniqueId" type="xs:string">
							<xs:annotation>
								<xs:documentation>Die Admin-Tree UniqueId des Ordners in dem diese Ebene angelegt werden soll. Der Aufrufende muss Admin-Rechte an diesem Knoten besitzen. Ist die Ebene bereits an andere Stelle vorhanden, dann wird diese *nicht* in diesen Ordner zuückgeschoben.</xs:documentation>
							</xs:annotation>
						</xs:element>
						<xs:element name="LayerDefinition" type="lyr:CardoLayerType">
							<xs:annotation>
								<xs:documentation>
									Die Ebenendefinition.
									Die Datenquellen-Eigenschaften werden überschrieben (Verbindungszeichenfolge immer), bzw. ergänzt wenn nicht angegeben (z.B. die  Abfrage).
									Der Driver-Type der Ebene wird angepast. Mit einem der ODBC_ Hinwese zum Drivertype kann der Typ zwischen Iwan Nativ und dem ODBC Typen gewählt werden.
								</xs:documentation>
							</xs:annotation>
						</xs:element>
					</xs:sequence>
				</xs:complexType>
			</xs:element>
		</xs:choice>
	</xs:complexType>

	<!--
		RecordValueType
	-->
	<xs:complexType name="RecordValueType">
		<xs:simpleContent>
			<xs:annotation>
				<xs:documentation>
					Die Werte müssen ihrem Datentype entsprechend Xml kodiert werden.
					Binärdaten: Kodierung als Base64
					Geometriedaten: eines der in cardo verfügbaren Formate, IWAN, WKT
					Datum,Zahl, Bool ...: gemäß XML Kodierung
				</xs:documentation>
			</xs:annotation>
			<xs:extension base="xs:anySimpleType">
				<xs:attribute name="name" type="sql:databaseObjectNameStringType" use="required">
					<xs:annotation>
						<xs:documentation>Der Spaltenname</xs:documentation>
					</xs:annotation>
				</xs:attribute>
			</xs:extension>
		</xs:simpleContent>
	</xs:complexType>
	<!--
		RecordTypeBase
	-->
	<xs:complexType name="RecordTypeBase" abstract="true">
	</xs:complexType>
	<!--
		RecordTypeWithColumnBase
	-->
	<xs:complexType name="RecordTypeWithColumnBase" abstract="true">
		<xs:sequence>
			<xs:element name="Col" type="RecordValueType" minOccurs="1" maxOccurs="unbounded" nillable="true">
			</xs:element>
		</xs:sequence>
	</xs:complexType>
	<!--
		InsertRecordType
	-->
	<xs:complexType name="InsertRecordType">
		<xs:complexContent>
			<xs:extension base="RecordTypeWithColumnBase"></xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<!--
	BulkInsertRecordType
	-->
	<xs:complexType name="BulkInsertRecordType">
		<xs:complexContent>
			<xs:extension base="RecordTypeBase">
				<xs:sequence>
					<xs:element name="Column" minOccurs="1" maxOccurs="unbounded">
						<xs:complexType>
							<xs:attribute name="name" type="sql:databaseObjectNameStringType" use="required">
								<xs:annotation>
									<xs:documentation>
										Die Daten werden in einem Grid der Element c (Cell) übermittelt.
										Die Zellen "c" müssen immer in der Anzahl der ColumnName * Anzahl Rows angegeben werden.
										Die Spalten in "c" werden gemäß der hier angegeben Reihenfolge interpretiert.
									</xs:documentation>
								</xs:annotation>
							</xs:attribute>
						</xs:complexType>
					</xs:element>
					<xs:element name="c" minOccurs="0" maxOccurs="unbounded" type="xs:anySimpleType" nillable="true">
						<xs:annotation>
							<xs:documentation>
								<xs:annotation>
									<xs:documentation>
										Die Werte müssen ihrem Datentype entsprechend Xml kodiert werden.
										Binärdaten: Kodierung als Base64
										Geometriedaten: eines der in cardo verfügbaren Formate, IWAN, WKT
										Datum,Zahl, Bool ...: gemäß XML Kodierung
									</xs:documentation>
								</xs:annotation>
							</xs:documentation>
						</xs:annotation>
					</xs:element>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<!--
	RowIdAttributeGroup
	-->
	<xs:attributeGroup name="RowIdAttributeGroup">
		<xs:attribute name="rowIdentifier" type="xs:string" use="required">
			<xs:annotation>
				<xs:documentation>Der Wert der Row-Id für diese Aktion (siehe rowIdColumnName)</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="rowIdColumnName" type="sql:databaseObjectNameStringType" use="optional">
			<xs:annotation>
				<xs:documentation>Der optionale Name der hier adressierten Row-Id Spalte. Wenn leer, dann wird die für die Tabelle gültige RowId verwendet.</xs:documentation>
			</xs:annotation>
		</xs:attribute>
	</xs:attributeGroup>
	<!--
		UpdateRecordType
	-->
	<xs:complexType name="UpdateRecordType">
		<xs:complexContent>
			<xs:extension base="RecordTypeWithColumnBase">
				<xs:attributeGroup ref="RowIdAttributeGroup"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<!--
		DeleteRecordType
	-->
	<xs:complexType name="DeleteRecordType">
		<xs:complexContent>
			<xs:extension base="RecordTypeBase">
				<xs:attributeGroup ref="RowIdAttributeGroup"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<!--
		TableDataType
	-->
	<xs:complexType name="TableDataType">
		<xs:sequence>
			<xs:choice minOccurs="1" maxOccurs="1">
				<xs:element name="WellknownDbId" maxOccurs="1" minOccurs="1" nillable="false" type="xs:int">
					<xs:annotation>
						<xs:documentation>Die Id der Datenbankverbindung, wo die Aktion ausgeführt werden soll. Die Datenbank muss über das entsprechende Attribut für die Verwendung als Exchange Ziel verfügen.</xs:documentation>
					</xs:annotation>
				</xs:element>
				<xs:element name="WellknownDbUniqueId" maxOccurs="1" minOccurs="1" nillable="false" type="uniqueIdString">
					<xs:annotation>
						<xs:documentation>Die Unique-Id der Datenbankverbindung, wo die Aktion ausgeführt werden soll. Die Datenbank muss über das entsprechende Attribut für die Verwendung als Exchange Ziel verfügen.</xs:documentation>
					</xs:annotation>
				</xs:element>
			</xs:choice>
			<xs:element name="Target" maxOccurs="1" minOccurs="1" nillable="false" type="TableIdentifierType">
				<xs:annotation>
					<xs:documentation>Definition für das Tabellen-Ziel</xs:documentation>
				</xs:annotation>
			</xs:element>
			<xs:choice minOccurs="0" maxOccurs="unbounded">
				<xs:element name="Insert" type="InsertRecordType" maxOccurs="unbounded" nillable="false"/>
				<xs:element name="BulkInsert" type="BulkInsertRecordType" maxOccurs="1" nillable="false"/>
				<xs:element name="Update" type="UpdateRecordType" maxOccurs="unbounded" nillable="false"/>
				<xs:element name="Delete" type="DeleteRecordType"  maxOccurs="unbounded" nillable="false"/>
			</xs:choice>
		</xs:sequence>
		<xs:attribute name="targetGeometryEpsgCode" use="required" type="xs:int">
			<xs:annotation>
				<xs:documentation>Der Epsg-Code in den alle Geometrien transformiert werden. die Angabe von &lt;= 0 führt zur Verwendung der cardo System Einstellung</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="rowIdColumnName" use="required" type="sql:databaseObjectNameStringType">
			<xs:annotation>
				<xs:documentation>
					Der Name der Spalte die die RowId enthält.
					Wird für alle Delete/Update Statements verwendet
				</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="truncateTable" use="optional" default="false" type="xs:boolean">
			<xs:annotation>
				<xs:documentation>Die Tabelle (vor den anderen Aktionen) Leeren</xs:documentation>
			</xs:annotation>
		</xs:attribute>
	</xs:complexType>
	<!--
	PostprocessType
	-->
	<xs:complexType name="PostprocessType">
		<xs:sequence>
			<xs:element name="ReloadLayer" type="LayerIdentifierType" minOccurs="1" maxOccurs="unbounded">
				<xs:annotation>
					<xs:documentation>Lädt eine oder mehrere Ebene nach der Datenbereitstellung neu (oder legt diese an).</xs:documentation>
				</xs:annotation>
			</xs:element>
		</xs:sequence>
	</xs:complexType>
	<!--
		Request
	-->
	<xs:element name="Request">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="DataChangeRequest" minOccurs="0" maxOccurs="unbounded">
					<xs:complexType>
						<xs:sequence>
							<xs:element name="Table" type="TableDataType" minOccurs="1" maxOccurs="1" nillable="false"/>
							<xs:element name="PostProcess" type="PostprocessType" minOccurs="0" maxOccurs="1"/>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
</xs:schema>
