public ClientData Import (IDataStoreContext ctx, ClientJson json, Guid? localIdHint = null, ClientData mergeBase = null) { var data = GetByRemoteId<ClientData> (ctx, json.Id.Value, localIdHint); var merger = mergeBase != null ? new ClientMerger (mergeBase) : null; if (merger != null && data != null) merger.Add (new ClientData (data)); if (json.DeletedAt.HasValue) { if (data != null) { ctx.Delete (data); data = null; } } else if (merger != null || ShouldOverwrite (data, json)) { data = data ?? new ClientData (); ImportJson (ctx, data, json); if (merger != null) { merger.Add (data); data = merger.Result; } data = ctx.Put (data); } return data; }
public TimeEntryData Import(IDataStoreContext ctx, TimeEntryJson json, Guid?localIdHint = null, TimeEntryData mergeBase = null) { var log = ServiceContainer.Resolve <ILogger> (); var data = GetByRemoteId <TimeEntryData> (ctx, json.Id.Value, localIdHint); var merger = mergeBase != null ? new TimeEntryMerger(mergeBase) : null; if (merger != null && data != null) { merger.Add(new TimeEntryData(data)); } if (json.DeletedAt.HasValue) { if (data != null) { // TODO: Delete TimeEntryTag intermediate data log.Info(Tag, "Deleting local data for {0}.", data.ToIdString()); ctx.Delete(data); data = null; } } else if (merger != null || ShouldOverwrite(data, json)) { data = data ?? new TimeEntryData(); ImportJson(ctx, data, json); if (merger != null) { merger.Add(data); data = merger.Result; } if (merger != null) { log.Info(Tag, "Importing {0}, merging with local data.", data.ToIdString()); } else { log.Info(Tag, "Importing {0}, replacing local data.", data.ToIdString()); } data = ctx.Put(data); // Also update tags from the JSON we are merging: if (mergeBase == null || (mergeBase != null && mergeBase.ModifiedAt != data.ModifiedAt)) { log.Info(Tag, "Resetting tags for {0}.", data.ToIdString()); ResetTags(ctx, data, json); } } else { log.Info(Tag, "Skipping import of {0}.", json.ToIdString()); } return(data); }
public TaskData Import(IDataStoreContext ctx, TaskJson json, Guid?localIdHint = null, TaskData mergeBase = null) { var log = ServiceContainer.Resolve <Logger> (); var data = GetByRemoteId <TaskData> (ctx, json.Id.Value, localIdHint); var merger = mergeBase != null ? new TaskMerger(mergeBase) : null; if (merger != null && data != null) { merger.Add(new TaskData(data)); } if (json.DeletedAt.HasValue) { if (data != null) { log.Info(Tag, "Deleting local data for {0}.", data.ToIdString()); ctx.Delete(data); data = null; } } else if (merger != null || ShouldOverwrite(data, json)) { data = data ?? new TaskData(); ImportJson(ctx, data, json); if (merger != null) { merger.Add(data); data = merger.Result; } if (merger != null) { log.Info(Tag, "Importing {0}, merging with local data.", data.ToIdString()); } else { log.Info(Tag, "Importing {0}, replacing local data.", data.ToIdString()); } data = ctx.Put(data); } else { log.Info(Tag, "Skipping import of {0}.", json.ToIdString()); } return(data); }
public TagData Import (IDataStoreContext ctx, TagJson json, Guid? localIdHint = null, bool forceUpdate = false) { var data = GetByRemoteId<TagData> (ctx, json.Id.Value, localIdHint); if (json.DeletedAt.HasValue) { if (data != null) { ctx.Delete (data); data = null; } } else if (data == null || forceUpdate || data.ModifiedAt < json.ModifiedAt) { data = Merge (ctx, data, json); data = ctx.Put (data); } return data; }
public ClientData Import (IDataStoreContext ctx, ClientJson json, Guid? localIdHint = null, ClientData mergeBase = null) { var log = ServiceContainer.Resolve<ILogger> (); var data = GetByRemoteId<ClientData> (ctx, json.Id.Value, localIdHint); var merger = mergeBase != null ? new ClientMerger (mergeBase) : null; if (merger != null && data != null) { merger.Add (new ClientData (data)); } if (json.DeletedAt.HasValue) { if (data != null) { log.Info (Tag, "Deleting local data for {0}.", data.ToIdString ()); ctx.Delete (data); data = null; } } else if (merger != null || ShouldOverwrite (data, json)) { data = data ?? new ClientData (); ImportJson (ctx, data, json); if (merger != null) { merger.Add (data); data = merger.Result; } if (merger != null) { log.Info (Tag, "Importing {0}, merging with local data.", data.ToIdString ()); } else { log.Info (Tag, "Importing {0}, replacing local data.", data.ToIdString ()); } data = ctx.Put (data); } else { log.Info (Tag, "Skipping import of {0}.", json.ToIdString ()); } return data; }
private static void ResetTags(IDataStoreContext ctx, TimeEntryData timeEntryData, TimeEntryJson json) { // Don't touch the tags when the field is null if (json.Tags == null) { return; } var con = ctx.Connection; // Resolve tags to IDs: var tagIds = new List <Guid> (); foreach (var tagName in json.Tags) { // Prevent importing empty (invalid) tags: if (String.IsNullOrWhiteSpace(tagName)) { continue; } var id = ctx.GetTagIdFromName(timeEntryData.WorkspaceId, tagName); if (id == Guid.Empty) { // Need to create a new tag: var tagData = new TagData() { Name = tagName, WorkspaceId = timeEntryData.WorkspaceId, }; con.Insert(tagData); id = timeEntryData.Id; } tagIds.Add(id); } // Iterate over TimeEntryTags and determine which to keep and which to discard: var inters = con.Table <TimeEntryTagData> ().Where(m => m.TimeEntryId == timeEntryData.Id); var toDelete = new List <TimeEntryTagData> (); foreach (var inter in inters) { if (tagIds.Contains(inter.TagId)) { tagIds.Remove(inter.TagId); } else { toDelete.Add(inter); } } // Delete unused tags intermediate rows: foreach (var inter in toDelete) { ctx.Delete(inter); } // Create new intermediate rows: foreach (var tagId in tagIds) { ctx.Put(new TimeEntryTagData() { TagId = tagId, TimeEntryId = timeEntryData.Id, }); } }
public TimeEntryData Import (IDataStoreContext ctx, TimeEntryJson json, Guid? localIdHint = null, TimeEntryData mergeBase = null) { var log = ServiceContainer.Resolve<ILogger> (); var data = GetByRemoteId<TimeEntryData> (ctx, json.Id.Value, localIdHint); var merger = mergeBase != null ? new TimeEntryMerger (mergeBase) : null; if (merger != null && data != null) { merger.Add (new TimeEntryData (data)); } if (json.DeletedAt.HasValue) { if (data != null) { // TODO: Delete TimeEntryTag intermediate data log.Info (Tag, "Deleting local data for {0}.", data.ToIdString ()); ctx.Delete (data); data = null; } } else if (merger != null || ShouldOverwrite (data, json)) { data = data ?? new TimeEntryData (); ImportJson (ctx, data, json); if (merger != null) { merger.Add (data); data = merger.Result; } if (merger != null) { log.Info (Tag, "Importing {0}, merging with local data.", data.ToIdString ()); } else { log.Info (Tag, "Importing {0}, replacing local data.", data.ToIdString ()); } data = ctx.Put (data); // Also update tags from the JSON we are merging: if (mergeBase == null || (mergeBase != null && mergeBase.ModifiedAt != data.ModifiedAt)) { log.Info (Tag, "Resetting tags for {0}.", data.ToIdString ()); ResetTags (ctx, data, json); } } else { log.Info (Tag, "Skipping import of {0}.", json.ToIdString ()); } return data; }
private static void ResetTags (IDataStoreContext ctx, TimeEntryData timeEntryData, TimeEntryJson json) { // Don't touch the tags when the field is null if (json.Tags == null) { return; } var con = ctx.Connection; // Resolve tags to IDs: var tagIds = new List<Guid> (); foreach (var tagName in json.Tags) { // Prevent importing empty (invalid) tags: if (String.IsNullOrWhiteSpace (tagName)) { continue; } var id = ctx.GetTagIdFromName (timeEntryData.WorkspaceId, tagName); if (id == Guid.Empty) { // Need to create a new tag: var tagData = new TagData () { Name = tagName, WorkspaceId = timeEntryData.WorkspaceId, }; con.Insert (tagData); id = timeEntryData.Id; } tagIds.Add (id); } // Iterate over TimeEntryTags and determine which to keep and which to discard: var inters = con.Table<TimeEntryTagData> ().Where (m => m.TimeEntryId == timeEntryData.Id); var toDelete = new List<TimeEntryTagData> (); foreach (var inter in inters) { if (tagIds.Contains (inter.TagId)) { tagIds.Remove (inter.TagId); } else { toDelete.Add (inter); } } // Delete unused tags intermediate rows: foreach (var inter in toDelete) { ctx.Delete (inter); } // Create new intermediate rows: foreach (var tagId in tagIds) { ctx.Put (new TimeEntryTagData () { TagId = tagId, TimeEntryId = timeEntryData.Id, }); } }
public TimeEntryData Import (IDataStoreContext ctx, TimeEntryJson json, Guid? localIdHint = null, TimeEntryData mergeBase = null) { var data = GetByRemoteId<TimeEntryData> (ctx, json.Id.Value, localIdHint); var merger = mergeBase != null ? new TimeEntryMerger (mergeBase) : null; if (merger != null && data != null) merger.Add (new TimeEntryData (data)); if (json.DeletedAt.HasValue) { if (data != null) { // TODO: Delete TimeEntryTag intermediate data ctx.Delete (data); data = null; } } else if (merger != null || ShouldOverwrite (data, json)) { data = data ?? new TimeEntryData (); ImportJson (ctx, data, json); if (merger != null) { merger.Add (data); data = merger.Result; } data = ctx.Put (data); // Also update tags from the JSON we are merging: if (mergeBase == null || (mergeBase != null && mergeBase.ModifiedAt != data.ModifiedAt)) { ResetTags (ctx, data, json); } } return data; }