Esempio n. 1
0
        private bool CheckTableExists(IDbConnection conn, DB2ZOSTableSourceInfo tableSource)
        {
            String query = "SELECT  NAME as TABLE_NAME "
                           + "FROM SYSIBM.SYSTABLES "
                           + "WHERE CREATOR = '" + tableSource.Database.Identifier + "' and NAME = '" + tableSource.Name.ToUpper() + "'";

            IDbCommand cmd = DatabaseServices.ExecutionService.CreateCommand(conn, query);

            cmd.CommandTimeout = QueryTimeout;
            using (IDataReader reader = cmd.ExecuteReader()) {
                return(reader.Read());
            }
        }
Esempio n. 2
0
        public override IEnumerable <ITableSourceColumnInfo> GetTableSourceColumns(ITableSourceInfo tableSource)
        {
            DB2ZOSTableSourceInfo tableInfo = tableSource as DB2ZOSTableSourceInfo;

            if (tableInfo == null)
            {
                return(null);
            }
            using (IDbConnection conn = DatabaseServices.TransactionService.CreateConnection()) {
                if (!CheckTableExists(conn, tableInfo))
                {
                    throw new IntrospectionServiceException("'" + tableSource.DisplayName + "' is not a valid physical table name.");
                }
            }
            return(GetColumnsInfo(tableInfo));
        }
Esempio n. 3
0
        private IList <ITableSourceForeignKeyInfo> GetForeignKeysInfo(DB2ZOSTableSourceInfo tableSource)
        {
            IList <ITableSourceForeignKeyInfo> foreignKeys = new List <ITableSourceForeignKeyInfo>();
            string query = "SELECT " +
                           "A.RELNAME as FK_NAME, " +
                           "B.COLNAME as FKCOLUMN_NAME," +
                           "A.REFTBCREATOR as PKTABLE_SCHEM, " +
                           "A.REFTBNAME as PKTABLE_NAME, " +
                           "(SELECT KYS.COLNAME FROM SYSIBM.SYSINDEXES PKS " +
                           "INNER JOIN SYSIBM.SYSKEYS KYS ON KYS.IXNAME = PKS.NAME " +
                           "WHERE PKS.TBNAME = A.REFTBNAME AND PKS.CREATOR = A.CREATOR AND PKS.UNIQUERULE = 'P') " +
                           "as PKCOLUMN_NAME, " +
                           "A.DELETERULE as CASCADE " +
                           "FROM SYSIBM.SYSRELS A, SYSIBM.SYSFOREIGNKEYS B " +
                           "WHERE A.TBNAME = '" + tableSource.Name.ToUpper() + "' " +
                           "AND B.TBNAME = '" + tableSource.Name.ToUpper() + "' " +
                           "AND A.CREATOR = '" + tableSource.Database.Identifier + "' " +
                           "AND B.CREATOR = '" + tableSource.Database.Identifier + "' " +
                           "AND A.RELNAME = B.RELNAME " +
                           "ORDER BY A.RELNAME, B.COLSEQ; ";

            Console.WriteLine("GetForeignKeysInfo, SQL: " + query);
            using (IDbConnection conn = DatabaseServices.TransactionService.CreateConnection()) {
                IDbCommand cmd = DatabaseServices.ExecutionService.CreateCommand(conn, query);
                cmd.CommandTimeout = QueryTimeout;
                using (IDataReader reader = cmd.ExecuteReader()) {
                    while (reader.Read())
                    {
                        string                     foreignKeyName               = (string)reader["FK_NAME"];
                        string                     columnName                   = (string)reader["FKCOLUMN_NAME"];
                        string                     referencedSchemaName         = (string)reader["PKTABLE_SCHEM"];
                        string                     referencedTableName          = (string)reader["PKTABLE_NAME"];
                        string                     referencedColumnName         = (string)reader["PKCOLUMN_NAME"];
                        bool                       isCascadeDelete              = "CASCADE".EqualsIgnoreCase((string)reader["CASCADE"]);
                        string                     qualifiedReferencedTableName = GetQualifiedIdentifier(referencedSchemaName, referencedTableName);
                        var                        a = tableSource.Database;
                        ITableSourceInfo           referencedTableSource = new DB2ZOSTableSourceInfo(DatabaseServices, tableSource.Database, referencedTableName, qualifiedReferencedTableName);
                        ITableSourceForeignKeyInfo foreignKeyInfo        = new DB2ZOSTableSourceForeignKeyInfo(tableSource, foreignKeyName, columnName, referencedTableSource, referencedColumnName, isCascadeDelete);
                        foreignKeys.Add(foreignKeyInfo);
                    }
                }
                return(foreignKeys);
            }
        }
Esempio n. 4
0
        private IList <ITableSourceColumnInfo> GetColumnsInfo(DB2ZOSTableSourceInfo tableSource)
        {
            IList <ITableSourceColumnInfo> columnsInfo = new List <ITableSourceColumnInfo>();

            using (IDbConnection conn = DatabaseServices.TransactionService.CreateConnection()) {
                string query = @"SELECT COLS.*, 
                                (
                                SELECT PKS.NAME FROM SYSIBM.SYSINDEXES  PKS 
                                INNER JOIN SYSIBM.SYSKEYS KYS ON KYS.IXNAME = PKS.NAME
                                WHERE PKS.TBNAME = COLS.TBNAME AND PKS.CREATOR = COLS.TBCREATOR AND PKS.UNIQUERULE = 'P' AND KYS.COLNAME = COLS.NAME
                                ) as PK_NAME,
                                COL_CHK.CHECKCONDITION as CHECK_CLAUSE,
                                UDTS.ENCODING_SCHEME as ORDERING_ROUT_NAME  
                                FROM SYSIBM.SYSCOLUMNS COLS 
                                INNER JOIN SYSIBM.SYSTABLES TAB ON TAB.NAME = COLS.TBNAME AND TAB.CREATOR = COLS.TBCREATOR              
                                LEFT JOIN SYSIBM.SYSVIEWDEP VDEP ON TAB.TYPE = 'V' and TAB.CREATOR = VDEP.BCREATOR and TAB.NAME = VDEP.DNAME
                                LEFT JOIN SYSIBM.SYSCHECKDEP DEP ON 
                                  ((TAB.TYPE = 'T' or TAB.TYPE = 'P') and DEP.TBOWNER = TAB.CREATOR and DEP.TBNAME = TAB.NAME and DEP.COLNAME = COLS.NAME)
                                  OR (TAB.TYPE = 'V' and DEP.TBOWNER = VDEP.BCREATOR and DEP.TBNAME = VDEP.BNAME and DEP.COLNAME = COLS.NAME)
                                LEFT JOIN SYSIBM.SYSCHECKS COL_CHK ON 
                                  ((TAB.TYPE = 'T' or TAB.TYPE = 'P') and COL_CHK.TBOWNER = DEP.TBOWNER and COL_CHK.TBNAME = TAB.NAME and COL_CHK.CHECKNAME = DEP.CHECKNAME)
                                  OR (TAB.TYPE = 'V' and COL_CHK.TBOWNER = DEP.TBOWNER and COL_CHK.TBNAME = DEP.TBNAME and COL_CHK.CHECKNAME = DEP.CHECKNAME)
                                LEFT JOIN SYSIBM.SYSDATATYPES UDTS ON UDTS.NAME = COLS.COLTYPE 
                                WHERE (COLS.GENERATED_ATTR is null OR COLS.GENERATED_ATTR <> 'A') and TAB.CREATOR = '" + tableSource.Database.Identifier + "' and TAB.NAME = '" + tableSource.Name.ToUpper() + "'";


                IDbCommand cmd = DatabaseServices.ExecutionService.CreateCommand(conn, query);
                cmd.CommandTimeout = QueryTimeout;

                using (IDataReader reader = cmd.ExecuteReader()) {
                    int primaryKeyColumnCount = 0;
                    while (reader.Read())
                    {
                        string columnName = (string)reader["NAME"];

                        IDataTypeInfo datatype = CreateDataTypeInfo(reader["COLTYPE"] == DBNull.Value ? null : ((string)reader["COLTYPE"]).Trim(),
                                                                    reader["LENGTH"] == DBNull.Value ? 0 : Convert.ToInt32(reader["LENGTH"]),
                                                                    reader["LENGTH"] == DBNull.Value ? 0 : Convert.ToInt32(reader["LENGTH"]),
                                                                    reader["SCALE"] == DBNull.Value ? 0 : Convert.ToInt32(reader["SCALE"]),
                                                                    reader["CHECK_CLAUSE"] == DBNull.Value ? null : (string)reader["CHECK_CLAUSE"],
                                                                    reader["ORDERING_ROUT_NAME"] == DBNull.Value ? null : (string)reader["ORDERING_ROUT_NAME"],
                                                                    reader["CCSID"] == DBNull.Value ? 0 : Convert.ToInt32(reader["CCSID"]));

                        bool isMandatory     = "N".EqualsIgnoreCase((string)reader["NULLS"]);
                        bool isPrimaryKey    = (reader["PK_NAME"] != DBNull.Value);
                        var  defaultVal      = (string)reader["DEFAULT"];
                        bool isAutoGenerated = "I".EqualsIgnoreCase(defaultVal) || "J".EqualsIgnoreCase(defaultVal);

                        DB2ZOSTableSourceColumnInfo info = new DB2ZOSTableSourceColumnInfo(tableSource, columnName, datatype, isMandatory, isPrimaryKey, isAutoGenerated);
                        columnsInfo.Add(info);
                        primaryKeyColumnCount += isPrimaryKey ? 1 : 0;
                    }
                    if (primaryKeyColumnCount > 1)
                    {
                        //we don't support composite primary keys so setting all to non primary key
                        IList <ITableSourceColumnInfo> columnsInfoCopy = new List <ITableSourceColumnInfo>();

                        foreach (ITableSourceColumnInfo c in columnsInfo)
                        {
                            columnsInfoCopy.Add(new DB2ZOSTableSourceColumnInfo(c.TableSource, c.Name, c.DataType, c.IsMandatory, false, c.IsAutoGenerated));
                        }
                        columnsInfo = columnsInfoCopy;
                    }
                }
            }
            return(columnsInfo);
        }