/**
         * Method declaration
         *
         *
         * @param name
         * @param channel
         *
         * @return
         *
         * @throws Exception
         */
        public Table getSystemTable(string name, Channel channel)
        {
            if (name.Equals("SYSTEM_PROCEDURES"))
            {
                Table t = createTable(name);

                t.addColumn("PROCEDURE_" + META_CAT, Column.VARCHAR);
                t.addColumn("PROCEDURE_" + META_SCHEM, Column.VARCHAR);
                t.addColumn("PROCEDURE_NAME", Column.VARCHAR);
                t.addColumn("NUM_INPUT_PARAMS", Column.INTEGER);
                t.addColumn("NUM_OUTPUT_PARAMS", Column.INTEGER);
                t.addColumn("NUM_RESULT_SETS", Column.INTEGER);
                t.addColumn("REMARKS", Column.VARCHAR);
                t.addColumn("PROCEDURE_TYPE", Column.SMALLINT);
                t.createPrimaryKey();

                return t;
            }
            else if (name.Equals("SYSTEM_PROCEDURECOLUMNS"))
            {
                Table t = createTable(name);

                t.addColumn("PROCEDURE_" + META_CAT, Column.VARCHAR);
                t.addColumn("PROCEDURE_" + META_SCHEM, Column.VARCHAR);
                t.addColumn("PROCEDURE_NAME", Column.VARCHAR);
                t.addColumn("COLUMN_NAME", Column.VARCHAR);
                t.addColumn("COLUMN_TYPE", Column.SMALLINT);
                t.addColumn("DATA_TYPE", Column.SMALLINT);
                t.addColumn("TYPE_NAME", Column.VARCHAR);
                t.addColumn("PRECISION", Column.INTEGER);
                t.addColumn("LENGTH", Column.INTEGER);
                t.addColumn("SCALE", Column.SMALLINT);
                t.addColumn("RADIX", Column.SMALLINT);
                t.addColumn("NULLABLE", Column.SMALLINT);
                t.addColumn("REMARKS", Column.VARCHAR);
                t.createPrimaryKey();

                return t;
            }
            else if (name.Equals("SYSTEM_TABLES"))
            {
                Table t = createTable(name);

                t.addColumn("TABLE_" + META_CAT, Column.VARCHAR);
                t.addColumn("TABLE_" + META_SCHEM, Column.VARCHAR);
                t.addColumn("TABLE_NAME", Column.VARCHAR);
                t.addColumn("TABLE_TYPE", Column.VARCHAR);
                t.addColumn("REMARKS", Column.VARCHAR);
                t.createPrimaryKey();

                for (int i = 0; i < tTable.Count; i++)
                {
                    Table  table = (Table) tTable[i];
                    object[] o = t.getNewRow();

                    o[2] = table.getName();
                    o[3] = "TABLE";

                    t.insert(o, null);
                }

                return t;
            }
            else if (name.Equals("SYSTEM_SCHEMAS"))
            {
                Table t = createTable(name);

                t.addColumn("TABLE_" + META_SCHEM, Column.VARCHAR);
                t.createPrimaryKey();

                return t;
            }
            else if (name.Equals("SYSTEM_CATALOGS"))
            {
                Table t = createTable(name);

                t.addColumn("TABLE_" + META_CAT, Column.VARCHAR);
                t.createPrimaryKey();

                return t;
            }
            else if (name.Equals("SYSTEM_TABLETYPES"))
            {
                Table t = createTable(name);

                t.addColumn("TABLE_TYPE", Column.VARCHAR);
                t.createPrimaryKey();

                object[] o = t.getNewRow();

                o[0] = "TABLE";

                t.insert(o, null);

                return t;
            }
            else if (name.Equals("SYSTEM_COLUMNS"))
            {
                Table t = createTable(name);

                t.addColumn("TABLE_" + META_CAT, Column.VARCHAR);
                t.addColumn("TABLE_" + META_SCHEM, Column.VARCHAR);
                t.addColumn("TABLE_NAME", Column.VARCHAR);
                t.addColumn("COLUMN_NAME", Column.VARCHAR);
                t.addColumn("DATA_TYPE", Column.SMALLINT);
                t.addColumn("TYPE_NAME", Column.VARCHAR);
                t.addColumn(META_COLUMN_SIZE, Column.INTEGER);
                t.addColumn(META_BUFFER_LENGTH, Column.INTEGER);
                t.addColumn(META_DECIMAL_DIGITS, Column.INTEGER);
                t.addColumn(META_NUM_PREC_RADIX, Column.INTEGER);
                t.addColumn("NULLABLE", Column.INTEGER);
                t.addColumn("REMARKS", Column.VARCHAR);

                // Access and Intersolv do not return this fields
                t.addColumn("COLUMN_DEF", Column.VARCHAR);
                t.addColumn("SQL_DATA_TYPE", Column.VARCHAR);
                t.addColumn("SQL_DATETIME_SUB", Column.INTEGER);
                t.addColumn("CHAR_OCTET_LENGTH", Column.INTEGER);
                t.addColumn("ORDINAL_POSITION", Column.VARCHAR);
                t.addColumn("IS_NULLABLE", Column.VARCHAR);
                t.createPrimaryKey();

                for (int i = 0; i < tTable.Count; i++)
                {
                    Table table = (Table) tTable[i];
                    int   columns = table.getColumnCount();

                    for (int j = 0; j < columns; j++)
                    {
                        object[] o = t.getNewRow();

                        o[2] = table.getName();
                        o[3] = table.getColumnName(j);
                        o[4] = table.getColumnType(j);
                        o[5] = Column.getType(table.getColumnType(j));

                        int nullable;

                        if (table.getColumnIsNullable(j))
                        {
                            nullable = true.ToInt32();
                        }
                        else
                        {
                            nullable = false.ToInt32();
                        }

                        o[10] = nullable;

                        if (table.getIdentityColumn() == j)
                        {
                            o[11] = "IDENTITY";
                        }

                        t.insert(o, null);
                    }
                }

                return t;
            }
            else if (name.Equals("SYSTEM_COLUMNPRIVILEGES"))
            {
                Table t = createTable(name);

                t.addColumn("TABLE_" + META_CAT, Column.VARCHAR);
                t.addColumn("TABLE_" + META_SCHEM, Column.VARCHAR);
                t.addColumn("TABLE_NAME", Column.VARCHAR);
                t.addColumn("COLUMN_NAME", Column.VARCHAR);
                t.addColumn("GRANTOR", Column.VARCHAR);
                t.addColumn("GRANTEE", Column.VARCHAR);
                t.addColumn("PRIVILEGE", Column.VARCHAR);
                t.addColumn("IS_GRANTABLE", Column.VARCHAR);
                t.createPrimaryKey();

                /*
                 * // todo: get correct info
                 * for(int i=0;i<tTable.size();i++) {
                 * Table table=(Table)tTable.elementAt(i);
                 * int columns=table.getColumnCount();
                 * for(int j=0;j<columns;j++) {
                 * object o[]=t.getNewRow();
                 * o[2]=table.getName();
                 * o[3]=table.getColumnName(j);
                 * o[4]="sa";
                 * o[6]="FULL";
                 * o[7]="NO";
                 * t.insert(o,null);
                 * }
                 * }
                 */
                return t;
            }
            else if (name.Equals("SYSTEM_TABLEPRIVILEGES"))
            {
                Table t = createTable(name);

                t.addColumn("TABLE_" + META_CAT, Column.VARCHAR);
                t.addColumn("TABLE_" + META_SCHEM, Column.VARCHAR);
                t.addColumn("TABLE_NAME", Column.VARCHAR);
                t.addColumn("GRANTOR", Column.VARCHAR);
                t.addColumn("GRANTEE", Column.VARCHAR);
                t.addColumn("PRIVILEGE", Column.VARCHAR);
                t.addColumn("IS_GRANTABLE", Column.VARCHAR);
                t.createPrimaryKey();

                for (int i = 0; i < tTable.Count; i++)
                {
                    Table  table = (Table) tTable[i];
                    object[] o = t.getNewRow();

                    o[2] = table.getName();
                    o[3] = "sa";
                    o[5] = "FULL";

                    t.insert(o, null);
                }

                return t;
            }
            else if (name.Equals("SYSTEM_BESTROWIDENTIFIER"))
            {
                Table t = createTable(name);

                t.addColumn("SCOPE", Column.SMALLINT);
                t.addColumn("COLUMN_NAME", Column.VARCHAR);
                t.addColumn("DATA_TYPE", Column.SMALLINT);
                t.addColumn("TYPE_NAME", Column.VARCHAR);
                t.addColumn(META_COLUMN_SIZE, Column.INTEGER);
                t.addColumn(META_BUFFER_LENGTH, Column.INTEGER);
                t.addColumn(META_DECIMAL_DIGITS, Column.SMALLINT);
                t.addColumn("PSEUDO_COLUMN", Column.SMALLINT);
                t.createPrimaryKey();

                return t;
            }
            else if (name.Equals("SYSTEM_VERSIONCOLUMNS"))
            {
                Table t = createTable(name);

                t.addColumn("SCOPE", Column.INTEGER);
                t.addColumn("COLUMN_NAME", Column.VARCHAR);
                t.addColumn("DATA_TYPE", Column.SMALLINT);
                t.addColumn("TYPE_NAME", Column.VARCHAR);
                t.addColumn(META_COLUMN_SIZE, Column.SMALLINT);
                t.addColumn(META_BUFFER_LENGTH, Column.INTEGER);
                t.addColumn(META_DECIMAL_DIGITS, Column.SMALLINT);
                t.addColumn("PSEUDO_COLUMN", Column.SMALLINT);
                t.createPrimaryKey();

                return t;
            }
            else if (name.Equals("SYSTEM_PRIMARYKEYS"))
            {
                Table t = createTable(name);

                t.addColumn("TABLE_" + META_CAT, Column.VARCHAR);
                t.addColumn("TABLE_" + META_SCHEM, Column.VARCHAR);
                t.addColumn("TABLE_NAME", Column.VARCHAR);
                t.addColumn("COLUMN_NAME", Column.VARCHAR);
                t.addColumn("KEY_SEQ", Column.SMALLINT);
                t.addColumn("PK_NAME", Column.VARCHAR);
                t.createPrimaryKey();

                for (int i = 0; i < tTable.Count; i++)
                {
                    Table table = (Table) tTable[i];
                    Index index = table.getIndex("SYSTEM_PK");
                    int[]   cols = index.getColumns();
                    int   len = cols.Length;

                    for (int j = 0; j < len; j++)
                    {
                        object[] o = t.getNewRow();

                        o[2] = table.getName();
                        o[3] = table.getColumnName(cols[j]);
                        o[4] = j + 1;
                        o[5] = "SYSTEM_PK";

                        t.insert(o, null);
                    }
                }

                return t;
            }
            else if (name.Equals("SYSTEM_IMPORTEDKEYS"))
            {
                Table t = createTable(name);

                t.addColumn("PKTABLE_" + META_CAT, Column.VARCHAR);
                t.addColumn("PKTABLE_" + META_SCHEM, Column.VARCHAR);
                t.addColumn("PKTABLE_NAME", Column.VARCHAR);
                t.addColumn("PKCOLUMN_NAME", Column.VARCHAR);
                t.addColumn("FKTABLE_" + META_CAT, Column.VARCHAR);
                t.addColumn("FKTABLE_" + META_SCHEM, Column.VARCHAR);
                t.addColumn("FKTABLE_NAME", Column.VARCHAR);
                t.addColumn("FKCOLUMN_NAME", Column.VARCHAR);
                t.addColumn("KEY_SEQ", Column.SMALLINT);
                t.addColumn("UPDATE_RULE", Column.SMALLINT);
                t.addColumn("DELETE_RULE", Column.SMALLINT);
                t.addColumn("FK_NAME", Column.VARCHAR);
                t.addColumn("PK_NAME", Column.VARCHAR);
                t.addColumn("DEFERRABILITY", Column.SMALLINT);
                t.createPrimaryKey();

                return t;
            }
            else if (name.Equals("SYSTEM_EXPORTEDKEYS"))
            {
                Table t = createTable(name);

                t.addColumn("PKTABLE_" + META_CAT, Column.VARCHAR);
                t.addColumn("PKTABLE_" + META_SCHEM, Column.VARCHAR);
                t.addColumn("PKTABLE_NAME", Column.VARCHAR);
                t.addColumn("PKCOLUMN_NAME", Column.VARCHAR);
                t.addColumn("FKTABLE_" + META_CAT, Column.VARCHAR);
                t.addColumn("FKTABLE_" + META_SCHEM, Column.VARCHAR);
                t.addColumn("FKTABLE_NAME", Column.VARCHAR);
                t.addColumn("FKCOLUMN_NAME", Column.VARCHAR);
                t.addColumn("KEY_SEQ", Column.SMALLINT);
                t.addColumn("UPDATE_RULE", Column.SMALLINT);
                t.addColumn("DELETE_RULE", Column.SMALLINT);
                t.addColumn("FK_NAME", Column.VARCHAR);
                t.addColumn("PK_NAME", Column.VARCHAR);
                t.addColumn("DEFERRABILITY", Column.SMALLINT);
                t.createPrimaryKey();

                return t;
            }
            else if (name.Equals("SYSTEM_CROSSREFERENCE"))
            {
                Table t = createTable(name);

                t.addColumn("PKTABLE_" + META_CAT, Column.VARCHAR);
                t.addColumn("PKTABLE_" + META_SCHEM, Column.VARCHAR);
                t.addColumn("PKTABLE_NAME", Column.VARCHAR);
                t.addColumn("PKCOLUMN_NAME", Column.VARCHAR);
                t.addColumn("FKTABLE_" + META_CAT, Column.VARCHAR);
                t.addColumn("FKTABLE_" + META_SCHEM, Column.VARCHAR);
                t.addColumn("FKTABLE_NAME", Column.VARCHAR);
                t.addColumn("FKCOLUMN_NAME", Column.VARCHAR);
                t.addColumn("KEY_SEQ", Column.INTEGER);
                t.addColumn("UPDATE_RULE", Column.SMALLINT);
                t.addColumn("DELETE_RULE", Column.SMALLINT);
                t.addColumn("FK_NAME", Column.VARCHAR);
                t.addColumn("PK_NAME", Column.VARCHAR);
                t.addColumn("DEFERRABILITY", Column.SMALLINT);
                t.createPrimaryKey();

                return t;
            }
            else if (name.Equals("SYSTEM_TYPEINFO"))
            {
                Table t = createTable(name);

                t.addColumn("TYPE_NAME", Column.VARCHAR);
                t.addColumn("DATA_TYPE", Column.SMALLINT);
                t.addColumn("PRECISION", Column.INTEGER);
                t.addColumn("LITERAL_PREFIX", Column.VARCHAR);
                t.addColumn("LITERAL_SUFFIX", Column.VARCHAR);
                t.addColumn("CREATE_PARAMS", Column.VARCHAR);
                t.addColumn("NULLABLE", Column.SMALLINT);
                t.addColumn("CASE_SENSITIVE", Column.VARCHAR);
                t.addColumn("SEARCHABLE", Column.SMALLINT);
                t.addColumn("UNSIGNED_ATTRIBUTE", Column.BIT);
                t.addColumn(META_FIXED_PREC_SCALE, Column.BIT);
                t.addColumn("AUTO_INCREMENT", Column.BIT);
                t.addColumn("LOCAL_TYPE_NAME", Column.VARCHAR);
                t.addColumn("MINIMUM_SCALE", Column.SMALLINT);
                t.addColumn("MAXIMUM_SCALE", Column.SMALLINT);

                // this columns are not supported by Access and Intersolv
                t.addColumn("SQL_DATE_TYPE", Column.INTEGER);
                t.addColumn("SQL_DATETIME_SUB", Column.INTEGER);
                t.addColumn("NUM_PREC_RADIX", Column.INTEGER);
                t.createPrimaryKey();

                for (int i = 0; i < Column.TYPES.Length; i++)
                {
                    object[] o = t.getNewRow();
                    int    type = Column.TYPES[i];

                    o[0] = Column.getType(type);
                    o[1] = type;
                    o[2] = 0;		 // precision
                    o[6] = true; // need Column to track nullable for this
                    o[7] = true;	 // case sensitive
                    o[8] = true;;
                    o[9] = false;       // unsigned
                    o[10] = (type == Column.NUMERIC	|| type == Column.DECIMAL);
                    o[11] = (type == Column.INTEGER);
                    o[12] = o[0];
                    o[13] = 0;
                    o[14] = 0;    // maximum scale
                    o[15] = 0;
                    o[16] = o[15];
                    o[17] = 10;

                    t.insert(o, null);
                }

                return t;
            }
            else if (name.Equals("SYSTEM_INDEXINFO"))
            {
                Table t = createTable(name);

                t.addColumn("TABLE_" + META_CAT, Column.VARCHAR);
                t.addColumn("TABLE_" + META_SCHEM, Column.VARCHAR);
                t.addColumn("TABLE_NAME", Column.VARCHAR);
                t.addColumn("NON_UNIQUE", Column.BIT);
                t.addColumn("INDEX_QUALIFIER", Column.VARCHAR);
                t.addColumn("INDEX_NAME", Column.VARCHAR);
                t.addColumn("TYPE", Column.SMALLINT);
                t.addColumn(META_ORDINAL_POSITON, Column.SMALLINT);
                t.addColumn("COLUMN_NAME", Column.VARCHAR);
                t.addColumn(META_ASC_OR_DESC, Column.VARCHAR);
                t.addColumn("CARDINALITY", Column.INTEGER);
                t.addColumn("PAGES", Column.INTEGER);
                t.addColumn("FILTER_CONDITION", Column.VARCHAR);
                t.createPrimaryKey();

                for (int i = 0; i < tTable.Count; i++)
                {
                    Table table = (Table) tTable[i];
                    Index index = null;

                    while (true)
                    {
                        index = table.getNextIndex(index);

                        if (index == null)
                        {
                            break;
                        }

                        int[] cols = index.getColumns();
                        int len = cols.Length;

                        // this removes the column that makes every index unique
                        if (!index.isUnique())
                        {
                            len--;
                        }

                        for (int j = 0; j < len; j++)
                        {
                            object[] o = t.getNewRow();

                            o[2] = table.getName();
                            o[3] = !index.isUnique();
                            o[5] = index.getName();
                            o[6] = 1;
                            o[7] = (j + 1);
                            o[8] = table.getColumnName(cols[j]);
                            o[9] = "A";

                            t.insert(o, null);
                        }
                    }
                }

                return t;
            }
            else if (name.Equals("SYSTEM_UDTS"))
            {
                Table t = createTable(name);

                t.addColumn("TYPE_" + META_CAT, Column.VARCHAR);
                t.addColumn("TYPE_" + META_SCHEM, Column.VARCHAR);
                t.addColumn("TYPE_NAME", Column.VARCHAR);
                t.addColumn("CLASS_NAME", Column.BIT);
                t.addColumn("DATA_TYPE", Column.VARCHAR);
                t.addColumn("REMARKS", Column.VARCHAR);
                t.createPrimaryKey();

                return t;
            }
            else if (name.Equals("SYSTEM_CONNECTIONINFO"))
            {
                Table t = createTable(name);

                t.addColumn("KEY", Column.VARCHAR);
                t.addColumn("VALUE", Column.VARCHAR);
                t.createPrimaryKey();

                object[] o = t.getNewRow();

                o[0] = "USER";
                o[1] = channel.getUsername();

                t.insert(o, null);

                o = t.getNewRow();
                o[0] = "READONLY";
                o[1] = channel.isReadOnly() ? "TRUE" : "FALSE";

                t.insert(o, null);

                o = t.getNewRow();
                o[0] = "MAXROWS";
                o[1] = "" + channel.getMaxRows();

                t.insert(o, null);

                o = t.getNewRow();
                o[0] = "DATABASE";
                o[1] = "" + channel.getDatabase().getName();

                t.insert(o, null);

                o = t.getNewRow();
                o[0] = "IDENTITY";
                o[1] = "" + channel.getLastIdentity();

                t.insert(o, null);

                return t;
            }
            else if (name.Equals("SYSTEM_USERS"))
            {
                Table t = createTable(name);

                t.addColumn("USER", Column.VARCHAR);
                t.addColumn("ADMIN", Column.BIT);
                t.createPrimaryKey();

                ArrayList v = aAccess.getUsers();

                for (int i = 0; i < v.Count; i++)
                {
                    User u = (User) v[i];

                    // todo: this is not a nice implementation
                    if (u == null)
                    {
                        continue;
                    }

                    string user = u.getName();

                    if (!user.Equals("PUBLIC"))
                    {
                        object[] o = t.getNewRow();

                        o[0] = user;
                        o[1] = u.isAdmin();

                        t.insert(o, null);
                    }
                }

                return t;
            }

            return null;
        }
Пример #2
0
        /**
         * Method declaration
         *
         *
         * @param name
         * @param channel
         *
         * @return
         *
         * @throws Exception
         */
        public Table getSystemTable(string name, Channel channel)
        {
            if (name.Equals("SYSTEM_PROCEDURES"))
            {
                Table t = createTable(name);

                t.addColumn("PROCEDURE_" + META_CAT, Column.VARCHAR);
                t.addColumn("PROCEDURE_" + META_SCHEM, Column.VARCHAR);
                t.addColumn("PROCEDURE_NAME", Column.VARCHAR);
                t.addColumn("NUM_INPUT_PARAMS", Column.INTEGER);
                t.addColumn("NUM_OUTPUT_PARAMS", Column.INTEGER);
                t.addColumn("NUM_RESULT_SETS", Column.INTEGER);
                t.addColumn("REMARKS", Column.VARCHAR);
                t.addColumn("PROCEDURE_TYPE", Column.SMALLINT);
                t.createPrimaryKey();

                return(t);
            }
            else if (name.Equals("SYSTEM_PROCEDURECOLUMNS"))
            {
                Table t = createTable(name);

                t.addColumn("PROCEDURE_" + META_CAT, Column.VARCHAR);
                t.addColumn("PROCEDURE_" + META_SCHEM, Column.VARCHAR);
                t.addColumn("PROCEDURE_NAME", Column.VARCHAR);
                t.addColumn("COLUMN_NAME", Column.VARCHAR);
                t.addColumn("COLUMN_TYPE", Column.SMALLINT);
                t.addColumn("DATA_TYPE", Column.SMALLINT);
                t.addColumn("TYPE_NAME", Column.VARCHAR);
                t.addColumn("PRECISION", Column.INTEGER);
                t.addColumn("LENGTH", Column.INTEGER);
                t.addColumn("SCALE", Column.SMALLINT);
                t.addColumn("RADIX", Column.SMALLINT);
                t.addColumn("NULLABLE", Column.SMALLINT);
                t.addColumn("REMARKS", Column.VARCHAR);
                t.createPrimaryKey();

                return(t);
            }
            else if (name.Equals("SYSTEM_TABLES"))
            {
                Table t = createTable(name);

                t.addColumn("TABLE_" + META_CAT, Column.VARCHAR);
                t.addColumn("TABLE_" + META_SCHEM, Column.VARCHAR);
                t.addColumn("TABLE_NAME", Column.VARCHAR);
                t.addColumn("TABLE_TYPE", Column.VARCHAR);
                t.addColumn("REMARKS", Column.VARCHAR);
                t.createPrimaryKey();

                for (int i = 0; i < tTable.Count; i++)
                {
                    Table    table = (Table)tTable[i];
                    object[] o     = t.getNewRow();

                    o[2] = table.getName();
                    o[3] = "TABLE";

                    t.insert(o, null);
                }

                return(t);
            }
            else if (name.Equals("SYSTEM_SCHEMAS"))
            {
                Table t = createTable(name);

                t.addColumn("TABLE_" + META_SCHEM, Column.VARCHAR);
                t.createPrimaryKey();

                return(t);
            }
            else if (name.Equals("SYSTEM_CATALOGS"))
            {
                Table t = createTable(name);

                t.addColumn("TABLE_" + META_CAT, Column.VARCHAR);
                t.createPrimaryKey();

                return(t);
            }
            else if (name.Equals("SYSTEM_TABLETYPES"))
            {
                Table t = createTable(name);

                t.addColumn("TABLE_TYPE", Column.VARCHAR);
                t.createPrimaryKey();

                object[] o = t.getNewRow();

                o[0] = "TABLE";

                t.insert(o, null);

                return(t);
            }
            else if (name.Equals("SYSTEM_COLUMNS"))
            {
                Table t = createTable(name);

                t.addColumn("TABLE_" + META_CAT, Column.VARCHAR);
                t.addColumn("TABLE_" + META_SCHEM, Column.VARCHAR);
                t.addColumn("TABLE_NAME", Column.VARCHAR);
                t.addColumn("COLUMN_NAME", Column.VARCHAR);
                t.addColumn("DATA_TYPE", Column.SMALLINT);
                t.addColumn("TYPE_NAME", Column.VARCHAR);
                t.addColumn(META_COLUMN_SIZE, Column.INTEGER);
                t.addColumn(META_BUFFER_LENGTH, Column.INTEGER);
                t.addColumn(META_DECIMAL_DIGITS, Column.INTEGER);
                t.addColumn(META_NUM_PREC_RADIX, Column.INTEGER);
                t.addColumn("NULLABLE", Column.INTEGER);
                t.addColumn("REMARKS", Column.VARCHAR);

                // Access and Intersolv do not return this fields
                t.addColumn("COLUMN_DEF", Column.VARCHAR);
                t.addColumn("SQL_DATA_TYPE", Column.VARCHAR);
                t.addColumn("SQL_DATETIME_SUB", Column.INTEGER);
                t.addColumn("CHAR_OCTET_LENGTH", Column.INTEGER);
                t.addColumn("ORDINAL_POSITION", Column.VARCHAR);
                t.addColumn("IS_NULLABLE", Column.VARCHAR);
                t.createPrimaryKey();

                for (int i = 0; i < tTable.Count; i++)
                {
                    Table table   = (Table)tTable[i];
                    int   columns = table.getColumnCount();

                    for (int j = 0; j < columns; j++)
                    {
                        object[] o = t.getNewRow();

                        o[2] = table.getName();
                        o[3] = table.getColumnName(j);
                        o[4] = table.getColumnType(j);
                        o[5] = Column.getType(table.getColumnType(j));

                        int nullable;

                        if (table.getColumnIsNullable(j))
                        {
                            nullable = true.ToInt32();
                        }
                        else
                        {
                            nullable = false.ToInt32();
                        }

                        o[10] = nullable;

                        if (table.getIdentityColumn() == j)
                        {
                            o[11] = "IDENTITY";
                        }

                        t.insert(o, null);
                    }
                }

                return(t);
            }
            else if (name.Equals("SYSTEM_COLUMNPRIVILEGES"))
            {
                Table t = createTable(name);

                t.addColumn("TABLE_" + META_CAT, Column.VARCHAR);
                t.addColumn("TABLE_" + META_SCHEM, Column.VARCHAR);
                t.addColumn("TABLE_NAME", Column.VARCHAR);
                t.addColumn("COLUMN_NAME", Column.VARCHAR);
                t.addColumn("GRANTOR", Column.VARCHAR);
                t.addColumn("GRANTEE", Column.VARCHAR);
                t.addColumn("PRIVILEGE", Column.VARCHAR);
                t.addColumn("IS_GRANTABLE", Column.VARCHAR);
                t.createPrimaryKey();

                /*
                 * // todo: get correct info
                 * for(int i=0;i<tTable.size();i++) {
                 * Table table=(Table)tTable.elementAt(i);
                 * int columns=table.getColumnCount();
                 * for(int j=0;j<columns;j++) {
                 * object o[]=t.getNewRow();
                 * o[2]=table.getName();
                 * o[3]=table.getColumnName(j);
                 * o[4]="sa";
                 * o[6]="FULL";
                 * o[7]="NO";
                 * t.insert(o,null);
                 * }
                 * }
                 */
                return(t);
            }
            else if (name.Equals("SYSTEM_TABLEPRIVILEGES"))
            {
                Table t = createTable(name);

                t.addColumn("TABLE_" + META_CAT, Column.VARCHAR);
                t.addColumn("TABLE_" + META_SCHEM, Column.VARCHAR);
                t.addColumn("TABLE_NAME", Column.VARCHAR);
                t.addColumn("GRANTOR", Column.VARCHAR);
                t.addColumn("GRANTEE", Column.VARCHAR);
                t.addColumn("PRIVILEGE", Column.VARCHAR);
                t.addColumn("IS_GRANTABLE", Column.VARCHAR);
                t.createPrimaryKey();

                for (int i = 0; i < tTable.Count; i++)
                {
                    Table    table = (Table)tTable[i];
                    object[] o     = t.getNewRow();

                    o[2] = table.getName();
                    o[3] = "sa";
                    o[5] = "FULL";

                    t.insert(o, null);
                }

                return(t);
            }
            else if (name.Equals("SYSTEM_BESTROWIDENTIFIER"))
            {
                Table t = createTable(name);

                t.addColumn("SCOPE", Column.SMALLINT);
                t.addColumn("COLUMN_NAME", Column.VARCHAR);
                t.addColumn("DATA_TYPE", Column.SMALLINT);
                t.addColumn("TYPE_NAME", Column.VARCHAR);
                t.addColumn(META_COLUMN_SIZE, Column.INTEGER);
                t.addColumn(META_BUFFER_LENGTH, Column.INTEGER);
                t.addColumn(META_DECIMAL_DIGITS, Column.SMALLINT);
                t.addColumn("PSEUDO_COLUMN", Column.SMALLINT);
                t.createPrimaryKey();

                return(t);
            }
            else if (name.Equals("SYSTEM_VERSIONCOLUMNS"))
            {
                Table t = createTable(name);

                t.addColumn("SCOPE", Column.INTEGER);
                t.addColumn("COLUMN_NAME", Column.VARCHAR);
                t.addColumn("DATA_TYPE", Column.SMALLINT);
                t.addColumn("TYPE_NAME", Column.VARCHAR);
                t.addColumn(META_COLUMN_SIZE, Column.SMALLINT);
                t.addColumn(META_BUFFER_LENGTH, Column.INTEGER);
                t.addColumn(META_DECIMAL_DIGITS, Column.SMALLINT);
                t.addColumn("PSEUDO_COLUMN", Column.SMALLINT);
                t.createPrimaryKey();

                return(t);
            }
            else if (name.Equals("SYSTEM_PRIMARYKEYS"))
            {
                Table t = createTable(name);

                t.addColumn("TABLE_" + META_CAT, Column.VARCHAR);
                t.addColumn("TABLE_" + META_SCHEM, Column.VARCHAR);
                t.addColumn("TABLE_NAME", Column.VARCHAR);
                t.addColumn("COLUMN_NAME", Column.VARCHAR);
                t.addColumn("KEY_SEQ", Column.SMALLINT);
                t.addColumn("PK_NAME", Column.VARCHAR);
                t.createPrimaryKey();

                for (int i = 0; i < tTable.Count; i++)
                {
                    Table table = (Table)tTable[i];
                    Index index = table.getIndex("SYSTEM_PK");
                    int[] cols  = index.getColumns();
                    int   len   = cols.Length;

                    for (int j = 0; j < len; j++)
                    {
                        object[] o = t.getNewRow();

                        o[2] = table.getName();
                        o[3] = table.getColumnName(cols[j]);
                        o[4] = j + 1;
                        o[5] = "SYSTEM_PK";

                        t.insert(o, null);
                    }
                }

                return(t);
            }
            else if (name.Equals("SYSTEM_IMPORTEDKEYS"))
            {
                Table t = createTable(name);

                t.addColumn("PKTABLE_" + META_CAT, Column.VARCHAR);
                t.addColumn("PKTABLE_" + META_SCHEM, Column.VARCHAR);
                t.addColumn("PKTABLE_NAME", Column.VARCHAR);
                t.addColumn("PKCOLUMN_NAME", Column.VARCHAR);
                t.addColumn("FKTABLE_" + META_CAT, Column.VARCHAR);
                t.addColumn("FKTABLE_" + META_SCHEM, Column.VARCHAR);
                t.addColumn("FKTABLE_NAME", Column.VARCHAR);
                t.addColumn("FKCOLUMN_NAME", Column.VARCHAR);
                t.addColumn("KEY_SEQ", Column.SMALLINT);
                t.addColumn("UPDATE_RULE", Column.SMALLINT);
                t.addColumn("DELETE_RULE", Column.SMALLINT);
                t.addColumn("FK_NAME", Column.VARCHAR);
                t.addColumn("PK_NAME", Column.VARCHAR);
                t.addColumn("DEFERRABILITY", Column.SMALLINT);
                t.createPrimaryKey();

                return(t);
            }
            else if (name.Equals("SYSTEM_EXPORTEDKEYS"))
            {
                Table t = createTable(name);

                t.addColumn("PKTABLE_" + META_CAT, Column.VARCHAR);
                t.addColumn("PKTABLE_" + META_SCHEM, Column.VARCHAR);
                t.addColumn("PKTABLE_NAME", Column.VARCHAR);
                t.addColumn("PKCOLUMN_NAME", Column.VARCHAR);
                t.addColumn("FKTABLE_" + META_CAT, Column.VARCHAR);
                t.addColumn("FKTABLE_" + META_SCHEM, Column.VARCHAR);
                t.addColumn("FKTABLE_NAME", Column.VARCHAR);
                t.addColumn("FKCOLUMN_NAME", Column.VARCHAR);
                t.addColumn("KEY_SEQ", Column.SMALLINT);
                t.addColumn("UPDATE_RULE", Column.SMALLINT);
                t.addColumn("DELETE_RULE", Column.SMALLINT);
                t.addColumn("FK_NAME", Column.VARCHAR);
                t.addColumn("PK_NAME", Column.VARCHAR);
                t.addColumn("DEFERRABILITY", Column.SMALLINT);
                t.createPrimaryKey();

                return(t);
            }
            else if (name.Equals("SYSTEM_CROSSREFERENCE"))
            {
                Table t = createTable(name);

                t.addColumn("PKTABLE_" + META_CAT, Column.VARCHAR);
                t.addColumn("PKTABLE_" + META_SCHEM, Column.VARCHAR);
                t.addColumn("PKTABLE_NAME", Column.VARCHAR);
                t.addColumn("PKCOLUMN_NAME", Column.VARCHAR);
                t.addColumn("FKTABLE_" + META_CAT, Column.VARCHAR);
                t.addColumn("FKTABLE_" + META_SCHEM, Column.VARCHAR);
                t.addColumn("FKTABLE_NAME", Column.VARCHAR);
                t.addColumn("FKCOLUMN_NAME", Column.VARCHAR);
                t.addColumn("KEY_SEQ", Column.INTEGER);
                t.addColumn("UPDATE_RULE", Column.SMALLINT);
                t.addColumn("DELETE_RULE", Column.SMALLINT);
                t.addColumn("FK_NAME", Column.VARCHAR);
                t.addColumn("PK_NAME", Column.VARCHAR);
                t.addColumn("DEFERRABILITY", Column.SMALLINT);
                t.createPrimaryKey();

                return(t);
            }
            else if (name.Equals("SYSTEM_TYPEINFO"))
            {
                Table t = createTable(name);

                t.addColumn("TYPE_NAME", Column.VARCHAR);
                t.addColumn("DATA_TYPE", Column.SMALLINT);
                t.addColumn("PRECISION", Column.INTEGER);
                t.addColumn("LITERAL_PREFIX", Column.VARCHAR);
                t.addColumn("LITERAL_SUFFIX", Column.VARCHAR);
                t.addColumn("CREATE_PARAMS", Column.VARCHAR);
                t.addColumn("NULLABLE", Column.SMALLINT);
                t.addColumn("CASE_SENSITIVE", Column.VARCHAR);
                t.addColumn("SEARCHABLE", Column.SMALLINT);
                t.addColumn("UNSIGNED_ATTRIBUTE", Column.BIT);
                t.addColumn(META_FIXED_PREC_SCALE, Column.BIT);
                t.addColumn("AUTO_INCREMENT", Column.BIT);
                t.addColumn("LOCAL_TYPE_NAME", Column.VARCHAR);
                t.addColumn("MINIMUM_SCALE", Column.SMALLINT);
                t.addColumn("MAXIMUM_SCALE", Column.SMALLINT);

                // this columns are not supported by Access and Intersolv
                t.addColumn("SQL_DATE_TYPE", Column.INTEGER);
                t.addColumn("SQL_DATETIME_SUB", Column.INTEGER);
                t.addColumn("NUM_PREC_RADIX", Column.INTEGER);
                t.createPrimaryKey();

                for (int i = 0; i < Column.TYPES.Length; i++)
                {
                    object[] o    = t.getNewRow();
                    int      type = Column.TYPES[i];

                    o[0]  = Column.getType(type);
                    o[1]  = type;
                    o[2]  = 0;                       // precision
                    o[6]  = true;                    // need Column to track nullable for this
                    o[7]  = true;                    // case sensitive
                    o[8]  = true;;
                    o[9]  = false;                   // unsigned
                    o[10] = (type == Column.NUMERIC || type == Column.DECIMAL);
                    o[11] = (type == Column.INTEGER);
                    o[12] = o[0];
                    o[13] = 0;
                    o[14] = 0;                        // maximum scale
                    o[15] = 0;
                    o[16] = o[15];
                    o[17] = 10;

                    t.insert(o, null);
                }

                return(t);
            }
            else if (name.Equals("SYSTEM_INDEXINFO"))
            {
                Table t = createTable(name);

                t.addColumn("TABLE_" + META_CAT, Column.VARCHAR);
                t.addColumn("TABLE_" + META_SCHEM, Column.VARCHAR);
                t.addColumn("TABLE_NAME", Column.VARCHAR);
                t.addColumn("NON_UNIQUE", Column.BIT);
                t.addColumn("INDEX_QUALIFIER", Column.VARCHAR);
                t.addColumn("INDEX_NAME", Column.VARCHAR);
                t.addColumn("TYPE", Column.SMALLINT);
                t.addColumn(META_ORDINAL_POSITON, Column.SMALLINT);
                t.addColumn("COLUMN_NAME", Column.VARCHAR);
                t.addColumn(META_ASC_OR_DESC, Column.VARCHAR);
                t.addColumn("CARDINALITY", Column.INTEGER);
                t.addColumn("PAGES", Column.INTEGER);
                t.addColumn("FILTER_CONDITION", Column.VARCHAR);
                t.createPrimaryKey();

                for (int i = 0; i < tTable.Count; i++)
                {
                    Table table = (Table)tTable[i];
                    Index index = null;

                    while (true)
                    {
                        index = table.getNextIndex(index);

                        if (index == null)
                        {
                            break;
                        }

                        int[] cols = index.getColumns();
                        int   len  = cols.Length;

                        // this removes the column that makes every index unique
                        if (!index.isUnique())
                        {
                            len--;
                        }

                        for (int j = 0; j < len; j++)
                        {
                            object[] o = t.getNewRow();

                            o[2] = table.getName();
                            o[3] = !index.isUnique();
                            o[5] = index.getName();
                            o[6] = 1;
                            o[7] = (j + 1);
                            o[8] = table.getColumnName(cols[j]);
                            o[9] = "A";

                            t.insert(o, null);
                        }
                    }
                }

                return(t);
            }
            else if (name.Equals("SYSTEM_UDTS"))
            {
                Table t = createTable(name);

                t.addColumn("TYPE_" + META_CAT, Column.VARCHAR);
                t.addColumn("TYPE_" + META_SCHEM, Column.VARCHAR);
                t.addColumn("TYPE_NAME", Column.VARCHAR);
                t.addColumn("CLASS_NAME", Column.BIT);
                t.addColumn("DATA_TYPE", Column.VARCHAR);
                t.addColumn("REMARKS", Column.VARCHAR);
                t.createPrimaryKey();

                return(t);
            }
            else if (name.Equals("SYSTEM_CONNECTIONINFO"))
            {
                Table t = createTable(name);

                t.addColumn("KEY", Column.VARCHAR);
                t.addColumn("VALUE", Column.VARCHAR);
                t.createPrimaryKey();

                object[] o = t.getNewRow();

                o[0] = "USER";
                o[1] = channel.getUsername();

                t.insert(o, null);

                o    = t.getNewRow();
                o[0] = "READONLY";
                o[1] = channel.isReadOnly() ? "TRUE" : "FALSE";

                t.insert(o, null);

                o    = t.getNewRow();
                o[0] = "MAXROWS";
                o[1] = "" + channel.getMaxRows();

                t.insert(o, null);

                o    = t.getNewRow();
                o[0] = "DATABASE";
                o[1] = "" + channel.getDatabase().getName();

                t.insert(o, null);

                o    = t.getNewRow();
                o[0] = "IDENTITY";
                o[1] = "" + channel.getLastIdentity();

                t.insert(o, null);

                return(t);
            }
            else if (name.Equals("SYSTEM_USERS"))
            {
                Table t = createTable(name);

                t.addColumn("USER", Column.VARCHAR);
                t.addColumn("ADMIN", Column.BIT);
                t.createPrimaryKey();

                ArrayList v = aAccess.getUsers();

                for (int i = 0; i < v.Count; i++)
                {
                    User u = (User)v[i];

                    // todo: this is not a nice implementation
                    if (u == null)
                    {
                        continue;
                    }

                    string user = u.getName();

                    if (!user.Equals("PUBLIC"))
                    {
                        object[] o = t.getNewRow();

                        o[0] = user;
                        o[1] = u.isAdmin();

                        t.insert(o, null);
                    }
                }

                return(t);
            }

            return(null);
        }