/* * Copyright (c) 2008-2013 Eike Stepper (Berlin, Germany) and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Eike Stepper - initial API and implementation */ package org.eclipse.net4j.db.tests; import org.eclipse.net4j.db.DBType; import org.eclipse.net4j.db.DBUtil; import org.eclipse.net4j.db.IDBAdapter; import org.eclipse.net4j.db.IDBConnectionProvider; import org.eclipse.net4j.db.IDBDatabase; import org.eclipse.net4j.db.IDBSchemaTransaction; import org.eclipse.net4j.db.ddl.IDBField; import org.eclipse.net4j.db.ddl.IDBIndex; import org.eclipse.net4j.db.ddl.IDBSchema; import org.eclipse.net4j.db.ddl.IDBTable; import org.eclipse.net4j.db.ddl.delta.IDBSchemaDelta; import org.eclipse.net4j.util.tests.AbstractOMTest; import javax.sql.DataSource; import java.sql.Connection; import java.util.Set; /** * @author Eike Stepper */ public abstract class AbstractDBTest extends AbstractOMTest { public static final String SCHEMA_NAME = "TEST"; private IDBAdapter adapter; private IDBConnectionProvider connectionProvider; private Connection internalConnection; @Override protected void doSetUp() throws Exception { adapter = createAdapter(); DataSource dataSource = createDataSource(); connectionProvider = adapter.createConnectionProvider(dataSource); } @Override protected void doTearDown() throws Exception { if (internalConnection != null) { DBUtil.dropAllTables(internalConnection, null); DBUtil.close(internalConnection); internalConnection = null; } connectionProvider = null; adapter = null; } protected abstract IDBAdapter createAdapter(); protected abstract DataSource createDataSource(); private Connection getConnection() { if (internalConnection == null) { internalConnection = connectionProvider.getConnection(); } return internalConnection; } public void _testDBTypes() throws Exception { IDBSchema schema = DBUtil.createSchema("testDBTypes"); DBType[] dbTypes = DBType.values(); int count = 0; int i = 0; for (DBType dbType : dbTypes) { IDBTable table = schema.addTable("table_" + i); table.addField("field", dbType); ++count; if (adapter.isTypeIndexable(dbType)) { IDBTable idx_table = schema.addTable("idx_table" + i); IDBField idx_field = idx_table.addField("field", dbType); idx_table.addIndex(IDBIndex.Type.NON_UNIQUE, idx_field); ++count; IDBTable uni_table = schema.addTable("uni_table" + i); IDBField uni_field = uni_table.addField("field", dbType); uni_table.addIndex(IDBIndex.Type.UNIQUE, uni_field); ++count; IDBTable pk_table = schema.addTable("pk_table" + i); IDBField pk_field = pk_table.addField("field", dbType); pk_table.addIndex(IDBIndex.Type.PRIMARY_KEY, pk_field); ++count; } ++i; } Set<IDBTable> tables = schema.create(adapter, getConnection()); assertEquals(count, tables.size()); } public void testFindElement() throws Exception { IDBSchema schema1 = DBUtil.createSchema(SCHEMA_NAME); IDBTable table1 = schema1.addTable("table"); IDBField field11 = table1.addField("field1", DBType.INTEGER, true); IDBField field12 = table1.addField("field2", DBType.VARCHAR, 64, true); IDBField field13 = table1.addField("field3", DBType.BOOLEAN); IDBIndex index11 = table1.addIndex("index1", IDBIndex.Type.PRIMARY_KEY, field11, field12); IDBIndex index12 = table1.addIndex("index2", IDBIndex.Type.UNIQUE, field11, field12); IDBIndex index13 = table1.addIndex("index3", IDBIndex.Type.NON_UNIQUE, field12); IDBSchema schema2 = DBUtil.createSchema(SCHEMA_NAME); IDBTable table2 = schema2.addTable("table"); IDBField field21 = table2.addField("field1", DBType.INTEGER, true); IDBField field22 = table2.addField("field2", DBType.VARCHAR, 64, true); IDBField field23 = table2.addField("field3", DBType.BOOLEAN); IDBIndex index21 = table2.addIndex("index1", IDBIndex.Type.PRIMARY_KEY, field21, field22); IDBIndex index22 = table2.addIndex("index2", IDBIndex.Type.UNIQUE, field21, field22); IDBIndex index23 = table2.addIndex("index3", IDBIndex.Type.NON_UNIQUE, field22); assertSame(schema2, schema2.findElement(schema1)); assertSame(table2, schema2.findElement(table1)); assertSame(field21, schema2.findElement(field11)); assertSame(field22, schema2.findElement(field12)); assertSame(field23, schema2.findElement(field13)); assertSame(index21, schema2.findElement(index11)); assertSame(index22, schema2.findElement(index12)); assertSame(index23, schema2.findElement(index13)); } public void testReadSchema() throws Exception { IDBSchema schema = DBUtil.readSchema(adapter, getConnection(), SCHEMA_NAME); assertEquals(true, schema.isEmpty()); } public void testCreateSchema() throws Exception { IDBDatabase database = DBUtil.openDatabase(adapter, connectionProvider, SCHEMA_NAME); IDBSchema schema = database.getSchema(); assertEquals(true, schema.isLocked()); assertEquals(true, schema.isEmpty()); IDBSchemaTransaction schemaTransaction = database.openSchemaTransaction(); IDBSchema workingCopy = schemaTransaction.getWorkingCopy(); assertEquals(false, workingCopy.isLocked()); assertEquals(true, workingCopy.isEmpty()); assertEquals(schema, workingCopy); IDBTable table1 = workingCopy.addTable("table1"); IDBField field11 = table1.addField("field11", DBType.INTEGER, true); IDBField field12 = table1.addField("field12", DBType.VARCHAR, 64, true); IDBField field13 = table1.addField("field13", DBType.BOOLEAN); IDBIndex index11 = table1.addIndex("index11", IDBIndex.Type.PRIMARY_KEY, field11, field12); IDBIndex index12 = table1.addIndex("index12", IDBIndex.Type.UNIQUE, field11, field12); IDBIndex index13 = table1.addIndex("index13", IDBIndex.Type.NON_UNIQUE, field12); IDBTable table2 = workingCopy.addTable("table2"); IDBField field21 = table2.addField("field21", DBType.INTEGER, true); IDBField field22 = table2.addField("field22", DBType.VARCHAR, 64, true); IDBField field23 = table2.addField("field23", DBType.BOOLEAN); IDBIndex index21 = table2.addIndex("index21", IDBIndex.Type.PRIMARY_KEY, field21, field22); IDBIndex index22 = table2.addIndex("index22", IDBIndex.Type.UNIQUE, field21, field22); IDBIndex index23 = table2.addIndex("index23", IDBIndex.Type.NON_UNIQUE, field22); schemaTransaction.commit(); assertEquals(true, schema.isLocked()); assertEquals(false, schema.isEmpty()); assertEquals(2, schema.getTables().length); assertEquals(table1, schema.getTables()[0]); assertEquals(table1.getFieldCount(), schema.getTables()[0].getFieldCount()); assertEquals(field11, schema.getTables()[0].getField(0)); assertEquals(field12, schema.getTables()[0].getField(1)); assertEquals(field13, schema.getTables()[0].getField(2)); assertEquals(table1.getIndexCount(), schema.getTables()[0].getIndexCount()); assertEquals(index11, schema.getTables()[0].getIndex(0)); assertEquals(index11.getType(), schema.getTables()[0].getIndex(0).getType()); assertEquals(index12, schema.getTables()[0].getIndex(1)); assertEquals(index12.getType(), schema.getTables()[0].getIndex(1).getType()); assertEquals(index13, schema.getTables()[0].getIndex(2)); assertEquals(index13.getType(), schema.getTables()[0].getIndex(2).getType()); assertEquals(table2, schema.getTables()[1]); assertEquals(table2.getFieldCount(), schema.getTables()[1].getFieldCount()); assertEquals(field21, schema.getTables()[1].getField(0)); assertEquals(field22, schema.getTables()[1].getField(1)); assertEquals(field23, schema.getTables()[1].getField(2)); assertEquals(table2.getIndexCount(), schema.getTables()[1].getIndexCount()); assertEquals(index21, schema.getTables()[1].getIndex(0)); assertEquals(index21.getType(), schema.getTables()[1].getIndex(0).getType()); assertEquals(index22, schema.getTables()[1].getIndex(1)); assertEquals(index22.getType(), schema.getTables()[1].getIndex(1).getType()); assertEquals(index23, schema.getTables()[1].getIndex(2)); assertEquals(index23.getType(), schema.getTables()[1].getIndex(2).getType()); } public void testChangeSchema() throws Exception { // Init database IDBDatabase database = DBUtil.openDatabase(adapter, connectionProvider, SCHEMA_NAME); IDBSchema schema = database.getSchema(); IDBSchemaTransaction schemaTransaction = database.openSchemaTransaction(); IDBSchema workingCopy = schemaTransaction.getWorkingCopy(); IDBTable table1 = workingCopy.addTable("table1"); IDBField field11 = table1.addField("field11", DBType.INTEGER, true); IDBField field12 = table1.addField("field12", DBType.VARCHAR, 64, true); IDBField field13 = table1.addField("field13", DBType.BOOLEAN); IDBIndex index11 = table1.addIndex("index11", IDBIndex.Type.PRIMARY_KEY, field11, field12); IDBIndex index12 = table1.addIndex("index12", IDBIndex.Type.UNIQUE, field11, field12); IDBIndex index13 = table1.addIndex("index13", IDBIndex.Type.NON_UNIQUE, field12); schemaTransaction.commit(); assertEquals(1, schema.getTables().length); // Reload database IDBDatabase database2 = DBUtil.openDatabase(adapter, connectionProvider, SCHEMA_NAME); IDBSchema schema2 = database2.getSchema(); DBUtil.dump(schema2); assertEquals(true, schema2.isLocked()); assertEquals(false, schema2.isEmpty()); assertEquals(1, schema2.getTables().length); IDBTable table = schema2.getTable("table1"); field11 = table.getField("field11"); field12 = table.getField("field12"); field13 = table.getField("field13"); index11 = table.getIndex("index11"); index12 = table.getIndex("index12"); index13 = table.getIndex("index13"); assertNotNull(field11); assertNotNull(field12); assertNotNull(field13); assertNotNull(index11); assertNotNull(index12); assertNotNull(index13); schemaTransaction = database2.openSchemaTransaction(); workingCopy = schemaTransaction.getWorkingCopy(); assertEquals(true, schema2.isLocked()); assertEquals(false, schema2.isEmpty()); assertEquals(1, schema2.getTables().length); IDBTable table2 = workingCopy.addTable("table2"); IDBField field21 = table2.addField("field21", DBType.INTEGER, true); IDBField field22 = table2.addField("field22", DBType.VARCHAR, 64, true); IDBField field23 = table2.addField("field23", DBType.BOOLEAN); IDBIndex index21 = table2.addIndex("index21", IDBIndex.Type.PRIMARY_KEY, field21, field22); IDBIndex index22 = table2.addIndex("index22", IDBIndex.Type.UNIQUE, field21, field22); IDBIndex index23 = table2.addIndex("index23", IDBIndex.Type.NON_UNIQUE, field22); assertEquals(table1, schema2.getTables()[0]); assertEquals(table1.getFieldCount(), schema2.getTables()[0].getFieldCount()); assertEquals(field11, schema2.getTables()[0].getField(0)); assertEquals(field12, schema2.getTables()[0].getField(1)); assertEquals(field13, schema2.getTables()[0].getField(2)); assertEquals(table1.getIndexCount(), schema2.getTables()[0].getIndexCount()); assertEquals(index11, schema2.getTables()[0].getIndex(0)); assertEquals(index11.getType(), schema2.getTables()[0].getIndex(0).getType()); assertEquals(index12, schema2.getTables()[0].getIndex(1)); assertEquals(index12.getType(), schema2.getTables()[0].getIndex(1).getType()); assertEquals(index13, schema2.getTables()[0].getIndex(2)); assertEquals(index13.getType(), schema2.getTables()[0].getIndex(2).getType()); IDBSchemaDelta delta = schemaTransaction.commit(); DBUtil.dump(delta); assertEquals(true, schema2.isLocked()); assertEquals(false, schema2.isEmpty()); assertEquals(2, schema2.getTables().length); assertEquals(table1, schema2.getTables()[0]); assertEquals(table1.getFieldCount(), schema2.getTables()[0].getFieldCount()); assertEquals(field11, schema2.getTables()[0].getField(0)); assertEquals(field12, schema2.getTables()[0].getField(1)); assertEquals(field13, schema2.getTables()[0].getField(2)); assertEquals(table1.getIndexCount(), schema2.getTables()[0].getIndexCount()); assertEquals(index11, schema2.getTables()[0].getIndex(0)); assertEquals(index11.getType(), schema2.getTables()[0].getIndex(0).getType()); assertEquals(index12, schema2.getTables()[0].getIndex(1)); assertEquals(index12.getType(), schema2.getTables()[0].getIndex(1).getType()); assertEquals(index13, schema2.getTables()[0].getIndex(2)); assertEquals(index13.getType(), schema2.getTables()[0].getIndex(2).getType()); assertEquals(table2, schema2.getTables()[1]); assertEquals(table2.getFieldCount(), schema2.getTables()[1].getFieldCount()); assertEquals(field21, schema2.getTables()[1].getField(0)); assertEquals(field22, schema2.getTables()[1].getField(1)); assertEquals(field23, schema2.getTables()[1].getField(2)); assertEquals(table2.getIndexCount(), schema2.getTables()[1].getIndexCount()); assertEquals(index21, schema2.getTables()[1].getIndex(0)); assertEquals(index21.getType(), schema2.getTables()[1].getIndex(0).getType()); assertEquals(index22, schema2.getTables()[1].getIndex(1)); assertEquals(index22.getType(), schema2.getTables()[1].getIndex(1).getType()); assertEquals(index23, schema2.getTables()[1].getIndex(2)); assertEquals(index23.getType(), schema2.getTables()[1].getIndex(2).getType()); } public void testEnsureSchema() throws Exception { { // Init database IDBDatabase database = DBUtil.openDatabase(adapter, connectionProvider, SCHEMA_NAME); IDBSchemaTransaction schemaTransaction = database.openSchemaTransaction(); IDBSchema workingCopy = schemaTransaction.getWorkingCopy(); IDBTable table1 = workingCopy.addTable("table1"); table1.addField("field11", DBType.INTEGER, true); table1.addField("field12", DBType.VARCHAR, 64, true); table1.addField("field13", DBType.BOOLEAN); schemaTransaction.commit(); } IDBSchema newSchema = DBUtil.createSchema("DIFFERENT_NAME"); IDBTable table2 = newSchema.addTable("table2"); IDBField field21 = table2.addField("field21", DBType.INTEGER, true); IDBField field22 = table2.addField("field22", DBType.VARCHAR, 64, true); table2.addField("field23", DBType.BOOLEAN); table2.addIndex("index21", IDBIndex.Type.PRIMARY_KEY, field21, field22); table2.addIndex("index22", IDBIndex.Type.UNIQUE, field21, field22); table2.addIndex("index23", IDBIndex.Type.NON_UNIQUE, field22); // Reload database IDBDatabase database = DBUtil.openDatabase(adapter, connectionProvider, SCHEMA_NAME); IDBSchemaTransaction schemaTransaction = database.openSchemaTransaction(); schemaTransaction.ensureSchema(newSchema); schemaTransaction.commit(); IDBSchema schema = database.getSchema(); assertEquals(true, schema.isLocked()); assertEquals(false, schema.isEmpty()); assertEquals(SCHEMA_NAME, schema.getName()); assertEquals(2, schema.getTables().length); DBUtil.dump(schema); } }