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 #>
|