Mercurial > pub > bltoolkit
comparison Source/Templates/Sybase.ttinclude @ 0:f990fcb411a9
Копия текущей версии из github
| author | cin |
|---|---|
| date | Thu, 27 Mar 2014 21:46:09 +0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:f990fcb411a9 |
|---|---|
| 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 #> |
