/// <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
/// <summary>Pull data from the database.</summary> /// <param name="obj"></param> /// <returns></returns> protected override PpsAttachmentAccess PullData(PpsObjectAccess obj) => new PpsObjectAttachmentAccess(obj);
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