| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 | using InABox.Core;using InABox.Database;using System;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<DigitalForm, IList<DigitalFormVariable>, bool> skip,            Func<Type, IDigitalFormInstance, DigitalForm, IList<DigitalFormVariable>, bool> convert, int step = 100)        {            var forms = DbFactory.Provider.Query<DigitalForm>(                null,                new Columns<DigitalForm>(x => x.ID)                    .Add(x => x.Code)                    .Add(x => x.Description)                    .Add(x => x.AppliesTo));            foreach(var form in forms.ToObjects<DigitalForm>())            {                Logger.Send(LogType.Information, "", $"Working on '{form.Code} - {form.Description}'");                var variables = DbFactory.Provider.Query(                    new Filter<DigitalFormVariable>(x => x.Form.ID).IsEqualTo(form.ID),                    null).ToObjects<DigitalFormVariable>().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.Provider.Query(formType,                    Filter.Create<IDigitalFormInstance>(formType, x => x.Form.ID).IsEqualTo(form.ID),                    Columns.Create<IDigitalFormInstance>(formType)                        .Add<IDigitalFormInstance>(x => x.ID)).Rows.Select(x => x.Get<Guid>("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.Provider.Query(formType,                        Filter.Create<IDigitalFormInstance>(formType, x => x.ID).InList(ids),                        Columns.Create<IDigitalFormInstance>(formType)                            .Add<IDigitalFormInstance>(x => x.ID)                            .Add<IDigitalFormInstance>(x => x.FormData)                            .Add<IDigitalFormInstance>(x => x.BlobData));                    var save = new List<Entity>();                    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.Provider.Save(formType, save);                    }                }            }        }    }}
 |