/* This file is part of VoltDB.
* Copyright (C) 2008 Vertica Systems Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.hsqldb;
/**
* Class provides static methods that return embed-able DTDs
* for the XML generated by HZSQLInterface. These DTDs don't
* really add any functionality, but the can be very helpful
* in testing.
*
*/
public abstract class DTDSource {
private static String getExpressionElementList() {
return "(value|columnref|bool|asterisk|operation|function)*";
}
private static String getExpressionDTDFragment() {
StringBuilder sb = new StringBuilder();
sb.append(" <!ELEMENT value ANY>\n");
sb.append(" <!ATTLIST value\n");
sb.append(" id CDATA #REQUIRED\n");
sb.append(" type CDATA #REQUIRED\n");
sb.append(" value CDATA #IMPLIED\n");
sb.append(" isparam CDATA #IMPLIED>\n");
sb.append(" <!ELEMENT columnref ANY>\n");
sb.append(" <!ATTLIST columnref\n");
sb.append(" id CDATA #REQUIRED\n");
sb.append(" table CDATA #REQUIRED\n");
sb.append(" column CDATA #REQUIRED\n");
sb.append(" alias CDATA #IMPLIED\n");
sb.append(" dir CDATA #IMPLIED>\n");
sb.append(" <!ELEMENT bool ANY>\n");
sb.append(" <!ATTLIST bool\n");
sb.append(" id CDATA #REQUIRED\n");
sb.append(" value CDATA #REQUIRED>\n");
sb.append(" <!ELEMENT asterisk ANY>\n");
sb.append(" <!ELEMENT groupcolumns (").append(getExpressionElementList()).append(")>\n");
sb.append(" <!ELEMENT ordercolumns (").append(getExpressionElementList()).append(")>\n");
sb.append(" <!ELEMENT operation (").append(getExpressionElementList()).append(")>\n");
sb.append(" <!ATTLIST operation\n");
sb.append(" id CDATA #REQUIRED\n");
sb.append(" type CDATA #REQUIRED\n");
sb.append(" alias CDATA #IMPLIED\n");
sb.append(" distinct CDATA #IMPLIED\n");
sb.append(" desc CDATA #IMPLIED>\n");
sb.append(" <!ELEMENT function (").append(getExpressionElementList()).append(")>\n");
sb.append(" <!ATTLIST function\n");
sb.append(" id CDATA #IMPLIED\n");
sb.append(" name CDATA #REQUIRED\n");
sb.append(" type CDATA #REQUIRED>\n");
return sb.toString();
}
/**
* Get an embed-able DTD that will validate the XML output
* for the Catalog XML output.
* @return the DTD as a string.
*/
public static String getCatalogDTD() {
StringBuilder sb = new StringBuilder();
sb.append("<!DOCTYPE databaseschema [\n");
sb.append(" <!ELEMENT databaseschema (table*)>\n");
sb.append(" <!ELEMENT table (columns,indexes,constraints)>\n");
sb.append(" <!ATTLIST table\n");
sb.append(" name CDATA #REQUIRED\n");
sb.append(" query CDATA #IMPLIED>\n");
sb.append(" <!ELEMENT columns (column*)>\n");
sb.append(" <!ELEMENT indexes (index*)>\n");
sb.append(" <!ELEMENT constraints (constraint*)>\n");
sb.append(" <!ELEMENT column (default?)>\n");
sb.append(" <!ATTLIST column\n");
sb.append(" name CDATA #REQUIRED\n");
sb.append(" type CDATA #REQUIRED\n");
sb.append(" nullable CDATA #REQUIRED\n");
sb.append(" size CDATA #REQUIRED>\n");
sb.append(" <!ELEMENT default (").append(getExpressionElementList()).append(")>\n");
sb.append(getExpressionDTDFragment());
sb.append(" <!ELEMENT index ANY>\n");
sb.append(" <!ATTLIST index\n");
sb.append(" name CDATA #REQUIRED\n");
sb.append(" unique CDATA #REQUIRED\n");
sb.append(" columns CDATA #REQUIRED>\n");
sb.append(" <!ELEMENT constraint ANY>\n");
sb.append(" <!ATTLIST constraint\n");
sb.append(" name CDATA #REQUIRED\n");
sb.append(" type CDATA #REQUIRED\n");
sb.append(" index CDATA #IMPLIED\n");
sb.append(" foreignkeytable CDATA #IMPLIED>\n");
sb.append(" <!ELEMENT reference ANY>\n");
sb.append(" <!ATTLIST reference\n");
sb.append(" from CDATA #REQUIRED\n");
sb.append(" to CDATA #REQUIRED>\n");
sb.append("]>\n");
return sb.toString();
}
/**
* Get an embed-able DTD that will validate the XML output
* for Compiled Statements.
* @return the DTD as a string.
*/
public static String getCompiledStatementDTD() {
StringBuilder sb = new StringBuilder();
sb.append("<!DOCTYPE statement [\n");
sb.append(" <!ELEMENT statement (select|update|insert|delete)>\n");
sb.append(" <!ELEMENT select (columns,parameters,tablescans,querycondition?,havingcondition?,ordercolumns?)>\n");
sb.append(" <!ATTLIST select\n");
sb.append(" limit CDATA #IMPLIED\n");
sb.append(" limit_paramid CDATA #IMPLIED\n");
sb.append(" offset CDATA #IMPLIED\n");
sb.append(" offset_paramid CDATA #IMPLIED\n");
sb.append(" distinct CDATA #IMPLIED\n");
sb.append(" grouped CDATA #IMPLIED\n");
sb.append(" aggregated CDATA #IMPLIED>\n");
sb.append(" <!ELEMENT values (columnref*|").append(getExpressionElementList()).append(")>\n");
sb.append(" <!ELEMENT columns (columnref*|column*|").append(getExpressionElementList()).append(")>\n");
// columnref is declared in the included expression section
sb.append(" <!ELEMENT parameters (parameter*)>\n");
sb.append(" <!ELEMENT parameter ANY>\n");
sb.append(" <!ATTLIST parameter\n");
sb.append(" index CDATA #REQUIRED\n");
sb.append(" id CDATA #REQUIRED\n");
sb.append(" type CDATA #REQUIRED>\n");
sb.append(" <!ELEMENT tablescans (tablescan*)>\n");
sb.append(" <!ELEMENT tablescan (searchkey?,startexp?,endexp?,postexp?)>\n");
sb.append(" <!ATTLIST tablescan\n");
sb.append(" type CDATA #REQUIRED\n");
sb.append(" table CDATA #REQUIRED\n");
sb.append(" index CDATA #IMPLIED\n");
sb.append(" alias CDATA #IMPLIED>\n");
sb.append(" <!ELEMENT searchkey (").append(getExpressionElementList()).append(")>\n");
sb.append(" <!ELEMENT startexp (").append(getExpressionElementList()).append(")>\n");
sb.append(" <!ELEMENT endexp (").append(getExpressionElementList()).append(")>\n");
sb.append(" <!ELEMENT postexp (").append(getExpressionElementList()).append(")>\n");
sb.append(" <!ELEMENT querycondition (").append(getExpressionElementList()).append(")>\n");
sb.append(" <!ELEMENT havingcondition (").append(getExpressionElementList()).append(")>\n");
sb.append(getExpressionDTDFragment());
sb.append(" <!ELEMENT update (columns,parameters,tablescan,condition?)>\n");
sb.append(" <!ATTLIST update\n");
sb.append(" table CDATA #REQUIRED>\n");
sb.append(" <!ELEMENT condition (").append(getExpressionElementList()).append(")>\n");
sb.append(" <!ELEMENT column (").append(getExpressionElementList()).append(")>\n");
sb.append(" <!ATTLIST column\n");
sb.append(" name CDATA #REQUIRED\n");
sb.append(" table CDATA #REQUIRED>\n");
sb.append(" <!ELEMENT insert (columns,parameters,tablescan?,condition?)>\n");
sb.append(" <!ATTLIST insert\n");
sb.append(" table CDATA #REQUIRED>\n");
sb.append(" <!ELEMENT delete (parameters,tablescan?,condition?)>\n");
sb.append(" <!ATTLIST delete\n");
sb.append(" table CDATA #REQUIRED>\n");
sb.append("]>\n");
return sb.toString();
}
}