internal override bool SaveChildren(AbstractXServer _server, SessionId _sessionId, IStorage _storage, DateTime _now)
 {
     var toSave = new List<Guid>();
     foreach (var pair in XValues)
     {
         var list = pair.Value as ServerXList;
         if (list != null)
         {
             toSave.AddRange(list.GetGuids());
         }
     }
     var saved = false;
     foreach (var uid in toSave.Distinct())
     {
         saved |= _server.SaveInternal(uid, _storage, _now, _sessionId);
     }
     return saved;
 }
 public ServerXReport GetReport(int _kind, Guid _uid, SessionId _sessionId)
 {
     return ServiceContract.GetReport(_kind, _uid, _sessionId);
 }
 public void ClientObjectChanged(XReport _report, SessionId _sessionId)
 {
     ServiceContract.ClientObjectChanged(_report, _sessionId);
 }
 public void ObjectSaved(Int32 _kind, Guid _uid, SessionId _sessionId)
 {
     if (OnServerObjectSaved != null)
     {
         OnServerObjectSaved(_kind, _uid, _sessionId);
     }
 }
 public IEnumerable<UndoXReport> Undo(Guid _uid, SessionId _sessionId)
 {
     return ServiceContract.Undo(_uid, _sessionId);
 }
 public IEnumerable<ServerXReport> Redo(Guid _uid, SessionId _sessionId)
 {
     return ServiceContract.Redo(_uid, _sessionId);
 }
 public uint GetCurrentGeneration(SessionId _sessionId)
 {
     int current;
     if(m_currentVersion.TryGetValue(_sessionId, out current) && current>=0)
     {
         return m_changes[_sessionId][current].ActualFrom;
     }
     return Stored;
 }
 internal virtual bool SaveChildren(AbstractXServer _server, SessionId _sessionId, IStorage _storage, DateTime _now)
 {
     var saved = false;
     foreach (var pair in m_xValues)
     {
         var list = pair.Value as ServerXList;
         if (list != null)
         {
             foreach (var childUid in list.GetGuids())
             {
                 saved = _server.SaveChild(childUid, Uid, _sessionId, _storage, pair.Key, _now) | saved;
             }
         }
     }
     return saved;
 }
Exemple #9
0
 public bool Equals(SessionId _other)
 {
     return _other.m_value == m_value;
 }
 private void OnServerObjectSaved(Guid _uid, SessionId _sessionId)
 {
     //Console.WriteLine("SAVED:" + _uid);
     if (m_serverObjectSaved != null)
     {
         if (IsAsync)
         {
             foreach (ServerObjectSaved d in m_serverObjectSaved.GetInvocationList())
             {
                 d.BeginInvoke(m_objects[_uid].Kind, _uid, _sessionId, null, null);
             }
         }
         else
         {
             m_serverObjectSaved(m_objects[_uid].Kind, _uid, _sessionId);
         }
     }
 }
        internal IEnumerable<UndoXReport> Undo(Guid _uid, SessionId _sessionId)
        {
            var dateTime = uint.MinValue;
            var candidates = new List<Guid>();
            GetAvailableUndoDate(_uid, _sessionId, this, ref dateTime, ref candidates);

            var reports = new List<UndoXReport>();
            foreach (var candidateUid in candidates.Distinct())
            {
                var serverXObjectContainer = m_objects[candidateUid];
                reports.Add(serverXObjectContainer.Undo(_sessionId));
            }
            return reports;
        }
        internal bool SaveInternal(Guid _uid, IStorage _st, DateTime _now, SessionId _sessionId)
        {
            ServerXObjectContainer obj;
            if (!m_objects.TryGetValue(_uid, out obj))
            {
                return false;
            }

            if (obj.Stored == 0 && _uid != GetRootUid())
            {
                obj.Stored = obj.GetCurrentGeneration(_sessionId);
                obj.StoredId = _st.InsertMain(obj.Uid, obj.Kind, _now);
            }
            var saved = obj.Save(_sessionId, _st, _now, this);
            saved = obj.SaveChildren(this, _sessionId, _st, _now) | saved;
            OnServerObjectSaved(_uid, _sessionId);
            return saved;
        }
        internal bool SaveChild(Guid _childUid, Guid _ownerUid, SessionId _sessionId, IStorage _storage, int _field,
            DateTime _now)
        {
            if (_ownerUid == GetRootUid())
            {
                return SaveInternal(_childUid, _storage, _now, _sessionId);
            }
            ServerXObjectContainer child;
            if (!m_objects.TryGetValue(_childUid, out child))
            {
                //not loaded yet
                return false;
            }

            var saved = false;
            if (child.Stored == 0)
            {
                saved = true;
                child.ValidFrom = _now;
                child.Stored = 1;
                child.StoredId = _storage.InsertMain(child.Uid, child.Kind, _now, _ownerUid, _field);
            }
            saved = child.Save(_sessionId, _storage, _now, this) | saved;
            saved = child.SaveChildren(this, _sessionId, _storage, _now) | saved;
            if (saved)
            {
                OnServerObjectSaved(_childUid, _sessionId);
            }
            return saved;
        }
 internal bool Save(Guid _uid, SessionId _sessionId)
 {
     using (var st = CreateStorage())
     {
         using (st.CreateTransaction())
         {
             return SaveInternal(_uid, st, DateTime.Now, _sessionId);
         }
     }
 }
        internal IEnumerable<ServerXReport> Redo(Guid _uid, SessionId _sessionId)
        {
            var dateTime = uint.MaxValue;
            var candidates = new List<Guid>();
            GetAvailableRedoDate(_uid, _sessionId, this, ref dateTime, ref candidates);

            var reports = new List<ServerXReport>();
            foreach (var candidateUid in candidates.Distinct())
            {
                reports.Add(m_objects[candidateUid].Redo(_sessionId));
            }
            return reports;
        }
 internal void ClientObjectReverted(Guid _uid, SessionId _sessionId)
 {
     m_objects[_uid].Revert(_sessionId);
 }
        internal bool Save(SessionId _sessionId, IStorage _storage, DateTime _now, AbstractXServer _abstractXServer)
        {
            List<XReport> reports;
            if (m_changes.TryGetValue(_sessionId, out reports) && m_currentVersion[_sessionId] >= 0)
            {
                var reverseItems = new List<AbstractXReportItem>();

                var changes = reports[m_currentVersion[_sessionId]];
                foreach (var item in changes.Items)
                {
                    IServerXValue xValue;
                    if (!m_xValues.TryGetValue(item.FieldId, out xValue))
                    {
                        xValue = item.CreateXValue();
                        m_xValues.Add(item.FieldId, xValue);
                        reverseItems.Add(item.CreateDefaultReportItem());
                    }
                    else
                    {
                        reverseItems.Add(xValue.CreateReverseReportItem(item));
                    }

                    int oldId;
                    if (m_xValueOldIds.TryGetValue(item.FieldId, out oldId))
                    {
                        m_xValueOldIds[item.FieldId] = xValue.SaveOriginalValue(Uid, item, _storage, oldId, _now, _abstractXServer);
                    }
                    else
                    {
                        m_xValueOldIds[item.FieldId] = xValue.SaveOriginalValue(Uid, item, _storage, null, _now, _abstractXServer);
                    }
                }
                reports.Clear();
                m_currentVersion[_sessionId] = -1;
                ValidFrom = _now;

                foreach (var pair in m_changes)
                {
                    if (pair.Key == _sessionId)
                    {
                        continue;
                    }
                    var reverseReport = new XReport(changes.Uid, reverseItems, changes.Kind, EState.UNDO_ABLE | EState.REVERT_ABLE | (pair.Value.Any()?EState.REDO_ABLE : EState.SINGLE)) { ActualFrom = changes.ActualFrom };
                    foreach (var xReport in pair.Value)
                    {
                        xReport.UpdateAccordingNewValues(m_xValues, reverseReport);
                    }
                    pair.Value.Insert(0, reverseReport);
                    m_currentVersion[pair.Key]++;
                }
                return true;
            }
            return false;
        }
 internal void FillFromClient(XReport _xReport, SessionId _sessionId)
 {
     Uid = _xReport.Uid;
     AddChanges(_sessionId, _xReport);
 }
 internal UndoXReport Undo(SessionId _sessionId)
 {
     if (m_currentVersion.ContainsKey(_sessionId))
     {
         var version = --m_currentVersion[_sessionId];
         if (version > -1)
         {
             var reports = m_changes[_sessionId];
             var actual = reports[version];
             var last = reports[reports.Count - 1];
             return new UndoXReport(Uid, actual.Items, actual.ActualFrom, Kind, EState.UNDO_ABLE|EState.REVERT_ABLE|(last!=actual?EState.REDO_ABLE : EState.SINGLE));
         }
     }
     return new UndoXReport(Uid, Stored, Kind);
 }
 internal void GetAvailableRedoDate(SessionId _sessionId, AbstractXServer _server,
     ref uint _generation, ref List<Guid> _candidates)
 {
     XReport changes = null;
     int version;
     if (m_currentVersion.TryGetValue(_sessionId, out version))
     {
         if (version < m_changes[_sessionId].Count)
         {
             if (version < m_changes[_sessionId].Count - 1)
             {
                 changes = m_changes[_sessionId][version + 1];
                 var result = changes.ActualFrom;
                 if (result < _generation)
                 {
                     _candidates.Clear();
                     _generation = result;
                 }
                 if (result == _generation)
                 {
                     _candidates.Add(Uid);
                 }
             }
             else if (version >= 0)
             {
                 changes = m_changes[_sessionId][version];
             }
         }
     }
     var uids = new List<Guid>();
     if (changes != null)
     {
         uids.AddRange(
             changes.Items.OfType<XReportList>().SelectMany(_list => _list.Items).Where(
                 _item => _item.State == EReportListItemState.ADDED).Select(_item => _item.Uid));
     }
     foreach (var pair in m_xValues)
     {
         var list = pair.Value as ServerXList;
         if (list == null) continue;
         uids.AddRange(list.GetGuids());
     }
     foreach (var uid in uids)
     {
         _server.GetAvailableRedoDate(uid, _sessionId, _server, ref _generation, ref _candidates);
     }
 }
 internal void AddChanges(SessionId _sessionId, XReport _report)
 {
     List<XReport> list;
     if (!m_changes.TryGetValue(_sessionId, out list))
     {
         list = new List<XReport>();
         m_changes.Add(_sessionId, list);
         m_currentVersion.Add(_sessionId, 0);
     }
     else
     {
         var version = ++m_currentVersion[_sessionId];
         if (version < list.Count)
         {
             list.RemoveRange(version, list.Count - version);
         }
     }
     list.Add(_report);
 }
        internal void GetAvailableUndoDate(SessionId _sessionId, AbstractXServer _server,
            ref uint _dateTime, ref List<Guid> _candidates)
        {
            XReport changes = null;
            var result = Stored;
            int version;
            if (m_currentVersion.TryGetValue(_sessionId, out version))
            {
                if (version >= 0)
                {
                    changes = m_changes[_sessionId][version];
                    result = changes.ActualFrom;
                }
                if (result > _dateTime)
                {
                    _candidates.Clear();
                    _dateTime = result;
                }
                if (result == _dateTime)
                {
                    _candidates.Add(Uid);
                }
            }

            var uids = new List<Guid>();
            if (changes != null)
            {
                uids.AddRange(
                    changes.Items.OfType<XReportList>().SelectMany(_list => _list.Items).Where(
                        _item => _item.State == EReportListItemState.ADDED).Select(_item => _item.Uid));
            }

            foreach (var pair in m_xValues)
            {
                var list = pair.Value as ServerXList;
                if (list == null) continue;
                uids.AddRange(list.GetGuids());
                if (changes != null)
                {
                    var pairCopy = pair;
                    var update = (XReportList) changes.Items.FirstOrDefault(_item => _item.FieldId == pairCopy.Key);
                    if (update != null)
                    {
                        foreach (var item in update.Items)
                        {
                            switch (item.State)
                            {
                                case EReportListItemState.REMOVED:
                                    uids.Remove(item.Uid);
                                    break;
                            }
                        }
                    }
                }
            }
            foreach (var uid in uids)
            {
                _server.GetAvailableUndoDate(uid, _sessionId, _server, ref _dateTime, ref _candidates);
            }
        }
 public void Save(Guid _uid, SessionId _sessionId)
 {
     ServiceContract.Save(_uid, _sessionId);
 }
        internal ServerXReport GetReport(SessionId _sessionId)
        {
            var actualFrom = Stored;
            List<XReport> reports;
            var state = EState.SINGLE;

            var items = new List<AbstractXReportItem>();
            foreach (var pair in m_xValues)
            {
                items.Add(pair.Value.GetOriginalValueReportItem(pair.Key, _sessionId));
            }

            if (m_changes.TryGetValue(_sessionId, out reports))
            {
                if (m_currentVersion[_sessionId] >= 0)
                {
                    var last = reports[reports.Count - 1];
                    var actual = reports[m_currentVersion[_sessionId]];

                    state |= EState.UNDO_ABLE|EState.REVERT_ABLE;
                    if (last != actual) state |= EState.REDO_ABLE;

                    var changes = actual;
                    items.AddRange(changes.Items);
                    actualFrom = changes.ActualFrom;
                }
            }
            else
            {
                m_changes.Add(_sessionId, new List<XReport>());
                m_currentVersion.Add(_sessionId, -1);
            }

            var result = new ServerXReport(Uid, items, actualFrom, Kind, state);
            return result;
        }
 private void OnServerObjectSaved(int _kind, Guid _uid, SessionId _sessionId)
 {
     if (ServerObjectSaved != null)
     {
         ServerObjectSaved(_kind, _uid, _sessionId);
     }
 }
        internal ServerXReport GetReport(SessionId _sessionId, uint _actualFor)
        {
            var actualFrom = Stored;
            var lastModification = Stored;
            var items = new List<AbstractXReportItem>();
            List<XReport> reports;
            XReport last = null;
            if (m_changes.TryGetValue(_sessionId, out reports))
            {
                last = reports.LastOrDefault(_report => _report.ActualFrom <= _actualFor);
                if (last != null)
                {
                    actualFrom = last.ActualFrom;
                }
            }
            else
            {
                m_changes.Add(_sessionId, new List<XReport>());
                m_currentVersion.Add(_sessionId, -1);
            }

            foreach (var pair in m_xValues)
            {
                var xName = pair.Key;
                items.Add(pair.Value.GetOriginalValueReportItem(xName, _sessionId));

                if (last != null)
                {
                    items.AddRange(last.Items.Where(_item => _item.FieldId == xName));
                }
            }

            var result = new ServerXReport(Uid, items, actualFrom, Kind, EState.SINGLE);
            return result;
        }
 public uint AddNew(XReport _xReport, SessionId _sessionId, Guid _parentUid)
 {
     return ServiceContract.AddNew(_xReport, _sessionId, _parentUid);
 }
        internal void PrepareToShrink(SessionId _sessionId)
        {
            if (!ValidTill.HasValue)
            {
                var report = GetReport(_sessionId);

                //m_changes.Clear();
                m_currentVersion.Clear();

                m_currentVersion[_sessionId] = 0;
                m_changes[_sessionId].Add(report);

                m_xValueOldIds.Clear();
                Stored = 0;
                StoredId = 0;
            }
        }
 public void ClientObjectReverted(Guid _uid, SessionId _sessionId)
 {
     ServiceContract.ClientObjectReverted(_uid, _sessionId);
 }
 internal ServerXReport Redo(SessionId _sessionId)
 {
     List<XReport> reports;
     if (!m_changes.TryGetValue(_sessionId, out reports)) return null;
     var version = ++m_currentVersion[_sessionId];
     var actual = reports[version];
     var last = reports[reports.Count - 1];
     return new ServerXReport(Uid, actual.Items, actual.ActualFrom, Kind, EState.UNDO_ABLE | EState.REVERT_ABLE | (last!=actual ? EState.REDO_ABLE : EState.SINGLE));
 }
 internal void Revert(SessionId _sessionId)
 {
     List<XReport> reports;
     if (!m_changes.TryGetValue(_sessionId, out reports) || !reports.Any()) return;
     reports.Clear();
     m_currentVersion[_sessionId] = -1;
 }
 internal void ClientObjectChanged(XReport _report, SessionId _sessionId)
 {
     _report.ActualFrom = NextGeneration();
     m_objects[_report.Uid].AddChanges(_sessionId, _report);
 }