示例#1
0
        private void DoStore(IStorable storable, IAuditMetadata auditMeta)
        {
            AuditOperation operation = AuditOperation.UPDATE;
            // ensure db id
            StorableDocument doc  = (StorableDocument)storable;
            long             dbId = doc.DbId is long?(long)doc.DbId : -1;

            if (dbId == -1)
            {
                dbId = ++lastDbId;
                storable.SetData("dbId", dbId);
            }
            IDictionary <string, object> document = new Dictionary <string, object>();

            if (documents.ContainsKey(dbId))
            {
                documents[dbId].Document.ToList().ForEach(kvp => document[kvp.Key] = kvp.Value);
            }
            else
            {
                operation = AuditOperation.INSERT;
            }
            doc.Document.ToList().ForEach(kvp => document[kvp.Key] = kvp.Value);
            doc             = new StorableDocument(doc.Categories, null);
            doc.Document    = document;
            documents[dbId] = doc;
            AuditRecord audit = NewAuditRecord(auditMeta);

            audit.InstanceDbId       = dbId;
            audit.Operation          = operation;
            audit.Instance           = doc;
            auditRecords[audit.DbId] = audit;
        }
示例#2
0
 private void DoDelete(ICollection <object> idsToDelete, IAuditMetadata auditMeta)
 {
     foreach (object id in idsToDelete)
     {
         DoDelete(id, auditMeta);
     }
 }
示例#3
0
 private void DoStore(ICollection <IStorable> docsToStore, IAuditMetadata auditMeta)
 {
     foreach (IStorable storable in docsToStore)
     {
         DoStore(storable, auditMeta);
     }
 }
示例#4
0
 private IAuditMetadata StoreAuditMetadata(IAuditMetadata auditMeta)
 {
     if (auditMeta == null)
     {
         auditMeta = NewAuditMetadata();
     }
     auditMetadatas[auditMeta.DbId] = (AuditMetadata)auditMeta;
     return(auditMeta);
 }
示例#5
0
        private AuditRecord NewAuditRecord(IAuditMetadata auditMeta)
        {
            AuditRecord audit = new AuditRecord();

            audit.DbId         = ++lastAuditRecordDbId;
            audit.MetadataDbId = auditMeta.DbId;
            audit.UTCTimestamp = auditMeta.UTCTimestamp;
            return(audit);
        }
示例#6
0
        private void DoDelete(object dbId, IAuditMetadata auditMeta)
        {
            documents.Remove((long)dbId);
            AuditRecord audit = NewAuditRecord(auditMeta);

            audit.InstanceDbId       = dbId;
            audit.Operation          = AuditOperation.DELETE;
            auditRecords[audit.DbId] = audit;
        }
示例#7
0
        public override IValue interpret(Context context)
        {
            List <object> toDelete = null;

            if (deletables != null)
            {
                toDelete = new List <object>();
                deletables.ForEach((exp) => CollectDeletables(context, exp, toDelete));
            }
            List <IStorable> toStore = null;

            if (storables != null)
            {
                toStore = new List <IStorable>();
                storables.ForEach((exp) => CollectStorables(context, exp, toStore));
            }
            if (deletables != null || storables != null)
            {
                IAuditMetadata withMeta = null;
                if (metadata != null)
                {
                    IValue value = metadata.interpret(context);
                    if (value is DocumentValue)
                    {
                        DocumentValue doc = (DocumentValue)value;
                        withMeta = DataStore.Instance.NewAuditMetadata();
                        foreach (String name in doc.GetMemberNames())
                        {
                            value          = doc.GetMemberValue(context, name, false);
                            withMeta[name] = value.GetStorableData();
                        }
                    }
                }
                DataStore.Instance.DeleteAndStore(toDelete, toStore, withMeta);
            }
            if (andThen != null)
            {
                andThen.interpret(context);
            }
            return(null);
        }
示例#8
0
 public void DeleteAndStore(ICollection <object> idsToDelete, ICollection <IStorable> docsToStore, IAuditMetadata auditMeta)
 {
     auditMeta = StoreAuditMetadata(auditMeta);
     if (idsToDelete != null)
     {
         DoDelete(idsToDelete, auditMeta);
     }
     if (docsToStore != null)
     {
         DoStore(docsToStore, auditMeta);
     }
     ;
 }