New tests.
[mono.git] / mcs / class / System.Data.Linq / src / DbLinq / Vendor / Implementation / SchemaLoader.cs
index c82783ef19faa16747a9e5ff3225df3caddef8ff..ef05fc55baa17f3bd07991298be8f18743091364 100644 (file)
@@ -38,12 +38,11 @@ using DbLinq.Data.Linq;
 using DbLinq.Factory;\r
 using DbLinq.Schema;\r
 using DbLinq.Schema.Dbml;\r
+using System.Text.RegularExpressions;\r
 \r
 namespace DbLinq.Vendor.Implementation\r
 {\r
-#if MONO_STRICT\r
-    internal\r
-#else\r
+#if !MONO_STRICT\r
     public\r
 #endif\r
     abstract partial class SchemaLoader : ISchemaLoader\r
@@ -52,12 +51,7 @@ namespace DbLinq.Vendor.Implementation
         /// Underlying vendor\r
         /// </summary>\r
         /// <value></value>\r
-        public abstract IVendor Vendor { get; }\r
-        /// <summary>\r
-        /// Vendor typed DataContext type\r
-        /// </summary>\r
-        /// <value></value>\r
-        public abstract System.Type DataContextType { get; }\r
+        public abstract IVendor Vendor { get; set; }\r
         /// <summary>\r
         /// Connection used to read schema\r
         /// </summary>\r
@@ -103,14 +97,14 @@ namespace DbLinq.Vendor.Implementation
             if (string.IsNullOrEmpty(databaseName))\r
                 throw new ArgumentException("A database name is required. Please specify /database=<databaseName>");\r
 \r
-            databaseName = GetDatabaseName(databaseName);\r
+            databaseName = GetDatabaseNameAliased(databaseName, nameAliases);\r
 \r
             var schemaName = NameFormatter.GetSchemaName(databaseName, GetExtraction(databaseName), nameFormat);\r
             var names = new Names();\r
             var schema = new Database\r
                              {\r
                                  Name = schemaName.DbName,\r
-                                 Class = schemaName.ClassName,\r
+                                 Class = GetRuntimeClassName(schemaName.ClassName, nameAliases),\r
                                  BaseType = typeof(DataContext).FullName,\r
                                  ContextNamespace = contextNamespace,\r
                                  EntityNamespace = entityNamespace,\r
@@ -133,7 +127,7 @@ namespace DbLinq.Vendor.Implementation
             //CheckNamesSafety(schema);\r
 \r
             // generate backing fields name (since we have here correct names)\r
-            GenerateStorageFields(schema);\r
+            GenerateStorageAndMemberFields(schema);\r
 \r
             return schema;\r
         }\r
@@ -148,6 +142,23 @@ namespace DbLinq.Vendor.Implementation
             return databaseName;\r
         }\r
 \r
+        protected virtual string GetDatabaseNameAliased(string databaseName, INameAliases nameAliases)\r
+        {\r
+            string databaseNameAliased = nameAliases != null ? nameAliases.GetDatabaseNameAlias(databaseName) : null;\r
+            return (databaseNameAliased != null) ? databaseNameAliased : GetDatabaseName(databaseName);\r
+        }\r
+\r
+        /// <summary>\r
+        /// Gets a usable name for the database class.\r
+        /// </summary>\r
+        /// <param name="databaseName">Name of the clas.</param>\r
+        /// <returns></returns>\r
+        protected virtual string GetRuntimeClassName(string className, INameAliases nameAliases)\r
+        {\r
+            string classNameAliased = nameAliases != null ? nameAliases.GetClassNameAlias(className) : null;\r
+            return (classNameAliased != null) ? classNameAliased : className;\r
+        }\r
+\r
         /// <summary>\r
         /// Writes an error line.\r
         /// </summary>\r
@@ -227,6 +238,8 @@ namespace DbLinq.Vendor.Implementation
             return CreateTableName(dbTableName, dbSchema, nameAliases, nameFormat, GetExtraction(dbTableName));\r
         }\r
 \r
+        Regex startsWithNumber = new Regex(@"^\d", RegexOptions.Compiled);\r
+\r
         /// <summary>\r
         /// Creates the name of the column.\r
         /// </summary>\r
@@ -255,6 +268,10 @@ namespace DbLinq.Vendor.Implementation
             var tableName = CreateTableName(dbTableName, dbSchema, nameAliases, nameFormat);\r
             if (columnName.PropertyName == tableName.ClassName)\r
                 columnName.PropertyName = columnName.PropertyName + "1";\r
+\r
+            if (startsWithNumber.IsMatch(columnName.PropertyName))\r
+                columnName.PropertyName = "_" + columnName.PropertyName;\r
+\r
             columnName.DbName = dbColumnName;\r
             return columnName;\r
         }\r
@@ -392,8 +409,15 @@ namespace DbLinq.Vendor.Implementation
                 if (columnRow.PrimaryKey.HasValue)\r
                     column.IsPrimaryKey = columnRow.PrimaryKey.Value;\r
 \r
-                if (columnRow.Generated.HasValue)\r
-                    column.IsDbGenerated = columnRow.Generated.Value;\r
+                bool? generated = (nameAliases != null) ? nameAliases.GetColumnGenerated(columnRow.ColumnName, columnRow.TableName, columnRow.TableSchema) : null;\r
+                if (!generated.HasValue)\r
+                    generated = columnRow.Generated;\r
+                if (generated.HasValue)\r
+                    column.IsDbGenerated = generated.Value;\r
+\r
+                AutoSync? autoSync = (nameAliases != null) ? nameAliases.GetColumnAutoSync(columnRow.ColumnName, columnRow.TableName, columnRow.TableSchema) : null;\r
+                if (autoSync.HasValue)\r
+                    column.AutoSync = autoSync.Value;\r
 \r
                 // the Expression can originate from two sources:\r
                 // 1. DefaultValue\r
@@ -404,6 +428,7 @@ namespace DbLinq.Vendor.Implementation
 \r
                 column.CanBeNull = columnRow.Nullable;\r
 \r
+                string columnTypeAlias = nameAliases != null ? nameAliases.GetColumnForcedType(columnRow.ColumnName, columnRow.TableName, columnRow.TableSchema) : null;\r
                 var columnType = MapDbType(columnName.DbName, columnRow);\r
 \r
                 var columnEnumType = columnType as EnumType;\r
@@ -416,6 +441,8 @@ namespace DbLinq.Vendor.Implementation
                         enumType[enumValue.Key] = enumValue.Value;\r
                     }\r
                 }\r
+                else if (columnTypeAlias != null)\r
+                    column.Type = columnTypeAlias;\r
                 else\r
                     column.Type = columnType.ToString();\r
 \r