123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- 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<DigitalForm, IList<DigitalFormVariable>, bool> skip,
- Func<Type, IDigitalFormInstance, DigitalForm, IList<DigitalFormVariable>, bool> convert, int step = 100)
- {
- var forms = DbFactory.NewProvider(Logger.Main).Query<DigitalForm>(
- null,
- Columns.None<DigitalForm>().Add(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.NewProvider(Logger.Main).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.NewProvider(Logger.Main).Query(formType,
- Filter.Create<IDigitalFormInstance>(formType, x => x.Form.ID).IsEqualTo(form.ID),
- Columns.Create<IDigitalFormInstance>(formType, ColumnTypeFlags.None)
- .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.NewProvider(Logger.Main).Query(formType,
- Filter.Create<IDigitalFormInstance>(formType, x => x.ID).InList(ids),
- Columns.Create<IDigitalFormInstance>(formType, ColumnTypeFlags.None)
- .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.NewProvider(Logger.Main).Save(formType, save);
- }
- }
- }
- }
- }
- }
|