Index: engine/src/main/java/org/teiid/query/metadata/DDLStringVisitor.java =================================================================== diff -u -N -r89be5a89d1fc7a345b001b7f1883007b60a4beac -r2f1ee19d2d0917592543b629cb22de3e0cf0a2b2 --- engine/src/main/java/org/teiid/query/metadata/DDLStringVisitor.java (.../DDLStringVisitor.java) (revision 89be5a89d1fc7a345b001b7f1883007b60a4beac) +++ engine/src/main/java/org/teiid/query/metadata/DDLStringVisitor.java (.../DDLStringVisitor.java) (revision 2f1ee19d2d0917592543b629cb22de3e0cf0a2b2) @@ -815,8 +815,11 @@ } private void buildOptions(AbstractMetadataRecord record, StringBuilder options) { - if (!record.getProperties().isEmpty()) { + if (!record.getProperties().isEmpty()) { for (Map.Entry entry:record.getProperties().entrySet()) { + if (record instanceof Database && entry.getKey().equals("full-ddl")) { + continue; + } addOption(options, entry.getKey(), entry.getValue()); } } Index: jboss-admin/src/main/java/org/teiid/adminapi/jboss/AdminFactory.java =================================================================== diff -u -N -r4dc60a16717e462b896b35cd8d1fc53ba5c184de -r2f1ee19d2d0917592543b629cb22de3e0cf0a2b2 --- jboss-admin/src/main/java/org/teiid/adminapi/jboss/AdminFactory.java (.../AdminFactory.java) (revision 4dc60a16717e462b896b35cd8d1fc53ba5c184de) +++ jboss-admin/src/main/java/org/teiid/adminapi/jboss/AdminFactory.java (.../AdminFactory.java) (revision 2f1ee19d2d0917592543b629cb22de3e0cf0a2b2) @@ -2066,11 +2066,18 @@ ArrayList params = new ArrayList(); params.add("vdb-name"); params.add(vdbName); + + if (vdbVersion == null) { + vdbVersion = "1"; + } params.add("vdb-version"); params.add(vdbVersion); - params.add("model-name"); - params.add(modelName); + if (modelName != null) { + params.add("model-name"); + params.add(modelName); + } + if (allowedTypes != null) { params.add("entity-type"); StringBuilder sb = new StringBuilder(); Index: jboss-integration/src/main/java/org/teiid/jboss/TeiidOperationHandler.java =================================================================== diff -u -N -r89be5a89d1fc7a345b001b7f1883007b60a4beac -r2f1ee19d2d0917592543b629cb22de3e0cf0a2b2 --- jboss-integration/src/main/java/org/teiid/jboss/TeiidOperationHandler.java (.../TeiidOperationHandler.java) (revision 89be5a89d1fc7a345b001b7f1883007b60a4beac) +++ jboss-integration/src/main/java/org/teiid/jboss/TeiidOperationHandler.java (.../TeiidOperationHandler.java) (revision 2f1ee19d2d0917592543b629cb22de3e0cf0a2b2) @@ -17,7 +17,12 @@ */ package org.teiid.jboss; -import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.*; +import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ALLOWED; +import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.DEFAULT; +import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.DESCRIPTION; +import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.READ_ONLY; +import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.REQUIRED; +import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.TYPE; import java.math.BigDecimal; import java.math.BigInteger; @@ -92,9 +97,11 @@ import org.teiid.jboss.TeiidServiceNames.InvalidServiceNameException; import org.teiid.logging.LogConstants; import org.teiid.logging.LogManager; +import org.teiid.metadata.Database; import org.teiid.metadata.MetadataStore; import org.teiid.metadata.Schema; import org.teiid.query.metadata.DDLStringVisitor; +import org.teiid.query.metadata.DatabaseUtil; import org.teiid.query.metadata.TransformationMetadata; import org.teiid.runtime.EmbeddedAdminFactory; import org.teiid.translator.TranslatorProperty.PropertyType; @@ -929,9 +936,16 @@ if (operation.hasDefined(OperationsConstants.ENTITY_PATTERN.getName())) { regEx = operation.get(OperationsConstants.ENTITY_PATTERN.getName()).asString(); } + + String ddl = null; MetadataStore metadataStore = vdb.getAttachment(TransformationMetadata.class).getMetadataStore(); - Schema schema = metadataStore.getSchema(modelName); - String ddl = DDLStringVisitor.getDDLString(schema, schemaTypes, regEx); + if (modelName != null) { + Schema schema = metadataStore.getSchema(modelName); + ddl = DDLStringVisitor.getDDLString(schema, schemaTypes, regEx); + } else { + Database db = DatabaseUtil.convert(vdb, metadataStore); + ddl = DDLStringVisitor.getDDLString(db); + } result.set(ddl); } Index: runtime/src/main/java/org/teiid/runtime/EmbeddedAdminImpl.java =================================================================== diff -u -N -r7361f8c569f2425e3ac4ba2ca3946dfd6e9ce0ac -r2f1ee19d2d0917592543b629cb22de3e0cf0a2b2 --- runtime/src/main/java/org/teiid/runtime/EmbeddedAdminImpl.java (.../EmbeddedAdminImpl.java) (revision 7361f8c569f2425e3ac4ba2ca3946dfd6e9ce0ac) +++ runtime/src/main/java/org/teiid/runtime/EmbeddedAdminImpl.java (.../EmbeddedAdminImpl.java) (revision 2f1ee19d2d0917592543b629cb22de3e0cf0a2b2) @@ -32,9 +32,11 @@ import org.teiid.dqp.internal.process.DQPWorkContext; import org.teiid.dqp.internal.process.SessionAwareCache; import org.teiid.dqp.service.SessionServiceException; +import org.teiid.metadata.Database; import org.teiid.metadata.MetadataStore; import org.teiid.metadata.Schema; import org.teiid.query.metadata.DDLStringVisitor; +import org.teiid.query.metadata.DatabaseUtil; import org.teiid.query.metadata.TransformationMetadata; import org.teiid.query.metadata.VDBResources; import org.teiid.translator.TranslatorProperty.PropertyType; @@ -529,10 +531,18 @@ @Override public String getSchema(String vdbName, String vdbVersion, String modelName, EnumSet allowedTypes, String typeNamePattern) throws AdminException { + if (vdbVersion == null) { + vdbVersion = "1"; + } VDBMetaData vdb = checkVDB(vdbName, vdbVersion); MetadataStore metadataStore = vdb.getAttachment(TransformationMetadata.class).getMetadataStore(); - Schema schema = metadataStore.getSchema(modelName); - return DDLStringVisitor.getDDLString(schema, allowedTypes, typeNamePattern); + if (modelName != null) { + Schema schema = metadataStore.getSchema(modelName); + return DDLStringVisitor.getDDLString(schema, allowedTypes, typeNamePattern); + } else { + Database db = DatabaseUtil.convert(vdb, metadataStore); + return DDLStringVisitor.getDDLString(db); + } } public static String prettyFormat(String input) throws TransformerException { Index: runtime/src/test/java/org/teiid/metadatastore/TestDDLMetadataStore.java =================================================================== diff -u -N -r89be5a89d1fc7a345b001b7f1883007b60a4beac -r2f1ee19d2d0917592543b629cb22de3e0cf0a2b2 --- runtime/src/test/java/org/teiid/metadatastore/TestDDLMetadataStore.java (.../TestDDLMetadataStore.java) (revision 89be5a89d1fc7a345b001b7f1883007b60a4beac) +++ runtime/src/test/java/org/teiid/metadatastore/TestDDLMetadataStore.java (.../TestDDLMetadataStore.java) (revision 2f1ee19d2d0917592543b629cb22de3e0cf0a2b2) @@ -23,6 +23,7 @@ import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; +import java.io.FileWriter; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.ResultSet; @@ -40,6 +41,7 @@ import org.jboss.security.SimpleGroup; import org.jboss.security.SimplePrincipal; import org.junit.After; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; @@ -219,6 +221,10 @@ String expected = ObjectConverterUtil .convertFileToString(new File(UnitTestUtil.getTestDataPath() + "/" + "first-vdb.xml")); assertEquals(expected, new String(out.toByteArray())); + + String exportedDdl = admin.getSchema("empty", "2", null, null, null); + Assert.assertEquals(ObjectConverterUtil.convertFileToString(UnitTestUtil.getTestDataFile("first-vdb.ddl")), + exportedDdl); } @Test Index: runtime/src/test/resources/first-vdb.ddl =================================================================== diff -u -N --- runtime/src/test/resources/first-vdb.ddl (revision 0) +++ runtime/src/test/resources/first-vdb.ddl (revision 2f1ee19d2d0917592543b629cb22de3e0cf0a2b2) @@ -0,0 +1,45 @@ + +/* +########################################### +# START DATABASE empty +########################################### +*/ +CREATE DATABASE empty VERSION '2' OPTIONS ("connection-type" 'BY_VERSION'); +USE DATABASE empty VERSION '2'; + +--############ Translators ############ +CREATE FOREIGN DATA WRAPPER y; + + +--############ Servers ############ +CREATE SERVER z FOREIGN DATA WRAPPER y OPTIONS ("jndi-name" 'z'); + + +--############ Schemas ############ +CREATE SCHEMA PM1 SERVER z; + + +--############ Roles ############ +CREATE ROLE admin WITH JAAS ROLE superuser; + + +--############ Schema:PM1 ############ +SET SCHEMA PM1; + +CREATE FOREIGN TABLE "my-table" ( + "my-column" string +) OPTIONS (UPDATABLE TRUE); + +CREATE FOREIGN TABLE mytable ( + "my-column" string +) OPTIONS (UPDATABLE TRUE); +--############ Grants ############ +GRANT SELECT,UPDATE ON TABLE "PM1.mytable" TO admin; + + +/* +########################################### +# END DATABASE empty +########################################### +*/ + Index: test-integration/common/src/test/java/org/teiid/arquillian/IntegrationTestDDL.java =================================================================== diff -u -N -r89be5a89d1fc7a345b001b7f1883007b60a4beac -r2f1ee19d2d0917592543b629cb22de3e0cf0a2b2 --- test-integration/common/src/test/java/org/teiid/arquillian/IntegrationTestDDL.java (.../IntegrationTestDDL.java) (revision 89be5a89d1fc7a345b001b7f1883007b60a4beac) +++ test-integration/common/src/test/java/org/teiid/arquillian/IntegrationTestDDL.java (.../IntegrationTestDDL.java) (revision 2f1ee19d2d0917592543b629cb22de3e0cf0a2b2) @@ -21,19 +21,24 @@ import static org.junit.Assert.fail; import java.io.ByteArrayInputStream; +import java.io.FileOutputStream; +import java.io.FileWriter; import java.sql.SQLException; import org.jboss.arquillian.junit.Arquillian; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.exporter.ZipExporter; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.junit.After; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.teiid.adminapi.Admin; import org.teiid.adminapi.AdminException; import org.teiid.adminapi.jboss.AdminFactory; +import org.teiid.core.util.ObjectConverterUtil; +import org.teiid.core.util.UnitTestUtil; import org.teiid.jdbc.AbstractMMQueryTestCase; import org.teiid.jdbc.TeiidDriver; @@ -89,6 +94,11 @@ execute("SELECT * FROM test.G2"); //$NON-NLS-1$ assertRowCount(1); printResults(); + + String exportedDdl = admin.getSchema("foo", "1", null, null, null); + Assert.assertEquals(ObjectConverterUtil.convertFileToString(UnitTestUtil.getTestDataFile("exported-vdb.ddl")), + exportedDdl); + closeConnection(); admin.undeploy("foo-vdb.ddl"); } Index: test-integration/common/src/test/resources/exported-vdb.ddl =================================================================== diff -u -N --- test-integration/common/src/test/resources/exported-vdb.ddl (revision 0) +++ test-integration/common/src/test/resources/exported-vdb.ddl (revision 2f1ee19d2d0917592543b629cb22de3e0cf0a2b2) @@ -0,0 +1,43 @@ + +/* +########################################### +# START DATABASE foo +########################################### +*/ +CREATE DATABASE foo VERSION '1' OPTIONS ("connection-type" 'BY_VERSION', "deployment-name" 'foo-vdb.ddl'); +USE DATABASE foo VERSION '1'; + +--############ Translators ############ +CREATE FOREIGN DATA WRAPPER loopback; + + +--############ Servers ############ +CREATE SERVER NONE FOREIGN DATA WRAPPER loopback OPTIONS ("jndi-name" 'NONE'); + + +--############ Schemas ############ +CREATE SCHEMA test SERVER NONE; + + +--############ Schema:test ############ +SET SCHEMA test; + +CREATE FOREIGN TABLE G1 ( + e1 integer, + e2 string(25), + e3 double, + PRIMARY KEY(e1) +); + +CREATE FOREIGN TABLE G2 ( + e1 integer, + e2 string(25), + e3 double, + PRIMARY KEY(e1) +); +/* +########################################### +# END DATABASE foo +########################################### +*/ +