}         // func PullData

        /// <summary>Push dataset to the object.</summary>
        /// <param name="obj"></param>
        /// <param name="data"></param>
        /// <param name="release"></param>
        /// <returns></returns>
        protected override PpsPushDataResult PushData(PpsObjectAccess obj, PpsDataSetServer data, bool release)
        {
            // fire triggers
            CallTableMethodsWithExceptions(LuaOnBeforePush, obj, data);

            // move all to original row
            data.Commit();

            if (obj.IsNew)
            {
                InsertNewObject(obj, data);
            }
            else             // check rev, to in base implementation?
            {
                var headRevId = obj.HeadRevId;
                if (headRevId > obj.RevId)
                {
                    return(PpsPushDataResult.PulledRevIsToOld);                    // head revision is newer than pulled revision -> return this fact
                }
                else if (headRevId < obj.RevId)
                {
                    throw new ArgumentException($"Push failed. Pulled revision is greater than head revision.");
                }
            }

            // update head id
            CheckHeadObjectId(obj, data);

            // update all local generated id's to server id's
            foreach (var dt in data.Tables)
            {
                if (dt.TableDefinition.PrimaryKey == null)
                {
                    continue;
                }

                var idxPrimaryKey = dt.TableDefinition.PrimaryKey.Index;
                if (dt.TableDefinition.PrimaryKey.IsIdentity)                 // auto incr => getnext
                {
                    foreach (var row in dt)
                    {
                        PpsDataTable.GetKey(row[idxPrimaryKey].ChangeType <long>(), out var type, out var value);
                        if (type == PpsTablePrimaryKeyType.Local)
                        {
                            row[idxPrimaryKey] = data.GetNextId();
                        }
                    }
                }
                else                 // self set => abs(nr)
                {
                    // absolute
                    foreach (var row in dt)
                    {
                        PpsDataTable.GetKey(row[idxPrimaryKey].ChangeType <long>(), out var type, out var value);
                        if (type == PpsTablePrimaryKeyType.Local)
                        {
                            row[idxPrimaryKey] = PpsDataTable.MakeKey(PpsTablePrimaryKeyType.Server, value);
                        }
                    }
                }
            }

            // commit all to orignal
            data.Commit();

            // update tags
            obj.UpdateRevisionTags(data.GetAutoTags());

            // actions after push
            CallTableMethodsWithExceptions(LuaOnAfterPush, obj, data);

            obj[nameof(PpsObjectAccess.MimeType)] = "text/dataset";
            using (var src = GetStreamFromData(data))
                obj.UpdateData(src);
            obj.Update(PpsObjectUpdateFlag.All);

            return(PpsPushDataResult.PushedAndChanged);
        }         // func PushData
예제 #2
0
        }         // proc UpdateNextId

        /// <summary>Returns a next id.</summary>
        /// <returns></returns>
        public long GetNextId()
        {
            lock (nextPrimaryLock)
                return(PpsDataTable.MakeKey(DataSetDefinition.KeyType, ++lastPrimaryId));
        }         // func GetNextId