Beispiel #1
0
        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);
        }
Beispiel #2
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);
            }
        }
Beispiel #3
0
        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();
                    }
                }
            }
        }