コード例 #1
0
ファイル: SqliteClassCache.cs プロジェクト: buzzware/cascade
        public async Task Store(object id, object model, long arrivedAt)
        {
            await _database.Connection.InsertOrReplaceAsync(model);

            await _database.Connection.InsertOrReplaceAsync(new CascadeModelMeta()
            {
                model_id   = CascadeModelMeta.GenerateId <Model>(id),
                arrived_at = arrivedAt
            });
        }
コード例 #2
0
ファイル: SqliteClassCache.cs プロジェクト: buzzware/cascade
        public async Task <OpResponse> Fetch(RequestOp requestOp)
        {
            if (requestOp.Type != typeof(Model))
            {
                throw new Exception("requestOp.Type != typeof(Model)");
            }
            switch (requestOp.Verb)
            {
            case RequestVerb.Get:
                var id = (IdType?)CascadeTypeUtils.ConvertTo(typeof(IdType), requestOp.Id);                         //  ((IdType)requestOp.Id)!;
                if (id == null)
                {
                    throw new Exception("Unable to get right value for Id");
                }

                if (await _database.Exists <Model>(id))
                {
                    var meta = await _database.Get <CascadeModelMeta>(CascadeModelMeta.GenerateId <Model>(id));

                    return(new OpResponse(
                               requestOp,
                               Cascade !.NowMs,
                               connected: true,
                               exists: true,
                               result: await _database.Get <Model>(id),
                               arrivedAtMs: meta?.arrived_at
                               ));
                }
                else
                {
                    return(new OpResponse(
                               requestOp,
                               Cascade !.NowMs,
                               connected: true,
                               exists: false,
                               result: null,
                               arrivedAtMs: null
                               ));
                }
                break;

            case RequestVerb.Query:
                var collection = await _database.Get <CascadeCollection>(CascadeCollection.GenerateId <Model>(requestOp.Key !));

                if (collection != null)
                {
                    return(new OpResponse(
                               requestOp,
                               Cascade !.NowMs,
                               connected: true,
                               exists: true,
                               result: collection.objectIds,
                               arrivedAtMs: collection.arrived_at
                               ));
                }
                else
                {
                    return(new OpResponse(
                               requestOp,
                               Cascade !.NowMs,
                               connected: true,
                               exists: false,
                               result: null,
                               arrivedAtMs: null
                               ));
                }
                break;

            default:
                throw new NotImplementedException($"Unsupported {requestOp.Verb}");
            }
        }
コード例 #3
0
ファイル: SqliteClassCache.cs プロジェクト: buzzware/cascade
        public async Task Remove(object id)
        {
            await _database.Delete <Model>(id);

            await _database.Delete <CascadeModelMeta>(CascadeModelMeta.GenerateId <Model>(id));
        }
コード例 #4
0
        public async Task TestMetadata()
        {
            var path = System.IO.Path.GetTempFileName();
            var conn = new SQLite.SQLiteAsyncConnection(path);
            var db   = new TestDatabase(conn);
            await db.Reset();

            var sqliteThingCache = new SqliteClassCache <Parent, long>(db);
            await sqliteThingCache.Setup();

            var sqliteGadgetCache = new SqliteClassCache <Child, string>(db);
            await sqliteGadgetCache.Setup();

            var cache1 = new ModelCache(aClassCache: new Dictionary <Type, IModelClassCache>()
            {
                { typeof(Parent), sqliteThingCache },
                { typeof(Child), sqliteGadgetCache }
            });

            // read from origin
            var cascade = new CascadeDataLayer(origin, new ICascadeCache[] { cache1 }, new CascadeConfig()
            {
                DefaultFreshnessSeconds = 1
            });

            var thing5 = new Parent()
            {
                id     = 5,
                colour = "red"
            };
            var thing5ArrivedAt = cascade.NowMs;
            await sqliteThingCache.Store(thing5.id, thing5, thing5ArrivedAt);

            origin.IncNowMs();

            var gadget6 = new Child()
            {
                id     = "abc",
                weight = 2.5,
                power  = 9.2
            };
            var gadget6ArrivedAt = cascade.NowMs;
            await sqliteGadgetCache.Store(gadget6.id, gadget6, gadget6ArrivedAt);

            origin.IncNowMs();

            var opResponse = await sqliteThingCache.Fetch(RequestOp.GetOp <Parent>(thing5.id, cascade.NowMs));

            var loaded5 = (opResponse.Result as Parent) !;

            Assert.AreEqual(thing5ArrivedAt, opResponse.ArrivedAtMs);
            Assert.AreEqual(thing5.colour, loaded5.colour);

            opResponse = await sqliteGadgetCache.Fetch(RequestOp.GetOp <Child>(gadget6.id, cascade.NowMs));

            var loaded6 = (opResponse.Result as Child) !;

            Assert.AreEqual(gadget6ArrivedAt, opResponse.ArrivedAtMs);
            Assert.AreEqual(gadget6.weight, loaded6.weight);

            await sqliteGadgetCache.Clear();

            // thing unaffected
            opResponse = await sqliteThingCache.Fetch(RequestOp.GetOp <Parent>(thing5.id, cascade.NowMs));

            Assert.NotNull(opResponse.Result);
            Assert.AreEqual(thing5ArrivedAt, opResponse.ArrivedAtMs);

            // gadget cleared including metadata
            opResponse = await sqliteGadgetCache.Fetch(RequestOp.GetOp <Child>(gadget6.id, cascade.NowMs));

            Assert.IsNull(opResponse.Result);
            Assert.IsNull(opResponse.ArrivedAtMs);
            var meta6 = await db.Get <CascadeModelMeta>(CascadeModelMeta.GenerateId <Child>(6));

            Assert.IsNull(meta6);
        }