public async Task Insert_With_AutoId_And_Reread()
        {
            using (var db = new LiteDatabaseAsync(new MemoryStream()))
            {
                var users = db.GetCollection <User>("TEST");

                var u1 = new User {
                    Name = "John"
                };
                var u2 = new User {
                    Name = "Zarlos"
                };
                var u3 = new User {
                    Name = "Ana"
                };

                // insert ienumerable
                await users.InsertAsync(new User[] { u1, u2, u3 });

                // Reopen the collection
                var users2 = db.GetCollection <User>("TEST");
                var result = users2.FindAllAsync().GetAwaiter().GetResult();

                Assert.Equal(3, result.Count());
                var resultList = result.Select(u => u.Name).ToList();
                Assert.Contains("John", resultList);
                Assert.Contains("Zarlos", resultList);
                Assert.Contains("Ana", resultList);
            }
        }
示例#2
0
        public async Task Delete_Many()
        {
            using (var db = new LiteDatabaseAsync(new MemoryStream()))
            {
                var users = db.GetCollection <User>("users");

                var u1 = new User {
                    Id = 1, Name = "John"
                };
                var u2 = new User {
                    Id = 2, Name = "Zarlos"
                };
                var u3 = new User {
                    Id = 3, Name = "Ana"
                };

                await users.InsertAsync(new User[] { u1, u2, u3 });

                var ids = new int[] { 1, 2, 3 };

                await users.DeleteManyAsync(x => ids.Contains(x.Id));

                (await users.CountAsync()).Should().Be(0);
            }
        }
        public async Task Query_Min_Max()
        {
            using (var f = new TempFile())
                using (var db = new LiteDatabaseAsync(f.Filename))
                {
                    var c = db.GetCollection <EntityMinMax>("col");

                    await c.InsertAsync(new EntityMinMax { });

                    await c.InsertAsync(new EntityMinMax
                    {
                        ByteValue = 200,
                        IntValue  = 443500,
                        LongValue = 443500,
                        UintValue = 443500
                    });

                    await c.EnsureIndexAsync(x => x.ByteValue);

                    await c.EnsureIndexAsync(x => x.IntValue);

                    await c.EnsureIndexAsync(x => x.LongValue);

                    await c.EnsureIndexAsync(x => x.UintValue);

                    (await c.MaxAsync(x => x.ByteValue)).Should().Be(200);
                    (await c.MaxAsync(x => x.IntValue)).Should().Be(443500);
                    (await c.MaxAsync(x => x.LongValue)).Should().Be(443500);
                    (await c.MaxAsync(x => x.UintValue)).Should().Be(443500);
                }
        }
        public async Task Transaction_Avoid_Dirty_Read()
        {
            var data1 = DataGen.Person(1, 100).ToArray();
            var data2 = DataGen.Person(101, 200).ToArray();

            using (var db = new LiteDatabase(new MemoryStream()))
                using (var asyncDb = new LiteDatabaseAsync(db, false))
                {
                    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 1s later - this plus +100 document must be visible only inside task A
                    var ta = Task.Run(async() =>
                    {
                        await asyncDb.BeginTransAsync();

                        await asyncPerson.InsertAsync(data2);

                        taskBSemaphore.Release();
                        await taskASemaphore.WaitAsync();

                        var count = await asyncPerson.CountAsync();

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

                        await asyncDb.CommitAsync();
                        taskBSemaphore.Release();
                    });

                    // task B will not open transaction and will wait 250ms before and count collection -
                    // at this time, task A already insert +100 document but here I can't see (are not committed yet)
                    // after task A finish, I can see now all 200 documents
                    var tb = Task.Run(() =>
                    {
                        taskBSemaphore.Wait();

                        var count = person.Count();

                        // read 100 documents
                        count.Should().Be(data1.Length);

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

                        // read 200 documents
                        count = person.Count();

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

                    await Task.WhenAll(ta, tb);
                }
        }
 public UnAuthorizeCommand(AppConfig appConfig, LiteDatabaseAsync liteDb, IEasyCachingProvider easyCachingProvider, AuthService authService)
 {
     _appConfig           = appConfig;
     _easyCachingProvider = easyCachingProvider;
     _authService         = authService;
     _liteDb = liteDb;
 }
示例#6
0
        public void Database_Pragmas_Get_Set()
        {
            using (var db = new LiteDatabaseAsync(":memory:"))
            {
                db.Timeout.TotalSeconds.Should().Be(60.0);
                db.UtcDate.Should().Be(false);
                db.Collation.SortOptions.Should().Be(CompareOptions.IgnoreCase);
                db.LimitSize.Should().Be(long.MaxValue);
                db.UserVersion.Should().Be(0);
                db.CheckpointSize.Should().Be(1000);

                // changing values
                db.Timeout        = TimeSpan.FromSeconds(30);
                db.UtcDate        = true;
                db.LimitSize      = 1024 * 1024;
                db.UserVersion    = 99;
                db.CheckpointSize = 0;

                // testing again
                db.Timeout.TotalSeconds.Should().Be(30);
                db.UtcDate.Should().Be(true);
                db.LimitSize.Should().Be(1024 * 1024);
                db.UserVersion.Should().Be(99);
                db.CheckpointSize.Should().Be(0);
            }
        }
示例#7
0
        public async Task FindAll()
        {
            using (var f = new TempFile())
            {
                using (var db = new LiteDatabaseAsync(f.Filename))
                {
                    var col = db.GetCollection <Person>("Person");

                    await col.InsertAsync(new Person { Fullname = "John" });

                    await col.InsertAsync(new Person { Fullname = "Doe" });

                    await col.InsertAsync(new Person { Fullname = "Joana" });

                    await col.InsertAsync(new Person { Fullname = "Marcus" });
                }
                // close datafile

                using (var db = new LiteDatabaseAsync(f.Filename))
                {
                    var p = await db.GetCollection <Person>("Person").FindAsync(Query.All("Fullname", Query.Ascending));

                    p.Count().Should().Be(4);
                }
            }
        }
示例#8
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");
                }
        }
示例#9
0
        public IndexSortAndFilterTest()
        {
            _tempFile   = new TempFile();
            _database   = new LiteDatabaseAsync(_tempFile.Filename);
            _collection = _database.GetCollection <Item>("items");

            var task1 = _collection.UpsertAsync(new Item()
            {
                Id = "C", Value = "Value 1"
            });
            var task2 = _collection.UpsertAsync(new Item()
            {
                Id = "A", Value = "Value 2"
            });
            var task3 = _collection.UpsertAsync(new Item()
            {
                Id = "B", Value = "Value 1"
            });

            Task.WaitAll(task1, task2, task3);

            var task4 = _collection.EnsureIndexAsync("idx_value", x => x.Value);

            task4.Wait();
        }
示例#10
0
 public DateTime_Tests()
 {
     _databasePath = Path.Combine(Path.GetTempPath(), $"litedbn-async-testing-{Path.GetRandomFileName()}.db");
     _db           = new LiteDatabaseAsync(_databasePath)
     {
         UtcDate = true
     };
 }
 public void Only_One_LiteDbAsync_Per_LiteDb()
 {
     using (var wrappedDb = new LiteDatabase(new MemoryStream()))
         using (var db1 = new LiteDatabaseAsync(wrappedDb)) {
             var exception = Assert.Throws <LiteAsyncException>(() => { var db1 = new LiteDatabaseAsync(wrappedDb); });
             Assert.Equal("You can only have one LiteDatabaseAsync per LiteDatabase.", exception.Message);
         }
 }
        public async Task Transaction_Read_Version()
        {
            var data1 = DataGen.Person(1, 100).ToArray();
            var data2 = DataGen.Person(101, 200).ToArray();

            using (var db = new LiteDatabase(new MemoryStream()))
                using (var asyncDb = new LiteDatabaseAsync(db, false))
                {
                    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 insert more 100 documents but will commit only 1s later
                    var ta = Task.Run(async() =>
                    {
                        await asyncDb.BeginTransAsync();

                        await asyncPerson.InsertAsync(data2);

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

                        await asyncDb.CommitAsync();

                        taskBSemaphore.Release();
                    });

                    // task B will open transaction too and will count 100 original documents only
                    // but now, will wait task A finish - but is in transaction and must see only initial version
                    var tb = Task.Run(() =>
                    {
                        db.BeginTrans();

                        taskBSemaphore.Wait();

                        var count = person.Count();

                        // read 100 documents
                        count.Should().Be(data1.Length);

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

                        // keep reading 100 documents because i'm still in same transaction
                        count = person.Count();

                        count.Should().Be(data1.Length);
                    });

                    await Task.WhenAll(ta, tb);
                }
        }
示例#13
0
        public async Task Rebuild_Large_Files()
        {
            // do some tests
            async Task DoTestAsync(ILiteDatabaseAsync db, ILiteCollectionAsync <Zip> col)
            {
                Assert.Equal(1, await col.CountAsync());
                Assert.Equal(99, db.UserVersion);
            };

            using (var file = new TempFile())
            {
                using (var db = new LiteDatabaseAsync(file.Filename))
                {
                    var col = db.GetCollection <Zip>();

                    db.UserVersion = 99;

                    await col.EnsureIndexAsync("city", false);

                    var inserted = await col.InsertAsync(DataGen.Zip());           // 29.353 docs

                    var deleted = await col.DeleteManyAsync(x => x.Id != "01001"); // delete 29.352 docs

                    Assert.Equal(29353, inserted);
                    Assert.Equal(29352, deleted);

                    Assert.Equal(1, await col.CountAsync());

                    // must checkpoint
                    await db.CheckpointAsync();

                    // file still large than 5mb (even with only 1 document)
                    Assert.True(file.Size > 5 * 1024 * 1024);

                    // reduce datafile
                    var reduced = await db.RebuildAsync();

                    // now file are small than 50kb
                    Assert.True(file.Size < 50 * 1024);

                    await DoTestAsync(db, col);
                }

                // re-open and rebuild again
                using (var db = new LiteDatabaseAsync(file.Filename))
                {
                    var col = db.GetCollection <Zip>();

                    await DoTestAsync(db, col);

                    await db.RebuildAsync();

                    await DoTestAsync(db, col);
                }
            }
        }
        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);
                }
        }
示例#15
0
        public Person_Tests()
        {
            this.local = DataGen.Person().ToArray();

            _db         = new LiteDatabaseAsync(":memory:");
            _collection = _db.GetCollection <Person>("person");
            var task = _collection.InsertAsync(this.local);

            task.Wait();
        }
 public ConnectionStringObjectTest()
 {
     _connectionString = new ConnectionString()
     {
         Filename   = Path.Combine(Path.GetTempPath(), "litedbn-async-testing-" + Path.GetRandomFileName() + ".db"),
         Connection = ConnectionType.Shared,
         Password   = "******"
     };
     _db = new LiteDatabaseAsync(_connectionString);
 }
示例#17
0
 public AuthorizeCommand(
     LiteDatabaseAsync liteDb,
     IEasyCachingProvider easyCachingProvider,
     AuthService authService
     )
 {
     _easyCachingProvider = easyCachingProvider;
     _authService         = authService;
     _liteDb = liteDb;
 }
        public void Disposes_Wrapped_LiteDb()
        {
            var mockWrappedDb = new Mock <ILiteDatabase>();

            using (var db = new LiteDatabaseAsync(mockWrappedDb.Object))
            {
                // Do nothing
            }
            mockWrappedDb.Verify(x => x.Dispose(), Times.Once);
        }
示例#19
0
        public static async Task Main(string[] args)
        {
            var cts = new CancellationTokenSource();

            if (DataDir != null)
            {
                Directory.SetCurrentDirectory(DataDir);
            }

            var audioTmpDir = Path.Join(_audioDir, "tmp");

            if (Directory.Exists(audioTmpDir))
            {
                Directory.Delete(audioTmpDir, recursive: true);
            }
            Directory.CreateDirectory(audioTmpDir);

            var secrets = JsonConvert.DeserializeObject <Secrets>(File.ReadAllText("secrets.json"));

            if (secrets == null)
            {
                throw new Exception("secrets object was null");
            }
            secrets.DiscordApiKey = DiscordApiKeyOverride ?? secrets.DiscordApiKey;
            secrets.WitAiApiKey   = WitAiApiKeyOverride ?? secrets.WitAiApiKey;

            using var db = new LiteDatabaseAsync($"Filename=metadata.db;Connection=shared");
            using var metadataManager    = new MetadataManager(db);
            using var playHistoryManager = new PlayHistoryManager(db);
            _metadataManager             = metadataManager;

#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
            Task.Run(() => _autoPopulate(cts.Token));
            Task.Run(() => _autoPrefetch(cts.Token));
#pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed

            if (secrets.WitAiApiKey == null)
            {
                throw new ArgumentNullException("WitAiApiKey must be provided.");
            }
            var aiClient = new WitAiClient(secrets.WitAiApiKey);

            if (secrets.DiscordApiKey == null)
            {
                throw new ArgumentNullException("DiscordApiKey must be provided.");
            }
            var client = new DiscordClient(secrets.DiscordApiKey, aiClient, _metadataManager, playHistoryManager);
            await client.StartAsync();

            Console.CancelKeyPress += (o, e) => cts.Cancel();
            AppDomain.CurrentDomain.ProcessExit += (s, ev) => cts.Cancel();

            await cts.Token.WhenCancelled();
        }
        public async Task MultiKey_Mapper()
        {
            using (var db = new LiteDatabaseAsync(":memory:"))
            {
                var col = db.GetCollection <MultiKeyDoc>("col");

                await col.InsertAsync(new MultiKeyDoc
                {
                    Id        = 1,
                    Keys      = new int[] { 1, 2, 3 },
                    Customers = new List <Customer>()
                    {
                        new Customer {
                            Name = "John"
                        },
                        new Customer {
                            Name = "Ana"
                        },
                        new Customer {
                            Name = "Doe"
                        },
                        new Customer {
                            Name = "Dante"
                        }
                    }
                });

                await col.InsertAsync(new MultiKeyDoc
                {
                    Id        = 2,
                    Keys      = new int[] { 2 },
                    Customers = new List <Customer>()
                    {
                        new Customer {
                            Name = "Ana"
                        }
                    }
                });

                await col.EnsureIndexAsync(x => x.Keys);

                await col.EnsureIndexAsync(x => x.Customers.Select(z => z.Name));

                // Query.EQ("Keys", 2)
                (await col.CountAsync(Query.Any().EQ("Keys", 2))).Should().Be(2);
                (await col.CountAsync(x => x.Keys.Contains(2))).Should().Be(2);

                (await col.CountAsync(Query.StartsWith("Customers[*].Name ANY", "Ana"))).Should().Be(2);
                (await col.CountAsync(x => x.Customers.Select(z => z.Name).Any(z => z.StartsWith("Ana")))).Should().Be(2);

                (await col.CountAsync(Query.StartsWith("Customers[*].Name ANY", "D"))).Should().Be(1);
                (await col.CountAsync(x => x.Customers.Select(z => z.Name).Any(z => z.StartsWith("D")))).Should().Be(1);
            }
        }
        public void Dont_Dispose_Wrapped_LiteDb()
        // Don't dispose of the wrapped LiteDB instance if the correct parameter is passed in
        {
            var mockWrappedDb = new Mock <ILiteDatabase>();

            using (var db = new LiteDatabaseAsync(mockWrappedDb.Object, false))
            {
                // Do nothing
            }
            mockWrappedDb.Verify(x => x.Dispose(), Times.Never);
        }
示例#22
0
 public async Task AutoId_Zero_Int()
 {
     using (var db = new LiteDatabaseAsync(":memory:"))
     {
         var test = db.GetCollection("Test", BsonAutoId.Int32);
         var doc  = new BsonDocument()
         {
             ["_id"] = 0, ["p1"] = 1
         };
         await test.InsertAsync(doc); // -> NullReferenceException
     }
 }
示例#23
0
        public void TestCanOpenThenCloseThenReopenDatabase()
        {
            string databasePath = Path.Combine(Path.GetTempPath(), "litedbn-async-testing-" + Path.GetRandomFileName() + ".db");

            using (var db1 = new LiteDatabaseAsync(databasePath))
            {
            }
            using (var db2 = new LiteDatabaseAsync(databasePath))
            {
            }
            File.Delete(databasePath);
        }
        public void TestOpeningDatabaseASecondTimeCausesAnException()
        {
            string databasePath = Path.Combine(Path.GetTempPath(), "litedbn-async-testing-" + Path.GetRandomFileName() + ".db");

            using (var db1 = new LiteDatabaseAsync(databasePath))
            {
                Assert.Throws <IOException>(() => {
                    var db2 = new LiteDatabaseAsync(databasePath);
                });
            }
            File.Delete(databasePath);
        }
示例#25
0
        public async Task UpsertManyAsync()
        {
            using (var db = new LiteDatabaseAsync(new MemoryStream()))
            {
                var manyUsers = Enumerable.Range(1, 100).Select(i => new User()
                {
                    Id = i, Name = $"Example {i}"
                }).ToList();

                var users = db.GetCollection <User>("users");

                Assert.Equal(100, await users.UpsertAsync(manyUsers));

                Assert.Equal(100, await users.CountAsync());

                // Read back from the database
                var users2 = await db.GetCollection <User>("users").Query().ToListAsync();

                // Are the id values the expected ones
                Assert.True(Enumerable.Range(1, 100).ToHashSet().SetEquals(users2.Select(u => u.Id)));

                // Are the names correct?
                foreach (var user in users2)
                {
                    Assert.Equal($"Example {user.Id}", user.Name);
                }

                // Update with new names
                manyUsers = Enumerable.Range(1, 100).Select(i => new User()
                {
                    Id = i, Name = $"User {i}"
                }).ToList();

                await users.UpsertAsync(manyUsers);

                Assert.Equal(100, await users.CountAsync());

                // Read back from the database
                users2 = await db.GetCollection <User>("users").Query().ToListAsync();

                // Are the id values the expected ones
                Assert.True(Enumerable.Range(1, 100).ToHashSet().SetEquals(users2.Select(u => u.Id)));

                // Are the names correct?
                foreach (var user in users2)
                {
                    Assert.Equal($"User {user.Id}", user.Name);
                }
            }
        }
        public void Can_Wrap_LiteDb_Twice()
        {
            var mockWrappedDb = new Mock <ILiteDatabase>();

            using (var db = new LiteDatabaseAsync(mockWrappedDb.Object, false))
            {
                // Do nothing
            }
            using (var db2 = new LiteDatabaseAsync(mockWrappedDb.Object, false))
            {
                // Do nothing
            }
            mockWrappedDb.Verify(x => x.Dispose(), Times.Never);
        }
示例#27
0
        public async Task TestOpeningDatabaseASecondTimeCausesAnException()
        {
            string databasePath = Path.Combine(Path.GetTempPath(), "litedbn-async-testing-" + Path.GetRandomFileName() + ".db");

            using (var db1 = new LiteDatabaseAsync(databasePath))
            {
                await db1.GetCollection <SimplePerson>().InsertAsync(new SimplePerson());

                await Assert.ThrowsAsync <IOException>(async() => {
                    using var db2 = new LiteDatabaseAsync(databasePath);
                    await db2.GetCollection <SimplePerson>().InsertAsync(new SimplePerson());
                });
            }
            File.Delete(databasePath);
        }
示例#28
0
 public TestCommand(
     LiteDatabaseAsync liteDatabaseAsync,
     IEasyCachingProvider easyCachingProvider,
     TelegramService telegramService,
     DeepAiService deepAiService,
     SettingsService settingsService,
     BlockListService blockListService
     )
 {
     _telegramService     = telegramService;
     _liteDatabaseAsync   = liteDatabaseAsync;
     _deepAiService       = deepAiService;
     _easyCachingProvider = easyCachingProvider;
     _settingsService     = settingsService;
     _blockListService    = blockListService;
 }
示例#29
0
        public async Task TestCanDisposeDatabaseTimely()
        {
            string databasePath = Path.Combine(Path.GetTempPath(),
                                               "litedbn-async-testing-" + Path.GetRandomFileName() + ".db");
            var db = new LiteDatabaseAsync(databasePath);

            // Ensure to do some stuff to open the database
            var collection = db.GetCollection <SimplePerson>();
            await collection.InsertAsync(new SimplePerson()).ConfigureAwait(false);

            var stopwatch = Stopwatch.StartNew();

            db.Dispose();
            stopwatch.Stop();

            Assert.InRange(stopwatch.Elapsed.TotalSeconds, 0, 4.99);
        }
        public async Task DropCollection()
        {
            using (var file = new TempFile())
                using (var db = new LiteDatabaseAsync(file.Filename))
                {
                    (await db.GetCollectionNamesAsync()).Should().NotContain("col");

                    var col = db.GetCollection("col");

                    await col.InsertAsync(new BsonDocument { ["a"] = 1 });

                    (await db.GetCollectionNamesAsync()).Should().Contain("col");

                    await db.DropCollectionAsync("col");

                    (await db.GetCollectionNamesAsync()).Should().NotContain("col");
                }
        }