Example #1
0
        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;
                    }
                }
            }
        }
Example #2
0
        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.");
        }
Example #3
0
        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);
            }
        }