private void ProcessQueue() { if (_currentApp == null) { return; } using (var db = new FFDatabase()) { var scanStartTime = DateTime.Now; while (!_kill.WaitOne(k_threadWaitActive)) { ScanInfo?scanInfo = null; lock (_scanLock) { if (_scanQueue != null && _scanQueue.Count > 0) { scanInfo = _scanQueue.Dequeue(); } } if (scanInfo.HasValue) { ProcessFile(db, CurrentApp, scanInfo.Value); } else { ProbeToolsPackage.Instance.SetStatusText("DkTools background purging..."); using (var txn = db.BeginTransaction()) { _currentApp.PurgeData(db); txn.Commit(); } var scanElapsed = DateTime.Now.Subtract(scanStartTime); ProbeToolsPackage.Instance.SetStatusText(string.Format("DkTools background scanning complete. (elapsed: {0})", scanElapsed)); lock (_scanLock) { _scanQueue = null; } return; } } } }
private void EnqueueFilesDependentOnInclude(string includeFileName) { if (_currentApp == null) { return; } var options = ProbeToolsPackage.Instance.EditorOptions; if (options.DisableBackgroundScan) { return; } using (var db = new FFDatabase()) { var fileIds = new Dictionary <long, string>(); using (var cmd = db.CreateCommand(@" select file_id, file_name from include_depends inner join file_ on file_.rowid = include_depends.file_id where include_depends.app_id = @app_id and include_depends.include_file_name = @include_file_name " )) { cmd.Parameters.AddWithValue("@app_id", _currentApp.Id); cmd.Parameters.AddWithValue("@include_file_name", includeFileName); using (var rdr = cmd.ExecuteReader()) { while (rdr.Read()) { var fileName = rdr.GetString(1); var context = FileContextUtil.GetFileContextFromFileName(fileName); if (context != FileContext.Include && context != FileContext.Dictionary) { fileIds[rdr.GetInt64(0)] = fileName; } } } } if (fileIds.Any()) { Log.Debug("Resetting modified date on {0} file(s).", fileIds.Count); using (var txn = db.BeginTransaction()) { using (var cmd = db.CreateCommand("update file_ set modified = '1900-01-01' where rowid = @id")) { foreach (var item in fileIds) { cmd.Parameters.Clear(); cmd.Parameters.AddWithValue("@id", item.Key); cmd.ExecuteNonQuery(); _currentApp.TrySetFileDate(item.Value, DateTime.MinValue); } } txn.Commit(); } } } RestartScanning("Include file changed; scanning dependent files."); }
private void ProcessFile(FFDatabase db, FFApp app, ScanInfo scan) { try { if (!File.Exists(scan.fileName)) { return; } if (FileContextUtil.IsLocalizedFile(scan.fileName)) { return; } var fileContext = CodeModel.FileContextUtil.GetFileContextFromFileName(scan.fileName); if (fileContext == FileContext.Include) { return; } DateTime modified; if (!app.TryGetFileDate(scan.fileName, out modified)) { modified = DateTime.MinValue; } var fileModified = File.GetLastWriteTime(scan.fileName); if (!scan.forceScan) { if (modified != DateTime.MinValue && fileModified.Subtract(modified).TotalSeconds < 1.0) { return; } } var ffFile = app.GetFileForScan(db, scan.fileName); Log.Debug("Processing file: {0} (modified={1}, last modified={2})", scan.fileName, fileModified, modified); if (scan.mode == FFScanMode.Exports) { ProbeToolsPackage.Instance.SetStatusText(string.Format("DkTools background scanning file: {0} (exports only)", scan.fileName)); } else { ProbeToolsPackage.Instance.SetStatusText(string.Format("DkTools background scanning file: {0}", scan.fileName)); } var fileTitle = Path.GetFileNameWithoutExtension(scan.fileName); var defProvider = new CodeModel.DefinitionProvider(_appSettings, scan.fileName); var fileContent = File.ReadAllText(scan.fileName); var fileStore = new CodeModel.FileStore(); var merger = new FileMerger(); merger.MergeFile(_appSettings, scan.fileName, null, false, true); var includeDependencies = (from f in merger.FileNames select new Preprocessor.IncludeDependency(f, false, true, merger.GetFileContent(f))).ToArray(); var model = fileStore.CreatePreprocessedModel(_appSettings, merger.MergedContent, scan.fileName, false, string.Concat("Function file processing: ", scan.fileName), includeDependencies); var className = fileContext.IsClass() ? Path.GetFileNameWithoutExtension(scan.fileName) : null; var classList = new List <FFClass>(); var funcList = new List <FFFunction>(); using (var txn = db.BeginTransaction()) { ffFile.UpdateFromModel(model, db, fileStore, fileModified, scan.mode); txn.Commit(); } if (ffFile.Visible) { app.OnVisibleFileChanged(ffFile); } else { app.OnInvisibleFileChanged(ffFile); } #if DEBUG FFDatabase.DumpMemoryStats(); #endif } catch (Exception ex) { Log.Error(ex, "Exception when background processing function name: {0} (mode: {1})", scan.fileName, scan.mode); } }