/// <summary> /// Update species observations. /// </summary> /// <param name="context">Web service request context.</param> /// <param name="speciesObservations">Updated species observations.</param> /// <param name="dataProvider">The dataProvider.</param> /// <param name="connectorServer">The connector server.</param> /// <param name="mappings">The mappings.</param> /// <param name="noOfUpdated">No of updated species observations.</param> /// <param name="noOfUpdatedErrors">No of updating errors.</param> public void UpdateSpeciesObservations(WebServiceContext context, List <WebData> speciesObservations, WebSpeciesObservationDataProvider dataProvider, IConnectorServer connectorServer, List <HarvestMapping> mappings, out int noOfUpdated, out int noOfUpdatedErrors) { noOfUpdated = 0; noOfUpdatedErrors = 0; ArtportalenProcess artportalenProcess = new ArtportalenProcess(); if (speciesObservations.IsNotEmpty()) { List <HarvestSpeciesObservation> updatedSpeciesObservations = new List <HarvestSpeciesObservation>(); for (Int32 index = speciesObservations.Count - 1; index >= 0; index--) { HarvestSpeciesObservation harvestSpeciesObservation = artportalenProcess.ProcessObservation(speciesObservations[index], mappings, context); updatedSpeciesObservations.Add(harvestSpeciesObservation); speciesObservations.RemoveAt(index); if (updatedSpeciesObservations.Count >= 10000) { break; } } connectorServer.UpdateSpeciesObservations(context, updatedSpeciesObservations, dataProvider, out noOfUpdated, out noOfUpdatedErrors); } }
/// <summary> /// Add information to the web service log. /// </summary> /// <param name="context">Web service request context.</param> /// <param name="dataProvider">Log text.</param> /// <param name="changedFrom">Changed from date.</param> /// <param name="changedTo">Changed to date.</param> /// <param name="processtime">How long time did the process take.</param> /// <param name="noOfCreated">Number of created observations.</param> /// <param name="noOfCreatedErrors">Number of errors when created observations.</param> /// <param name="noOfUpdated">Number of updated observations.</param> /// <param name="noOfUpdatedErrors">Number of errors when updated observations.</param> /// <param name="noOfDeleted">Number of deleted observations.</param> /// <param name="noOfDeletedErrors">Number of errors when deleted observations.</param> /// <param name="maxChangeId">Latest change id that was harvest from data source. -1 means no changeid is used for this dataprovider.</param> public virtual void LogHarvestRead(WebServiceContext context, WebSpeciesObservationDataProvider dataProvider, DateTime changedFrom, DateTime changedTo, Int64 processtime, Int64 noOfCreated, Int64 noOfCreatedErrors, Int64 noOfUpdated, Int64 noOfUpdatedErrors, Int64 noOfDeleted, Int64 noOfDeletedErrors, Int64 maxChangeId = -1) { string action = String.Format("Update from {0}, date: {1}{2}", dataProvider.Name, changedFrom.ToShortDateString(), (maxChangeId > -1 ? ", maxChangeId: " + maxChangeId.ToString() : String.Empty)); string result = String.Format( "Created: {0} ({1} errors), Updated: {2} ({3} errors), Deleted: {4} ({5} errors)", noOfCreated, noOfCreatedErrors, noOfUpdated, noOfUpdatedErrors, noOfDeleted, noOfDeletedErrors); context.GetSpeciesObservationDatabase().WriteToLogStatistics( action, processtime, result); }
/// <summary> /// Used to bridge to the private method CreateSpeciesObservations for the HarvestManagerTest. /// </summary> /// <param name="context">Web service context.</param> /// <param name="speciesObservations">Species observations.</param> /// <param name="dataProvider">Data provider.</param> /// <param name="changedFrom">Changed from date.</param> /// <param name="changedTo">Changed to date.</param> public static void TestCreateSpeciesObservations(WebServiceContext context, SpeciesObservationChange speciesObservations, WebSpeciesObservationDataProvider dataProvider, DateTime changedFrom, DateTime changedTo) { Stopwatch stopwatch = Stopwatch.StartNew(); int noOfUpdated, noOfUpdatedErrors, noOfDeleted, noOfDeletedErrors; ////ConnectorServer.CreateSpeciesObservations(context, speciesObservations.CreatedSpeciesObservations, dataProvider, out noOfCreated, out noOfCreatedErrors); ConnectorServer.UpdateSpeciesObservations(context, speciesObservations.UpdatedSpeciesObservations, dataProvider, out noOfUpdated, out noOfUpdatedErrors); ConnectorServer.DeleteSpeciesObservations(context, speciesObservations.DeletedSpeciesObservationGuids, dataProvider, out noOfDeleted, out noOfDeletedErrors); stopwatch.Stop(); context.GetSpeciesObservationDatabase().LogHarvestRead(context, dataProvider, changedFrom, changedTo, stopwatch.ElapsedMilliseconds, 0, 0, noOfUpdated, noOfUpdatedErrors, noOfDeleted, noOfDeletedErrors); }
/// <summary> /// Get information about species observations /// that has changed in the specified date range. /// Only date part of parameters changedFrom and changedTo /// are used. It does not matter what time of day that is set /// in parameters changedFrom and changedTo. /// </summary> /// <param name="changedFrom">Start date for changes.</param> /// <param name="changedTo">End date for changes.</param> /// <param name="mappings">The mappings.</param> /// <param name="context">Web service context.</param> /// <param name="connectorServer">The connector server.</param> /// <returns> /// Returns true if there are more species /// observations to retrieve for current date. /// </returns> public Boolean GetSpeciesObservationChange(DateTime changedFrom, DateTime changedTo, List <HarvestMapping> mappings, WebServiceContext context, IConnectorServer connectorServer) { // DOES NOT WORK EQUAL TO OTHERS. UNTIL FIX IT RECIEVES ALL DATA IN NORS //// Int64 maxReturnedChanges = 100; DateTime calcChangedTo = changedTo.AddDays(1); WebSpeciesObservationDataProvider dataProvider = GetSpeciesObservationDataProvider(context); Int64 nextChangeId = context.GetSpeciesObservationDatabase().GetMaxChangeId(dataProvider.Id) + 1; GetSpeciesObservationChange(changedFrom, false, calcChangedTo, false, nextChangeId, true, maxReturnedChanges, mappings, context, connectorServer); return(false); }
/// <summary> The remove deleted species observations. </summary> /// <param name="webSpeciesObservationChange"> The web species observation change. </param> /// <param name="speciesObservationChange"> The species observation change. </param> /// <param name="kulProcess"> The kul process. </param> /// <param name="mappings"> The mappings. </param> /// <param name="context"> The context. </param> /// <param name="connectorServer"> The connector server. </param> /// <param name="dataProvider"> The data provider. </param> /// <param name="sumNoOfDeleted"> The sum No Of Deleted. </param> /// <param name="sumNoOfDeletedErrors"> The sum No Of Deleted Errors. </param> private void RemoveDeletedSpeciesObservations( WebSpeciesObservationChange webSpeciesObservationChange, SpeciesObservationChange speciesObservationChange, KulProcess kulProcess, List <HarvestMapping> mappings, WebServiceContext context, IConnectorServer connectorServer, WebSpeciesObservationDataProvider dataProvider, out int sumNoOfDeleted, out int sumNoOfDeletedErrors) { sumNoOfDeleted = 0; sumNoOfDeletedErrors = 0; int observationCount = 0; int noOfDeleted = 0, noOfDeletedErrors = 0; speciesObservationChange.DeletedSpeciesObservationGuids = new List <String>(); foreach (String kulSpeciesObservation in webSpeciesObservationChange.DeletedSpeciesObservationGuids) { // if (adsSpeciesObservation.DatabaseId == 99) continue; String id = kulSpeciesObservation.Substring(kulSpeciesObservation.LastIndexOf('.') + 1); speciesObservationChange.DeletedSpeciesObservationGuids.Add(id); if (decimal.Remainder(++observationCount, 1000) != 0) { continue; } // write every 10000 observation to database to avoid memory problems connectorServer.DeleteSpeciesObservations( context, speciesObservationChange.DeletedSpeciesObservationGuids, dataProvider, out noOfDeleted, out noOfDeletedErrors); sumNoOfDeleted += noOfDeleted; sumNoOfDeletedErrors += noOfDeletedErrors; speciesObservationChange.DeletedSpeciesObservationGuids.Clear(); } // write remaining observations to database connectorServer.DeleteSpeciesObservations( context, speciesObservationChange.DeletedSpeciesObservationGuids, dataProvider, out noOfDeleted, out noOfDeletedErrors); sumNoOfDeleted += noOfDeleted; sumNoOfDeletedErrors += noOfDeletedErrors; speciesObservationChange.DeletedSpeciesObservationGuids.Clear(); }
/// <summary> /// Update species observations. /// </summary> /// <param name="context">Web service request context.</param> /// <param name="speciesObservationIds">Ids for updated species observations.</param> /// <param name="dataProvider">The dataProvider.</param> /// <param name="connectorServer">The connector server.</param> /// <param name="mappings">The mappings.</param> /// <param name="noOfUpdated">No of updated species observations.</param> /// <param name="noOfUpdatedErrors">No of updating errors.</param> public void UpdateSpeciesObservations(WebServiceContext context, List <Int64> speciesObservationIds, WebSpeciesObservationDataProvider dataProvider, IConnectorServer connectorServer, List <HarvestMapping> mappings, out int noOfUpdated, out int noOfUpdatedErrors) { List <Int64> tempSpeciesObservtionIds; List <WebData> updatedSpeciesObservations; WebData webData; noOfUpdated = 0; noOfUpdatedErrors = 0; if (speciesObservationIds.IsNotEmpty()) { tempSpeciesObservtionIds = new List <Int64>(); for (Int32 index = speciesObservationIds.Count - 1; index >= 0; index--) { tempSpeciesObservtionIds.Add(speciesObservationIds[index]); speciesObservationIds.RemoveAt(index); if (tempSpeciesObservtionIds.Count >= 10000) { break; } } updatedSpeciesObservations = new List <WebData>(); using (ArtportalenServer artportalenServer = new ArtportalenServer()) { // Get updated observations from Artportalen. using (DataReader dataReader = artportalenServer.GetSpeciesObservationsByIds(tempSpeciesObservtionIds)) { while (dataReader.Read()) { webData = new WebData(); webData.LoadData(dataReader); updatedSpeciesObservations.Add(webData); } } UpdateSpeciesObservations(context, updatedSpeciesObservations, dataProvider, connectorServer, mappings, out noOfUpdated, out noOfUpdatedErrors); } } }
public void GetSpeciesObservationChange() { DateTime changedFrom = new DateTime(2012, 10, 13); DateTime changedTo = new DateTime(2012, 10, 15); ArtportalenConnector artportalenConnector = new ArtportalenConnector(); List <WebSpeciesObservationFieldDescriptionExtended> webDarwinCoreFieldDescriptions = WebServiceData.MetadataManager.GetSpeciesObservationFieldDescriptionsExtended(GetContext(), true); WebSpeciesObservationDataProvider dataProvider = artportalenConnector.GetSpeciesObservationDataProvider(GetContext()); var mappings = HarvestManager.CreateMappingList(webDarwinCoreFieldDescriptions, dataProvider.Id); artportalenConnector.GetSpeciesObservationChange(changedFrom, changedTo, mappings, GetContext(), new ConnectorServer()); }
public void GetSpeciesObservationChange_StandardSignature() { DateTime changedFrom = new DateTime(2010, 01, 1); DateTime changedTo = new DateTime(2010, 1, 2); NorsConnector norsConnector = new NorsConnector(); List <WebSpeciesObservationFieldDescriptionExtended> webDarwinCoreFieldDescriptions = WebServiceData.MetadataManager.GetSpeciesObservationFieldDescriptionsExtended(GetContext(), true); WebSpeciesObservationDataProvider dataProvider = norsConnector.GetSpeciesObservationDataProvider(GetContext()); var mappings = HarvestManager.CreateMappingList(webDarwinCoreFieldDescriptions, dataProvider.Id); //norsConnector.GetSpeciesObservationChange(changedFrom, true, changedTo, true, 0, true, maxReturnedChanges, mappings, GetContext(), new ConnectorServer()); norsConnector.GetSpeciesObservationChange(changedFrom, changedTo, mappings, GetContext(), new ConnectorServer()); }
/// <summary> /// Will get all changes from the first connection and return it to HarvestManagerTest. /// If you want to test more connectors, code must be rewritten. /// </summary> /// <param name="context">Web service context.</param> /// <param name="changedFrom">Changed from date.</param> /// <param name="changedTo">Changed to date.</param> /// <param name="dataProvider">Data provider.</param> public static void TestGetSpeciesObservationChange(WebServiceContext context, DateTime changedFrom, DateTime changedTo, out WebSpeciesObservationDataProvider dataProvider) { IDataProviderConnector connector = Connectors[0]; dataProvider = connector.GetSpeciesObservationDataProvider(context); // Read metadata from SpeciesObservationDatabase List <WebSpeciesObservationFieldDescriptionExtended> webDarwinCoreFieldDescriptions = WebServiceData.MetadataManager.GetSpeciesObservationFieldDescriptionsExtended(context, true); var mappings = CreateMappingList(webDarwinCoreFieldDescriptions, dataProvider.Id); ConnectorServer connectorServer = new ConnectorServer(); connector.GetSpeciesObservationChange(changedFrom, changedTo, mappings, context, connectorServer); }
/// <summary> /// Get all species observation data providers. /// No cache is used. /// </summary> /// <param name="context">Web service request context.</param> /// <returns>All species observation data providers.</returns> private List <WebSpeciesObservationDataProvider> GetSpeciesObservationDataProviders(WebServiceContext context) { List <WebSpeciesObservationDataProvider> dataProviders; WebSpeciesObservationDataProvider dataProvider; // Data not in cache. Get information from database. dataProviders = new List <WebSpeciesObservationDataProvider>(); using (DataReader dataReader = context.GetDatabase().GetSpeciesObservationDataProviders(context.Locale.Id)) { while (dataReader.Read()) { dataProvider = new WebSpeciesObservationDataProvider(); dataProvider.LoadData(dataReader); dataProviders.Add(dataProvider); } } return(dataProviders); }
public void GetSpeciesObservationChange() { Int64 maxReturnedChanges = 100; DateTime changedFrom = new DateTime(2012, 3, 1); DateTime changedTo = new DateTime(2014, 1, 1); NorsConnector norsConnector = new NorsConnector(); List <WebSpeciesObservationFieldDescriptionExtended> webDarwinCoreFieldDescriptions = WebServiceData.MetadataManager.GetSpeciesObservationFieldDescriptionsExtended(GetContext(), true); WebSpeciesObservationDataProvider dataProvider = norsConnector.GetSpeciesObservationDataProvider(GetContext()); var mappings = HarvestManager.CreateMappingList(webDarwinCoreFieldDescriptions, dataProvider.Id); while (changedFrom < changedTo) { norsConnector.GetSpeciesObservationChange(changedFrom, true, changedFrom.AddDays(1), true, 0, false, maxReturnedChanges, mappings, GetContext(), new ConnectorServer()); changedFrom = changedFrom.AddDays(1); } }
public void GetSpeciesObservationChange_ChangeId() { //DateTime changedFrom = new DateTime(2009, 11, 22); //DateTime changedTo = new DateTime(2009, 11, 24); DateTime changedFrom = new DateTime(2010, 1, 1); DateTime changedTo = new DateTime(2011, 1, 1); Int64 changeId = 0; Int64 maxReturnedChanges = 100; NorsConnector norsConnector = new NorsConnector(); List <WebSpeciesObservationFieldDescriptionExtended> webDarwinCoreFieldDescriptions = WebServiceData.MetadataManager.GetSpeciesObservationFieldDescriptionsExtended(GetContext(), true); WebSpeciesObservationDataProvider dataProvider = norsConnector.GetSpeciesObservationDataProvider(GetContext()); var mappings = HarvestManager.CreateMappingList(webDarwinCoreFieldDescriptions, dataProvider.Id); norsConnector.GetSpeciesObservationChange(changedFrom, false, changedTo, false, changeId, true, maxReturnedChanges, mappings, GetContext(), new ConnectorServer()); }
/// <summary> /// Insert all deleted observations into a DataTable /// If ok, add it to TempDelete /// If there are errors add the observation to speciesObservationErrorFieldTable. /// </summary> /// <param name="context">Web service request context.</param> /// <param name="speciesObservationGuids">GUIDs for deleted species observations.</param> /// <param name="dataProvider">The dataProvider.</param> /// <param name="noOfDeleted">No of deleted species observations.</param> /// <param name="noOfErrors">No of deleting errors.</param> public static void DeleteSpeciesObservations(WebServiceContext context, List <String> speciesObservationGuids, WebSpeciesObservationDataProvider dataProvider, out int noOfDeleted, out int noOfErrors) { noOfDeleted = 0; noOfErrors = 0; if (speciesObservationGuids.IsNotEmpty()) { DataTable deletedObservationTable = HarvestManager.GetDeletedObservationTable(); foreach (string speciesObservation in speciesObservationGuids) { HarvestManager.AddToTempDelete(deletedObservationTable, dataProvider, speciesObservation); noOfDeleted++; } context.GetSpeciesObservationDatabase().AddTableData(deletedObservationTable); } }
public void GetSpeciesObservationChange() { DateTime changedFrom = new DateTime(2009, 11, 03); DateTime changedTo = new DateTime(2009, 11, 03); ObservationsdatabasenConnector obsdataConnector = new ObservationsdatabasenConnector(); List <WebSpeciesObservationFieldDescriptionExtended> webDarwinCoreFieldDescriptions = WebServiceData.MetadataManager.GetSpeciesObservationFieldDescriptionsExtended(GetContext(), true); WebSpeciesObservationDataProvider dataProvider = obsdataConnector.GetSpeciesObservationDataProvider(GetContext()); var mappings = HarvestManager.CreateMappingList(webDarwinCoreFieldDescriptions, dataProvider.Id); obsdataConnector.GetSpeciesObservationChange(changedFrom, changedTo, mappings, GetContext(), new ConnectorServer()); //Assert.IsTrue(speciesObservationChange.CreatedSpeciesObservations.IsNotEmpty()); //Assert.IsTrue(speciesObservationChange.UpdatedSpeciesObservations.IsNotEmpty()); //Assert.IsTrue(speciesObservationChange.DeletedSpeciesObservationGuids.IsNotEmpty()); //Assert.IsTrue(speciesObservationChange.CreatedSpeciesObservations[0].Fields[0].IsNotNull()); //Assert.IsTrue(speciesObservationChange.UpdatedSpeciesObservations[0].Fields[0].IsNotNull()); //Assert.IsTrue(speciesObservationChange.DeletedSpeciesObservationGuids[0].IsNotNull()); }
/// <summary> /// Get information about species observations that has changed. /// The service contains observations that are aggregated and has start /// and end dates that are set to the first and last day of every month. /// </summary> /// <param name="changedFrom">Start date for changes.</param> /// <param name="changedTo">End date for changes.</param> /// <param name="mappings">The mappings.</param> /// <param name="context">Web service context.</param> /// <param name="connectorServer">The connector server.</param> /// <returns> /// Returns true if there are more species /// observations to retrieve for current date. /// </returns> public Boolean GetSpeciesObservationChange(DateTime changedFrom, DateTime changedTo, List <HarvestMapping> mappings, WebServiceContext context, IConnectorServer connectorServer) { Dictionary <String, WebSpeciesObservation> updatedSpeciesObservations; SpeciesObservationChange speciesObservationChange = new SpeciesObservationChange(); speciesObservationChange.CreatedSpeciesObservations = new List <HarvestSpeciesObservation>(); Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); WramProcess wramProcess = new WramProcess(); WebSpeciesObservationDataProvider dataProvider = GetSpeciesObservationDataProvider(context); WebSpeciesObservationChange webSpeciesObservationChange = WebServiceProxy.WramService.GetSpeciesObservationChangeAsSpecies(DateTime.Now, false, DateTime.Now, false, dataProvider.MaxChangeId, true, Settings.Default.MaxSpeciesObservationsFromWram); // Run all created and updated together as one list. updatedSpeciesObservations = new Dictionary <String, WebSpeciesObservation>(); AddSpeciesObservations(updatedSpeciesObservations, webSpeciesObservationChange.UpdatedSpeciesObservations); AddSpeciesObservations(updatedSpeciesObservations, webSpeciesObservationChange.CreatedSpeciesObservations); List <WebSpeciesObservation> createdAndUpdatedObservations = new List <WebSpeciesObservation>(); createdAndUpdatedObservations.AddRange(updatedSpeciesObservations.Values); // Handle created and updated species observations. int noOfCreated = 0, noOfCreatedErrors = 0; if (createdAndUpdatedObservations.IsNotEmpty()) { foreach (WebSpeciesObservation wramSpeciesObservation in createdAndUpdatedObservations) { WebData webData = new WebData { DataFields = new List <WebDataField>() }; foreach (WebSpeciesObservationField webSpeciesObservationField in wramSpeciesObservation.Fields) { WebDataField webDataField = new WebDataField(); webDataField.LoadData(webSpeciesObservationField); webData.DataFields.Add(webDataField); } // Map and add webdata to the 'created collection' speciesObservationChange.CreatedSpeciesObservations.Add(wramProcess.ProcessObservation(webData, mappings, context)); } connectorServer.UpdateSpeciesObservations(context, speciesObservationChange.CreatedSpeciesObservations, dataProvider, out noOfCreated, out noOfCreatedErrors); } // Handle deleted species observtions. int noOfDeleted = 0, noOfDeletedErrors = 0; speciesObservationChange.DeletedSpeciesObservationGuids = new List <String>(); if (webSpeciesObservationChange.DeletedSpeciesObservationGuids.IsNotEmpty()) { foreach (String wramSpeciesObservation in webSpeciesObservationChange.DeletedSpeciesObservationGuids) { String id = wramSpeciesObservation.Substring(wramSpeciesObservation.LastIndexOf(':') + 1); speciesObservationChange.DeletedSpeciesObservationGuids.Add(id); } connectorServer.DeleteSpeciesObservations(context, speciesObservationChange.DeletedSpeciesObservationGuids, dataProvider, out noOfDeleted, out noOfDeletedErrors); } Debug.WriteLine(webSpeciesObservationChange.MaxChangeId + " : count created: " + noOfCreated); context.GetSpeciesObservationDatabase().LogHarvestRead( context, dataProvider, changedFrom, changedTo, stopwatch.ElapsedMilliseconds, noOfCreated, noOfCreatedErrors, 0, 0, noOfDeleted, noOfDeletedErrors, webSpeciesObservationChange.MaxChangeId); stopwatch.Stop(); if (webSpeciesObservationChange.MaxChangeId > 0) { // context.GetSpeciesObservationDatabase().SetMaxChangeId(dataProvider.Id, webSpeciesObservationChange.MaxChangeId); // Testing if WRAM has a problem with handling of change id. context.GetSpeciesObservationDatabase().SetMaxChangeId(dataProvider.Id, webSpeciesObservationChange.MaxChangeId - 1); } // else: No changes was retrieved. There are no more changes available right now. return(false); }
/// <summary> /// Get information about species observations /// that has changed in the specified date range or /// from a specified changeId. /// Only date part of parameters changedFrom and changedTo /// are used. It does not matter what time of day that is set /// in parameters changedFrom and changedTo. /// </summary> /// <param name="changedFrom"> /// Changed from date. /// </param> /// <param name="isChangedFromSpecified"> /// Is changed from specified. /// </param> /// <param name="changedTo"> /// Changed to date. /// </param> /// <param name="isChangedToSpecified"> /// Is changed to specified. /// </param> /// <param name="changeId"> /// From witch change id. /// </param> /// <param name="isChangeIdspecified"> /// Is changed id specified. /// </param> /// <param name="maxReturnedChanges"> /// Max number of observations returned. /// </param> /// <param name="mappings"> /// The mapping list. /// </param> /// <param name="context"> /// The web service context. /// </param> /// <param name="connectorServer"> /// The connector service. /// </param> public void GetSpeciesObservationChange(DateTime changedFrom, Boolean isChangedFromSpecified, DateTime changedTo, Boolean isChangedToSpecified, Int64 changeId, Boolean isChangeIdspecified, Int64 maxReturnedChanges, List <HarvestMapping> mappings, WebServiceContext context, IConnectorServer connectorServer) { SpeciesObservationChange speciesObservationChange = new SpeciesObservationChange(); speciesObservationChange.CreatedSpeciesObservations = new List <HarvestSpeciesObservation>(); speciesObservationChange.UpdatedSpeciesObservations = new List <HarvestSpeciesObservation>(); Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); int sumNoOfCreated = 0, sumNoOfCreatedErrors = 0, sumNoOfUpdated = 0, sumNoOfUpdatedErrors = 0, sumNoOfDeleted = 0, sumNoOfDeletedErrors = 0; NorsProcess norsProcess = new NorsProcess(); WebSpeciesObservationDataProvider dataProvider = GetSpeciesObservationDataProvider(context); WebSpeciesObservationChange webSpeciesObservationChange = WebServiceProxy.NorsService.GetSpeciesObservationChangeAsSpecies(changedFrom, isChangedFromSpecified, changedTo, isChangedToSpecified, changeId, isChangeIdspecified, maxReturnedChanges); // LOOP OVER CHANGEID // Denna verkar inte klara mer än ca 100 obsar så det behövs en loop över dessa... Int32 readSize = 0; Int64 currentChangeId = 0; int j = 0; while ((readSize++ < 50) && (currentChangeId < webSpeciesObservationChange.MaxChangeId)) { currentChangeId = webSpeciesObservationChange.MaxChangeId; context.GetSpeciesObservationDatabase().SetMaxChangeId(dataProvider.Id, webSpeciesObservationChange.MaxChangeId); // CREATED int i = 0; int noOfCreated, noOfCreatedErrors; foreach (Proxy.NorsService.WebSpeciesObservation norsSpeciesObservation in webSpeciesObservationChange.CreatedSpeciesObservations) { WebData webData = new WebData(); webData.DataFields = new List <WebDataField>(); foreach (WebSpeciesObservationField webSpeciesObservationField in norsSpeciesObservation.Fields) { WebDataField webDataField = new WebDataField(); webDataField.Information = webSpeciesObservationField.Information; webDataField.Name = webSpeciesObservationField.Property.Id.ToString(); webDataField.Type = (WebDataType)webSpeciesObservationField.Type; webDataField.Unit = webSpeciesObservationField.Unit; webDataField.Value = webSpeciesObservationField.Value.CheckInjection(); if (webDataField.IsNotNull()) { webData.DataFields.Add(webDataField); ////Debug.Write(webDataField.Name + " : "); ////Debug.Write(webDataField.Value + " : "); ////Debug.Write(webDataField.Type + " : "); ////Debug.Write(webDataField.Unit + " : "); ////Debug.WriteLine(webDataField.Information); } } // map webdata HarvestSpeciesObservation harvestSpeciesObservation = norsProcess.ProcessObservation(webData, mappings, context); speciesObservationChange.CreatedSpeciesObservations.Add(harvestSpeciesObservation); if (decimal.Remainder(++i, 10000) != 0) { continue; } // write every 10000 observation to database to avoid memory problems connectorServer.UpdateSpeciesObservations(context, speciesObservationChange.CreatedSpeciesObservations, dataProvider, out noOfCreated, out noOfCreatedErrors); sumNoOfCreated += noOfCreated; sumNoOfCreatedErrors += noOfCreatedErrors; speciesObservationChange.CreatedSpeciesObservations.Clear(); } connectorServer.UpdateSpeciesObservations(context, speciesObservationChange.CreatedSpeciesObservations, dataProvider, out noOfCreated, out noOfCreatedErrors); sumNoOfCreated += noOfCreated; sumNoOfCreatedErrors += noOfCreatedErrors; speciesObservationChange.CreatedSpeciesObservations.Clear(); // UPDATED i = 0; int noOfUpdated, noOfUpdatedErrors; foreach (Proxy.NorsService.WebSpeciesObservation norsSpeciesObservation in webSpeciesObservationChange.UpdatedSpeciesObservations) { WebData webData = new WebData(); webData.DataFields = new List <WebDataField>(); foreach (WebSpeciesObservationField webSpeciesObservationField in norsSpeciesObservation.Fields) { WebDataField webDataField = new WebDataField(); webDataField.Information = webSpeciesObservationField.Information; webDataField.Name = webSpeciesObservationField.Property.Id.ToString(); webDataField.Type = (WebDataType)webSpeciesObservationField.Type; webDataField.Unit = webSpeciesObservationField.Unit; webDataField.Value = webSpeciesObservationField.Value.CheckInjection(); if (webDataField.IsNotNull()) { webData.DataFields.Add(webDataField); } } // map webdata HarvestSpeciesObservation harvestSpeciesObservation = norsProcess.ProcessObservation(webData, mappings, context); speciesObservationChange.UpdatedSpeciesObservations.Add(harvestSpeciesObservation); if (decimal.Remainder(++i, 10000) != 0) { continue; } // write every 10000 observation to database to avoid memory problems connectorServer.UpdateSpeciesObservations(context, speciesObservationChange.UpdatedSpeciesObservations, dataProvider, out noOfUpdated, out noOfUpdatedErrors); sumNoOfUpdated += noOfUpdated; sumNoOfUpdatedErrors += noOfUpdatedErrors; speciesObservationChange.UpdatedSpeciesObservations.Clear(); } connectorServer.UpdateSpeciesObservations(context, speciesObservationChange.UpdatedSpeciesObservations, dataProvider, out noOfUpdated, out noOfUpdatedErrors); sumNoOfCreated += noOfUpdated; sumNoOfCreatedErrors += noOfUpdatedErrors; speciesObservationChange.UpdatedSpeciesObservations.Clear(); // DELETED i = 0; int noOfDeleted = 0, noOfDeletedErrors = 0; speciesObservationChange.DeletedSpeciesObservationGuids = new List <String>(); foreach (String norsSpeciesObservation in webSpeciesObservationChange.DeletedSpeciesObservationGuids) { // if (adsSpeciesObservation.DatabaseId == 99) continue; String id = norsSpeciesObservation.Substring(norsSpeciesObservation.LastIndexOf('.') + 1); speciesObservationChange.DeletedSpeciesObservationGuids.Add(id); if (decimal.Remainder(++i, 10000) != 0) { continue; } // write every 10000 observation to database to avoid memory problems connectorServer.DeleteSpeciesObservations( context, speciesObservationChange.DeletedSpeciesObservationGuids, dataProvider, out noOfDeleted, out noOfDeletedErrors); sumNoOfDeleted += noOfDeleted; sumNoOfDeletedErrors += noOfDeletedErrors; speciesObservationChange.DeletedSpeciesObservationGuids.Clear(); } // write remaining observations to database connectorServer.DeleteSpeciesObservations( context, speciesObservationChange.DeletedSpeciesObservationGuids, dataProvider, out noOfDeleted, out noOfDeletedErrors); sumNoOfDeleted += noOfDeleted; sumNoOfDeletedErrors += noOfDeletedErrors; speciesObservationChange.DeletedSpeciesObservationGuids.Clear(); // HANDLE LOOP OVER CHANGEID webSpeciesObservationChange = WebServiceProxy.NorsService.GetSpeciesObservationChangeAsSpecies(changedFrom, isChangedFromSpecified, changedTo, isChangedToSpecified, webSpeciesObservationChange.MaxChangeId + 1, isChangeIdspecified, maxReturnedChanges); if (decimal.Remainder(++j, 10) != 0) { continue; } Debug.WriteLine(webSpeciesObservationChange.MaxChangeId + " : count created: " + sumNoOfCreated); } Debug.WriteLine("end :" + webSpeciesObservationChange.MaxChangeId + " : count created: " + sumNoOfCreated); // Log latest harvest date for the data provider // Use changeFrom since changedTo is calculated (+1 day) context.GetSpeciesObservationDatabase().SetDataProviderLatestHarvestDate(dataProvider.Id, changedFrom); context.GetSpeciesObservationDatabase() .LogHarvestRead( context, dataProvider, changedFrom, changedTo, stopwatch.ElapsedMilliseconds, sumNoOfCreated, sumNoOfCreatedErrors, sumNoOfUpdated, sumNoOfUpdatedErrors, sumNoOfDeleted, sumNoOfDeletedErrors, currentChangeId); stopwatch.Stop(); }
/// <summary> /// Get information about species observations /// that has changed in the specified date range or /// from a specified changeId. /// Only date part of parameters changedFrom and changedTo /// are used. It does not matter what time of day that is set /// in parameters changedFrom and changedTo. /// </summary> /// <param name="changedFrom"> /// Changed from date. /// </param> /// <param name="isChangedFromSpecified"> /// Is changed from specified. /// </param> /// <param name="changedTo"> /// Changed to date. /// </param> /// <param name="isChangedToSpecified"> /// Is changed to specified. /// </param> /// <param name="changeId"> /// From witch change id. /// </param> /// <param name="isChangeIdspecified"> /// Is changed id specified. /// </param> /// <param name="maxReturnedChanges"> /// Max number of observations returned. /// </param> /// <param name="mappings"> /// The mapping list. /// </param> /// <param name="context"> /// The web service context. /// </param> /// <param name="connectorServer"> /// The connector service. /// </param> public void GetSpeciesObservationChange(DateTime changedFrom, Boolean isChangedFromSpecified, DateTime changedTo, Boolean isChangedToSpecified, Int64 changeId, Boolean isChangeIdspecified, Int64 maxReturnedChanges, List <HarvestMapping> mappings, WebServiceContext context, IConnectorServer connectorServer) { SpeciesObservationChange speciesObservationChange = new SpeciesObservationChange { CreatedSpeciesObservations = new List <HarvestSpeciesObservation>(), UpdatedSpeciesObservations = new List <HarvestSpeciesObservation>() }; var stopwatch = Stopwatch.StartNew(); int sumNoOfCreated = 0, sumNoOfCreatedErrors = 0, sumNoOfUpdated = 0, sumNoOfUpdatedErrors = 0, sumNoOfDeleted = 0, sumNoOfDeletedErrors = 0; KulProcess kulProcess = new KulProcess(); WebSpeciesObservationDataProvider dataProvider = GetSpeciesObservationDataProvider(context); Stopwatch stopwatch1 = Stopwatch.StartNew(); WebSpeciesObservationChange webSpeciesObservationChange = WebServiceProxy.KulService.GetSpeciesObservationChangeAsSpecies(changedFrom, isChangedFromSpecified, changedTo, isChangedToSpecified, changeId, isChangeIdspecified, maxReturnedChanges); Debug.WriteLine("Harvest: " + DateTime.Now.ToLongTimeString() + " - Time: " + TimeSpan.FromMilliseconds(stopwatch1.ElapsedMilliseconds).TotalMinutes + " Minutes"); // LOOP OVER CHANGEID // Denna verkar inte klara mer än ca 100 obsar så det behövs en loop över dessa... Int32 readSize = 0; Int64 currentChangeId = 0; int j = 0; while ((readSize++ < 50) && (currentChangeId < webSpeciesObservationChange.MaxChangeId)) { currentChangeId = webSpeciesObservationChange.MaxChangeId; context.GetSpeciesObservationDatabase().SetMaxChangeId(dataProvider.Id, webSpeciesObservationChange.MaxChangeId); // CREATED AddNewSpeciesObservations(webSpeciesObservationChange, speciesObservationChange, kulProcess, mappings, context, connectorServer, dataProvider, out sumNoOfCreated, out sumNoOfCreatedErrors); /* int i = 0; * int noOfCreated, noOfCreatedErrors; * foreach (Proxy.KulService.WebSpeciesObservation kulSpeciesObservation in webSpeciesObservationChange.CreatedSpeciesObservations) * { * WebData webData = new WebData { DataFields = new List<WebDataField>() }; * * foreach (WebSpeciesObservationField webSpeciesObservationField in kulSpeciesObservation.Fields) * { * WebDataField webDataField = new WebDataField * { * Information = webSpeciesObservationField.Information, * Name = webSpeciesObservationField.Property.Id.ToString(), * Type = (WebDataType)webSpeciesObservationField.Type, * Unit = webSpeciesObservationField.Unit, * Value = webSpeciesObservationField.Value.CheckInjection() * }; * * if (webDataField.IsNotNull()) * { * webData.DataFields.Add(webDataField); * } * } * * // map webdata * HarvestSpeciesObservation harvestSpeciesObservation = kulProcess.ProcessObservation(webData, mappings, context); * * speciesObservationChange.CreatedSpeciesObservations.Add(harvestSpeciesObservation); * * if (decimal.Remainder(++i, 1000) != 0) * { * continue; * } * * // write every 10000 observation to database to avoid memory problems * connectorServer.UpdateSpeciesObservations(context, speciesObservationChange.CreatedSpeciesObservations, dataProvider, out noOfCreated, out noOfCreatedErrors); * * sumNoOfCreated += noOfCreated; * sumNoOfCreatedErrors += noOfCreatedErrors; * speciesObservationChange.CreatedSpeciesObservations.Clear(); * } * * connectorServer.UpdateSpeciesObservations(context, speciesObservationChange.CreatedSpeciesObservations, dataProvider, out noOfCreated, out noOfCreatedErrors); * * sumNoOfCreated += noOfCreated; * sumNoOfCreatedErrors += noOfCreatedErrors; * speciesObservationChange.CreatedSpeciesObservations.Clear(); */ // UPDATED int i = 0; int noOfUpdated, noOfUpdatedErrors; foreach (Proxy.KulService.WebSpeciesObservation kulSpeciesObservation in webSpeciesObservationChange.UpdatedSpeciesObservations) { WebData webData = new WebData { DataFields = new List <WebDataField>() }; foreach (WebSpeciesObservationField webSpeciesObservationField in kulSpeciesObservation.Fields) { WebDataField webDataField = new WebDataField { Information = webSpeciesObservationField.Information, Name = webSpeciesObservationField.Property.Id.ToString(), Type = (WebDataType)webSpeciesObservationField.Type, Unit = webSpeciesObservationField.Unit, Value = webSpeciesObservationField.Value.CheckInjection() }; if (webDataField.IsNotNull()) { webData.DataFields.Add(webDataField); } } // map webdata HarvestSpeciesObservation harvestSpeciesObservation = kulProcess.ProcessObservation(webData, mappings, context); speciesObservationChange.UpdatedSpeciesObservations.Add(harvestSpeciesObservation); if (decimal.Remainder(++i, 1000) != 0) { continue; } // write every 10000 observation to database to avoid memory problems connectorServer.UpdateSpeciesObservations(context, speciesObservationChange.UpdatedSpeciesObservations, dataProvider, out noOfUpdated, out noOfUpdatedErrors); sumNoOfUpdated += noOfUpdated; sumNoOfUpdatedErrors += noOfUpdatedErrors; speciesObservationChange.UpdatedSpeciesObservations.Clear(); } connectorServer.UpdateSpeciesObservations(context, speciesObservationChange.UpdatedSpeciesObservations, dataProvider, out noOfUpdated, out noOfUpdatedErrors); sumNoOfCreated += noOfUpdated; sumNoOfCreatedErrors += noOfUpdatedErrors; speciesObservationChange.UpdatedSpeciesObservations.Clear(); // DELETED this.RemoveDeletedSpeciesObservations(webSpeciesObservationChange, speciesObservationChange, kulProcess, mappings, context, connectorServer, dataProvider, out sumNoOfDeleted, out sumNoOfDeletedErrors); /* * i = 0; * int noOfDeleted = 0, noOfDeletedErrors = 0; * speciesObservationChange.DeletedSpeciesObservationGuids = new List<String>(); * * foreach (String kulSpeciesObservation in webSpeciesObservationChange.DeletedSpeciesObservationGuids) * { * // if (adsSpeciesObservation.DatabaseId == 99) continue; * String id = kulSpeciesObservation.Substring(kulSpeciesObservation.LastIndexOf('.') + 1); * speciesObservationChange.DeletedSpeciesObservationGuids.Add(id); * * if (decimal.Remainder(++i, 1000) != 0) * { * continue; * } * * // write every 10000 observation to database to avoid memory problems * connectorServer.DeleteSpeciesObservations( * context, * speciesObservationChange.DeletedSpeciesObservationGuids, * dataProvider, * out noOfDeleted, * out noOfDeletedErrors); * sumNoOfDeleted += noOfDeleted; * sumNoOfDeletedErrors += noOfDeletedErrors; * speciesObservationChange.DeletedSpeciesObservationGuids.Clear(); * } * * // write remaining observations to database * connectorServer.DeleteSpeciesObservations( * context, * speciesObservationChange.DeletedSpeciesObservationGuids, * dataProvider, * out noOfDeleted, * out noOfDeletedErrors); * sumNoOfDeleted += noOfDeleted; * sumNoOfDeletedErrors += noOfDeletedErrors; * speciesObservationChange.DeletedSpeciesObservationGuids.Clear(); */ // HANDLE LOOP OVER CHANGEID webSpeciesObservationChange = WebServiceProxy.KulService.GetSpeciesObservationChangeAsSpecies(changedFrom, isChangedFromSpecified, changedTo, isChangedToSpecified, webSpeciesObservationChange.MaxChangeId + 1, isChangeIdspecified, maxReturnedChanges); if (decimal.Remainder(++j, 10) != 0) { continue; } Debug.WriteLine(webSpeciesObservationChange.MaxChangeId + " : count created: " + sumNoOfCreated); } Debug.WriteLine("end :" + webSpeciesObservationChange.MaxChangeId + " : count created: " + sumNoOfCreated); // Log latest harvest date for the data provider // Use changeFrom since changedTo is calculated (+1 day) context.GetSpeciesObservationDatabase().SetDataProviderLatestHarvestDate(dataProvider.Id, changedFrom); context.GetSpeciesObservationDatabase() .LogHarvestRead(context, dataProvider, changedFrom, changedTo, stopwatch.ElapsedMilliseconds, sumNoOfCreated, sumNoOfCreatedErrors, sumNoOfUpdated, sumNoOfUpdatedErrors, sumNoOfDeleted, sumNoOfDeletedErrors, currentChangeId); stopwatch.Stop(); }
/// <summary> /// Get information about species observations that has changed. /// The service contains observations that are aggregated and has start /// and end dates that are set to the first and last day of every month. /// </summary> /// <param name="changedFrom">Start date for changes.</param> /// <param name="changedTo">End date for changes.</param> /// <param name="mappings">The mappings.</param> /// <param name="context">Web service context.</param> /// <param name="connectorServer">The connector server.</param> /// <returns> /// Returns true if there are more species /// observations to retrieve for current date. /// </returns> public Boolean GetSpeciesObservationChange(DateTime changedFrom, DateTime changedTo, List <HarvestMapping> mappings, WebServiceContext context, IConnectorServer connectorServer) { Dictionary <String, WebSpeciesObservation> updatedSpeciesObservations; Int32 minutes; Int64 maxChangeId; // Wait for MVM service to be ready for use. for (minutes = 0; minutes < 60; minutes++) { if (WebServiceProxy.MvmService.IsReadyToUse()) { break; } else { // Wait one minute for MVM service to be ready for use. Thread.Sleep(60000); } } if ((minutes == 60) && !(WebServiceProxy.MvmService.IsReadyToUse())) { // Can not wait any longer for MVM service to be ready. return(false); } SpeciesObservationChange speciesObservationChange = new SpeciesObservationChange(); speciesObservationChange.CreatedSpeciesObservations = new List <HarvestSpeciesObservation>(); WebSpeciesObservationChange webSpeciesObservationChange; webSpeciesObservationChange = new WebSpeciesObservationChange(); webSpeciesObservationChange.CreatedSpeciesObservations = new List <WebSpeciesObservation>(); webSpeciesObservationChange.DeletedSpeciesObservationGuids = new List <String>(); webSpeciesObservationChange.UpdatedSpeciesObservations = new List <WebSpeciesObservation>(); Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); MvmProcess mvmProcess = new MvmProcess(); WebSpeciesObservationDataProvider dataProvider = GetSpeciesObservationDataProvider(context); maxChangeId = dataProvider.MaxChangeId; for (Int32 index = 0; index < 10; index++) { WebSpeciesObservationChange webSpeciesObservationChangeTemp = WebServiceProxy.MvmService.GetSpeciesObservationChangeAsSpecies(DateTime.Now, false, DateTime.Now, false, maxChangeId, true, Settings.Default.MaxSpeciesObservationsFromMvm); if (webSpeciesObservationChangeTemp.CreatedSpeciesObservations.IsNotEmpty()) { webSpeciesObservationChange.CreatedSpeciesObservations.AddRange(webSpeciesObservationChangeTemp.CreatedSpeciesObservations); } if (webSpeciesObservationChangeTemp.DeletedSpeciesObservationGuids.IsNotEmpty()) { webSpeciesObservationChange.DeletedSpeciesObservationGuids.AddRange(webSpeciesObservationChangeTemp.DeletedSpeciesObservationGuids); } if (webSpeciesObservationChangeTemp.UpdatedSpeciesObservations.IsNotEmpty()) { webSpeciesObservationChange.UpdatedSpeciesObservations.AddRange(webSpeciesObservationChangeTemp.UpdatedSpeciesObservations); } if (maxChangeId < webSpeciesObservationChangeTemp.MaxChangeId) { maxChangeId = webSpeciesObservationChangeTemp.MaxChangeId; } else { // No more species observation changes are available. break; } } // Run all created and updated together as one list. updatedSpeciesObservations = new Dictionary <String, WebSpeciesObservation>(); AddSpeciesObservations(updatedSpeciesObservations, webSpeciesObservationChange.UpdatedSpeciesObservations); AddSpeciesObservations(updatedSpeciesObservations, webSpeciesObservationChange.CreatedSpeciesObservations); List <WebSpeciesObservation> createdAndUpdatedObservations = new List <WebSpeciesObservation>(); createdAndUpdatedObservations.AddRange(updatedSpeciesObservations.Values); // Handle created and updated species observations. int noOfCreated = 0, noOfCreatedErrors = 0; if (createdAndUpdatedObservations.IsNotEmpty()) { foreach (WebSpeciesObservation mvmSpeciesObservation in createdAndUpdatedObservations) { WebData webData = new WebData { DataFields = new List <WebDataField>() }; foreach (WebSpeciesObservationField webSpeciesObservationField in mvmSpeciesObservation.Fields) { WebDataField webDataField = new WebDataField(); webDataField.LoadData(webSpeciesObservationField); webData.DataFields.Add(webDataField); } // Map and add webdata to the 'created collection' speciesObservationChange.CreatedSpeciesObservations.Add(mvmProcess.ProcessObservation(webData, mappings, context)); } connectorServer.UpdateSpeciesObservations(context, speciesObservationChange.CreatedSpeciesObservations, dataProvider, out noOfCreated, out noOfCreatedErrors); } // Handle deleted species observtions. int noOfDeleted = 0, noOfDeletedErrors = 0; speciesObservationChange.DeletedSpeciesObservationGuids = new List <String>(); if (webSpeciesObservationChange.DeletedSpeciesObservationGuids.IsNotEmpty()) { foreach (String mvmSpeciesObservation in webSpeciesObservationChange.DeletedSpeciesObservationGuids) { String id = mvmSpeciesObservation.Substring(mvmSpeciesObservation.LastIndexOf(':') + 1); speciesObservationChange.DeletedSpeciesObservationGuids.Add(id); } connectorServer.DeleteSpeciesObservations(context, speciesObservationChange.DeletedSpeciesObservationGuids, dataProvider, out noOfDeleted, out noOfDeletedErrors); } Debug.WriteLine(maxChangeId + " : count created: " + noOfCreated); context.GetSpeciesObservationDatabase().LogHarvestRead( context, dataProvider, changedFrom, changedTo, stopwatch.ElapsedMilliseconds, noOfCreated, noOfCreatedErrors, 0, 0, noOfDeleted, noOfDeletedErrors, maxChangeId); stopwatch.Stop(); if (maxChangeId > 0) { context.GetSpeciesObservationDatabase().SetMaxChangeId(dataProvider.Id, maxChangeId); } // else: No changes was retrieved. There are no more changes available right now. return(false); }
/// <summary> /// Get information about species observations /// that has changed in the specified date range. /// Only date part of parameters changedFrom and changedTo /// are used. It does not matter what time of day that is set /// in parameters changedFrom and changedTo. /// </summary> /// <param name="changedFrom">Start date for changes.</param> /// <param name="changedTo">End date for changes.</param> /// <param name="mappings">The mappings.</param> /// <param name="context">Web service context.</param> /// <param name="connectorServer">The connector server.</param> /// <returns> /// Returns true if there are more species /// observations to retrieve for current date. /// </returns> public Boolean GetSpeciesObservationChange(DateTime changedFrom, DateTime changedTo, List <HarvestMapping> mappings, WebServiceContext context, IConnectorServer connectorServer) { DateTime calcChangedTo = changedTo.AddDays(1); calcChangedTo = new DateTime(calcChangedTo.Year, calcChangedTo.Month, calcChangedTo.Day); WebData webData; SpeciesObservationChange speciesObservationChange = new SpeciesObservationChange(); WebSpeciesObservationDataProvider dataProvider = GetSpeciesObservationDataProvider(context); WebSpeciesObservationClass speciesObservationClass = new WebSpeciesObservationClass(SpeciesObservationClassId.DarwinCore); WebSpeciesObservationProperty reportedDateProp = new WebSpeciesObservationProperty(SpeciesObservationPropertyId.ReportedDate); Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); int sumNoOfCreated = 0, sumNoOfCreatedErrors = 0, sumNoOfUpdated = 0, sumNoOfUpdatedErrors = 0, sumNoOfDeleted = 0, sumNoOfDeletedErrors = 0; using (ObservationsdatabasenServer observationDatabasenServer = new ObservationsdatabasenServer()) { ObservationsdatabasenProcess observationsdatabasenProcess = new ObservationsdatabasenProcess(); // Get created and edited observations from Observationsdatabasen using (DataReader dataReader = observationDatabasenServer.GetSpeciesObservations(changedFrom, calcChangedTo)) { speciesObservationChange.CreatedSpeciesObservations = new List <HarvestSpeciesObservation>(); speciesObservationChange.UpdatedSpeciesObservations = new List <HarvestSpeciesObservation>(); int i = 0; int noOfCreated, noOfCreatedErrors, noOfUpdated, noOfUpdatedErrors; while (dataReader.Read()) { webData = new WebData(); webData.LoadData(dataReader); HarvestSpeciesObservation harvestSpeciesObservation = observationsdatabasenProcess.ProcessObservation(webData, mappings, context); DateTime reportedDate = harvestSpeciesObservation.GetFieldValue(speciesObservationClass, reportedDateProp).WebParseDateTime(); // If reportedDate is earlier than changedFrom the observation is edited. if (reportedDate < changedFrom) { speciesObservationChange.UpdatedSpeciesObservations.Add(harvestSpeciesObservation); } else { speciesObservationChange.CreatedSpeciesObservations.Add(harvestSpeciesObservation); } if (decimal.Remainder(++i, 10000) == 0) { // Write every 10000 observation to database to avoid memory problems connectorServer.UpdateSpeciesObservations(context, speciesObservationChange.CreatedSpeciesObservations, dataProvider, out noOfCreated, out noOfCreatedErrors); connectorServer.UpdateSpeciesObservations(context, speciesObservationChange.UpdatedSpeciesObservations, dataProvider, out noOfUpdated, out noOfUpdatedErrors); sumNoOfCreated += noOfCreated; sumNoOfCreatedErrors += noOfCreatedErrors; sumNoOfUpdated += noOfUpdated; sumNoOfUpdatedErrors += noOfUpdatedErrors; speciesObservationChange.CreatedSpeciesObservations.Clear(); speciesObservationChange.UpdatedSpeciesObservations.Clear(); } } // Write the remaining observations to database connectorServer.UpdateSpeciesObservations(context, speciesObservationChange.CreatedSpeciesObservations, dataProvider, out noOfCreated, out noOfCreatedErrors); connectorServer.UpdateSpeciesObservations(context, speciesObservationChange.UpdatedSpeciesObservations, dataProvider, out noOfUpdated, out noOfUpdatedErrors); sumNoOfCreated += noOfCreated; sumNoOfCreatedErrors += noOfCreatedErrors; sumNoOfUpdated += noOfUpdated; sumNoOfUpdatedErrors += noOfUpdatedErrors; speciesObservationChange.CreatedSpeciesObservations.Clear(); speciesObservationChange.UpdatedSpeciesObservations.Clear(); } // Get deleted observations from Observationsdatabasen using (DataReader dataReader = observationDatabasenServer.GetDeletedObservations(changedFrom, calcChangedTo)) { speciesObservationChange.DeletedSpeciesObservationGuids = new List <String>(); int noOfDeleted, noOfDeletedErrors; int i = 0; while (dataReader.Read()) { webData = new WebData(); webData.LoadData(dataReader); String deletedCatalogNumber = observationsdatabasenProcess.ProcessDeletedObservation(webData); speciesObservationChange.DeletedSpeciesObservationGuids.Add(deletedCatalogNumber); if (decimal.Remainder(++i, 10000) == 0) { // Write every 10000 observation to database to avoid memory problems connectorServer.DeleteSpeciesObservations(context, speciesObservationChange.DeletedSpeciesObservationGuids, dataProvider, out noOfDeleted, out noOfDeletedErrors); sumNoOfDeleted += noOfDeleted; sumNoOfDeletedErrors += noOfDeletedErrors; speciesObservationChange.DeletedSpeciesObservationGuids.Clear(); } } connectorServer.DeleteSpeciesObservations(context, speciesObservationChange.DeletedSpeciesObservationGuids, dataProvider, out noOfDeleted, out noOfDeletedErrors); sumNoOfDeleted += noOfDeleted; sumNoOfDeletedErrors += noOfDeletedErrors; speciesObservationChange.DeletedSpeciesObservationGuids.Clear(); } } // Log latest harvest date for the data provider context.GetSpeciesObservationDatabase().SetDataProviderLatestHarvestDate(dataProvider.Id, changedTo); context.GetSpeciesObservationDatabase().LogHarvestRead(context, dataProvider, changedFrom, changedTo, stopwatch.ElapsedMilliseconds, sumNoOfCreated, sumNoOfCreatedErrors, sumNoOfUpdated, sumNoOfUpdatedErrors, sumNoOfDeleted, sumNoOfDeletedErrors); stopwatch.Stop(); return(false); }
public void GetSpeciesObservationChange() { Int64 maxReturnedChanges = 100000; var changedFrom = new DateTime(2014, 7, 1); //// var changedFrom = new DateTime(1987, 7, 1); ////var changedTo = new DateTime(2015, 10, 29); var changedTo = new DateTime(2014, 9, 29); var kulConnector = new KulConnector(); List <WebSpeciesObservationFieldDescriptionExtended> webDarwinCoreFieldDescriptions = WebServiceData.MetadataManager.GetSpeciesObservationFieldDescriptionsExtended(GetContext(), true); WebServiceContext context = GetContext(); // Read meta data for current job var harvestJobManager = new HarvestJobManager(context); var harvestJob = harvestJobManager.GetHarvestJob(); WebSpeciesObservationDataProvider dataProvider = kulConnector.GetSpeciesObservationDataProvider(context); var dataProviderId = new List <int>() { dataProvider.Id }; var mappings = HarvestManager.CreateMappingList(webDarwinCoreFieldDescriptions, dataProvider.Id); // Log data provider harvest status /* * context.GetSpeciesObservationDatabase().EmptyTempTables(); * context.GetSpeciesObservationDatabase().CleanLogUpdateError(); * context.GetSpeciesObservationDatabase().CleanLogUpdateErrorDuplicates(); */ context.GetSpeciesObservationDatabase().SetHarvestJobStatistics(dataProviderId, harvestJob.JobStatus, changedFrom); //// Stopwatch stopwatch1 = Stopwatch.StartNew(); while (changedFrom < changedTo) { //// stopwatch1.Reset(); //// stopwatch1 = Stopwatch.StartNew(); kulConnector.GetSpeciesObservationChange(changedFrom, true, changedFrom.AddMonths(1), true, 0, false, maxReturnedChanges, mappings, GetContext(), new ConnectorServer()); changedFrom = changedFrom.AddMonths(1); //// Debug.WriteLine("Harvest and fix: " + DateTime.Now.ToLongTimeString() + " - Time: " + stopwatch1.ElapsedMilliseconds); } // Log latest changed date (at data source), of modified information of harvested observations context.GetSpeciesObservationDatabase().SetDataProviderLatestChangedDate(dataProvider.Id); Stopwatch stopwatchM = Stopwatch.StartNew(); string logMessage = String.Empty; long stopwatchPrev = 0; context.GetSpeciesObservationDatabase().UpdateTempObservationId(); logMessage += " ID: " + (stopwatchM.ElapsedMilliseconds - stopwatchPrev); stopwatchPrev = stopwatchM.ElapsedMilliseconds; context.GetSpeciesObservationDatabase().CheckTaxonIdOnTemp(); logMessage += ", TAXON: " + (stopwatchM.ElapsedMilliseconds - stopwatchPrev); stopwatchPrev = stopwatchM.ElapsedMilliseconds; context.GetSpeciesObservationDatabase().LogHarvestMove(context, "Harvest SP - Check", stopwatchM.ElapsedMilliseconds, logMessage); logMessage = String.Empty; context.GetSpeciesObservationDatabase().CreatePointGoogleMercatorInTemp(); logMessage += " POINT: " + (stopwatchM.ElapsedMilliseconds - stopwatchPrev); stopwatchPrev = stopwatchM.ElapsedMilliseconds; context.GetSpeciesObservationDatabase().LogHarvestMove(context, "Harvest SP - Calculate", stopwatchM.ElapsedMilliseconds, logMessage); logMessage = String.Empty; context.GetSpeciesObservationDatabase().UpdateAccuracyAndDisturbanceRadius(); logMessage += " ACCURACY_AND_DISTURBANCE_RADIUS: " + (stopwatchM.ElapsedMilliseconds - stopwatchPrev); stopwatchPrev = stopwatchM.ElapsedMilliseconds; context.GetSpeciesObservationDatabase().LogHarvestMove(context, "Harvest SP - Calculate", stopwatchM.ElapsedMilliseconds, logMessage); logMessage = String.Empty; context.GetSpeciesObservationDatabase().MergeTempUpdateToPosition(); logMessage += " POSITION: " + (stopwatchM.ElapsedMilliseconds - stopwatchPrev); stopwatchPrev = stopwatchM.ElapsedMilliseconds; context.GetSpeciesObservationDatabase().LogHarvestMove(context, "Harvest SP - POSITION", stopwatchM.ElapsedMilliseconds, logMessage); logMessage = String.Empty; context.GetSpeciesObservationDatabase().UpdateSpeciesObservationChange(); logMessage += " SOC: " + (stopwatchM.ElapsedMilliseconds - stopwatchPrev); stopwatchPrev = stopwatchM.ElapsedMilliseconds; context.GetSpeciesObservationDatabase().MergeTempUpdateToDarwinCoreObservation(); logMessage += " DCO: " + (stopwatchM.ElapsedMilliseconds - stopwatchPrev); stopwatchPrev = stopwatchM.ElapsedMilliseconds; context.GetSpeciesObservationDatabase().MergeTempUpdateToSpeciesObservationField(); logMessage += ", SOF: " + (stopwatchM.ElapsedMilliseconds - stopwatchPrev); stopwatchPrev = stopwatchM.ElapsedMilliseconds; context.GetSpeciesObservationDatabase().LogHarvestMove(context, "Harvest SP - CREATE & UPDATE", stopwatchM.ElapsedMilliseconds, logMessage); logMessage = String.Empty; context.GetSpeciesObservationDatabase().CopyDeleteToSpeciesObservation(); logMessage += " SO: " + (stopwatchM.ElapsedMilliseconds - stopwatchPrev); stopwatchPrev = stopwatchM.ElapsedMilliseconds; context.GetSpeciesObservationDatabase().LogHarvestMove(context, "Harvest SP - DELETE", stopwatchM.ElapsedMilliseconds, logMessage); logMessage = String.Empty; context.GetSpeciesObservationDatabase().UpdateStatistics(); logMessage += ", DPS:" + (stopwatchM.ElapsedMilliseconds - stopwatchPrev); stopwatchPrev = stopwatchM.ElapsedMilliseconds; context.GetSpeciesObservationDatabase().EmptyTempTables(); logMessage += ", Empty: " + (stopwatchM.ElapsedMilliseconds - stopwatchPrev); context.GetSpeciesObservationDatabase().CleanLogUpdateError(); context.GetSpeciesObservationDatabase().CleanLogUpdateErrorDuplicates(); logMessage += ", LUE: " + (stopwatchM.ElapsedMilliseconds - stopwatchPrev); stopwatchM.Stop(); context.GetSpeciesObservationDatabase().LogHarvestMove(context, "Harvest DB - OPERATIONS", stopwatchM.ElapsedMilliseconds, logMessage); // Log data provider harvest status context.GetSpeciesObservationDatabase().SetHarvestJobStatistics(dataProviderId, HarvestStatusEnum.Done, changedFrom); }
////void IConnectorServer.CreateSpeciesObservations(WebServiceContext context, List<HarvestSpeciesObservation> speciesObservations, WebSpeciesObservationDataProvider dataProvider, out int noOfCreated, out int noOfErrors) ////{ //// throw new NotImplementedException(); //// // CreateSpeciesObservations(context, speciesObservations, dataProvider, out noOfCreated, out noOfErrors); ////} ///// <summary> ///// Insert all new (created) observations into a DataTable ///// First check the observation ///// If ok, add it to SpeciesObservationTable and DarwinCoreTable ///// If there are errors add the observation to speciesObservationErrorFieldTable ///// </summary> ///// <param name="context">Web service request context.</param> ///// <param name="speciesObservations">Created species observations.</param> ///// <param name="dataProvider">Species observation data source.</param> ///// <param name="noOfCreated">Created </param> ///// <param name="noOfErrors">Errors </param> ////public static void CreateSpeciesObservations(WebServiceContext context, //// List<HarvestSpeciesObservation> speciesObservations, //// WebSpeciesObservationDataProvider dataProvider, //// out int noOfCreated, out int noOfErrors) ////{ //// noOfCreated = 0; //// noOfErrors = 0; //// if (speciesObservations.IsNotEmpty()) //// { //// DataTable darwinCoreTable = HarvestManager.GetDarwinCoreTable(CREATE); //// DataTable speciesObservationFieldTable = HarvestManager.GetSpeciesObservationFieldTable(CREATE); //// DataTable speciesObservationErrorFieldTable = HarvestManager.GetSpeciesObservationErrorFieldTable(); //// // Save all species observations into tables. //// foreach (HarvestSpeciesObservation speciesObservation in speciesObservations) //// { //// string catalogNumber; //// Dictionary<SpeciesObservationPropertyId, string> errors; //// if (HarvestManager.CheckSpeciesObservation(speciesObservation, context, out errors, out catalogNumber)) //// { //// // HarvestManager.SpeciesObservationId++; //// HarvestManager.AddToTempSpeciesObservation(speciesObservation, //// darwinCoreTable, //// speciesObservationFieldTable, //// HarvestManager.SpeciesObservationId, //// dataProvider, //// catalogNumber); //// noOfCreated++; //// } //// else //// { //// HarvestManager.CreateSpeciesObservationError(speciesObservation, //// speciesObservationErrorFieldTable, //// dataProvider, //// errors, //// CREATE); //// noOfErrors++; //// } //// } //// // Save tables to database. //// context.GetSpeciesObservationDatabase().AddTableData(speciesObservationFieldTable); //// context.GetSpeciesObservationDatabase().AddTableData(darwinCoreTable); //// if (noOfErrors > 0) //// context.GetSpeciesObservationDatabase().AddTableData(speciesObservationErrorFieldTable); //// } ////} /// <summary> /// Insert all changed (updated) observations into a DataTable /// First check the observation /// If ok, add it to SpeciesObservationUpdateTable and DarwinCoreUpdateTable /// If there are errors add the observation to speciesObservationErrorFieldTable. /// </summary> /// <param name="context">Web service request context.</param> /// <param name="speciesObservations">Updated species observations.</param> /// <param name="dataProvider">The dataProvider.</param> /// <param name="noOfUpdated">No of updated species observations.</param> /// <param name="noOfUpdatedErrors">No of updating errors.</param> public static void UpdateSpeciesObservations(WebServiceContext context, List <HarvestSpeciesObservation> speciesObservations, WebSpeciesObservationDataProvider dataProvider, out int noOfUpdated, out int noOfUpdatedErrors) { noOfUpdated = 0; noOfUpdatedErrors = 0; if (!speciesObservations.IsNotEmpty()) { return; } DataTable darwinCoreTable = HarvestManager.GetDarwinCoreTable(HarvestManager.UPDATE); DataTable speciesObservationFieldTable = HarvestManager.GetSpeciesObservationFieldTable(HarvestManager.UPDATE); DataTable speciesObservationErrorFieldTable = HarvestManager.GetSpeciesObservationErrorFieldTable(); // Save all species observations into tables. foreach (HarvestSpeciesObservation speciesObservation in speciesObservations) { string catalogNumber; Boolean someError = true; Dictionary <SpeciesObservationPropertyId, string> errors; if (HarvestManager.CheckSpeciesObservation(speciesObservation, context, out errors, out catalogNumber)) { try { HarvestManager.AddToTempSpeciesObservation(speciesObservation, darwinCoreTable, speciesObservationFieldTable, -1, dataProvider, catalogNumber); noOfUpdated++; someError = false; } catch (Exception ex) { var prop = (SpeciesObservationPropertyId)Enum.Parse(typeof(SpeciesObservationPropertyId), ex.Message); if (prop.IsNotNull()) { errors.Add(prop, ex.InnerException.Message); } else { errors.Add(SpeciesObservationPropertyId.Id, ex.InnerException.ToString()); } } } if (someError) { HarvestManager.CreateSpeciesObservationError(speciesObservation, speciesObservationErrorFieldTable, dataProvider, errors, HarvestManager.UPDATE); noOfUpdatedErrors++; } } // Save tables to database. context.GetSpeciesObservationDatabase().AddTableData(speciesObservationFieldTable); context.GetSpeciesObservationDatabase().AddTableData(darwinCoreTable); if (noOfUpdatedErrors > 0) { context.GetSpeciesObservationDatabase().AddTableData(speciesObservationErrorFieldTable); } }
/// <summary> /// Get information about species observations /// that has changed in the specified date range. /// Only date part of parameters changedFrom and changedTo /// are used. It does not matter what time of day that is set /// in parameters changedFrom and changedTo. /// </summary> /// <param name="changedFrom">Start date for changes.</param> /// <param name="changedTo">End date for changes.</param> /// <param name="mappings">The mappings.</param> /// <param name="context">Web service context.</param> /// <param name="connectorServer">The connector server.</param> /// <returns> /// Returns true if there are more species /// observations to retrieve for current date. /// </returns> public Boolean GetSpeciesObservationChange(DateTime changedFrom, DateTime changedTo, List <HarvestMapping> mappings, WebServiceContext context, IConnectorServer connectorServer) { Int32 noOfDeleted, noOfDeletedErrors; int noOfUpdated = 0, noOfUpdatedErrors = 0; DateTime calcChangedTo = changedTo.AddDays(1); WebSpeciesObservationDataProvider dataProvider = GetSpeciesObservationDataProvider(context); WebData webData; Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); if (mUpdatedSpeciesObservations.IsEmpty() && mUpdatedSpeciesObservationIds.IsEmpty()) { SpeciesObservationChange speciesObservationChange = new SpeciesObservationChange(); mUpdatedSpeciesObservationIds = new List <Int64>(); mUpdatedSpeciesObservations = new List <WebData>(); int sumNoOfCreated = 0, sumNoOfCreatedErrors = 0, sumNoOfUpdated = 0, sumNoOfUpdatedErrors = 0, sumNoOfDeleted = 0, sumNoOfDeletedErrors = 0; using (ArtportalenServer artportalenServer = new ArtportalenServer()) { var artportalenProcess = new ArtportalenProcess(); // Get changes from Artportalen. using (DataReader dataReader = artportalenServer.GetSpeciesObservations(changedFrom, calcChangedTo)) { while (dataReader.Read()) { webData = new WebData(); webData.LoadData(dataReader); if (mUpdatedSpeciesObservations.Count >= 100000) { mUpdatedSpeciesObservationIds.Add(GetSpeciesObservationId(webData)); } else { mUpdatedSpeciesObservations.Add(webData); } } AddProjectParameters(this.mUpdatedSpeciesObservations, dataReader); } // Save updated species observations into database. // Max 10000 species observations are saved in one call. UpdateSpeciesObservations(context, mUpdatedSpeciesObservations, dataProvider, connectorServer, mappings, out noOfUpdated, out noOfUpdatedErrors); sumNoOfUpdated += noOfUpdated; sumNoOfUpdatedErrors += noOfUpdatedErrors; // Get deleted observations from Artportalen speciesObservationChange.DeletedSpeciesObservationGuids = new List <String>(); using (DataReader dataReader = artportalenServer.GetDeletedObservations(changedFrom, calcChangedTo)) { int i = 0; while (dataReader.Read()) { webData = new WebData(); webData.LoadData(dataReader); String deletedCatalogNumber = artportalenProcess.ProcessDeletedObservation(webData); speciesObservationChange.DeletedSpeciesObservationGuids.Add(deletedCatalogNumber); if (decimal.Remainder(++i, 10000) == 0) { // Write every 10000 observation to database to avoid memory problems connectorServer.DeleteSpeciesObservations(context, speciesObservationChange.DeletedSpeciesObservationGuids, dataProvider, out noOfDeleted, out noOfDeletedErrors); sumNoOfDeleted += noOfDeleted; sumNoOfDeletedErrors += noOfDeletedErrors; speciesObservationChange.DeletedSpeciesObservationGuids.Clear(); } } // Write the remaining observations to database connectorServer.DeleteSpeciesObservations(context, speciesObservationChange.DeletedSpeciesObservationGuids, dataProvider, out noOfDeleted, out noOfDeletedErrors); sumNoOfDeleted += noOfDeleted; sumNoOfDeletedErrors += noOfDeletedErrors; speciesObservationChange.DeletedSpeciesObservationGuids.Clear(); } } // Log latest harvest date for the data provider context.GetSpeciesObservationDatabase().SetDataProviderLatestHarvestDate(dataProvider.Id, changedTo); context.GetSpeciesObservationDatabase().LogHarvestRead(context, dataProvider, changedFrom, changedTo, stopwatch.ElapsedMilliseconds, sumNoOfCreated, sumNoOfCreatedErrors, sumNoOfUpdated, sumNoOfUpdatedErrors, sumNoOfDeleted, sumNoOfDeletedErrors); } else { // Save updated species observations into database. // Max 10000 species observations are saved in one call. if (mUpdatedSpeciesObservations.IsNotEmpty()) { UpdateSpeciesObservations(context, mUpdatedSpeciesObservations, dataProvider, connectorServer, mappings, out noOfUpdated, out noOfUpdatedErrors); } else { if (mUpdatedSpeciesObservationIds.IsNotEmpty()) { UpdateSpeciesObservations(context, mUpdatedSpeciesObservationIds, dataProvider, connectorServer, mappings, out noOfUpdated, out noOfUpdatedErrors); } } context.GetSpeciesObservationDatabase().LogHarvestRead(context, dataProvider, changedFrom, changedTo, stopwatch.ElapsedMilliseconds, 0, 0, noOfUpdated, noOfUpdatedErrors, 0, 0); } stopwatch.Stop(); return(mUpdatedSpeciesObservations.IsNotEmpty() || mUpdatedSpeciesObservationIds.IsNotEmpty()); }
/// <summary> /// Update species observations. /// </summary> /// <param name="context">Web service request context.</param> /// <param name="speciesObservations">Updated species observations.</param> /// <param name="dataProvider">The dataProvider.</param> /// <param name="noOfUpdated">No of updated species observations.</param> /// <param name="noOfUpdatedErrors">No of updating errors.</param> void IConnectorServer.UpdateSpeciesObservations(WebServiceContext context, List <HarvestSpeciesObservation> speciesObservations, WebSpeciesObservationDataProvider dataProvider, out int noOfUpdated, out int noOfUpdatedErrors) { UpdateSpeciesObservations(context, speciesObservations, dataProvider, out noOfUpdated, out noOfUpdatedErrors); }
/// <summary> /// Insert all deleted observations into a DataTable /// If ok, add it to TempDelete /// If there are errors add the observation to speciesObservationErrorFieldTable. /// </summary> /// <param name="context">Web service request context.</param> /// <param name="speciesObservationGuids">GUIDs for deleted species observations.</param> /// <param name="dataProvider">The dataProvider.</param> /// <param name="noOfDeleted">No of deleted species observations.</param> /// <param name="noOfErrors">No of deleting errors.</param> void IConnectorServer.DeleteSpeciesObservations(WebServiceContext context, List <string> speciesObservationGuids, WebSpeciesObservationDataProvider dataProvider, out int noOfDeleted, out int noOfErrors) { DeleteSpeciesObservations(context, speciesObservationGuids, dataProvider, out noOfDeleted, out noOfErrors); }
/// <summary> /// Get information about species observations /// that has it's id in the SightingIds list. /// </summary> /// <param name="sightingIds">A list of id's to return information about.</param> /// <param name="mappings">The mappings.</param> /// <param name="context">Web service context.</param> /// <param name="connectorServer">The connector server.</param> public void GetSpeciesObservationChange(List <string> sightingIds, List <HarvestMapping> mappings, WebServiceContext context, IConnectorServer connectorServer) { WebSpeciesObservationDataProvider dataProvider = GetSpeciesObservationDataProvider(context); WebData webData; SpeciesObservationChange speciesObservationChange = new SpeciesObservationChange(); Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); int sumNoOfCreated = 0, sumNoOfCreatedErrors = 0, sumNoOfUpdated = 0, sumNoOfUpdatedErrors = 0, sumNoOfDeleted = 0, sumNoOfDeletedErrors = 0; using (ArtportalenServer artportalenServer = new ArtportalenServer()) { ArtportalenProcess artportalenProcess = new ArtportalenProcess(); // Get created and edited observations from Artportalen using (DataReader dataReader = artportalenServer.GetSpeciesObservationsByIds(sightingIds)) { speciesObservationChange.CreatedSpeciesObservations = new List <HarvestSpeciesObservation>(); int i = 0; int noOfCreated, noOfCreatedErrors; while (dataReader.Read()) { webData = new WebData(); webData.LoadData(dataReader); HarvestSpeciesObservation harvestSpeciesObservation = artportalenProcess.ProcessObservation(webData, mappings, context); speciesObservationChange.CreatedSpeciesObservations.Add(harvestSpeciesObservation); if (decimal.Remainder(++i, 10000) == 0) { // Write every 10000 observation to database to avoid memory problems. connectorServer.UpdateSpeciesObservations(context, speciesObservationChange.CreatedSpeciesObservations, dataProvider, out noOfCreated, out noOfCreatedErrors); sumNoOfCreated += noOfCreated; sumNoOfCreatedErrors += noOfCreatedErrors; speciesObservationChange.CreatedSpeciesObservations.Clear(); speciesObservationChange.UpdatedSpeciesObservations.Clear(); } } // Write the remaining observations to database connectorServer.UpdateSpeciesObservations(context, speciesObservationChange.CreatedSpeciesObservations, dataProvider, out noOfCreated, out noOfCreatedErrors); sumNoOfCreated += noOfCreated; sumNoOfCreatedErrors += noOfCreatedErrors; speciesObservationChange.CreatedSpeciesObservations.Clear(); } //// Get deleted observations from Artportalen //using (DataReader dataReader = artportalenServer.GetDeletedObservations(changedFrom, calcChangedTo)) //{ // speciesObservationChange.DeletedSpeciesObservationGuids = new List<String>(); // int i = 0; // while (dataReader.Read()) // { // webData = new WebData(); // webData.LoadData(dataReader); // String deletedCatalogNumber = artportalenProcess.ProcessDeletedObservation(webData); // speciesObservationChange.DeletedSpeciesObservationGuids.Add(deletedCatalogNumber); // if (decimal.Remainder(++i, 10000) == 0) // { // // Write every 10000 observation to database to avoid memory problems // connectorServer.DeleteSpeciesObservations(context, speciesObservationChange.DeletedSpeciesObservationGuids, dataProvider, out noOfDeleted, out noOfDeletedErrors); // sumNoOfDeleted += noOfDeleted; // sumNoOfDeletedErrors += noOfDeletedErrors; // speciesObservationChange.DeletedSpeciesObservationGuids.Clear(); // } // } // // Write the remaining observations to database // connectorServer.DeleteSpeciesObservations(context, speciesObservationChange.DeletedSpeciesObservationGuids, dataProvider, out noOfDeleted, out noOfDeletedErrors); // sumNoOfDeleted += noOfDeleted; // sumNoOfDeletedErrors += noOfDeletedErrors; // speciesObservationChange.DeletedSpeciesObservationGuids.Clear(); //} } // Log latest harvest date for the data provider //context.GetSpeciesObservationDatabase().SetDataProviderLatestHarvestDate(dataProvider.Id, changedTo); context.GetSpeciesObservationDatabase().LogHarvestRead(context, dataProvider, new DateTime(1900, 01, 01), new DateTime(1900, 01, 01), stopwatch.ElapsedMilliseconds, sumNoOfCreated, sumNoOfCreatedErrors, sumNoOfUpdated, sumNoOfUpdatedErrors, sumNoOfDeleted, sumNoOfDeletedErrors); stopwatch.Stop(); }
/// <summary> The add new species observations. </summary> /// <param name="webSpeciesObservationChange"> The web species observation change. </param> /// <param name="speciesObservationChange"> The species observation change. </param> /// <param name="kulProcess"> The kul Process. </param> /// <param name="mappings"> The mappings. </param> /// <param name="context"> The context. </param> /// <param name="connectorServer"> The connector Server. </param> /// <param name="dataProvider"> The data Provider. </param> /// <param name="sumNoOfCreated"> The sum No Of Created. </param> /// <param name="sumNoOfCreatedErrors"> The sum No Of Created Errors. </param> private void AddNewSpeciesObservations( WebSpeciesObservationChange webSpeciesObservationChange, SpeciesObservationChange speciesObservationChange, KulProcess kulProcess, List <HarvestMapping> mappings, WebServiceContext context, IConnectorServer connectorServer, WebSpeciesObservationDataProvider dataProvider, out int sumNoOfCreated, out int sumNoOfCreatedErrors) { int observationCount = 0; int noOfCreated, noOfCreatedErrors; sumNoOfCreated = 0; sumNoOfCreatedErrors = 0; foreach (Proxy.KulService.WebSpeciesObservation kulSpeciesObservation in webSpeciesObservationChange.CreatedSpeciesObservations) { WebData webData = new WebData { DataFields = new List <WebDataField>() }; foreach (WebSpeciesObservationField webSpeciesObservationField in kulSpeciesObservation.Fields) { WebDataField webDataField = new WebDataField { Information = webSpeciesObservationField.Information, Name = webSpeciesObservationField.Property.Id.ToString(), Type = (WebDataType)webSpeciesObservationField.Type, Unit = webSpeciesObservationField.Unit, Value = webSpeciesObservationField.Value.CheckInjection() }; webData.DataFields.Add(webDataField); } // map webdata HarvestSpeciesObservation harvestSpeciesObservation = kulProcess.ProcessObservation(webData, mappings, context); speciesObservationChange.CreatedSpeciesObservations.Add(harvestSpeciesObservation); if (decimal.Remainder(++observationCount, 1000) != 0) { continue; } // write every 10000 observation to database to avoid memory problems connectorServer.UpdateSpeciesObservations(context, speciesObservationChange.CreatedSpeciesObservations, dataProvider, out noOfCreated, out noOfCreatedErrors); sumNoOfCreated += noOfCreated; sumNoOfCreatedErrors += noOfCreatedErrors; speciesObservationChange.CreatedSpeciesObservations.Clear(); } connectorServer.UpdateSpeciesObservations(context, speciesObservationChange.CreatedSpeciesObservations, dataProvider, out noOfCreated, out noOfCreatedErrors); sumNoOfCreated += noOfCreated; sumNoOfCreatedErrors += noOfCreatedErrors; speciesObservationChange.CreatedSpeciesObservations.Clear(); }