Exemple #1
0
        /// <summary></summary>
        /// <param name="obj"></param>
        /// <param name="data"></param>
        /// <param name="release"></param>
        /// <returns></returns>
        protected override PpsPushDataResult LuaPush(PpsObjectAccess obj, object data, bool release)
        {
            switch (data)
            {
            case byte[] b:
                using (var a = new PpsStreamAttachmentAccess(new MemoryStream(b, false)))
                    return(PushData(obj, a, release));

            case string s:
                using (var a = new PpsStreamAttachmentAccess(new FileStream(s, FileMode.Open, FileAccess.Read)))
                    return(PushData(obj, a, release));

            case Stream src:
                using (var a = new PpsStreamAttachmentAccess(src))
                    return(PushData(obj, a, release));

            case PpsAttachmentAccess a:
                return(PushData(obj, a, release));

            case null:
                throw new ArgumentNullException(nameof(data));

            default:
                throw new ArgumentException();
            }
        }         // func LuaPush
        }         // func GetDataFromStream

        /// <summary>Pull dataset from the object.</summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        protected override PpsDataSetServer PullData(PpsObjectAccess obj)
        {
            // get the head or given revision
            // create the dataset
            var data = (PpsDataSetServer)DataSetDefinition.CreateDataSet();

            if (obj.HeadRevId > 0)
            {
                var xDocumentData = XDocument.Parse(obj.GetText());
                data.Read(xDocumentData.Root);
            }
            else
            {
                CallTableMethods(LuaOnCreateRevision, obj, data);
            }

            // correct id and revision
            CheckHeadObjectId(obj, data);

            // fire triggers
            CallTableMethods(LuaOnAfterPull, obj, data);

            // mark all has orignal
            data.Commit();

            return(data);
        }         // func PullData
        private static void CheckHeadObjectId(PpsObjectAccess obj, PpsDataSetServer dataset)
        {
            var headTable = dataset.Tables["Head"];

            if (headTable != null)
            {
                var firstRow = headTable.First;
                if (firstRow != null)
                {
                    var columnId    = headTable.Columns.FirstOrDefault(c => String.Compare(c.Name, "ObjKId", StringComparison.OrdinalIgnoreCase) == 0);
                    var columnRevId = headTable.Columns.FirstOrDefault(c => String.Compare(c.Name, "RevId", StringComparison.OrdinalIgnoreCase) == 0);
                    if (columnId != null)
                    {
                        firstRow[columnId.Index] = obj.Id;
                    }
                    if (columnRevId != null)
                    {
                        firstRow[columnRevId.Index] = obj.RevId;
                    }
                }
            }
        } // proc CheckHeadObjectId
Exemple #4
0
 /// <summary>Pull data from the database.</summary>
 /// <param name="obj"></param>
 /// <returns></returns>
 protected override PpsAttachmentAccess PullData(PpsObjectAccess obj)
 => new PpsObjectAttachmentAccess(obj);
Exemple #5
0
 public PpsObjectAttachmentAccess(PpsObjectAccess obj)
 {
     this.obj = obj;
 }             // ctor
        }         // 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