/// <summary> /// Constructor, initialize background worker evens and information about database /// </summary> public MainWindowsViewModel() { InstigateWorkCommand = new RelayCommand(o => _worker.RunWorkerAsync(), o => !_worker.IsBusy); _worker = new BackgroundWorker(); _worker.DoWork += DoFillDataBaseWork; _worker.RunWorkerCompleted += EndFillDataBaseWork; _worker.ProgressChanged += ProgressChanged; _dataBaseStartSize = DataBaseAccessFactory.GetDataBaseOperationClass().GetDataBaseCount(); DatabseCountValue = $"{_dataBaseStartSize}\t {Math.Round((double)_dataBaseStartSize / (MaximumDocumentDatabaseSize/100), 2)}%"; }
/// <summary> /// Main funcion, draws document number from specified range, save them to local database /// </summary> /// <param name="minimumNumber"></param> /// <param name="biggestNumber"></param> /// <param name="fillSize"></param> /// <returns>Time in milisec that task endure</returns> public long FillDataTableRecursive(int minimumNumber = MaximumDocumentNumber, int biggestNumber = MaximumDocumentNumber, int fillSize = PackToSaveSize) { try { if (fillSize >= MaximumDocumentDatabaseSize || fillSize <= 0) { throw new DocumentNumberGeneratorLogicException($"Range of documents can be from 0 to {MaximumDocumentNumber - MinimumDocumentNumber}"); } var watch = Stopwatch.StartNew(); var maxNumbers = fillSize; var numbers = new List <int>(maxNumbers); var r = new Random(); //count of document in database in processed range var allStuff = DataBaseAccessFactory.GetDataBaseOperationClass() .GetDataBaseCount(minimumNumber, biggestNumber); //size of unique numbers in first half of processed range var firstPartStuff = DataBaseAccessFactory.GetDataBaseOperationClass() .GetDataBaseCount(minimumNumber, ((biggestNumber + minimumNumber) / 2)); //size of unique numbers in second half of processed range var secondPartStuff = allStuff - firstPartStuff; if (fillSize > MaximumDocumentDatabaseSize - allStuff) { throw new DocumentNumberGeneratorLogicException($"Number of documents can be saved is {MaximumDocumentDatabaseSize - allStuff}"); } //if the range of possible use of the unique number is twice the amount //of numbers you want to generate this range can be divided into two, //choose a larger scope and cause recursive if ((((biggestNumber - minimumNumber) - allStuff) > 2 * fillSize)) { if (firstPartStuff > secondPartStuff) { return(FillDataTableRecursive((biggestNumber + minimumNumber) / 2, biggestNumber, fillSize)); } else { return(FillDataTableRecursive(minimumNumber, ((biggestNumber + minimumNumber) / 2), fillSize)); } } //Start MAIN STUFF... // while (maxNumbers > 0) { //We can change logic in this section, random pack of documents number trying to //save in database by "INSERT OR IGNORE" statment, then we check how many document number wasnt saved //and we proccess all logic in full range with number ot not inserted document number //to change this, need to uncomment and we guarante to there is no document number in database //and need to comment/remove code lines when we check how many document number didnt save var testValue = r.Next(minimumNumber, biggestNumber); if ((!numbers.Exists(number => number == testValue))) { // && !DataBaseAccessFactory.GetDataBaseOperationClass() // .GetDataDaseExistElement(testValue)) numbers.Add(testValue); } if ((numbers.Count >= PackToSaveSize) || (maxNumbers == numbers.Count)) { var countInsertedValues = DataBaseAccessFactory.GetDataBaseOperationClass().FillDataTable(numbers); _dataBaseStartSize += countInsertedValues; maxNumbers -= countInsertedValues; CurrentProgress += (decimal)(100 * (countInsertedValues)) / _elementsToFill; DatabseCountValue = $"{_dataBaseStartSize}\t{Math.Round((double)(_dataBaseStartSize) / ((MaximumDocumentDatabaseSize) / 100), 2)}%"; numbers.Clear(); if (maxNumbers > 0) { FillDataTableRecursive(MinimumDocumentNumber, MaximumDocumentNumber, maxNumbers); break; } } } watch.Stop(); return(watch.ElapsedMilliseconds); } catch (DocumentNumberGeneratorLogicException ex) { throw new Exception($@"Some Exception error: {ex.Message}."); } catch (Exception ex) { throw new Exception($@"Some Exception error: {ex.Message}."); } }