private static void ReadLinkedProjects(ref RevitSheetData sheetData)
        {
            try
            {
                sheetData.LinkedProjects.Clear();
                using (SQLiteCommand cmd = new SQLiteCommand(connection))
                {
                    cmd.CommandText = "SELECT * FROM LinkedProjects";
                    using (SQLiteDataReader reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            LinkedProject project = new LinkedProject();
                            project.Id            = new Guid(reader.GetString(reader.GetOrdinal("LinkedProject_Id")));
                            project.ProjectNumber = reader.GetString(reader.GetOrdinal("LinkedProject_Number"));
                            project.ProjectName   = reader.GetString(reader.GetOrdinal("LinkedProject_Name"));
                            project.FilePath      = reader.GetString(reader.GetOrdinal("LinkedProject_FilePath"));
                            project.LinkedDate    = reader.GetDateTime(reader.GetOrdinal("LinkedProject_LinkedDate"));
                            project.LinkedBy      = reader.GetString(reader.GetOrdinal("LinkedProject_LinkedBy"));

                            sheetData.LinkedProjects.Add(project);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                string message = ex.Message;
            }
        }
        public List <LinkedProject> GetLinkedProjects()
        {
            List <LinkedProject> projects = new List <LinkedProject>();

            try
            {
                if (null != connection && null != command)
                {
                    using (SQLiteCommand cmd = new SQLiteCommand(connection))
                    {
                        cmd.CommandText = "SELECT * FROM LinkedProjects";
                        using (SQLiteDataReader reader = cmd.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                LinkedProject project = new LinkedProject();
                                project.Id            = new Guid(reader.GetString(reader.GetOrdinal("LinkedProject_Id")));
                                project.ProjectNumber = reader.GetString(reader.GetOrdinal("LinkedProject_Number"));
                                project.ProjectName   = reader.GetString(reader.GetOrdinal("LinkedProject_Name"));
                                project.FilePath      = reader.GetString(reader.GetOrdinal("LinkedProject_FilePath"));
                                project.LinkedDate    = reader.GetDateTime(reader.GetOrdinal("LinkedProject_LinkedDate"));
                                project.LinkedBy      = reader.GetString(reader.GetOrdinal("LinkedProject_LinkedBy"));

                                projects.Add(project);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                string message = ex.Message;
            }
            return(projects);
        }
        public static bool ChangeLinkedProject(LinkedProject item, CommandType cmdType)
        {
            bool result = false;

            try
            {
                if (null != connection && null != command)
                {
                    switch (cmdType)
                    {
                    case CommandType.INSERT:
                        command.CommandText = @"INSERT INTO LinkedProjects (LinkedProject_Id, LinkedProject_Number, LinkedProject_Name, LinkedProject_FilePath, LinkedProject_LinkedDate, LinkedProject_LinkedBy)" +
                                              "VALUES ('" + item.Id.ToString() + "', '" + item.ProjectNumber + "', '" + item.ProjectName + "', '" + item.FilePath + "', @date, '" + item.LinkedBy + "')";
                        command.Parameters["@date"].Value = item.LinkedDate;
                        if (command.ExecuteNonQuery() > 0)
                        {
                            result = true;
                        }
                        break;

                    case CommandType.UPDATE:
                        command.CommandText = @"UPDATE LinkedProjects SET LinkedProject_Number = '" + item.ProjectNumber + "', LinkedProject_Name = '" + item.ProjectName + "', " +
                                              "LinkedProject_FilePath ='" + item.FilePath + "', LinkedProject_LinkedDate = @date, LinkedProject_LinkedBy = '" + item.LinkedBy + "'" +
                                              " WHERE LinkedProject_Id = '" + item.Id.ToString() + "'";
                        command.Parameters["@date"].Value = item.LinkedDate;
                        if (command.ExecuteNonQuery() > 0)
                        {
                            result = true;
                        }
                        break;

                    case CommandType.DELETE:
                        command.CommandText = "DELETE FROM LinkedProjects WHERE LinkedProject_Id = '" + item.Id.ToString() + "'";
                        if (command.ExecuteNonQuery() > 0)
                        {
                            result = true;
                        }
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                string message = ex.Message;
            }
            return(result);
        }
        public void DocumentOpened(object sender, DocumentOpenedEventArgs args)
        {
            try
            {
                var doc = args.Document;
                if (null == doc)
                {
                    return;
                }

                var sheetConfig = new SheetManagerConfiguration(doc);
                if (doc.IsWorkshared)
                {
                    if (!ServerUtilities.GetByCentralPath(sheetConfig.CentralPath, "configurations/centralpath",
                                                          out Configuration configFound))
                    {
                        return;
                    }
                    if (null != configFound)
                    {
                        foreach (var updater in configFound.Updaters)
                        {
                            if (updater.UpdaterName != "Sheet Tracker")
                            {
                                continue;
                            }

                            sheetConfig.AutoUpdate   = updater.IsUpdaterOn;
                            sheetConfig.DatabaseFile = configFound.SheetDatabase;
                            break;
                        }
                    }
                }

                if (sheetConfig.AutoUpdate && !string.IsNullOrEmpty(sheetConfig.DatabaseFile))
                {
                    if (File.Exists(sheetConfig.DatabaseFile))
                    {
                        //update project info
                        var dbManager    = new UpdaterDataManager(sheetConfig.DatabaseFile);
                        var projects     = dbManager.GetLinkedProjects();
                        var projectFound = projects.Where(x => x.FilePath == sheetConfig.CentralPath).ToList();
                        if (projectFound.Any())
                        {
                            var linkedProject = projectFound.First();
                            sheetConfig.ModelId = linkedProject.Id;
                        }
                        else
                        {
                            var dbOpened = SheetDataWriter.OpenDatabase(sheetConfig.DatabaseFile);
                            if (dbOpened)
                            {
                                var linkedProject = new LinkedProject(sheetConfig.ModelId)
                                {
                                    FilePath      = sheetConfig.CentralPath,
                                    ProjectNumber = doc.ProjectInformation.Number,
                                    ProjectName   = doc.ProjectInformation.Name,
                                    LinkedBy      = Environment.UserName,
                                    LinkedDate    = DateTime.Now
                                };
                                SheetDataWriter.ChangeLinkedProject(linkedProject, CommandType.INSERT);
                                SheetDataWriter.CloseDatabse();
                            }
                        }

                        UpdaterUtil.RegisterUpdaters(doc, sheetConfig);
                    }
                }

                if (!configDictionary.ContainsKey(sheetConfig.CentralPath))
                {
                    configDictionary.Add(sheetConfig.CentralPath, sheetConfig);
                }
            }
            catch (Exception ex)
            {
                Log.AppendLog(LogMessageType.EXCEPTION, ex.Message);
            }
        }
        private static void ReadRevisions(ref RevitSheetData sheetData)
        {
            try
            {
                ObservableCollection <LinkedRevision> linkedRevisions = new ObservableCollection <LinkedRevision>();
                using (SQLiteCommand cmd = new SQLiteCommand(connection))
                {
                    cmd.CommandText = "SELECT * FROM LinkedRevisions";
                    using (SQLiteDataReader reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            LinkedRevision lRevision = new LinkedRevision();
                            lRevision.Id         = reader.GetGuid(reader.GetOrdinal("LinkedRevision_Id"));
                            lRevision.RevisionId = reader.GetGuid(reader.GetOrdinal("LinkedRevision_Revision_Id"));
                            lRevision.Sequence   = reader.GetInt32(reader.GetOrdinal("LinkedRevision_Sequence"));
                            lRevision.Number     = reader.GetString(reader.GetOrdinal("LinkedRevision_Number"));
                            lRevision.NumberType = (NumberType)Enum.Parse(typeof(NumberType), reader.GetString(reader.GetOrdinal("LinkedRevision_NumberType")));

                            Guid projectId    = reader.GetGuid(reader.GetOrdinal("LinkedRevision_Project_Id"));
                            var  projectFound = from project in sheetData.LinkedProjects where project.Id == projectId select project;
                            if (projectFound.Count() > 0)
                            {
                                LinkedProject project = projectFound.First();
                                lRevision.LinkProject = project;
                            }

                            lRevision.LinkedElementId = reader.GetString(reader.GetOrdinal("LinkedRevision_Element_Id"));
                            lRevision.IsSource        = reader.GetBoolean(reader.GetOrdinal("LinkedRevision_IsSource"));

                            linkedRevisions.Add(lRevision);
                        }
                    }
                }

                ObservableCollection <RevisionDocument> revisionDocuments = new ObservableCollection <RevisionDocument>();
                using (SQLiteCommand cmd = new SQLiteCommand(connection))
                {
                    cmd.CommandText = "SELECT * FROM RevisionDocuments";
                    using (SQLiteDataReader reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            RevisionDocument document = new RevisionDocument();
                            document.Id    = reader.GetGuid(reader.GetOrdinal("Document_Id"));
                            document.Title = reader.GetString(reader.GetOrdinal("Document_Title"));
                            document.Path  = reader.GetString(reader.GetOrdinal("Document_Path"));
                            if (reader["Document_Contents"] != System.DBNull.Value)
                            {
                                document.Contents = (byte[])reader["Document_Contents"];
                            }

                            revisionDocuments.Add(document);
                        }
                    }
                }

                sheetData.Revisions.Clear();
                using (SQLiteCommand cmd = new SQLiteCommand(connection))
                {
                    cmd.CommandText = "SELECT * FROM Revisions";
                    using (SQLiteDataReader reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            RevitRevision revision = new RevitRevision();
                            revision.Id          = reader.GetGuid(reader.GetOrdinal("Revision_Id"));
                            revision.Description = reader.GetString(reader.GetOrdinal("Revision_Description"));
                            revision.IssuedBy    = reader.GetString(reader.GetOrdinal("Revision_IssuedBy"));
                            revision.IssuedTo    = reader.GetString(reader.GetOrdinal("Revision_IssuedTo"));
                            revision.Date        = reader.GetString(reader.GetOrdinal("Revision_Date"));

                            Guid documentId    = reader.GetGuid(reader.GetOrdinal("Revision_Document_Id"));
                            var  documentFound = from document in revisionDocuments where document.Id == documentId select document;
                            if (documentFound.Count() > 0)
                            {
                                revision.Document = documentFound.First();
                            }

                            var linkedRevisionFound = from link in linkedRevisions where link.RevisionId == revision.Id select link;
                            if (linkedRevisionFound.Count() > 0)
                            {
                                revision.LinkedRevisions = new ObservableCollection <LinkedRevision>(linkedRevisionFound.ToList());
                            }
                            sheetData.Revisions.Add(revision);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                string message = ex.Message;
            }
        }