private UpdateStatus InitialLoad(CompoundIdentity seId, EntityBundle sites, EntityBundle instruments, WaterQualityDET curdet, IWQDeploymentProvider depl, IWQMeasurementProvider meas, bool isPrivate) { UpdateStatus stat = null; if (sites == null || instruments == null || seId == null || seId.IsEmpty) { stat = new UpdateStatus(UpdateIssue.DataIssue); stat.Add(new IssueNotice("BundlesOrEvent", "Null value")); } else { //TODO -- may need to do case insensitive ops or not -- verify how excel part is implemented Dictionary <string, CompoundIdentity> deployIds = new Dictionary <string, CompoundIdentity>(); BundleElement elem; foreach (DeploymentDTO cur in curdet.Deployments.Values) { if (cur != null && !deployIds.ContainsKey(cur.DeployCode)) { elem = sites.Get(cur.SiteId); if (elem != null) { CompoundIdentity siteId = elem.EntityId; elem = instruments.Get(cur.InstrumentId); if (elem != null) { CompoundIdentity sensorId = elem.EntityId; WaterQualityDeployment dep = depl.Create(cur.DeployCode, seId, siteId, sensorId, this.GetRange(cur.StartDate, cur.EndDate), cur.Comments, isPrivate); if (dep != null) { deployIds[dep.Name] = dep.Identity; } else { stat = Add("Create", "Unable to create deployment " + cur.DeployCode, UpdateIssue.DataIssue, stat); } } else { stat = Add("InstCode", "Empty or invalid Instrument Code on deployment " + cur.DeployCode, UpdateIssue.DataIssue, stat); } } else { stat = Add("SiteCode", "Empty or invalid Site Code on Deployment " + cur.DeployCode, UpdateIssue.DataIssue, stat); } } else { stat = Add("DeployCode", "A deployment is missing a deployment code", UpdateIssue.DataIssue, stat); } } Dictionary <CompoundIdentity, WaterQualityMeasurementsDTO> items = new Dictionary <CompoundIdentity, WaterQualityMeasurementsDTO>(); foreach (MeasurementDTO cur in curdet.Measurements.Values) { if (cur != null && deployIds.ContainsKey(cur.DeployCode) && cur.MeasureDateTime != null) { CompoundIdentity depId = deployIds[cur.DeployCode]; if (depId != null) { if (!items.ContainsKey(depId)) { items[depId] = WaterQualityMeasurementsDTO.Create(depId); } WaterQualityMeasurementsDTO elems = items[depId]; elems.Add(new WaterQualityMeasurementDTO(cur.MeasureDateTime.Value, cur.SurfaceElevation, cur.Temperature, cur.pH, cur.DO, cur.Conductivity, cur.Salinity, cur.Velocity)); } } else { stat = Add("Create", "Unable to create Measurement with key " + cur.DeployCode + ":" + cur.MeasureDateTime, UpdateIssue.DataIssue, stat); } } foreach (WaterQualityMeasurementsDTO cur in items.Values) { if (cur != null) { meas.Create(cur); } } if (stat == null) { stat = new UpdateStatus(UpdateIssue.AllOk); stat.Add(new IssueNotice("NoIssues", "No issues")); } } return(stat); }
public IEnumerable <WaterQualityMeasurement> Create(WaterQualityMeasurementsDTO items) { if (items != null) { if (!items.DeploymentId.IsNullOrEmpty() && this.CanCreate()) { List <WaterQualityMeasurement> results = new List <WaterQualityMeasurement>(); if (items.Count > 0) { int count = 0; StringBuilder sb = new StringBuilder(Db.InsertMeasurementB); NpgsqlCommand cmd = Db.GetCmd(Db.ConnectionString); //we could optimize this further by doing a begin / end transaction first - if needed, hope not - DB transactions suck bad - don't use them if you don't have to. foreach (WaterQualityMeasurementDTO cur in items) { //do inserts in batches of 100 items if (count > 99) { cmd.CommandText = sb.ToString(); Db.ExecuteNonQuery(cmd); count = 0; sb.Clear(); sb.Append(Db.InsertMeasurementB); //this is "INSERT ... VALUES " -- needs the batches as param sets (a,b,c),(a,b,c),... } if (count > 0) { sb.Append(","); } count++; //increment the indicator //\"DeploySystemId\", \"DeployId\", \"SampleDate\", \"SurfElev\", \"Temperature\", \"pH\", \"DissOxy\", \"Cond\", \"Sal\", \"Velocity\" sb.Append("('"); sb.Append(items.DeploymentId.DataStoreIdentity); sb.Append("','"); sb.Append(items.DeploymentId.Identity); sb.Append("','"); sb.Append(Db.FixDate(cur.SampleDate).ToString("u")); sb.Append("',"); if (cur.SurfaceElevation.HasValue && !double.IsNaN(cur.SurfaceElevation.Value)) { sb.Append(cur.SurfaceElevation.Value); } else { sb.Append("NULL"); } sb.Append(','); if (cur.Temperature.HasValue && !double.IsNaN(cur.Temperature.Value)) { sb.Append(cur.Temperature.Value); } else { sb.Append("NULL"); } sb.Append(','); if (cur.pH.HasValue && !double.IsNaN(cur.pH.Value)) { sb.Append(cur.pH.Value); } else { sb.Append("NULL"); } sb.Append(','); if (cur.DissolvedOxygen.HasValue && !double.IsNaN(cur.DissolvedOxygen.Value)) { sb.Append(cur.DissolvedOxygen.Value); } else { sb.Append("NULL"); } sb.Append(','); if (cur.Conductivity.HasValue && !double.IsNaN(cur.Conductivity.Value)) { sb.Append(cur.Conductivity.Value); } else { sb.Append("NULL"); } sb.Append(','); if (cur.Salinity.HasValue && !double.IsNaN(cur.Salinity.Value)) { sb.Append(cur.Salinity.Value); } else { sb.Append("NULL"); } sb.Append(','); if (cur.Velocity.HasValue && !double.IsNaN(cur.Velocity.Value)) { sb.Append(cur.Velocity.Value); } else { sb.Append("NULL"); } sb.Append(')'); results.Add(new WaterQualityMeasurement(items.DeploymentId, Db.FixDate(cur.SampleDate), cur.SurfaceElevation, cur.Temperature, cur.pH, cur.DissolvedOxygen, cur.Conductivity, cur.Salinity, cur.Velocity)); } if (count > 0) //commit any leftovers { cmd.CommandText = sb.ToString(); Db.ExecuteNonQuery(cmd); } } return(results); } } return(null); }