Exemplo n.º 1
0
        public async Task Rebuild_Change_Culture_Error()
        {
            using (var file = new TempFile())
                using (var db = new LiteDatabaseAsync(file.Filename))
                {
                    // remove string comparer ignore case
                    await db.RebuildAsync(new RebuildOptions { Collation = new Collation("en-US/None") });

                    // insert 2 documents with different ID in case sensitive
                    await db.GetCollection("col1").InsertAsync(new BsonDocument[]
                    {
                        new BsonDocument {
                            ["_id"] = "ana"
                        },
                        new BsonDocument {
                            ["_id"] = "ANA"
                        }
                    });

                    // try migrate to ignorecase
                    this.Invoking(async x =>
                    {
                        await db.RebuildAsync(new RebuildOptions {
                            Collation = new Collation("en-US/IgnoreCase")
                        });
                    }).Should().Throw <LiteAsyncException>();

                    // test if current pragma still with collation none
                    (await db.PragmaAsync(Pragmas.COLLATION)).AsString.Should().Be("en-US/None");
                }
        }
Exemplo n.º 2
0
        public async Task Transaction_Write_Lock_Timeout()
        {
            var data1 = DataGen.Person(1, 100).ToArray();
            var data2 = DataGen.Person(101, 200).ToArray();

            using (var db = new LiteDatabase("filename=:memory:"))
                using (var asyncDb = new LiteDatabaseAsync(db, false))
                {
                    // small timeout
                    await asyncDb.PragmaAsync(Pragmas.TIMEOUT, 1);

                    var asyncPerson = asyncDb.GetCollection <Person>();
                    var person      = db.GetCollection <Person>();

                    // init person collection with 100 document
                    await asyncPerson.InsertAsync(data1);

                    var taskASemaphore = new SemaphoreSlim(0, 1);
                    var taskBSemaphore = new SemaphoreSlim(0, 1);

                    // task A will open transaction and will insert +100 documents
                    // but will commit only 2s later
                    var ta = Task.Run(async() =>
                    {
                        await asyncDb.BeginTransAsync();

                        await asyncPerson.InsertAsync(data2);

                        taskBSemaphore.Release();
                        taskASemaphore.Wait();

                        var count = await asyncPerson.CountAsync();

                        count.Should().Be(data1.Length + data2.Length);

                        await asyncDb.CommitAsync();
                    });

                    // task B will try delete all documents but will be locked during 1 second
                    var tb = Task.Run(() =>
                    {
                        taskBSemaphore.Wait();

                        db.BeginTrans();
                        person
                        .Invoking(personCol => personCol.DeleteMany("1 = 1"))
                        .Should()
                        .Throw <LiteException>()
                        .Where(ex => ex.ErrorCode == LiteException.LOCK_TIMEOUT);

                        taskASemaphore.Release();
                    });

                    await Task.WhenAll(ta, tb);
                }
        }