Example #1
0
        private string GetColumnList(Table table, int[] col, int len)
        {
            StringBuilder a = new StringBuilder();

            a.Append("(");

            for (int i = 0; i < len; i++)
            {
                a.Append('"');
                a.Append(table.GetColumnName(col[i]));
                a.Append('"');

                if (i < len - 1)
                {
                    a.Append(",");
                }
            }

            return(a.Append(")").ToString());
        }
Example #2
0
        public Result GetScript(bool bDrop, bool bInsert, bool bCached, Channel channel)
        {
            channel.CheckAdmin();

            Result r = new Result(1);

            r.Type[0]  = ColumnType.VarChar;
            r.Table[0] = "SYSTEM_SCRIPT";
            r.Label[0] = "COMMAND";
            r.Name[0]  = "COMMAND";

            StringBuilder a = new StringBuilder();

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

                if (bDrop)
                {
                    AddRow(r, "DROP TABLE \"" + t.Name + "\"");
                }

                a.Remove(0, a.Length);
                a.Append("CREATE ");

                if (t.IsCached)
                {
                    a.Append("CACHED ");
                }

                a.Append("TABLE ");
                a.Append('"');
                a.Append(t.Name);
                a.Append('"');
                a.Append("(");

                int   columns = t.ColumnCount;
                Index pki     = t.GetIndex("SYSTEM_PK");
                int   pk      = (pki == null) ? -1 : pki.Columns[0];

                for (int j = 0; j < columns; j++)
                {
                    a.Append('"');
                    a.Append(t.GetColumnName(j));
                    a.Append('"');
                    a.Append(" ");
                    a.Append(Column.GetColumnTypeString(t.GetType(j)));

                    if (!t.GetColumnIsNullable(j))
                    {
                        a.Append(" NOT NULL");
                    }

                    if (j == t.IdentityColumn)
                    {
                        a.Append(" IDENTITY");
                    }

                    if (j == pk)
                    {
                        a.Append(" PRIMARY KEY");
                    }

                    if (j < columns - 1)
                    {
                        a.Append(",");
                    }
                }

                ArrayList v = t.Constraints;

                for (int j = 0; j < v.Count; j++)
                {
                    Constraint c = (Constraint)v[j];

                    if (c.ConstraintType == ConstraintType.ForeignKey)
                    {
                        a.Append(",FOREIGN KEY");

                        int[] col = c.RefTableColumns;

                        a.Append(GetColumnList(c.RefTable, col, col.Length));
                        a.Append("REFERENCES ");
                        a.Append(c.MainTable.Name);

                        col = c.MainTableColumns;

                        a.Append(GetColumnList(c.MainTable, col, col.Length));
                    }
                    else if (c.ConstraintType == ConstraintType.Unique)
                    {
                        a.Append(",UNIQUE");

                        int[] col = c.MainTableColumns;

                        a.Append(GetColumnList(c.MainTable, col, col.Length));
                    }
                }

                a.Append(")");
                AddRow(r, a.ToString());

                Index index = null;

                while (true)
                {
                    index = t.GetNextIndex(index);

                    if (index == null)
                    {
                        break;
                    }

                    string indexname = index.Name;

                    if (indexname.Equals("SYSTEM_PK"))
                    {
                        continue;
                    }
                    else if (indexname.StartsWith("SYSTEM_FOREIGN_KEY"))
                    {
                        // foreign keys where created in the 'create table'
                        continue;
                    }
                    else if (indexname.StartsWith("SYSTEM_CONSTRAINT"))
                    {
                        // constraints where created in the 'create table'
                        continue;
                    }

                    a.Remove(0, a.Length);
                    a.Append("CREATE ");

                    if (index.IsUnique)
                    {
                        a.Append("UNIQUE ");
                    }

                    a.Append("INDEX ");
                    a.Append(indexname);
                    a.Append(" ON ");
                    a.Append(t.Name);

                    int[] col = index.Columns;
                    int   len = col.Length;

                    if (!index.IsUnique)
                    {
                        len--;
                    }

                    a.Append(GetColumnList(t, col, len));
                    AddRow(r, a.ToString());
                }

                if (bInsert)
                {
                    Index primary   = t.PrimaryIndex;
                    Node  x         = primary.First();
                    bool  integrity = true;

                    if (x != null)
                    {
                        integrity = false;

                        AddRow(r, "SET REFERENTIAL_INTEGRITY FALSE");
                    }

                    while (x != null)
                    {
                        AddRow(r, t.GetInsertStatement(x.GetData()));

                        x = primary.Next(x);
                    }

                    if (!integrity)
                    {
                        AddRow(r, "SET REFERENTIAL_INTEGRITY TRUE");
                    }
                }

                if (bCached && t.IsCached)
                {
                    a.Remove(0, a.Length);
                    a.Append("SET TABLE ");

                    a.Append('"');
                    a.Append(t.Name);
                    a.Append('"');
                    a.Append(" INDEX '");
                    a.Append(t.IndexRoots);
                    a.Append("'");
                    AddRow(r, a.ToString());
                }
            }

            ArrayList uList = aAccess.GetUsers();

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

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

                string name = u.Name;

                if (!name.Equals("PUBLIC"))
                {
                    a.Remove(0, a.Length);
                    a.Append("CREATE USER ");

                    a.Append(name);
                    a.Append(" PASSWORD ");
                    a.Append("\"" + u.Password + "\"");

                    if (u.IsAdmin)
                    {
                        a.Append(" ADMIN");
                    }

                    AddRow(r, a.ToString());
                }

                Hashtable rights = u.Rights;

                if (rights == null)
                {
                    continue;
                }

                foreach (string dbObject in rights.Keys)
                {
                    AccessType right = (AccessType)rights[dbObject];

                    if (right == AccessType.None)
                    {
                        continue;
                    }

                    a.Remove(0, a.Length);
                    a.Append("GRANT ");

                    a.Append(Access.GetRight(right));
                    a.Append(" ON ");
                    a.Append(dbObject);
                    a.Append(" TO ");
                    a.Append(u.Name);
                    AddRow(r, a.ToString());
                }
            }

            if (dDatabase.IsIgnoreCase)
            {
                AddRow(r, "SET IGNORECASE TRUE");
            }

            Hashtable h = dDatabase.Alias;

            foreach (string alias in h.Keys)
            {
                string className = (string)h[alias];
                AddRow(r, "CREATE ALIAS " + alias + " FOR \"" + className + "\"");
            }

            return(r);
        }
Example #3
0
        public Table GetSystemTable(string name, Channel channel)
        {
            if (name.Equals("SYSTEM_PROCEDURES"))
            {
                Table t = CreateTable(name);

                t.AddColumn("PROCEDURE_" + META_CAT, ColumnType.VarChar);
                t.AddColumn("PROCEDURE_" + META_SCHEM, ColumnType.VarChar);
                t.AddColumn("PROCEDURE_NAME", ColumnType.VarChar);
                t.AddColumn("NUM_INPUT_PARAMS", ColumnType.Integer);
                t.AddColumn("NUM_OUTPUT_PARAMS", ColumnType.Integer);
                t.AddColumn("NUM_RESULT_SETS", ColumnType.Integer);
                t.AddColumn("REMARKS", ColumnType.VarChar);
                t.AddColumn("PROCEDURE_TYPE", ColumnType.SmallInt);
                t.CreatePrimaryKey();

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

                t.AddColumn("PROCEDURE_" + META_CAT, ColumnType.VarChar);
                t.AddColumn("PROCEDURE_" + META_SCHEM, ColumnType.VarChar);
                t.AddColumn("PROCEDURE_NAME", ColumnType.VarChar);
                t.AddColumn("COLUMN_NAME", ColumnType.VarChar);
                t.AddColumn("COLUMN_TYPE", ColumnType.SmallInt);
                t.AddColumn("DATA_TYPE", ColumnType.SmallInt);
                t.AddColumn("TYPE_NAME", ColumnType.VarChar);
                t.AddColumn("PRECISION", ColumnType.Integer);
                t.AddColumn("LENGTH", ColumnType.Integer);
                t.AddColumn("SCALE", ColumnType.SmallInt);
                t.AddColumn("RADIX", ColumnType.SmallInt);
                t.AddColumn("NULLABLE", ColumnType.SmallInt);
                t.AddColumn("REMARKS", ColumnType.VarChar);
                t.CreatePrimaryKey();

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

                t.AddColumn("TABLE_" + META_CAT, ColumnType.VarChar);
                t.AddColumn("TABLE_" + META_SCHEM, ColumnType.VarChar);
                t.AddColumn("TABLE_NAME", ColumnType.VarChar);
                t.AddColumn("TABLE_TYPE", ColumnType.VarChar);
                t.AddColumn("REMARKS", ColumnType.VarChar);
                t.CreatePrimaryKey();

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

                    o[2] = table.Name;
                    o[3] = "TABLE";

                    t.Insert(o, null);
                }

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

                t.AddColumn("TABLE_" + META_SCHEM, ColumnType.VarChar);
                t.CreatePrimaryKey();

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

                t.AddColumn("TABLE_" + META_CAT, ColumnType.VarChar);
                t.CreatePrimaryKey();

                return(t);
            }
            else if (name.Equals("SYSTEM_DATABASES"))
            {
                Table t = CreateTable(name);

                t.AddColumn("DATABASE", ColumnType.VarChar);
                t.CreatePrimaryKey();

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

                t.AddColumn("TABLE_TYPE", ColumnType.VarChar);
                t.CreatePrimaryKey();

                object[] o = t.NewRow;

                o[0] = "TABLE";

                t.Insert(o, null);

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

                t.AddColumn("TABLE_" + META_CAT, ColumnType.VarChar);
                t.AddColumn("TABLE_" + META_SCHEM, ColumnType.VarChar);
                t.AddColumn("TABLE_NAME", ColumnType.VarChar);
                t.AddColumn("COLUMN_NAME", ColumnType.VarChar);
                t.AddColumn("DATA_TYPE", ColumnType.SmallInt);
                t.AddColumn("TYPE_NAME", ColumnType.VarChar);
                t.AddColumn(META_COLUMN_SIZE, ColumnType.Integer);
                t.AddColumn(META_BUFFER_LENGTH, ColumnType.Integer);
                t.AddColumn(META_DECIMAL_DIGITS, ColumnType.Integer);
                t.AddColumn(META_NUM_PREC_RADIX, ColumnType.Integer);
                t.AddColumn("NULLABLE", ColumnType.Integer);
                t.AddColumn("REMARKS", ColumnType.VarChar);

                // Access and Intersolv do not return this fields
                t.AddColumn("COLUMN_DEF", ColumnType.VarChar);
                t.AddColumn("SQL_DATA_TYPE", ColumnType.VarChar);
                t.AddColumn("SQL_DATETIME_SUB", ColumnType.Integer);
                t.AddColumn("CHAR_OCTET_LENGTH", ColumnType.Integer);
                t.AddColumn("ORDINAL_POSITION", ColumnType.VarChar);
                t.AddColumn("IS_NULLABLE", ColumnType.VarChar);
                t.CreatePrimaryKey();

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

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

                        o[2] = table.Name;
                        o[3] = table.GetColumnName(j);
                        o[4] = table.GetColumnType(j);
                        o[5] = Column.GetColumnTypeString(table.GetColumnType(j));

                        int nullable;

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

                        o[10] = nullable;

                        if (table.IdentityColumn == 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, ColumnType.VarChar);
                t.AddColumn("TABLE_" + META_SCHEM, ColumnType.VarChar);
                t.AddColumn("TABLE_NAME", ColumnType.VarChar);
                t.AddColumn("COLUMN_NAME", ColumnType.VarChar);
                t.AddColumn("GRANTOR", ColumnType.VarChar);
                t.AddColumn("GRANTEE", ColumnType.VarChar);
                t.AddColumn("PRIVILEGE", ColumnType.VarChar);
                t.AddColumn("IS_GRANTABLE", ColumnType.VarChar);
                t.CreatePrimaryKey();

                /*
                 * // todo: get correct info
                 * for(int i=0;i<tTable.size();i++) {
                 * Table table=(Table)tTable.elementAt(i);
                 * int columns=table.ColumnCount;
                 * for(int j=0;j<columns;j++) {
                 * object o[]=t.NewRow;
                 * o[2]=table.Name;
                 * 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, ColumnType.VarChar);
                t.AddColumn("TABLE_" + META_SCHEM, ColumnType.VarChar);
                t.AddColumn("TABLE_NAME", ColumnType.VarChar);
                t.AddColumn("GRANTOR", ColumnType.VarChar);
                t.AddColumn("GRANTEE", ColumnType.VarChar);
                t.AddColumn("PRIVILEGE", ColumnType.VarChar);
                t.AddColumn("IS_GRANTABLE", ColumnType.VarChar);
                t.CreatePrimaryKey();

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

                    o[2] = table.Name;
                    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", ColumnType.SmallInt);
                t.AddColumn("COLUMN_NAME", ColumnType.VarChar);
                t.AddColumn("DATA_TYPE", ColumnType.SmallInt);
                t.AddColumn("TYPE_NAME", ColumnType.VarChar);
                t.AddColumn(META_COLUMN_SIZE, ColumnType.Integer);
                t.AddColumn(META_BUFFER_LENGTH, ColumnType.Integer);
                t.AddColumn(META_DECIMAL_DIGITS, ColumnType.SmallInt);
                t.AddColumn("PSEUDO_COLUMN", ColumnType.SmallInt);
                t.CreatePrimaryKey();

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

                t.AddColumn("SCOPE", ColumnType.Integer);
                t.AddColumn("COLUMN_NAME", ColumnType.VarChar);
                t.AddColumn("DATA_TYPE", ColumnType.SmallInt);
                t.AddColumn("TYPE_NAME", ColumnType.VarChar);
                t.AddColumn(META_COLUMN_SIZE, ColumnType.SmallInt);
                t.AddColumn(META_BUFFER_LENGTH, ColumnType.Integer);
                t.AddColumn(META_DECIMAL_DIGITS, ColumnType.SmallInt);
                t.AddColumn("PSEUDO_COLUMN", ColumnType.SmallInt);
                t.CreatePrimaryKey();

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

                t.AddColumn("TABLE_" + META_CAT, ColumnType.VarChar);
                t.AddColumn("TABLE_" + META_SCHEM, ColumnType.VarChar);
                t.AddColumn("TABLE_NAME", ColumnType.VarChar);
                t.AddColumn("COLUMN_NAME", ColumnType.VarChar);
                t.AddColumn("KEY_SEQ", ColumnType.SmallInt);
                t.AddColumn("PK_NAME", ColumnType.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.Columns;
                    int   len   = cols.Length;

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

                        o[2] = table.Name;
                        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, ColumnType.VarChar);
                t.AddColumn("PKTABLE_" + META_SCHEM, ColumnType.VarChar);
                t.AddColumn("PKTABLE_NAME", ColumnType.VarChar);
                t.AddColumn("PKCOLUMN_NAME", ColumnType.VarChar);
                t.AddColumn("FKTABLE_" + META_CAT, ColumnType.VarChar);
                t.AddColumn("FKTABLE_" + META_SCHEM, ColumnType.VarChar);
                t.AddColumn("FKTABLE_NAME", ColumnType.VarChar);
                t.AddColumn("FKCOLUMN_NAME", ColumnType.VarChar);
                t.AddColumn("KEY_SEQ", ColumnType.SmallInt);
                t.AddColumn("UPDATE_RULE", ColumnType.SmallInt);
                t.AddColumn("DELETE_RULE", ColumnType.SmallInt);
                t.AddColumn("FK_NAME", ColumnType.VarChar);
                t.AddColumn("PK_NAME", ColumnType.VarChar);
                t.AddColumn("DEFERRABILITY", ColumnType.SmallInt);
                t.CreatePrimaryKey();

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

                t.AddColumn("PKTABLE_" + META_CAT, ColumnType.VarChar);
                t.AddColumn("PKTABLE_" + META_SCHEM, ColumnType.VarChar);
                t.AddColumn("PKTABLE_NAME", ColumnType.VarChar);
                t.AddColumn("PKCOLUMN_NAME", ColumnType.VarChar);
                t.AddColumn("FKTABLE_" + META_CAT, ColumnType.VarChar);
                t.AddColumn("FKTABLE_" + META_SCHEM, ColumnType.VarChar);
                t.AddColumn("FKTABLE_NAME", ColumnType.VarChar);
                t.AddColumn("FKCOLUMN_NAME", ColumnType.VarChar);
                t.AddColumn("KEY_SEQ", ColumnType.SmallInt);
                t.AddColumn("UPDATE_RULE", ColumnType.SmallInt);
                t.AddColumn("DELETE_RULE", ColumnType.SmallInt);
                t.AddColumn("FK_NAME", ColumnType.VarChar);
                t.AddColumn("PK_NAME", ColumnType.VarChar);
                t.AddColumn("DEFERRABILITY", ColumnType.SmallInt);
                t.CreatePrimaryKey();

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

                t.AddColumn("PKTABLE_" + META_CAT, ColumnType.VarChar);
                t.AddColumn("PKTABLE_" + META_SCHEM, ColumnType.VarChar);
                t.AddColumn("PKTABLE_NAME", ColumnType.VarChar);
                t.AddColumn("PKCOLUMN_NAME", ColumnType.VarChar);
                t.AddColumn("FKTABLE_" + META_CAT, ColumnType.VarChar);
                t.AddColumn("FKTABLE_" + META_SCHEM, ColumnType.VarChar);
                t.AddColumn("FKTABLE_NAME", ColumnType.VarChar);
                t.AddColumn("FKCOLUMN_NAME", ColumnType.VarChar);
                t.AddColumn("KEY_SEQ", ColumnType.Integer);
                t.AddColumn("UPDATE_RULE", ColumnType.SmallInt);
                t.AddColumn("DELETE_RULE", ColumnType.SmallInt);
                t.AddColumn("FK_NAME", ColumnType.VarChar);
                t.AddColumn("PK_NAME", ColumnType.VarChar);
                t.AddColumn("DEFERRABILITY", ColumnType.SmallInt);
                t.CreatePrimaryKey();

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

                t.AddColumn("TYPE_NAME", ColumnType.VarChar);
                t.AddColumn("DATA_TYPE", ColumnType.SmallInt);
                t.AddColumn("PRECISION", ColumnType.Integer);
                t.AddColumn("LITERAL_PREFIX", ColumnType.VarChar);
                t.AddColumn("LITERAL_SUFFIX", ColumnType.VarChar);
                t.AddColumn("CREATE_PARAMS", ColumnType.VarChar);
                t.AddColumn("NULLABLE", ColumnType.SmallInt);
                t.AddColumn("CASE_SENSITIVE", ColumnType.VarChar);
                t.AddColumn("SEARCHABLE", ColumnType.SmallInt);
                t.AddColumn("UNSIGNED_ATTRIBUTE", ColumnType.Bit);
                t.AddColumn(META_FIXED_PREC_SCALE, ColumnType.Bit);
                t.AddColumn("AUTO_INCREMENT", ColumnType.Bit);
                t.AddColumn("LOCAL_TYPE_NAME", ColumnType.VarChar);
                t.AddColumn("MINIMUM_SCALE", ColumnType.SmallInt);
                t.AddColumn("MAXIMUM_SCALE", ColumnType.SmallInt);

                // this columns are not supported by Access and Intersolv
                t.AddColumn("SQL_DATE_TYPE", ColumnType.Integer);
                t.AddColumn("SQL_DATETIME_SUB", ColumnType.Integer);
                t.AddColumn("NUM_PREC_RADIX", ColumnType.Integer);
                t.CreatePrimaryKey();

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

                    o[0]  = Column.GetColumnTypeString(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 == ColumnType.Numeric || type == ColumnType.DbDecimal);
                    o[11] = (type == ColumnType.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, ColumnType.VarChar);
                t.AddColumn("TABLE_" + META_SCHEM, ColumnType.VarChar);
                t.AddColumn("TABLE_NAME", ColumnType.VarChar);
                t.AddColumn("NON_UNIQUE", ColumnType.Bit);
                t.AddColumn("INDEX_QUALIFIER", ColumnType.VarChar);
                t.AddColumn("INDEX_NAME", ColumnType.VarChar);
                t.AddColumn("TYPE", ColumnType.SmallInt);
                t.AddColumn(META_ORDINAL_POSITON, ColumnType.SmallInt);
                t.AddColumn("COLUMN_NAME", ColumnType.VarChar);
                t.AddColumn(META_ASC_OR_DESC, ColumnType.VarChar);
                t.AddColumn("CARDINALITY", ColumnType.Integer);
                t.AddColumn("PAGES", ColumnType.Integer);
                t.AddColumn("FILTER_CONDITION", ColumnType.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.Columns;
                        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.NewRow;

                            o[2] = table.Name;
                            o[3] = !index.IsUnique;
                            o[5] = index.Name;
                            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, ColumnType.VarChar);
                t.AddColumn("TYPE_" + META_SCHEM, ColumnType.VarChar);
                t.AddColumn("TYPE_NAME", ColumnType.VarChar);
                t.AddColumn("CLASS_NAME", ColumnType.Bit);
                t.AddColumn("DATA_TYPE", ColumnType.VarChar);
                t.AddColumn("REMARKS", ColumnType.VarChar);
                t.CreatePrimaryKey();

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

                t.AddColumn("KEY", ColumnType.VarChar);
                t.AddColumn("VALUE", ColumnType.VarChar);
                t.CreatePrimaryKey();

                object[] o = t.NewRow;

                o[0] = "USER";
                o[1] = channel.UserName;

                t.Insert(o, null);

                o    = t.NewRow;
                o[0] = "READONLY";
                o[1] = channel.IsReadOnly ? "TRUE" : "FALSE";

                t.Insert(o, null);

                o    = t.NewRow;
                o[0] = "MAXROWS";
                o[1] = "" + channel.MaxRows;

                t.Insert(o, null);

                o    = t.NewRow;
                o[0] = "DATABASE";
                o[1] = "" + channel.Database.Name;

                t.Insert(o, null);

                o    = t.NewRow;
                o[0] = "IDENTITY";
                o[1] = "" + channel.LastIdentity;

                t.Insert(o, null);

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

                t.AddColumn("USER", ColumnType.VarChar);
                t.AddColumn("ADMIN", ColumnType.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.Name;

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

                        o[0] = user;
                        o[1] = u.IsAdmin;

                        t.Insert(o, null);
                    }
                }

                return(t);
            }

            return(null);
        }
        private string GetColumnList(Table table, int[] col, int len)
        {
            StringBuilder a = new StringBuilder();
            a.Append("(");

            for (int i = 0; i < len; i++)
            {
                a.Append('"');
                a.Append(table.GetColumnName(col[i]));
                a.Append('"');

                if (i < len - 1)
                {
                    a.Append(",");
                }
            }

            return a.Append(")").ToString();
        }