public PostgresSqlDataTypeProvider(TypeDescriptorProvider typeDescriptorProvider, ConstraintDefaultsConfiguration constraintDefaultsConfiguration, bool nativeUuids, bool nativeEnums)
            : base(constraintDefaultsConfiguration)
        {
            this.typeDescriptorProvider = typeDescriptorProvider;

            this.NativeUuids = nativeUuids;
            this.NativeEnums = nativeEnums;

            this.blobSqlDataType = new DefaultBlobSqlDataType(constraintDefaultsConfiguration, "BYTEA");

            DefinePrimitiveSqlDataType(typeof(bool), "BOOLEAN", "GetBoolean");
            DefinePrimitiveSqlDataType(typeof(short), "SMALLINT", "GetInt16");
            DefinePrimitiveSqlDataType(typeof(int), "INTEGER", "GetInt32");
            DefinePrimitiveSqlDataType(typeof(ushort), "SMALLINT", "GetInt32");
            DefinePrimitiveSqlDataType(typeof(uint), "INTEGER", "GetInt64");
            DefinePrimitiveSqlDataType(typeof(ulong), "BIGINT", "GetValue");
            DefinePrimitiveSqlDataType(typeof(float), "FLOAT(8)", "GetFloat");
            DefinePrimitiveSqlDataType(typeof(double), "DOUBLE PRECISION", "GetDouble");
            DefinePrimitiveSqlDataType(typeof(byte), "SMALLINT", "GetByte");
            DefinePrimitiveSqlDataType(typeof(sbyte), "SMALLINT", "GetByte");
            DefinePrimitiveSqlDataType(typeof(decimal), "NUMERIC(57, 28)", "GetDecimal");

            DefineSqlDataType(new DateTimeKindNormalisingDateTimeSqlDateType(this.ConstraintDefaultsConfiguration, "TIMESTAMP", false, DateTimeKind.Utc));
            DefineSqlDataType(new DateTimeKindNormalisingDateTimeSqlDateType(this.ConstraintDefaultsConfiguration, "TIMESTAMP", true, DateTimeKind.Utc));

            DefineSqlDataType(new PostgresTimespanSqlDataType(this.ConstraintDefaultsConfiguration, typeof(TimeSpan)));
            DefineSqlDataType(new PostgresTimespanSqlDataType(this.ConstraintDefaultsConfiguration, typeof(TimeSpan?)));

            if (nativeUuids)
            {
                DefineSqlDataType(new PostgresUuidSqlDataType(this.ConstraintDefaultsConfiguration, typeof(Guid)));
                DefineSqlDataType(new PostgresUuidSqlDataType(this.ConstraintDefaultsConfiguration, typeof(Guid?)));
            }
        }
        public RuntimeDataAccessModelInfo(TypeDescriptorProvider typeDescriptorProvider, Assembly concreteAssembly, Assembly definitionAssembly)
        {
            this.TypeDescriptorProvider = typeDescriptorProvider;
            this.dataAccessModelType    = typeDescriptorProvider.DataAccessModelType;

            Debug.Assert(dataAccessModelType.Assembly == definitionAssembly);

            this.ConcreteAssembly   = concreteAssembly;
            this.DefinitionAssembly = definitionAssembly;

            var concreteDataAccessModelType = concreteAssembly.GetType(dataAccessModelType.Namespace + "." + dataAccessModelType.Name);

            this.dataAccessModelConstructor = Expression.Lambda <Func <DataAccessModel> >(Expression.Convert(Expression.New(concreteDataAccessModelType), dataAccessModelType)).Compile();

            var typeProvider = new TypeDescriptorProvider(dataAccessModelType);

            foreach (var type in typeProvider.GetTypeDescriptors())
            {
                var concreteType = concreteAssembly.GetType(type.Type.Namespace + "." + type.Type.Name);

                this.concreteTypesByType[type.Type]    = concreteType;
                this.typesByConcreteType[concreteType] = type.Type;

                this.dataAccessObjectsTypes[type.Type] = TypeHelper.DataAccessObjectsType.MakeGenericType(type.Type);
                this.enumerableTypes[type.Type]        = TypeHelper.IEnumerableType.MakeGenericType(type.Type);
            }
        }
Esempio n. 3
0
        public static ProjectedColumns ProjectColumns(TypeDescriptorProvider typeDescriptorProvider, Nominator nominator, Expression expression, string newAlias, params string[] existingAliases)
        {
            var projector = new ColumnProjector(typeDescriptorProvider, nominator, expression, newAlias, existingAliases);

            expression = projector.Visit(expression);

            return(new ProjectedColumns(expression, projector.columns.ToReadOnlyList()));
        }
        public override RuntimeDataAccessModelInfo GetDataAccessModelAssembly(Type dataAccessModelType, DataAccessModelConfiguration configuration)
        {
            var typeDescriptorProvider = new TypeDescriptorProvider(dataAccessModelType);
            var originalAssembly       = dataAccessModelType.Assembly;
            var builtAssembly          = BuildAssembly(typeDescriptorProvider, configuration);

            return(new RuntimeDataAccessModelInfo(typeDescriptorProvider, builtAssembly, originalAssembly));
        }
Esempio n. 5
0
		public Sql92QueryFormatter(SqlQueryFormatterOptions options = SqlQueryFormatterOptions.Default, SqlDialect sqlDialect = null, SqlDataTypeProvider sqlDataTypeProvider = null, TypeDescriptorProvider typeDescriptorProvider = null)
			: base(sqlDialect, new StringWriter(new StringBuilder()))
		{
			this.options = options;
			this.typeDescriptorProvider = typeDescriptorProvider;
			this.sqlDataTypeProvider = sqlDataTypeProvider ?? new DefaultSqlDataTypeProvider(new ConstraintDefaultsConfiguration());
			this.stringQuote = this.sqlDialect.GetSyntaxSymbolString(SqlSyntaxSymbol.StringQuote);
			this.identifierQuoteString = this.sqlDialect.GetSyntaxSymbolString(SqlSyntaxSymbol.IdentifierQuote);
		}
Esempio n. 6
0
        internal ColumnProjector(TypeDescriptorProvider typeDescriptorProvider, Nominator nominator, Expression expression, string newAlias, params string[] existingAliases)
        {
            columnNames             = new HashSet <string>();
            columns                 = new List <SqlColumnDeclaration>();
            mappedColumnExpressions = new Dictionary <SqlColumnExpression, SqlColumnExpression>();

            this.typeDescriptorProvider = typeDescriptorProvider;
            this.nominator       = nominator;
            this.newAlias        = newAlias;
            this.existingAliases = existingAliases;
            this.candidates      = nominator.Nominate(expression);
        }
Esempio n. 7
0
        private static Assembly BuildAssembly(TypeDescriptorProvider typeDescriptorProvider, DataAccessModelConfiguration configuration)
        {
            DataAccessObjectTypeBuilder dataAccessObjectTypeBuilder;

            var hash               = configuration.GetSha1();
            var assemblyName       = new AssemblyName(typeDescriptorProvider.DataAccessModelType.Assembly.GetName().Name + "." + typeDescriptorProvider.DataAccessModelType.Name);
            var sharedAssemblyName = new AssemblyName("Shaolinq.GeneratedDataAccessModel");
            var assemblyBuilder    = AppDomain.CurrentDomain.DefineDynamicAssembly(sharedAssemblyName, AssemblyBuilderAccess.RunAndSave);
            var moduleBuilder      = assemblyBuilder.DefineDynamicModule(assemblyName.Name, assemblyName.Name + "." + hash + ".dll");

            var propertiesBuilder = moduleBuilder.DefineType("$$$DataAccessModelProperties", TypeAttributes.Class, typeof(object));

            var assemblyBuildContext = new AssemblyBuildContext(assemblyBuilder, propertiesBuilder);

            var dataAccessModelTypeBuilder = new DataAccessModelTypeBuilder(assemblyBuildContext, moduleBuilder);

            dataAccessModelTypeBuilder.BuildTypePhase1(typeDescriptorProvider.DataAccessModelType);

            var typeDescriptors = typeDescriptorProvider.GetTypeDescriptors();

            foreach (var typeDescriptor in typeDescriptors)
            {
                dataAccessObjectTypeBuilder = new DataAccessObjectTypeBuilder(typeDescriptorProvider, assemblyBuildContext, moduleBuilder, typeDescriptor.Type);
                dataAccessObjectTypeBuilder.Build(new DataAccessObjectTypeBuilder.TypeBuildContext(1));
            }

            foreach (var typeDescriptor in typeDescriptors)
            {
                dataAccessObjectTypeBuilder = assemblyBuildContext.TypeBuilders[typeDescriptor.Type];
                dataAccessObjectTypeBuilder.Build(new DataAccessObjectTypeBuilder.TypeBuildContext(2));
            }

            assemblyBuildContext.DataAccessModelPropertiesTypeBuilder.CreateType();
            dataAccessModelTypeBuilder.BuildTypePhase2();

            bool saveConcreteAssembly;

            bool.TryParse(ConfigurationManager.AppSettings["Shaolinq.SaveConcreteAssembly"], out saveConcreteAssembly);

#if DEBUG
            const bool isInDebugMode = true;
#else
            const bool isInDebugMode = false;
#endif

            // ReSharper disable once ConditionIsAlwaysTrueOrFalse
            if (saveConcreteAssembly || isInDebugMode)
            {
                ActionUtils.IgnoreExceptions(() => assemblyBuilder.Save(assemblyName + "." + hash + ".dll"));
            }

            return(assemblyBuilder);
        }
        private static Assembly BuildAssembly(TypeDescriptorProvider typeDescriptorProvider, DataAccessModelConfiguration configuration)
        {
            DataAccessObjectTypeBuilder dataAccessObjectTypeBuilder;

            var configMd5       = configuration.GetMd5();
            var assemblyName    = new AssemblyName(typeDescriptorProvider.DataAccessModelType.Assembly.GetName().Name + "." + typeDescriptorProvider.DataAccessModelType.Name);
            var assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);
            var moduleBuilder   = assemblyBuilder.DefineDynamicModule(assemblyName.Name, assemblyName.Name + "." + configMd5 + ".dll");

            var assemblyBuildContext = new AssemblyBuildContext(assemblyBuilder);

            var dataAccessModelTypeBuilder = new DataAccessModelTypeBuilder(assemblyBuildContext, moduleBuilder);

            dataAccessModelTypeBuilder.BuildType(typeDescriptorProvider.DataAccessModelType);

            var typeDescriptors = typeDescriptorProvider.GetTypeDescriptors();

            foreach (var typeDescriptor in typeDescriptors)
            {
                dataAccessObjectTypeBuilder = new DataAccessObjectTypeBuilder(typeDescriptorProvider, assemblyBuildContext, moduleBuilder, typeDescriptor.Type);
                dataAccessObjectTypeBuilder.Build(new DataAccessObjectTypeBuilder.TypeBuildContext(1));
            }

            foreach (var typeDescriptor in typeDescriptors)
            {
                dataAccessObjectTypeBuilder = assemblyBuildContext.TypeBuilders[typeDescriptor.Type];
                dataAccessObjectTypeBuilder.Build(new DataAccessObjectTypeBuilder.TypeBuildContext(2));
            }

            bool saveConcreteAssembly;

            bool.TryParse(ConfigurationManager.AppSettings["Shaolinq.SaveConcreteAssembly"], out saveConcreteAssembly);

#if DEBUG
            const bool isInDebugMode = true;
#else
            const bool isInDebugMode = false;
#endif

            if (saveConcreteAssembly || isInDebugMode)
            {
                ActionUtils.IgnoreExceptions(() => assemblyBuilder.Save(assemblyName + "." + configMd5 + ".dll"));
            }

            return(assemblyBuilder);
        }
 public PostgresDotConnectSqlQueryFormatter(SqlQueryFormatterOptions options, SqlDialect sqlDialect, SqlDataTypeProvider sqlDataTypeProvider, TypeDescriptorProvider typeDescriptorProvider, string schemaName, bool convertEnumsToText)
     : base(options, sqlDialect, sqlDataTypeProvider, typeDescriptorProvider, schemaName, convertEnumsToText)
 {
 }
 public PostgresSqlQueryFormatter(SqlQueryFormatterOptions options, SqlDialect sqlDialect, SqlDataTypeProvider sqlDataTypeProvider, TypeDescriptorProvider typeDescriptorProvider, string schemaName, bool convertEnumsToText)
     : base(options, sqlDialect, sqlDataTypeProvider, typeDescriptorProvider)
 {
     this.schemaName         = schemaName;
     this.ConvertEnumsToText = convertEnumsToText;
 }
Esempio n. 11
0
 public static Expression Amend(TypeDescriptorProvider typeDescriptorProvider, Expression expression)
 {
     return(new SqlSubCollectionOrderByAmender(typeDescriptorProvider).Visit(expression));
 }
Esempio n. 12
0
 private SqlSubCollectionOrderByAmender(TypeDescriptorProvider typeDescriptorProvider)
 {
     this.typeDescriptorProvider = typeDescriptorProvider;
 }
 public SqlServerSqlQueryFormatter(SqlQueryFormatterOptions options, SqlDialect sqlDialect, SqlDataTypeProvider sqlDataTypeProvider, TypeDescriptorProvider typeDescriptorProvider, SqlServerSqlDatabaseContextInfo contextInfo, string serverVersion)
     : base(options, sqlDialect, sqlDataTypeProvider, typeDescriptorProvider)
 {
     this.contextInfo  = contextInfo;
     this.majorVersion = serverVersion == null ? null : (int?)Convert.ToInt32(serverVersion.Split('.')[0]);
 }
Esempio n. 14
0
        protected override void Initialize()
        {
            TypeDescriptorProvider.RegisterTypes();

            base.Initialize();
        }
Esempio n. 15
0
        private static Assembly BuildAssembly(TypeDescriptorProvider typeDescriptorProvider, DataAccessModelConfiguration configuration)
        {
            DataAccessObjectTypeBuilder dataAccessObjectTypeBuilder;
            var serializedConfiguration = XmlSerializer <DataAccessModelConfigurationUniqueKey> .New().SerializeToString(new DataAccessModelConfigurationUniqueKey(configuration));

            var filename = GetFileName(typeDescriptorProvider, configuration.GeneratedAssembliesSaveDirectory, serializedConfiguration, out var fullhash);

            if (configuration.SaveAndReuseGeneratedAssemblies ?? false)
            {
                if (filename != null && File.Exists(filename))
                {
                    var candidate = Assembly.LoadFile(filename);

                    if (ReadResource(candidate, "configuration.xml") == serializedConfiguration &&
                        ReadResource(candidate, "sha1.txt") == fullhash)
                    {
                        return(candidate);
                    }
                }
            }

            var filenameWithoutExtension = Path.GetFileNameWithoutExtension(filename);
            var typeDescriptors          = typeDescriptorProvider.GetTypeDescriptors();
            var assemblyName             = new AssemblyName(filenameWithoutExtension);
            var assemblyBuilder          = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave, Path.GetDirectoryName(filename));
            var moduleBuilder            = assemblyBuilder.DefineDynamicModule(filenameWithoutExtension, filenameWithoutExtension + ".dll");

            assemblyBuilder.SetCustomAttribute(new CustomAttributeBuilder(TypeUtils.GetConstructor(() => new GeneratedAssemblyAttribute()), Type.EmptyTypes));

            var propertiesBuilder    = moduleBuilder.DefineType("$$$DataAccessModelProperties", TypeAttributes.Class, typeof(object));
            var assemblyBuildContext = new AssemblyBuildContext(assemblyBuilder, moduleBuilder, propertiesBuilder);

            var dataAccessModelTypeBuilder = new DataAccessModelTypeBuilder(assemblyBuildContext, moduleBuilder);

            dataAccessModelTypeBuilder.BuildTypePhase1(typeDescriptorProvider.DataAccessModelType);

            foreach (var typeDescriptor in typeDescriptors)
            {
                dataAccessObjectTypeBuilder = new DataAccessObjectTypeBuilder(typeDescriptorProvider, assemblyBuildContext, moduleBuilder, typeDescriptor.Type);
                dataAccessObjectTypeBuilder.Build(new DataAccessObjectTypeBuilder.TypeBuildContext(1));
            }

            foreach (var typeDescriptor in typeDescriptors)
            {
                dataAccessObjectTypeBuilder = assemblyBuildContext.TypeBuilders[typeDescriptor.Type];
                dataAccessObjectTypeBuilder.Build(new DataAccessObjectTypeBuilder.TypeBuildContext(2));
            }

            assemblyBuildContext.DataAccessModelPropertiesTypeBuilder.CreateType();
            assemblyBuildContext.FinishConstantsContainer();
            assemblyBuildContext.ConstantsContainer.CreateType();

            dataAccessModelTypeBuilder.BuildTypePhase2();

#if DEBUG
            const bool isInDebugMode = true;
#else
            const bool isInDebugMode = false;
#endif

            var saveAssembly = configuration.SaveAndReuseGeneratedAssemblies ?? !isInDebugMode;

            if (saveAssembly)
            {
                try
                {
                    moduleBuilder.DefineManifestResource("configuration.xml", new MemoryStream(Encoding.UTF8.GetBytes(serializedConfiguration)), ResourceAttributes.Public);
                    moduleBuilder.DefineManifestResource("sha1.txt", new MemoryStream(Encoding.UTF8.GetBytes(fullhash)), ResourceAttributes.Public);

                    assemblyBuilder.Save(Path.GetFileName(filename));
                }
                catch
                {
                }
            }

            return(assemblyBuilder);
        }
Esempio n. 16
0
 private InterfaceAccessNormalizer(TypeDescriptorProvider typeDescriptorProvider)
 {
     this.typeDescriptorProvider = typeDescriptorProvider;
 }
Esempio n. 17
0
        private static string GetFileName(TypeDescriptorProvider typeDescriptorProvider, string cacheDirectory, string serializedConfiguration, out string fullhash)
        {
            var sha1          = SHA1.Create();
            var modelAssembly = typeDescriptorProvider.DataAccessModelType.Assembly;
            var uniquelyReferencedAssemblies = new HashSet <Assembly> {
                typeof(DataAccessModel).Assembly, modelAssembly
            };

            foreach (var type in typeDescriptorProvider.GetTypeDescriptors())
            {
                var current = type.Type;

                while (current != null)
                {
                    uniquelyReferencedAssemblies.Add(current.Assembly);

                    current = current.BaseType;
                }
            }

            var bytes = Encoding.UTF8.GetBytes(serializedConfiguration);

            sha1.TransformBlock(bytes, 0, bytes.Length, null, 0);

            foreach (var assembly in uniquelyReferencedAssemblies.OrderBy(c => c.FullName))
            {
                bytes = Encoding.UTF8.GetBytes(assembly.FullName);
                sha1.TransformBlock(bytes, 0, bytes.Length, null, 0);

                bytes = Encoding.UTF8.GetBytes(assembly.GetName().Version.ToString());
                sha1.TransformBlock(bytes, 0, bytes.Length, null, 0);

                var path = StringUriUtils.GetScheme(assembly.CodeBase) == "file" ? new Uri(assembly.CodeBase).LocalPath : assembly.Location;

                if (path != null)
                {
                    if (assembly.GetName().GetPublicKeyToken().Length == 0)
                    {
                        var fileInfo = new FileInfo(path);

                        bytes = BitConverter.GetBytes(fileInfo.Length);
                        sha1.TransformBlock(bytes, 0, bytes.Length, null, 0);

                        bytes = BitConverter.GetBytes(fileInfo.LastWriteTimeUtc.Ticks);
                        sha1.TransformBlock(bytes, 0, bytes.Length, null, 0);
                    }
                }
            }

            sha1.TransformFinalBlock(bytes, 0, 0);

            var fileName = modelAssembly.Location == null?modelAssembly.GetName().Name : Path.GetFileNameWithoutExtension(modelAssembly.Location);

            cacheDirectory = cacheDirectory?.Trim();
            var codebaseUri = new Uri(modelAssembly.CodeBase);

            var modelName = typeDescriptorProvider.DataAccessModelType.Name;

            if (modelAssembly.GetExportedTypes().Any(c => c.Name == modelName && c != typeDescriptorProvider.DataAccessModelType))
            {
                modelName = typeDescriptorProvider.DataAccessModelType.FullName.Replace(".", "_");
            }

            fullhash = TextConversion.ToHexString(sha1.Hash);

            fileName       = $"{fileName}.{modelName}.Generated.dll";
            cacheDirectory = !string.IsNullOrEmpty(cacheDirectory) ? cacheDirectory : !codebaseUri.IsFile ? Environment.CurrentDirectory : Path.GetDirectoryName(codebaseUri.LocalPath);

            return(Path.Combine(cacheDirectory, fileName));
        }
 public SqliteSqlQueryFormatter(SqlQueryFormatterOptions options, SqlDialect sqlDialect, SqlDataTypeProvider sqlDataTypeProvider, TypeDescriptorProvider typeDescriptorProvider)
     : base(options, sqlDialect, sqlDataTypeProvider, typeDescriptorProvider)
 {
 }
Esempio n. 19
0
 public SqlServerIdentityInsertAndUpdateAmender(TypeDescriptorProvider typeDescriptorProvider)
 {
     this.typeDescriptorProvider = typeDescriptorProvider;
 }
 public MySqlSqlQueryFormatter(SqlQueryFormatterOptions options, SqlDialect sqlDialect, SqlDataTypeProvider sqlDataTypeProvider, TypeDescriptorProvider typeDescriptorProvider, bool silentlyIgnoreIndexConditions)
     : base(options, sqlDialect, sqlDataTypeProvider, typeDescriptorProvider)
 {
     this.silentlyIgnoreIndexConditions = silentlyIgnoreIndexConditions;
 }
		private SqlSubCollectionOrderByAmender(TypeDescriptorProvider typeDescriptorProvider)
		{
			this.typeDescriptorProvider = typeDescriptorProvider;
		}
		public static Expression Amend(TypeDescriptorProvider typeDescriptorProvider, Expression expression)
		{
			return new SqlSubCollectionOrderByAmender(typeDescriptorProvider).Visit(expression);
		}
Esempio n. 23
0
 public static Expression Normalize(TypeDescriptorProvider typeDescriptorProvider, Expression expression)
 {
     return(new InterfaceAccessNormalizer(typeDescriptorProvider).Visit(expression));
 }
 public PostgresEnumSqlDataType(ConstraintDefaultsConfiguration constraintDefaultsConfiguration, Type supportedType, TypeDescriptorProvider typeDescriptorProvider)
     : base(constraintDefaultsConfiguration, supportedType, true)
 {
     this.typeDescriptorProvider = typeDescriptorProvider;
     this.underlyingType         = Nullable.GetUnderlyingType(supportedType);
 }
Esempio n. 25
0
 public static Expression Amend(TypeDescriptorProvider typeDescriptorProvider, Expression expression)
 {
     return(new SqlServerIdentityInsertAndUpdateAmender(typeDescriptorProvider).Visit(expression));
 }