| 
0
 | 
     1 <#
 | 
| 
 | 
     2 	ConnectionType = "Sybase.Data.AseClient.AseConnection, Sybase.AdoNet2.AseClient";
 | 
| 
 | 
     3 #><#+
 | 
| 
 | 
     4 
 | 
| 
 | 
     5 bool GenerateSybaseSystemTables = false;
 | 
| 
 | 
     6 
 | 
| 
 | 
     7 private void LoadServerMetadata()
 | 
| 
 | 
     8 {
 | 
| 
 | 
     9 	var tables  = CreateList(new { ID = 0, Table  = new Table()  });
 | 
| 
 | 
    10 	var columns = CreateList(new { ID = 0, Column = new Column() });
 | 
| 
 | 
    11 
 | 
| 
 | 
    12 	using (var conn = GetConnection())
 | 
| 
 | 
    13 	using (var cmd  = conn.CreateCommand())
 | 
| 
 | 
    14 	{
 | 
| 
 | 
    15 		// Load tables & vies.
 | 
| 
 | 
    16 		//
 | 
| 
 | 
    17 		cmd.CommandText = @"
 | 
| 
 | 
    18 			SELECT
 | 
| 
 | 
    19 				id,
 | 
| 
 | 
    20 				USER_NAME(uid),
 | 
| 
 | 
    21 				name,
 | 
| 
 | 
    22 				type
 | 
| 
 | 
    23 			FROM
 | 
| 
 | 
    24 				sysobjects
 | 
| 
 | 
    25 			WHERE
 | 
| 
 | 
    26 				type IN ('U','V')";
 | 
| 
 | 
    27 
 | 
| 
 | 
    28 		using (var rd = cmd.ExecuteReader())
 | 
| 
 | 
    29 		{
 | 
| 
 | 
    30 			while (rd.Read())
 | 
| 
 | 
    31 			{
 | 
| 
 | 
    32 				var t = new
 | 
| 
 | 
    33 				{
 | 
| 
 | 
    34 					ID    = Convert.ToInt32(rd[0]),
 | 
| 
 | 
    35 					Table = new Table
 | 
| 
 | 
    36 					{
 | 
| 
 | 
    37 						Owner         = rd[1].ToString(),
 | 
| 
 | 
    38 						TableName     = rd[2].ToString(),
 | 
| 
 | 
    39 						ClassName     = rd[2].ToString(),
 | 
| 
 | 
    40 						IsView        = rd[3].ToString()[0] == 'V',
 | 
| 
 | 
    41 						BaseClassName = BaseEntityClass,
 | 
| 
 | 
    42 					}
 | 
| 
 | 
    43 				};
 | 
| 
 | 
    44 
 | 
| 
 | 
    45 				tables.Add(t);
 | 
| 
 | 
    46 			}
 | 
| 
 | 
    47 		}
 | 
| 
 | 
    48 
 | 
| 
 | 
    49 		// Load columns.
 | 
| 
 | 
    50 		//
 | 
| 
 | 
    51 		cmd.CommandText = @"
 | 
| 
 | 
    52 			SELECT
 | 
| 
 | 
    53 				o.id,
 | 
| 
 | 
    54 				c.colid,
 | 
| 
 | 
    55 				c.name,
 | 
| 
 | 
    56 				c.status,
 | 
| 
 | 
    57 				c.usertype,
 | 
| 
 | 
    58 				t.type,
 | 
| 
 | 
    59 				c.length,
 | 
| 
 | 
    60 				c.prec,
 | 
| 
 | 
    61 				c.scale,
 | 
| 
 | 
    62 				t.name as typename,
 | 
| 
 | 
    63 				Convert(bit, c.status & 0x08) isNullable,
 | 
| 
 | 
    64 				Convert(bit, c.status & 0x80) isIdentity
 | 
| 
 | 
    65 			FROM
 | 
| 
 | 
    66 				syscolumns c
 | 
| 
 | 
    67 					JOIN sysobjects o ON c.id       = o.id
 | 
| 
 | 
    68 					JOIN systypes   t ON c.usertype = t.usertype
 | 
| 
 | 
    69 			WHERE
 | 
| 
 | 
    70 				o.type IN ('U','V')";
 | 
| 
 | 
    71 
 | 
| 
 | 
    72 		using (var rd = cmd.ExecuteReader())
 | 
| 
 | 
    73 		{
 | 
| 
 | 
    74 			while (rd.Read())
 | 
| 
 | 
    75 			{
 | 
| 
 | 
    76 				var col = new
 | 
| 
 | 
    77 				{
 | 
| 
 | 
    78 					ID     = Convert.ToInt32(rd["id"]),
 | 
| 
 | 
    79 					Column = new Column
 | 
| 
 | 
    80 					{
 | 
| 
 | 
    81 						ID         = Convert.ToInt16  (rd["colid"]),
 | 
| 
 | 
    82 						ColumnName = Convert.ToString (rd["name"]),
 | 
| 
 | 
    83 						MemberName = Convert.ToString (rd["name"]),
 | 
| 
 | 
    84 						ColumnType = Convert.ToString (rd["typename"]),
 | 
| 
 | 
    85 						IsNullable = Convert.ToBoolean(rd["isNullable"]),
 | 
| 
 | 
    86 						IsIdentity = Convert.ToBoolean(rd["isIdentity"]),
 | 
| 
 | 
    87 						Length     = rd.IsDBNull(rd.GetOrdinal("length")) ? 0 : Convert.ToInt64(rd["length"]),
 | 
| 
 | 
    88 						Precision  = rd.IsDBNull(rd.GetOrdinal("prec"))   ? 0 : Convert.ToInt32(rd["prec"]),
 | 
| 
 | 
    89 						Scale      = rd.IsDBNull(rd.GetOrdinal("scale"))  ? 0 : Convert.ToInt32(rd["scale"]),
 | 
| 
 | 
    90 					}
 | 
| 
 | 
    91 				};
 | 
| 
 | 
    92 
 | 
| 
 | 
    93 				var c = col.Column;
 | 
| 
 | 
    94 
 | 
| 
 | 
    95 				switch (Convert.ToInt32(rd["type"]))
 | 
| 
 | 
    96 				{
 | 
| 
 | 
    97 					case  34 /* image         */ : c.Type = "byte[]";   c.DbType = DbType.Binary;    c.SqlDbType = SqlDbType.Image;         break;
 | 
| 
 | 
    98 					case  35 /* text          */ : c.Type = "string";   c.DbType = DbType.String;    c.SqlDbType = SqlDbType.Text;          break;
 | 
| 
 | 
    99 					case  45 /* binary        */ : c.Type = "byte[]";   c.DbType = DbType.Binary;    c.SqlDbType = SqlDbType.Binary;        break;
 | 
| 
 | 
   100 					case  48 /* tinyint       */ : c.Type = "byte";     c.DbType = DbType.Byte;      c.SqlDbType = SqlDbType.TinyInt;       break;
 | 
| 
 | 
   101 					case  49 /* date          */ : c.Type = "DateTime"; c.DbType = DbType.Date;      c.SqlDbType = SqlDbType.Date;          break;
 | 
| 
 | 
   102 					case  50 /* bit           */ : c.Type = "bool";     c.DbType = DbType.Boolean;   c.SqlDbType = SqlDbType.Bit;           break;
 | 
| 
 | 
   103 					case  51 /* time          */ : c.Type = "DateTime"; c.DbType = DbType.Time;      c.SqlDbType = SqlDbType.Time;          break;
 | 
| 
 | 
   104 					case  52 /* smallint      */ : c.Type = "short";    c.DbType = DbType.Int16;     c.SqlDbType = SqlDbType.SmallInt;      break;
 | 
| 
 | 
   105 					case  55 /* decimal       */ : c.Type = "decimal";  c.DbType = DbType.Decimal;   c.SqlDbType = SqlDbType.Decimal;       break;
 | 
| 
 | 
   106 					case  56 /* int           */ : c.Type = "int";      c.DbType = DbType.Int32;     c.SqlDbType = SqlDbType.Int;           break;
 | 
| 
 | 
   107 					case  58 /* smalldatetime */ : c.Type = "DateTime"; c.DbType = DbType.DateTime;  c.SqlDbType = SqlDbType.SmallDateTime; break;
 | 
| 
 | 
   108 					case  59 /* real          */ : c.Type = "float";    c.DbType = DbType.Single;    c.SqlDbType = SqlDbType.Real;          break;
 | 
| 
 | 
   109 					case  60 /* money         */ : c.Type = "decimal";  c.DbType = DbType.Currency;  c.SqlDbType = SqlDbType.Money;         break;
 | 
| 
 | 
   110 					case  61 /* datetime      */ : c.Type = "DateTime"; c.DbType = DbType.DateTime;  c.SqlDbType = SqlDbType.DateTime;      break;
 | 
| 
 | 
   111 					case  62 /* float         */ : c.Type = "double";   c.DbType = DbType.Double;    c.SqlDbType = SqlDbType.Float;         break;
 | 
| 
 | 
   112 					case  63 /* numeric       */ : c.Type = "decimal";  c.DbType = DbType.Decimal;   c.SqlDbType = SqlDbType.Decimal;       break;
 | 
| 
 | 
   113 					case  65 /* usmallint     */ : c.Type = "ushort";   c.DbType = DbType.UInt16;    c.SqlDbType = SqlDbType.SmallInt;      break;
 | 
| 
 | 
   114 					case  66 /* uint          */ : c.Type = "uint";     c.DbType = DbType.UInt32;    c.SqlDbType = SqlDbType.Int;           break;
 | 
| 
 | 
   115 					case  67 /* ubigint       */ : c.Type = "ulong";    c.DbType = DbType.UInt64;    c.SqlDbType = SqlDbType.BigInt;        break;
 | 
| 
 | 
   116 					case 122 /* smallmoney    */ : c.Type = "decimal";  c.DbType = DbType.Currency;  c.SqlDbType = SqlDbType.SmallMoney;    break;
 | 
| 
 | 
   117 					case 174 /* unitext       */ : c.Type = "string";   c.DbType = DbType.String;    c.SqlDbType = SqlDbType.NText;         break;
 | 
| 
 | 
   118 					case 189 /* bigdatetime   */ : c.Type = "DateTime"; c.DbType = DbType.DateTime2; c.SqlDbType = SqlDbType.DateTime2;     break;
 | 
| 
 | 
   119 					case 190 /* bigtime       */ : c.Type = "DateTime"; c.DbType = DbType.DateTime2; c.SqlDbType = SqlDbType.DateTime2;     break;
 | 
| 
 | 
   120 					case 191 /* bigint        */ : c.Type = "long";     c.DbType = DbType.Int64;     c.SqlDbType = SqlDbType.BigInt;        break;
 | 
| 
 | 
   121 
 | 
| 
 | 
   122 					case  37 /* varbinary     */
 | 
| 
 | 
   123 					         /* timestamp     */ :
 | 
| 
 | 
   124 						c.Type      = "byte[]";
 | 
| 
 | 
   125 						c.DbType    = DbType.Binary;
 | 
| 
 | 
   126 						c.SqlDbType = Convert.ToString(rd["typename"]) == "timestamp" ? SqlDbType.Timestamp : SqlDbType.VarBinary;
 | 
| 
 | 
   127 						break;
 | 
| 
 | 
   128 
 | 
| 
 | 
   129 					case  39 /* sysname       */
 | 
| 
 | 
   130 					         /* longsysname   */
 | 
| 
 | 
   131 					         /* varchar       */
 | 
| 
 | 
   132 					         /* nvarchar      */ :
 | 
| 
 | 
   133 
 | 
| 
 | 
   134 						c.Type = "string";
 | 
| 
 | 
   135 
 | 
| 
 | 
   136 						if (Convert.ToString(rd["typename"]) == "nvarchar")
 | 
| 
 | 
   137 						{
 | 
| 
 | 
   138 							c.DbType    = DbType.String;
 | 
| 
 | 
   139 							c.SqlDbType = SqlDbType.NVarChar; 
 | 
| 
 | 
   140 						}
 | 
| 
 | 
   141 						else
 | 
| 
 | 
   142 						{
 | 
| 
 | 
   143 							c.DbType    = DbType.AnsiString;
 | 
| 
 | 
   144 							c.SqlDbType = SqlDbType.VarChar;
 | 
| 
 | 
   145 						}
 | 
| 
 | 
   146 
 | 
| 
 | 
   147 						break;
 | 
| 
 | 
   148 
 | 
| 
 | 
   149 					case  47 /* char          */
 | 
| 
 | 
   150 					         /* nchar         */ : 
 | 
| 
 | 
   151 
 | 
| 
 | 
   152 						c.Type      = Convert.ToInt32 (rd["length"])   == 1      ? "char" : "string";
 | 
| 
 | 
   153 						c.DbType    = Convert.ToString(rd["typename"]) == "char" ? DbType.AnsiStringFixedLength : DbType.StringFixedLength;
 | 
| 
 | 
   154 						c.SqlDbType = Convert.ToString(rd["typename"]) == "char" ? SqlDbType.Char : SqlDbType.NChar;
 | 
| 
 | 
   155 						break;
 | 
| 
 | 
   156 
 | 
| 
 | 
   157 					case 135 /* unichar       */ :
 | 
| 
 | 
   158 						c.Type      = Convert.ToInt32 (rd["length"]) == 1 ? "char" : "string";
 | 
| 
 | 
   159 						c.DbType    = DbType.StringFixedLength;
 | 
| 
 | 
   160 						c.SqlDbType = SqlDbType.NChar;
 | 
| 
 | 
   161 						break;
 | 
| 
 | 
   162 
 | 
| 
 | 
   163 					case 155 /* univarchar    */ :
 | 
| 
 | 
   164 						c.Type      = Convert.ToInt32 (rd["length"]) == 1 ? "char" : "string";
 | 
| 
 | 
   165 						c.DbType    = DbType.String;
 | 
| 
 | 
   166 						c.SqlDbType = SqlDbType.NVarChar;
 | 
| 
 | 
   167 						break;
 | 
| 
 | 
   168 
 | 
| 
 | 
   169 					case  36 /* extended type */ :
 | 
| 
 | 
   170 					case  38 /* intn          */ : 
 | 
| 
 | 
   171 					case  68 /* uintn         */ : 
 | 
| 
 | 
   172 					case 106 /* decimaln      */ : 
 | 
| 
 | 
   173 					case 108 /* numericn      */ : 
 | 
| 
 | 
   174 					case 109 /* floatn        */ : 
 | 
| 
 | 
   175 					case 110 /* moneyn        */ : 
 | 
| 
 | 
   176 					case 111 /* datetimn      */ : 
 | 
| 
 | 
   177 					case 123 /* daten         */ : 
 | 
| 
 | 
   178 					case 147 /* timen         */ : 
 | 
| 
 | 
   179 					case 187 /* bigdatetimen  */ : 
 | 
| 
 | 
   180 					case 188 /* bigtimen      */ : c.Type = "byte[]";   c.DbType = DbType.Binary;    c.SqlDbType = SqlDbType.Binary;        break;
 | 
| 
 | 
   181 				}
 | 
| 
 | 
   182 
 | 
| 
 | 
   183 				switch (c.Type)
 | 
| 
 | 
   184 				{
 | 
| 
 | 
   185 					case "string" :
 | 
| 
 | 
   186 					case "byte[]" : c.IsClass = true; break;
 | 
| 
 | 
   187 				}
 | 
| 
 | 
   188 
 | 
| 
 | 
   189 				if (c.IsNullable && !c.IsClass)
 | 
| 
 | 
   190 					c.Type += "?";
 | 
| 
 | 
   191 
 | 
| 
 | 
   192 				columns.Add(col);
 | 
| 
 | 
   193 			}
 | 
| 
 | 
   194 		}
 | 
| 
 | 
   195 
 | 
| 
 | 
   196 		// Load PKs.
 | 
| 
 | 
   197 		//
 | 
| 
 | 
   198 		cmd.CommandText = @"
 | 
| 
 | 
   199 			SELECT
 | 
| 
 | 
   200 				i.id,
 | 
| 
 | 
   201 				i.name,
 | 
| 
 | 
   202 				INDEX_COL(USER_NAME(o.uid) + '.' + o.name, i.indid, c.colid) AS colname,
 | 
| 
 | 
   203 				INDEX_COLORDER(USER_NAME(o.uid) + '.' + o.name, i.indid, c.colid) AS [order],
 | 
| 
 | 
   204 				c.colid
 | 
| 
 | 
   205 			FROM
 | 
| 
 | 
   206 				sysindexes i
 | 
| 
 | 
   207 					JOIN sysobjects o ON i.id = o.id
 | 
| 
 | 
   208 					JOIN syscolumns c ON i.id = c.id
 | 
| 
 | 
   209 			WHERE
 | 
| 
 | 
   210 				i.status2 & 2 = 2 AND
 | 
| 
 | 
   211 				i.status & 2048 = 2048 AND
 | 
| 
 | 
   212 				i.indid > 0 AND
 | 
| 
 | 
   213 				c.colid < i.keycnt + CASE WHEN i.indid = 1 THEN 1 ELSE 0 END";
 | 
| 
 | 
   214 
 | 
| 
 | 
   215 		using (var rd = cmd.ExecuteReader())
 | 
| 
 | 
   216 		{
 | 
| 
 | 
   217 			while (rd.Read())
 | 
| 
 | 
   218 			{
 | 
| 
 | 
   219 				var id      = Convert.ToInt32 (rd["id"]);
 | 
| 
 | 
   220 				var colid   = Convert.ToInt32 (rd["colid"]);
 | 
| 
 | 
   221 				var colname = Convert.ToString(rd["colname"]);
 | 
| 
 | 
   222 
 | 
| 
 | 
   223 				columns.Single(_ => _.ID == id && _.Column.ColumnName == colname).Column.PKIndex = colid;
 | 
| 
 | 
   224 			}
 | 
| 
 | 
   225 		}
 | 
| 
 | 
   226 
 | 
| 
 | 
   227 		// Load FKs.
 | 
| 
 | 
   228 		//
 | 
| 
 | 
   229 		cmd.CommandText = @"
 | 
| 
 | 
   230 			SELECT
 | 
| 
 | 
   231 				o.name     as Name,
 | 
| 
 | 
   232 				c.tableid  as ThisTable,
 | 
| 
 | 
   233 				r.reftabid as OtherTable,
 | 
| 
 | 
   234 				COL_NAME(c.tableid, r.fokey1) as ThisColumn1,
 | 
| 
 | 
   235 				COL_NAME(c.tableid, r.fokey2) as ThisColumn2,
 | 
| 
 | 
   236 				COL_NAME(c.tableid, r.fokey3) as ThisColumn3,
 | 
| 
 | 
   237 				COL_NAME(c.tableid, r.fokey4) as ThisColumn4,
 | 
| 
 | 
   238 				COL_NAME(c.tableid, r.fokey5) as ThisColumn5,
 | 
| 
 | 
   239 				COL_NAME(c.tableid, r.fokey6) as ThisColumn6,
 | 
| 
 | 
   240 				COL_NAME(c.tableid, r.fokey7) as ThisColumn7,
 | 
| 
 | 
   241 				COL_NAME(c.tableid, r.fokey8) as ThisColumn8,
 | 
| 
 | 
   242 				COL_NAME(c.tableid, r.fokey9) as ThisColumn9,
 | 
| 
 | 
   243 				COL_NAME(c.tableid, r.fokey10) as ThisColumn10,
 | 
| 
 | 
   244 				COL_NAME(c.tableid, r.fokey11) as ThisColumn11,
 | 
| 
 | 
   245 				COL_NAME(c.tableid, r.fokey12) as ThisColumn12,
 | 
| 
 | 
   246 				COL_NAME(c.tableid, r.fokey13) as ThisColumn13,
 | 
| 
 | 
   247 				COL_NAME(c.tableid, r.fokey14) as ThisColumn14,
 | 
| 
 | 
   248 				COL_NAME(c.tableid, r.fokey15) as ThisColumn15,
 | 
| 
 | 
   249 				COL_NAME(c.tableid, r.fokey16) as ThisColumn16,
 | 
| 
 | 
   250 				COL_NAME(r.reftabid, r.refkey1) as OtherColumn1,
 | 
| 
 | 
   251 				COL_NAME(r.reftabid, r.refkey2) as OtherColumn2,
 | 
| 
 | 
   252 				COL_NAME(r.reftabid, r.refkey3) as OtherColumn3,
 | 
| 
 | 
   253 				COL_NAME(r.reftabid, r.refkey4) as OtherColumn4,
 | 
| 
 | 
   254 				COL_NAME(r.reftabid, r.refkey5) as OtherColumn5,
 | 
| 
 | 
   255 				COL_NAME(r.reftabid, r.refkey6) as OtherColumn6,
 | 
| 
 | 
   256 				COL_NAME(r.reftabid, r.refkey7) as OtherColumn7,
 | 
| 
 | 
   257 				COL_NAME(r.reftabid, r.refkey8) as OtherColumn8,
 | 
| 
 | 
   258 				COL_NAME(r.reftabid, r.refkey9) as OtherColumn9,
 | 
| 
 | 
   259 				COL_NAME(r.reftabid, r.refkey10) as OtherColumn10,
 | 
| 
 | 
   260 				COL_NAME(r.reftabid, r.refkey11) as OtherColumn11,
 | 
| 
 | 
   261 				COL_NAME(r.reftabid, r.refkey12) as OtherColumn12,
 | 
| 
 | 
   262 				COL_NAME(r.reftabid, r.refkey13) as OtherColumn13,
 | 
| 
 | 
   263 				COL_NAME(r.reftabid, r.refkey14) as OtherColumn14,
 | 
| 
 | 
   264 				COL_NAME(r.reftabid, r.refkey15) as OtherColumn15,
 | 
| 
 | 
   265 				COL_NAME(r.reftabid, r.refkey16) as OtherColumn16
 | 
| 
 | 
   266 			FROM
 | 
| 
 | 
   267 				sysreferences r
 | 
| 
 | 
   268 					JOIN sysconstraints c ON r.constrid = c.constrid
 | 
| 
 | 
   269 						JOIN sysobjects o  ON c.constrid = o.id
 | 
| 
 | 
   270 						JOIN sysobjects o3 ON c.tableid  = o3.id
 | 
| 
 | 
   271 					LEFT JOIN sysobjects o2 ON r.reftabid = o2.id
 | 
| 
 | 
   272 					JOIN sysreferences r2 ON r.constrid = r2.constrid
 | 
| 
 | 
   273 						LEFT JOIN sysindexes i ON r2.indexid = i.indid AND r2.reftabid = i.id
 | 
| 
 | 
   274 			WHERE
 | 
| 
 | 
   275 				c.status = 64";
 | 
| 
 | 
   276 
 | 
| 
 | 
   277 		using (var rd = cmd.ExecuteReader())
 | 
| 
 | 
   278 		{
 | 
| 
 | 
   279 			while (rd.Read())
 | 
| 
 | 
   280 			{
 | 
| 
 | 
   281 				var name            = Convert.ToString(rd["Name"]);
 | 
| 
 | 
   282 				var thisTableID     = Convert.ToInt32 (rd["ThisTable"]);
 | 
| 
 | 
   283 				var otherTableID    = Convert.ToInt32 (rd["OtherTable"]);
 | 
| 
 | 
   284 
 | 
| 
 | 
   285 				var thisTable   = (from t in tables  where t.ID == thisTableID  select t.Table).Single();
 | 
| 
 | 
   286 				var otherTable  = (from t in tables  where t.ID == otherTableID select t.Table).Single();
 | 
| 
 | 
   287 
 | 
| 
 | 
   288 				thisTable.ForeignKeys.Add(name, new ForeignKey { KeyName = name, MemberName = name, OtherTable = otherTable });
 | 
| 
 | 
   289 
 | 
| 
 | 
   290 				for (int i = 1; i <= 16; i++)
 | 
| 
 | 
   291 				{
 | 
| 
 | 
   292 					if (rd.IsDBNull(rd.GetOrdinal("ThisColumn"  + i)))
 | 
| 
 | 
   293 						break;
 | 
| 
 | 
   294 
 | 
| 
 | 
   295 					var thisColumnName  = Convert.ToString(rd["ThisColumn"  + i]);
 | 
| 
 | 
   296 					var otherColumnName = Convert.ToString(rd["OtherColumn" + i]);
 | 
| 
 | 
   297 
 | 
| 
 | 
   298 					var thisColumn  = (from c in columns where c.ID == thisTableID  && c.Column.ColumnName == thisColumnName  select c.Column).Single();
 | 
| 
 | 
   299 					var otherColumn = (from c in columns where c.ID == otherTableID && c.Column.ColumnName == otherColumnName select c.Column).Single();
 | 
| 
 | 
   300 
 | 
| 
 | 
   301 					var key = thisTable.ForeignKeys[name];
 | 
| 
 | 
   302 
 | 
| 
 | 
   303 					key.ThisColumns. Add(thisColumn);
 | 
| 
 | 
   304 					key.OtherColumns.Add(otherColumn);
 | 
| 
 | 
   305 				}
 | 
| 
 | 
   306 			}
 | 
| 
 | 
   307 		}
 | 
| 
 | 
   308 	}
 | 
| 
 | 
   309 
 | 
| 
 | 
   310 	var qc =
 | 
| 
 | 
   311 		from c in columns
 | 
| 
 | 
   312 		group c by c.ID into gr
 | 
| 
 | 
   313 		join t in tables on gr.Key equals t.ID
 | 
| 
 | 
   314 		select new { t.Table, gr };
 | 
| 
 | 
   315 
 | 
| 
 | 
   316 	foreach (var c in qc)
 | 
| 
 | 
   317 	{
 | 
| 
 | 
   318 		foreach (var col in from col in c.gr orderby col.Column.ID select col.Column)
 | 
| 
 | 
   319 			c.Table.Columns.Add(col.ColumnName, col);
 | 
| 
 | 
   320 
 | 
| 
 | 
   321 		if (c.Table.Owner == "dbo")
 | 
| 
 | 
   322 		{
 | 
| 
 | 
   323 			c.Table.Owner = null;
 | 
| 
 | 
   324 			Tables.Add(c.Table.TableName, c.Table);
 | 
| 
 | 
   325 		}
 | 
| 
 | 
   326 		else
 | 
| 
 | 
   327 		{
 | 
| 
 | 
   328 			Tables.Add(c.Table.Owner + "." + c.Table.TableName, c.Table);
 | 
| 
 | 
   329 		}
 | 
| 
 | 
   330 	}
 | 
| 
 | 
   331 
 | 
| 
 | 
   332 	if (GenerateSybaseSystemTables)
 | 
| 
 | 
   333 	{
 | 
| 
 | 
   334 		Tables.Add("sysobjects", new Table
 | 
| 
 | 
   335 		{
 | 
| 
 | 
   336 			TableName     = "sysobjects",
 | 
| 
 | 
   337 			ClassName     = "SysObject",
 | 
| 
 | 
   338 			BaseClassName = BaseEntityClass,
 | 
| 
 | 
   339 			Columns       =
 | 
| 
 | 
   340 			{
 | 
| 
 | 
   341 				{ "name",      new VarCharColumn  { ColumnName = "name", Length = 255 }},
 | 
| 
 | 
   342 				{ "id",        new IntColumn      { ColumnName = "id"  }},
 | 
| 
 | 
   343 				{ "uid",       new IntColumn      { ColumnName = "uid" }},
 | 
| 
 | 
   344 				{ "type",      new Column {
 | 
| 
 | 
   345 					ColumnName = "type",
 | 
| 
 | 
   346 					Type       = "string",
 | 
| 
 | 
   347 					ColumnType = "char",
 | 
| 
 | 
   348 					DbType     = DbType.AnsiStringFixedLength,
 | 
| 
 | 
   349 					SqlDbType  = SqlDbType.Char,
 | 
| 
 | 
   350 					Length     = 2,
 | 
| 
 | 
   351 				}},
 | 
| 
 | 
   352 				{ "userstat",  new SmallIntColumn { ColumnName = "userstat"  }},
 | 
| 
 | 
   353 				{ "sysstat",   new SmallIntColumn { ColumnName = "sysstat"   }},
 | 
| 
 | 
   354 				{ "indexdel",  new SmallIntColumn { ColumnName = "indexdel"  }},
 | 
| 
 | 
   355 				{ "schemacnt", new SmallIntColumn { ColumnName = "schemacnt" }},
 | 
| 
 | 
   356 				{ "sysstat2",  new IntColumn      { ColumnName = "sysstat2"  }},
 | 
| 
 | 
   357 				{ "crdate",    new DateTimeColumn { ColumnName = "crdate"    }},
 | 
| 
 | 
   358 				{ "expdate",   new DateTimeColumn { ColumnName = "expdate"   }},
 | 
| 
 | 
   359 				{ "deltrig",   new IntColumn      { ColumnName = "deltrig"   }},
 | 
| 
 | 
   360 				{ "instrig",   new IntColumn      { ColumnName = "instrig"   }},
 | 
| 
 | 
   361 				{ "updtrig",   new IntColumn      { ColumnName = "updtrig"   }},
 | 
| 
 | 
   362 				{ "seltrig",   new IntColumn      { ColumnName = "seltrig"   }},
 | 
| 
 | 
   363 				{ "ckfirst",   new IntColumn      { ColumnName = "ckfirst"   }},
 | 
| 
 | 
   364 				{ "cache",     new SmallIntColumn { ColumnName = "cache"     }},
 | 
| 
 | 
   365 				{ "audflags",  new IntColumn      { ColumnName = "audflags", IsNullable = true }},
 | 
| 
 | 
   366 				{ "objspare",  new IntColumn      { ColumnName = "objspare"  }},
 | 
| 
 | 
   367 				{ "versionts", new Column {
 | 
| 
 | 
   368 					ColumnName = "versionts",
 | 
| 
 | 
   369 					IsNullable = true,
 | 
| 
 | 
   370 					Type       = "byte[]",
 | 
| 
 | 
   371 					ColumnType = "binary",
 | 
| 
 | 
   372 					IsClass    = true,
 | 
| 
 | 
   373 					DbType     = DbType.Binary,
 | 
| 
 | 
   374 					SqlDbType  = SqlDbType.Binary,
 | 
| 
 | 
   375 					Length     = 6,
 | 
| 
 | 
   376 				}},
 | 
| 
 | 
   377 				{ "loginame", new VarCharColumn   { ColumnName = "loginame", Length = 30 }},
 | 
| 
 | 
   378 			}
 | 
| 
 | 
   379 		});
 | 
| 
 | 
   380 
 | 
| 
 | 
   381 		int n = 1;
 | 
| 
 | 
   382 
 | 
| 
 | 
   383 		foreach (var col in Tables["sysobjects"].Columns)
 | 
| 
 | 
   384 		{
 | 
| 
 | 
   385 			var c = col.Value;
 | 
| 
 | 
   386 
 | 
| 
 | 
   387 			c.ID         = n++;
 | 
| 
 | 
   388 			c.MemberName = c.ColumnName;
 | 
| 
 | 
   389 
 | 
| 
 | 
   390 			if (c.IsNullable && !c.IsClass)
 | 
| 
 | 
   391 				c.Type = c.Type + "?";
 | 
| 
 | 
   392 		}
 | 
| 
 | 
   393 	}
 | 
| 
 | 
   394 }
 | 
| 
 | 
   395 
 | 
| 
 | 
   396 class VarCharColumn : Column
 | 
| 
 | 
   397 {
 | 
| 
 | 
   398 	public VarCharColumn()
 | 
| 
 | 
   399 	{
 | 
| 
 | 
   400 		Type       = "string";
 | 
| 
 | 
   401 		ColumnType = "varchar";
 | 
| 
 | 
   402 		IsClass    = true;
 | 
| 
 | 
   403 		DbType     = DbType.AnsiString;
 | 
| 
 | 
   404 		SqlDbType  = SqlDbType.VarChar;
 | 
| 
 | 
   405 	}
 | 
| 
 | 
   406 }
 | 
| 
 | 
   407 
 | 
| 
 | 
   408 class IntColumn : Column
 | 
| 
 | 
   409 {
 | 
| 
 | 
   410 	public IntColumn()
 | 
| 
 | 
   411 	{
 | 
| 
 | 
   412 		Type       = "int";
 | 
| 
 | 
   413 		ColumnType = "int";
 | 
| 
 | 
   414 		DbType     = DbType.Int32;
 | 
| 
 | 
   415 		SqlDbType  = SqlDbType.Int;
 | 
| 
 | 
   416 		Length     = 4;
 | 
| 
 | 
   417 	}
 | 
| 
 | 
   418 }
 | 
| 
 | 
   419 
 | 
| 
 | 
   420 class SmallIntColumn : Column
 | 
| 
 | 
   421 {
 | 
| 
 | 
   422 	public SmallIntColumn()
 | 
| 
 | 
   423 	{
 | 
| 
 | 
   424 		Type       = "short";
 | 
| 
 | 
   425 		ColumnType = "smallint";
 | 
| 
 | 
   426 		DbType     = DbType.Int16;
 | 
| 
 | 
   427 		SqlDbType  = SqlDbType.SmallInt;
 | 
| 
 | 
   428 		Length     = 2;
 | 
| 
 | 
   429 	}
 | 
| 
 | 
   430 }
 | 
| 
 | 
   431 
 | 
| 
 | 
   432 class DateTimeColumn : Column
 | 
| 
 | 
   433 {
 | 
| 
 | 
   434 	public DateTimeColumn()
 | 
| 
 | 
   435 	{
 | 
| 
 | 
   436 		Type       = "DateTime";
 | 
| 
 | 
   437 		ColumnType = "datetime";
 | 
| 
 | 
   438 		DbType     = DbType.DateTime;
 | 
| 
 | 
   439 		SqlDbType  = SqlDbType.DateTime;
 | 
| 
 | 
   440 		Length     = 8;
 | 
| 
 | 
   441 	}
 | 
| 
 | 
   442 }
 | 
| 
 | 
   443 
 | 
| 
 | 
   444 #>
 |