diff --git a/src/org/hwo/sql/Schema.java b/src/org/hwo/sql/Schema.java
new file mode 100644
index 0000000..2f8698f
--- /dev/null
+++ b/src/org/hwo/sql/Schema.java
@@ -0,0 +1,147 @@
+package org.hwo.sql;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hwo.StringHelper;
+
+public class Schema {
+
+ Connection database;
+ List
tables;
+
+ public Schema(Connection database){
+ this.database = database;
+ this.tables = new ArrayList();
+
+ scanTables();
+ }
+
+ private void scanTables(){
+ ResultSet rsTables;
+ try {
+ rsTables = database.getMetaData().getTables(null, null, null, new String[]{"TABLE"});
+ while (rsTables.next()){
+ tables.add(new Table(rsTables.getString("TABLE_NAME")));
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+
+ public void print(){
+
+ for (Table t: tables){
+ System.err.println(t.toString());
+ }
+ }
+
+
+ public class Table {
+ private String name;
+ private ArrayList columns;
+
+ public Table(String name) throws SQLException{
+ this.name = name;
+ this.columns = new ArrayList();
+ scan();
+ }
+ public Table(){
+ this.name = "";
+ this.columns = new ArrayList();
+ }
+
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ Column[] getColumns(){
+ return columns.toArray(new Column[0]);
+ }
+
+ Column getColumn(String name){
+ for (Column c: columns){
+ if (c.getName().equals(name))
+ return c;
+ }
+ return null;
+ }
+
+ void addColumn(Column c){
+ columns.add(c);
+ }
+ void removeColumn(Column c){
+ columns.remove(c);
+ }
+ void removeColumn(String name){
+ columns.remove(getColumn(name));
+ }
+
+ private void scan() throws SQLException {
+ ResultSet rsColumns = database.getMetaData().getColumns(null, null, name, null);
+
+ while (rsColumns.next()){
+ addColumn(new Column(rsColumns.getString("COLUMN_NAME"), rsColumns.getString("TYPE_NAME"), rsColumns.getInt("COLUMN_SIZE")));
+ }
+
+ }
+
+
+ @Override
+ public String toString() {
+ return String.format("TABLE %s (%s)",name,StringHelper.join(columns, ","));
+ }
+
+ public class Column {
+ private String name;
+ private String sqltype;
+ private Integer size;
+
+ public Column(String name,String sqltype,Integer size) {
+ this.name = name;
+ this.sqltype = sqltype;
+ this.size = size;
+ }
+
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getSqltype() {
+ return sqltype;
+ }
+ public void setSqltype(String sqltype) {
+ this.sqltype = sqltype;
+ }
+
+ public Integer getSize() {
+ return size;
+ }
+ public void setSize(Integer size) {
+ this.size = size;
+ }
+
+ @Override
+ public String toString() {
+ if (!size.equals(0)){
+ return String.format("%s %s(%d)", name, sqltype, size);
+ } else {
+ return String.format("%s %s", name, sqltype);
+ }
+ }
+ }
+
+ }
+
+}