Пример #1
0
        public void Setup()
        {
            var schema = new DataTable();

            schema.Columns.Add("AllowDBNull", typeof(bool));
            schema.Rows.Add(false);
            schema.Rows.Add(true);
            schema.Rows.Add(true);

            var result = new QueryResult()
            {
                Schema = schema,

                Names      = new[] { "id", "name", "login_count" },
                FieldTypes = new[] { typeof(long), typeof(string), typeof(int) },
                DbTypes    = new[] { "int8", "varchar", "int4" },

                Data = new object?[][] { new object?[] { 100500L, "Vasily Lohankin", 123 } },
            };

            _cn = new MockDbConnection(result, ConnectionState.Open);
            _db = new DataConnection(PostgreSQLTools.GetDataProvider(PostgreSQLVersion.v95), _cn);

            _compiled = CompiledQuery.Compile <DataConnection, long, IQueryable <User> >(
                (db, userId) => from c in db.GetTable <User>()
                where c.Id == userId
                select c);
        }
Пример #2
0
        public void SpecificTest([IncludeDataSources(TestProvName.AllPostgreSQL)] string context, [Values] bool avoidProviderSpecificApi)
        {
            var provider = PostgreSQLTools.GetDataProvider(PostgreSQLVersion.v95);
            var cs       = DataConnection.GetConnectionString(context);

            using (var cn = new NpgsqlConnection(cs))
                using (var db = new DataConnection(provider, cn))
                {
                    db.MappingSchema.GetFluentMappingBuilder()
                    .Entity <Client>()
                    .HasTableName("Issue1438")
                    .Property(x => x.Id)
                    .IsPrimaryKey()
                    .IsIdentity();

                    using (var tbl = db.CreateLocalTable <Client>())
                    {
                        var id = db.InsertWithInt32Identity(new Client()
                        {
                            Has = true
                        });

                        var record = tbl.Where(_ => _.Id == id).Single();

                        Assert.AreEqual(id, record.Id);
                        Assert.True(record.Has);
                    }
                }
        }
Пример #3
0
        static DataConnection()
        {
            _configurationIDs = new ConcurrentDictionary <string, int>();


            OracleTools.GetDataProvider();
            PostgreSQLTools.GetDataProvider();

            var section = LinqToDBSection.Instance;

            if (section != null)
            {
                DefaultConfiguration = section.DefaultConfiguration;
                DefaultDataProvider  = section.DefaultDataProvider;

                foreach (DataProviderElement provider in section.DataProviders)
                {
                    var dataProviderType = Type.GetType(provider.TypeName, true);
                    var providerInstance = (IDataProviderFactory)Activator.CreateInstance(dataProviderType);

                    if (!string.IsNullOrEmpty(provider.Name))
                    {
                        AddDataProvider(provider.Name, providerInstance.GetDataProvider(provider.Attributes));
                    }
                }
            }
        }
Пример #4
0
        protected override IDbConnection CreateConnectionInternal(string connectionString)
        {
            // fill base mapping schema
            using (PostgreSQLTools.GetDataProvider(PostgreSQLVersion.v95).CreateConnection(connectionString))
            {
            }

            return(base.CreateConnectionInternal(connectionString));
        }
Пример #5
0
        public void NpgsqlDateTimeTest(string context)
        {
            PostgreSQLTools.GetDataProvider().CreateConnection(DataConnection.GetConnectionString(context));

            var d  = new NpgsqlDateTime(DateTime.Today);
            var o  = new DateTimeOffset(DateTime.Today);
            var c1 = PostgreSQLTools.GetDataProvider().MappingSchema.GetConvertExpression <NpgsqlDateTime, DateTimeOffset>();
            var c2 = PostgreSQLTools.GetDataProvider().MappingSchema.GetConvertExpression <NpgsqlDateTime, DateTimeOffset?>();

            Assert.IsNotNull(c1);
            Assert.IsNotNull(c2);

            Assert.AreEqual(o, c1.Compile()(d));
            Assert.AreEqual(o, c2.Compile()(d).Value);
        }
Пример #6
0
        protected override void OnConnectionTypeCreated(Type connectionType)
        {
            base.OnConnectionTypeCreated(connectionType);

            var baseProvider = (PostgreSQLDataProvider)PostgreSQLTools.GetDataProvider(PostgreSQLVersion.v95);

            // configure mapping from npgsql3 type to npgsql4 type though DataParameter.Value
            SetConverterToParameter(baseProvider.NpgsqlDateTimeType, NpgsqlDateTimeType);
            SetConverterToParameter(baseProvider.NpgsqlDateType, NpgsqlDateType);
            SetConverterToParameter(baseProvider.NpgsqlIntervalType, NpgsqlIntervalType);
            SetConverterToParameter(baseProvider.NpgsqlPointType, NpgsqlPointType);
            SetConverterToParameter(baseProvider.NpgsqlLSegType, NpgsqlLSegType);
            SetConverterToParameter(baseProvider.NpgsqlBoxType, NpgsqlBoxType);
            SetConverterToParameter(baseProvider.NpgsqlPathType, NpgsqlPathType);
            SetConverterToParameter(baseProvider.NpgsqlPolygonType, NpgsqlPolygonType);
            SetConverterToParameter(baseProvider.NpgsqlCircleType, NpgsqlCircleType);
            SetConverterToParameter(baseProvider.NpgsqlLineType, NpgsqlLineType);
            SetConverterToParameterNpgsqlInet(baseProvider.NpgsqlInetType, NpgsqlInetType);

            // configure mapping from npgsql4 type to npgsql3 type
            SetConverterToV3(baseProvider.NpgsqlDateTimeType, NpgsqlDateTimeType);
            SetConverterToV3(baseProvider.NpgsqlDateType, NpgsqlDateType);
            SetConverterToV3(baseProvider.NpgsqlIntervalType, NpgsqlIntervalType);
            SetConverterToV3(baseProvider.NpgsqlPointType, NpgsqlPointType);
            SetConverterToV3(baseProvider.NpgsqlLSegType, NpgsqlLSegType);
            SetConverterToV3(baseProvider.NpgsqlBoxType, NpgsqlBoxType);
            SetConverterToV3(baseProvider.NpgsqlPathType, NpgsqlPathType);
            SetConverterToV3(baseProvider.NpgsqlPolygonType, NpgsqlPolygonType);
            SetConverterToV3(baseProvider.NpgsqlCircleType, NpgsqlCircleType);
            SetConverterToV3(baseProvider.NpgsqlLineType, NpgsqlLineType);
            SetConverterToV3NpgsqlInet(baseProvider.NpgsqlInetType, NpgsqlInetType);

            _setMoney     = GetSetParameter(connectionType, "NpgsqlParameter", "NpgsqlDbType", NpgsqlDbType, "Money");
            _setVarBinary = GetSetParameter(connectionType, "NpgsqlParameter", "NpgsqlDbType", NpgsqlDbType, "Bytea");
            _setBoolean   = GetSetParameter(connectionType, "NpgsqlParameter", "NpgsqlDbType", NpgsqlDbType, "Boolean");
            _setXml       = GetSetParameter(connectionType, "NpgsqlParameter", "NpgsqlDbType", NpgsqlDbType, "Xml");
            _setText      = GetSetParameter(connectionType, "NpgsqlParameter", "NpgsqlDbType", NpgsqlDbType, "Text");
            _setBit       = GetSetParameter(connectionType, "NpgsqlParameter", "NpgsqlDbType", NpgsqlDbType, "Bit");
            _setHstore    = GetSetParameter(connectionType, "NpgsqlParameter", "NpgsqlDbType", NpgsqlDbType, "Hstore");
            _setJson      = GetSetParameter(connectionType, "NpgsqlParameter", "NpgsqlDbType", NpgsqlDbType, "Json");
            _setJsonb     = GetSetParameter(connectionType, "NpgsqlParameter", "NpgsqlDbType", NpgsqlDbType, "Jsonb");

            _setNativeParameterType = GetSetParameter <object>(connectionType, "NpgsqlParameter", "NpgsqlDbType", NpgsqlDbType);
        }
Пример #7
0
        public void Setup()
        {
            var schema = new DataTable();

            schema.Columns.Add("AllowDBNull", typeof(bool));
            schema.Rows.Add(false);
            schema.Rows.Add(true);
            schema.Rows.Add(true);

            var result = new QueryResult()
            {
                Schema = schema,

                Names      = new[] { "id", "name", "login_count" },
                FieldTypes = new[] { typeof(long), typeof(string), typeof(int) },
                DbTypes    = new[] { "int8", "varchar", "int4" },

                Data = new object?[][] { new object?[] { 100500L, "Vasily Lohankin", 123 } },
            };

            _cn = new MockDbConnection(result, ConnectionState.Open);

            _compiled = CompiledQuery.Compile <DataConnection, long?, IQueryable <User> >(
                (db, userId) => from c in db.GetTable <User>()
                where userId == null || c.Id == userId
                select c);

            var threadCount = ThreadCount;

            _threads = new Thread[threadCount];
            _db      = new DataConnection[threadCount];

            for (var i = 0; i < _threads.Length; i++)
            {
                _db[i]      = new DataConnection(PostgreSQLTools.GetDataProvider(PostgreSQLVersion.v95), _cn);
                _threads[i] = new Thread(ThreadWorker);
                _threads[i].IsBackground = true;                 // we don't stop threads explicitly
                _threads[i].Start(i);
            }
        }
Пример #8
0
        public void Setup()
        {
            _cn = new MockDbConnection(new QueryResult()
            {
                Return = 1
            }, ConnectionState.Open);
            _db = new DataConnection(PostgreSQLTools.GetDataProvider(PostgreSQLVersion.v95), _cn);

            _compiledLinqSet = CompiledQuery.Compile <DataConnection, Workflow, int>(
                (db, record) => db.GetTable <Workflow>()
                .Where(x => x.Id == record.Id && x.RowVersion == record.RowVersion)
                .Set(x => x.Status, record.Status)
                .Set(x => x.Result, record.Result)
                .Set(x => x.Error, record.Error)
                .Set(x => x.Steps, record.Steps)
                .Set(x => x.UpdateTime, record.UpdateTime)
                .Set(x => x.RowVersion, x => x.RowVersion + 1)
                .Set(x => x.StartTime, record.StartTime)
                .Set(x => x.ProcessedTime, record.ProcessedTime)
                .Set(x => x.CompleteTime, record.CompleteTime)
                .Update());
            _compiledLinqObject = CompiledQuery.Compile <DataConnection, Workflow, int>(
                (db, record) => db.GetTable <Workflow>()
                .Where(x => x.Id == _record.Id && x.RowVersion == _record.RowVersion)
                .Update(x => new()
            {
                Status        = record.Status,
                Result        = record.Result,
                Error         = record.Error,
                Steps         = record.Steps,
                UpdateTime    = record.UpdateTime,
                RowVersion    = x.RowVersion + 1,
                StartTime     = record.StartTime,
                ProcessedTime = record.ProcessedTime,
                CompleteTime  = record.CompleteTime
            }));
        }
Пример #9
0
 public Npgsql4PostgreSQLMappingSchema() : base(PostgreSQLTools.GetDataProvider(PostgreSQLVersion.v95).MappingSchema)
 {
 }
Пример #10
0
        public bool OpenConnection(string connectionString)
        {
            if (string.IsNullOrWhiteSpace(connectionString))
            {
                Logger.Log(this, "Unable to connect to the SQL database: No connection specified.", LogLevel.Error);
                return(false);
            }
            internalState         = ConnectionState.Connecting;
            connection            = PostgreSQLTools.CreateDataConnection(connectionString);
            internalState         = ConnectionState.Open;
            connection.OnClosing += (sender, args) => internalState = ConnectionState.Closed;
            connection.OnClosed  += (sender, args) => internalState = ConnectionState.Closed;
            metadata              = connection.GetTable <Metadata>();
            try
            {
                var version = from entry in metadata
                              where entry.Key == "version"
                              select entry.Value;

                var count = version.Count();
                if (count != 1)
                {
                    Logger.Log(this, "Zero or multiple 'version' entries found in the Metadata table. The database connection will be dropped.", LogLevel.Error);
                    HandleConnectionFailure();
                    return(false);
                }

                if (version.First() != Bot.DatabaseVersion)
                {
                    Logger.Log(this, $"Bot and database version do not match (bot is at {Bot.DatabaseVersion}, database is at {version.First()}). The database will now be upgraded.", LogLevel.Info);
                    if (!UpgradeDatabase(version.First()))
                    {
                        Logger.Log(this, "Upgrade failed. The database connection will be dropped.", LogLevel.Warning);
                        HandleConnectionFailure();
                        return(false);
                    }
                }
            }
            catch (NpgsqlException e)
            {
                if (e.Message.ToLower().Contains("metadata") && e.Message.ToLower().Contains("does not exist"))
                {
                    Logger.Log(this, "Metadata table not found. A new tableset will be created.", LogLevel.Warning);
                    try
                    {
                        DropTables();
                        CreateTables();
                    }
                    catch (NpgsqlException f)
                    {
                        Logger.Log(this, $"Unable to create a new tableset: An exception occurred({f.GetType()}: {f.Message}). The database connection will be dropped.", LogLevel.Error);
                        HandleConnectionFailure();
                        return(false);
                    }
                    AddMetadata();
                    Logger.Log(this, "Writing metadata...", LogLevel.Info);
                }
                else
                {
                    Logger.Log(this, $"Unable to retrieve the database version: An exception occurred ({e.GetType()}: {e.Message}). The database connection will be dropped.", LogLevel.Error);
                    HandleConnectionFailure();
                    return(false);
                }
            }

            //UserCredentials = connection.GetTable<UserCredential>();
            Quotes         = connection.GetTable <Quote>();
            UserStatistics = connection.GetTable <UserStatistic>();
            Emoticons      = connection.GetTable <UsedEmoticon>();
            KeyValuePairs  = connection.GetTable <KeyValuePair>();
            LinkedUrls     = connection.GetTable <LinkedUrl>();
            Users          = connection.GetTable <User>();
            Words          = connection.GetTable <UsedWord>();
            ChatLog        = connection.GetTable <ChatLog>();
            MiscData       = connection.GetTable <MiscData>();

            try
            {
                // These methods are actually not pure, because they'll throw an exception
                // if their backing database tables are not found. It's a bit of a hack,
                // but this is the easiest way to check whether those tables exist.

                // ReSharper disable ReturnValueOfPureMethodIsNotUsed
                //UserCredentials.FirstOrDefault();
                Quotes.FirstOrDefault();
                UserStatistics.FirstOrDefault();
                Emoticons.FirstOrDefault();
                KeyValuePairs.FirstOrDefault();
                LinkedUrls.FirstOrDefault();
                Users.FirstOrDefault();
                Words.FirstOrDefault();
                ChatLog.FirstOrDefault();
                MiscData.FirstOrDefault();
                // ReSharper restore ReturnValueOfPureMethodIsNotUsed
            }
            catch (Exception e)
            {
                Logger.Log(this, $"Database integrity check failed ({e.GetType().Name}: {e.Message})", LogLevel.Error);
                HandleConnectionFailure();
                return(false);
            }

            return(true);
        }
 /// <summary>
 /// Configure connection to use PostgreSQL Npgsql provider, specific dialect and connection string.
 /// </summary>
 /// <param name="builder">Instance of <see cref="LinqToDbConnectionOptionsBuilder"/>.</param>
 /// <param name="connectionString">PostgreSQL connection string.</param>
 /// <param name="dialect">POstgreSQL dialect support level.</param>
 /// <returns>The builder instance so calls can be chained.</returns>
 public static LinqToDbConnectionOptionsBuilder UsePostgreSQL(this LinqToDbConnectionOptionsBuilder builder, string connectionString, PostgreSQLVersion dialect)
 {
     return(builder.UseConnectionString(PostgreSQLTools.GetDataProvider(dialect), connectionString));
 }