using InABox.Core; using InABox.Database; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PRS.Shared { public static class FormUpdater { public static void UpdateAllForms( Func, bool> skip, Func, bool> convert, int step = 100) { var forms = DbFactory.NewProvider(Logger.Main).Query( null, Columns.None().Add(x => x.ID) .Add(x => x.Code) .Add(x => x.Description) .Add(x => x.AppliesTo)); foreach(var form in forms.ToObjects()) { Logger.Send(LogType.Information, "", $"Working on '{form.Code} - {form.Description}'"); var variables = DbFactory.NewProvider(Logger.Main).Query( new Filter(x => x.Form.ID).IsEqualTo(form.ID), null).ToObjects().ToArray(); if(skip(form, variables)) { continue; } var formType = DFUtils.GetFormInstanceType(form.AppliesTo); if(formType is null) { Logger.Send(LogType.Error, "", $"{form.AppliesTo} does not refer to a digital form instance class."); continue; } var IDs = DbFactory.NewProvider(Logger.Main).Query(formType, Filter.Create(formType, x => x.Form.ID).IsEqualTo(form.ID), Columns.Create(formType, ColumnTypeFlags.None) .Add(x => x.ID)).Rows.Select(x => x.Get("ID")).ToArray(); for(int i = 0; i < IDs.Length; i += step) { int j = Math.Min(i + step, IDs.Length); var ids = IDs[i..j]; Logger.Send(LogType.Information, "", $"Converting {j - i} items; {IDs.Length - j} left."); var formInstances = DbFactory.NewProvider(Logger.Main).Query(formType, Filter.Create(formType, x => x.ID).InList(ids), Columns.Create(formType, ColumnTypeFlags.None) .Add(x => x.ID) .Add(x => x.FormData) .Add(x => x.BlobData)); var save = new List(); foreach (var row in formInstances.Rows) { var formInstance = (row.ToObject(formType) as IDigitalFormInstance)!; if (convert(formType, formInstance, form, variables)) { save.Add((formInstance as Entity)!); } } if(save.Count > 0) { DbFactory.NewProvider(Logger.Main).Save(formType, save); } } } } } }