public void InsertOrUpdate(FFDatabase db, CodeModel.FileStore store, CodeModel.CodeModel model) { if (_id != 0) { using (var cmd = db.CreateCommand("update file_ set modified = @modified, visible = @visible where rowid = @id")) { cmd.Parameters.AddWithValue("@id", _id); cmd.Parameters.AddWithValue("@modified", _modified); cmd.Parameters.AddWithValue("@visible", _visible ? 1 : 0); cmd.ExecuteNonQuery(); } } else { using (var cmd = db.CreateCommand( "insert into file_ (app_id, file_name, modified, visible) values (@app_id, @file_name, @modified, @visible);" + " select last_insert_rowid();")) { cmd.Parameters.AddWithValue("@app_id", _app.Id); cmd.Parameters.AddWithValue("@file_name", _fileName); cmd.Parameters.AddWithValue("@modified", _modified); cmd.Parameters.AddWithValue("@visible", _visible ? 1 : 0); _id = Convert.ToInt64(cmd.ExecuteScalar()); } } UpdateIncludeDependencies(db, store, model); }
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); } }
private void UpdateIncludeDependencies(FFDatabase db, CodeModel.FileStore store, CodeModel.CodeModel model) { var modelIncludeList = model.PreprocessorModel.IncludeDependencies.ToArray(); var dbIncludes = new List <DbInclude>(); using (var cmd = db.CreateCommand("select rowid, include_file_name, include, localized_file from include_depends where file_id = @file_id")) { cmd.Parameters.AddWithValue("@file_id", _id); using (var rdr = cmd.ExecuteReader()) { while (rdr.Read()) { dbIncludes.Add(new DbInclude { id = rdr.GetInt64(0), fileName = rdr.GetString(1), include = rdr.GetTinyIntBoolean(2), localizedFile = rdr.GetTinyIntBoolean(3) }); } } } // Remove dependencies that are no longer there var recordsToRemove = (from d in dbIncludes where !modelIncludeList.Any(m => m.FileName.Equals(d.fileName, StringComparison.OrdinalIgnoreCase) && m.Include == d.include && m.LocalizedFile == d.localizedFile) select d).ToArray(); if (recordsToRemove.Length > 0) { using (var cmd = db.CreateCommand("delete from include_depends where rowid = @rowid")) { foreach (var id in recordsToRemove) { cmd.Parameters.Clear(); cmd.Parameters.AddWithValue("@rowid", id); cmd.ExecuteNonQuery(); } } } // Add new dependencies var recordsToAdd = (from m in modelIncludeList where !dbIncludes.Any(d => d.fileName.Equals(m.FileName, StringComparison.OrdinalIgnoreCase) && d.include == m.Include && d.localizedFile == m.LocalizedFile) select m).ToArray(); if (recordsToAdd.Length > 0) { using (var cmd = db.CreateCommand(@" insert into include_depends (app_id, file_id, include_file_name, include, localized_file) values (@app_id, @file_id, @include_file_name, @include, @localized_file) " )) { foreach (var incl in recordsToAdd) { cmd.Parameters.Clear(); cmd.Parameters.AddWithValue("@app_id", _app.Id); cmd.Parameters.AddWithValue("@file_id", _id); cmd.Parameters.AddWithValue("@include_file_name", incl.FileName); cmd.Parameters.AddWithValue("@include", incl.Include ? 1 : 0); cmd.Parameters.AddWithValue("@localized_file", incl.LocalizedFile ? 1 : 0); cmd.ExecuteNonQuery(); } } } }