Author: cbegin Date: Fri Aug 8 13:13:28 2008 New Revision: 684074 URL: http://svn.apache.org/viewvc?rev=684074&view=rev Log: Added DB Metadata classes
Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Column.java (with props) ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Database.java (with props) ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/DatabaseFactory.java (with props) ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Table.java (with props) ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/metadata/ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/metadata/MetadataTest.java (with props) Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Column.java URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Column.java?rev=684074&view=auto ============================================================================== --- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Column.java (added) +++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Column.java Fri Aug 8 13:13:28 2008 @@ -0,0 +1,40 @@ +package org.apache.ibatis.metadata; + +public class Column { + + private String name; + private int type; + + public Column(String name, int type) { + this.name = name; + this.type = type; + } + + public String getName() { + return name; + } + + public int getType() { + return type; + } + + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + final Column column = (Column) o; + + if (type != column.type) return false; + if (name != null ? !name.equals(column.name) : column.name != null) return false; + + return true; + } + + public int hashCode() { + int result; + result = (name != null ? name.hashCode() : 0); + result = 29 * result + type; + return result; + } + +} Propchange: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Column.java ------------------------------------------------------------------------------ svn:executable = * Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Database.java URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Database.java?rev=684074&view=auto ============================================================================== --- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Database.java (added) +++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Database.java Fri Aug 8 13:13:28 2008 @@ -0,0 +1,57 @@ +package org.apache.ibatis.metadata; + +import java.util.HashMap; +import java.util.Map; + +public class Database { + + private String catalog; + private String schema; + + private Map tables = new HashMap(); + + public Database(String catalog, String schema) { + this.catalog = catalog; + this.schema = schema; + } + + public String getCatalog() { + return catalog; + } + + public String getSchema() { + return schema; + } + + public void addTable(Table table) { + tables.put(table.getName().toUpperCase(), table); + } + + public Table getTable(String name) { + return (Table)tables.get(name.toUpperCase()); + } + + public String[] getTableNames() { + return (String[])tables.keySet().toArray(new String[tables.size()]); + } + + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + final Database database = (Database) o; + + if (catalog != null ? !catalog.equals(database.catalog) : database.catalog != null) return false; + if (schema != null ? !schema.equals(database.schema) : database.schema != null) return false; + + return true; + } + + public int hashCode() { + int result; + result = (catalog != null ? catalog.hashCode() : 0); + result = 29 * result + (schema != null ? schema.hashCode() : 0); + return result; + } + +} Propchange: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Database.java ------------------------------------------------------------------------------ svn:executable = * Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/DatabaseFactory.java URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/DatabaseFactory.java?rev=684074&view=auto ============================================================================== --- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/DatabaseFactory.java (added) +++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/DatabaseFactory.java Fri Aug 8 13:13:28 2008 @@ -0,0 +1,58 @@ +package org.apache.ibatis.metadata; + +import javax.sql.DataSource; +import java.sql.*; + +public class DatabaseFactory { + private DatabaseFactory() { + } + + public static Database newDatabase(DataSource dataSource, String catalogFilter, String schemaFilter) throws SQLException { + Database database = new Database(catalogFilter, schemaFilter); + Connection conn = dataSource.getConnection(); + ResultSet rs = null; + try { + DatabaseMetaData dbmd = conn.getMetaData(); + + try { + rs = dbmd.getColumns(catalogFilter, schemaFilter, null, null); + while (rs.next()) { + String catalogName = rs.getString("TABLE_CAT"); + String schemaName = rs.getString("TABLE_SCHEM"); + String tableName = rs.getString("TABLE_NAME"); + String columnName = rs.getString("COLUMN_NAME"); + int dataType = Integer.parseInt(rs.getString("DATA_TYPE")); + Table table = database.getTable(tableName); + if (table == null) { + table = new Table(tableName); + table.setCatalog(catalogName); + table.setSchema(schemaName); + database.addTable(table); + } + table.addColumn(new Column(columnName, dataType)); + } + } finally { + if (rs != null) rs.close(); + } + + try { + String[] tableNames = database.getTableNames(); + for (int i=0; i < tableNames.length; i++) { + Table table = database.getTable(tableNames[i]); + rs = dbmd.getPrimaryKeys(catalogFilter, schemaFilter, table.getName()); + if (rs.next()) { + String columnName = rs.getString("COLUMN_NAME"); + table.setPrimaryKey (table.getColumn(columnName)); + } + } + } finally { + if (rs != null) rs.close(); + } + + } finally { + conn.close(); + } + return database; + } + +} Propchange: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/DatabaseFactory.java ------------------------------------------------------------------------------ svn:executable = * Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Table.java URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Table.java?rev=684074&view=auto ============================================================================== --- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Table.java (added) +++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Table.java Fri Aug 8 13:13:28 2008 @@ -0,0 +1,69 @@ +package org.apache.ibatis.metadata; + +import java.util.HashMap; +import java.util.Map; + +public class Table { + private String name; + private String catalog; + private String schema; + private Map columns = new HashMap(); + private Column primaryKey; + + public Table(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public String getCatalog() { + return catalog; + } + + public void setCatalog(String catalog) { + this.catalog = catalog; + } + + public String getSchema() { + return schema; + } + + public void setSchema(String schema) { + this.schema = schema; + } + + public void addColumn(Column col) { + columns.put(col.getName().toUpperCase(), col); + } + + public Column getColumn(String name) { + return (Column) columns.get(name.toUpperCase()); + } + + public String[] getColumnNames() { + return (String[]) columns.keySet().toArray(new String[columns.size()]); + } + + public void setPrimaryKey(Column column) { + primaryKey = column; + } + + public Column getPrimaryKey() { + return primaryKey; + } + + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + final Table table = (Table) o; + if (name != null ? !name.equals(table.name) : table.name != null) return false; + return true; + } + + public int hashCode() { + return (name != null ? name.hashCode() : 0); + } + +} Propchange: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/metadata/Table.java ------------------------------------------------------------------------------ svn:executable = * Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/metadata/MetadataTest.java URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/metadata/MetadataTest.java?rev=684074&view=auto ============================================================================== --- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/metadata/MetadataTest.java (added) +++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/metadata/MetadataTest.java Fri Aug 8 13:13:28 2008 @@ -0,0 +1,59 @@ +package org.apache.ibatis.metadata; + +import org.apache.ibatis.BaseDataTest; +import org.junit.Test; +import org.junit.Before; + +import javax.sql.DataSource; + +import junit.framework.Assert; + +import java.sql.Types; + +public class MetadataTest extends BaseDataTest { + + private DataSource dataSource; + + @Before + public void setup() throws Exception { + dataSource = createSimpleDataSource(BaseDataTest.BLOG_PROPERTIES); + } + + @Test + public void testShouldGetAllTableNames() throws Exception { + Database db = DatabaseFactory.newDatabase(dataSource,null,"APP"); + Assert.assertNotNull(db.getTable("blog")); + Assert.assertNotNull(db.getTable("Author")); + Assert.assertNotNull(db.getTable("tAg")); + Assert.assertNotNull(db.getTable("PosT")); + } + + @Test + public void testShouldEnsureDatabasesTablesAndColumnsEqualityWorks() throws Exception { + Database db = DatabaseFactory.newDatabase(dataSource, null, null); + Database db2 = DatabaseFactory.newDatabase(dataSource, null, null); + Assert.assertNotNull(db); + Assert.assertTrue(db.equals(db2)); + Assert.assertTrue(db.hashCode() == db.hashCode()); + Table t = db.getTable("blog"); + Table t2 = db.getTable("author"); + Assert.assertNotNull(t); + Assert.assertNotNull(t2); + Assert.assertFalse(t.equals(t2)); + Assert.assertTrue(t.getCatalog().equals(t.getCatalog())); + Assert.assertTrue(t.getSchema().equals(t.getSchema())); + Assert.assertTrue(t.equals(t)); + Assert.assertTrue(t.hashCode() == t.hashCode()); + Assert.assertEquals("BLOG",t.getName()); + Assert.assertEquals(3, t.getColumnNames().length); + Column c = t.getColumn("author_id"); + Column c2 = t.getColumn("id"); + Assert.assertNotNull(c); + Assert.assertNotNull(c2); + Assert.assertEquals(Types.INTEGER, c.getType()); + Assert.assertFalse(c.equals(c2)); + Assert.assertTrue(c.equals(c)); + Assert.assertTrue(c.hashCode() == c.hashCode()); + } + +} Propchange: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/metadata/MetadataTest.java ------------------------------------------------------------------------------ svn:executable = *