internal static void QueueUploadOfMissingPDFs(Library library, List <PDFDocument> pdf_documents) { // Get a list of all the documents in the Intranet library List <string> existing_pdfs_full = IntranetLibraryTools.GetListOfDocumentsInLibrary(library.WebLibraryDetail.IntranetPath); HashSet <string> existing_pdfs = new HashSet <string>(); foreach (string existing_pdf in existing_pdfs_full) { existing_pdfs.Add(Path.GetFileName(existing_pdf)); } foreach (PDFDocument pdf_document in pdf_documents) { bool deleted = pdf_document.Deleted; // Try to upload all files that we have if (!deleted && pdf_document.DocumentExists) { string filename_full = PDFDocumentFileLocations.DocumentPath(library, pdf_document.Fingerprint, "pdf"); string filename_short = Path.GetFileName(filename_full); if (!existing_pdfs.Contains(filename_short)) { SyncQueues.Instance.QueuePut(pdf_document.Fingerprint, library); } } } }
internal static void DaemonPut(Library library, string fingerprint) { string filename_full = PDFDocumentFileLocations.DocumentPath(library, fingerprint, "pdf"); string filename_short = Path.GetFileName(filename_full); string pdf_path = IntranetLibraryTools.GetLibraryPDFPath(library.WebLibraryDetail.IntranetPath, filename_short); DirectoryTools.CreateDirectory(Path.GetDirectoryName(pdf_path)); Logging.Info("+Copying up {0}", fingerprint); File.Copy(filename_full, pdf_path); Logging.Info("-Copying up {0}", fingerprint); }
public LibraryDB(WebLibraryDetail web_library_detail) { base_path = web_library_detail.LIBRARY_BASE_PATH; library_path = LibraryDB.GetLibraryDBPath(base_path); string db_syncref_path = IntranetLibraryTools.GetLibraryMetadataPath(base_path); // Copy a library into place... // but only if this is not a Internet sync directory/DB! if (File.Exists(db_syncref_path)) { throw new Exception(String.Format("MUST NOT attempt to create a regular Qiqqa library in the Qiqqa Internet/Intranet Sync directory: '{0}'", base_path)); } if (!File.Exists(library_path)) { Logging.Warn($"Library db for '{web_library_detail.Id}' does not exist so copying the template to '{library_path}'"); string library_template_path = LibraryDB.GetLibraryDBTemplatePath(); File.Copy(library_template_path, library_path); } }
public LibraryDB(string base_path) { this.base_path = base_path; library_path = LibraryDB.GetLibraryDBPath(base_path); string db_syncref_path = IntranetLibraryTools.GetLibraryMetadataPath(base_path); // Copy a library into place... // but only if this is not a Internet sync directory/DB! if (File.Exists(db_syncref_path)) { throw new Exception(String.Format("MUST NOT attempt to create a regular Qiqqa library in the Qiqqa Internet/Intranet Sync directory: '{0}'", base_path)); } if (!File.Exists(library_path)) { Logging.Warn("Library db does not exist so copying the template to {0}", library_path); string library_template_path = LibraryDB.GetLibraryDBTemplatePath(); File.Copy(library_template_path, library_path); } }
internal static void DaemonGet(Library library, string fingerprint) { string filename_full = PDFDocumentFileLocations.DocumentPath(library, fingerprint, "pdf"); string filename_short = Path.GetFileName(filename_full); string pdf_path = IntranetLibraryTools.GetLibraryPDFPath(library.WebLibraryDetail.IntranetPath, filename_short); DirectoryTools.CreateDirectory(Path.GetDirectoryName(filename_full)); Logging.Info("+Copying down {0}", fingerprint); File.Copy(pdf_path, filename_full); Logging.Info("-Copying down {0}", fingerprint); // Write the audit if (true) { string audit_filename = IntranetLibraryTools.GetLibraryAuditFilename(library.WebLibraryDetail.IntranetPath); string audit_directory = Path.GetDirectoryName(audit_filename); if (Directory.Exists(audit_directory)) { string audit_data = String.Format( "{0}\t{1}\t{2}\t{3}\t{4}\t{5}\r\n" , DateTime.UtcNow.ToString("yyyyMMdd.hhmmss") , ConfigurationManager.Instance.ConfigurationRecord.Account_Username , ConfigurationManager.Instance.ConfigurationRecord.Account_Nickname , Environment.UserName , filename_short , pdf_path ); try { File.AppendAllText(audit_filename, audit_data); } catch (Exception ex) { Logging.Warn(ex, "Unable to write intranet sync audit data."); } } } }
public void UpdateKnownWebLibraryFromIntranet(string intranet_path, bool suppress_flush_to_disk = true, string extra_info_message_on_skip = "") { Logging.Info("+Updating known Intranet Library from {0}", intranet_path); IntranetLibraryDetail intranet_library_detail = IntranetLibraryDetail.Read(IntranetLibraryTools.GetLibraryDetailPath(intranet_path)); WebLibraryDetail new_web_library_detail = new WebLibraryDetail(); new_web_library_detail.IntranetPath = intranet_path; //new_web_library_detail.IsIntranetLibrary = true; new_web_library_detail.Id = intranet_library_detail.Id; new_web_library_detail.Title = intranet_library_detail.Title; new_web_library_detail.Description = intranet_library_detail.Description; new_web_library_detail.IsReadOnly = false; new_web_library_detail.Deleted = false; UpdateKnownWebLibrary(new_web_library_detail, suppress_flush_to_disk, extra_info_message_on_skip); Logging.Info("-Updating known Intranet Library from {0}", intranet_path); }
// ************************************************************************************************************* // *** MIGRATION TO OPEN SOURCE CODE *************************************************************************** // ************************************************************************************************************* private void AddLegacyWebLibrariesThatCanBeFoundOnDisk() { /** * Plan: * Iterate through all the folders in the Qiqqa data directory * If a folder contains a valid Library record and it is a WEB library, then add it to our list with the word '[LEGACY]' in front of it */ string base_directory_path = UpgradePaths.V037To038.SQLiteUpgrade.BaseDirectoryForQiqqa; Logging.Info("Going to scan for web libraries at: {0}", base_directory_path); if (Directory.Exists(base_directory_path)) { string[] library_directories = Directory.GetDirectories(base_directory_path); foreach (string library_directory in library_directories) { Logging.Info("Inspecting directory {0} - Phase 1 : Web & Known Libraries", library_directory); string databaselist_file = Path.GetFullPath(Path.Combine(library_directory, @"Qiqqa.known_web_libraries")); if (File.Exists(databaselist_file)) { LoadKnownWebLibraries(databaselist_file, true); } } foreach (string library_directory in library_directories) { Logging.Info("Inspecting directory {0} - Phase 2 : Intranet Libraries", library_directory); string databaselist_file = IntranetLibraryTools.GetLibraryDetailPath(library_directory); if (File.Exists(databaselist_file)) { IntranetLibraryDetail intranet_library_detail = IntranetLibraryDetail.Read(databaselist_file); UpdateKnownWebLibraryFromIntranet(library_directory, extra_info_message_on_skip: String.Format(" as obtained from file {0}", databaselist_file)); } } foreach (string library_directory in library_directories) { Logging.Info("Inspecting directory {0} - Phase 3 : Bundles", library_directory); // must be a qiqqa_bundle and/or qiqqa_bundle_manifest file set Logging.Warn("Auto bundle import at startup is not yet suppoerted."); } foreach (string library_directory in library_directories) { Logging.Info("Inspecting directory {0} - Phase 4 : Local and Legacy Libraries", library_directory); string database_file = Path.GetFullPath(Path.Combine(library_directory, @"Qiqqa.library")); if (File.Exists(database_file)) { var library_id = Path.GetFileName(library_directory); WebLibraryDetail new_web_library_detail = new WebLibraryDetail(); new_web_library_detail.Id = library_id; new_web_library_detail.Title = "Legacy Web Library - " + new_web_library_detail.Id; new_web_library_detail.IsReadOnly = false; // library: UNKNOWN type UpdateKnownWebLibrary(new_web_library_detail); } } } }
internal static void RunUpgrade() { Logging.Info("Upgrading from 037 to 038"); string base_directory_path = BaseDirectoryForQiqqa; if (Directory.Exists(base_directory_path)) { int info_library_count, info_item_count; string[] library_directories = Directory.GetDirectories(base_directory_path); info_library_count = 0; foreach (string library_directory in library_directories) { ++info_library_count; Logging.Info("Inspecting directory {0}", library_directory); string documents_directory = Path.GetFullPath(Path.Combine(library_directory, @"documents")); string database_file = LibraryDB.GetLibraryDBPath(library_directory); string database_syncref_file = IntranetLibraryTools.GetLibraryMetadataPath(library_directory); // make sure we skip S3DB internet DB sync directories and only 'go through the upgrade process // when this looks like a viable (local) Qiqqa library: if (!File.Exists(database_file) && Directory.Exists(documents_directory) && !File.Exists(database_syncref_file)) { Logging.Warn("We have to upgrade {0}", library_directory); SQLiteUpgrade_LibraryDB library_db = new SQLiteUpgrade_LibraryDB(library_directory); using (var connection = library_db.GetConnection()) { connection.Open(); using (var transaction = connection.BeginTransaction()) { // Get a list of ALL the files in the documents directory... string[] full_filenames = Directory.GetFiles(documents_directory, "*.*", SearchOption.AllDirectories); info_item_count = 0; foreach (string full_filename in full_filenames) { ++info_item_count; StatusManager.Instance.UpdateStatus("DBUpgrade", String.Format("Upgrading library {0}/{1}", info_library_count, library_directories.Length), info_item_count, full_filenames.Length); string fingerprint = Path.GetFileNameWithoutExtension(full_filename); string extension = Path.GetExtension(full_filename).Trim('.'); if (EXTENSIONS.Contains(extension)) { Logging.Info("Upgrading {0}--{1}", fingerprint, extension); byte[] data = File.ReadAllBytes(full_filename); library_db.PutBlob(connection, transaction, fingerprint, extension, data); } else { Logging.Info("NOT upgrading {0}--{1}", fingerprint, extension); } } transaction.Commit(); } } } } } StatusManager.Instance.UpdateStatus("DBUpgrade", "Finished migrating libraries."); }
// ************************************************************************************************************* // *** MIGRATION TO OPEN SOURCE CODE *************************************************************************** // ************************************************************************************************************* private void AddLegacyWebLibrariesThatCanBeFoundOnDisk() { WPFDoEvents.AssertThisCodeIs_NOT_RunningInTheUIThread(); try { ConfigurationManager.ThrowWhenActionIsNotEnabled(nameof(AddLegacyWebLibrariesThatCanBeFoundOnDisk)); /** * Plan: * - Iterate through all the folders in the Qiqqa data directory. * - If a folder contains a valid Library record and it is a WEB library, * then add it to our list with the word '[LEGACY]' in front of it. */ string base_directory_path = UpgradePaths.V037To038.SQLiteUpgrade.BaseDirectoryForQiqqa; Logging.Info("Going to scan for web libraries at: {0}", base_directory_path); if (Directory.Exists(base_directory_path)) { string[] library_directories = Directory.GetDirectories(base_directory_path); foreach (string library_directory in library_directories) { Logging.Info("Inspecting directory {0} - Phase 1 : Web & Known Libraries", library_directory); string databaselist_file = Path.GetFullPath(Path.Combine(library_directory, @"Qiqqa.known_web_libraries")); if (File.Exists(databaselist_file)) { LoadKnownWebLibraries(databaselist_file, only_load_those_libraries_which_are_actually_present: true); } } foreach (string library_directory in library_directories) { Logging.Info("Inspecting directory {0} - Phase 2 : Intranet Libraries", library_directory); string databaselist_file = IntranetLibraryTools.GetLibraryDetailPath(library_directory); if (File.Exists(databaselist_file)) { IntranetLibraryDetail intranet_library_detail = IntranetLibraryDetail.Read(databaselist_file); UpdateKnownWebLibraryFromIntranet(library_directory, extra_info_message_on_skip: String.Format(" as obtained from file {0}", databaselist_file)); } } foreach (string library_directory in library_directories) { Logging.Info("Inspecting directory {0} - Phase 3 : Bundles", library_directory); // must be a qiqqa_bundle and/or qiqqa_bundle_manifest file set Logging.Warn("Auto bundle import at startup is not yet supported."); } foreach (string library_directory in library_directories) { Logging.Info("Inspecting directory {0} - Phase 4 : Local and Legacy Libraries", library_directory); string database_file = LibraryDB.GetLibraryDBPath(library_directory); string db_syncref_path = IntranetLibraryTools.GetLibraryMetadataPath(library_directory); // add/update only if this is not a Internet sync directory/DB! if (File.Exists(db_syncref_path)) { Logging.Info("Skip the Qiqqa Internet/Intranet Sync directory and the sync DB contained therein: '{0}'", db_syncref_path); // https://github.com/jimmejardine/qiqqa-open-source/issues/145 :: delete lib file when it is very small and was illegally // constructed by a previous v82beta Qiqqa release: if (File.Exists(database_file)) { long s3length = File.GetSize(database_file); if (6 * 1024 > s3length) { Logging.Warn("DELETE the wrongfully created DB file '{0}' in the Qiqqa Internet/Intranet Sync directory and the sync DB contained therein: '{1}', which has precedence!", database_file, db_syncref_path); FileTools.DeleteToRecycleBin(database_file); } else { Logging.Error("Inspect the Library DB file '{0}' in the Qiqqa Internet/Intranet Sync directory and the sync DB contained therein: '{1}', which MAY have precedence. Delete one of these manually to clean up your system as Qiqqa heuristics cannot tell which is the prevalent metadata database here!", database_file, db_syncref_path); } } continue; } if (File.Exists(database_file)) { var library_id = Path.GetFileName(library_directory); WebLibraryDetail new_web_library_detail = new WebLibraryDetail(); new_web_library_detail.Id = library_id; new_web_library_detail.Title = "Legacy Web Library - " + new_web_library_detail.Id; new_web_library_detail.IsReadOnly = false; // library: UNKNOWN type UpdateKnownWebLibrary(new_web_library_detail); } } } } catch (Exception ex) { Logging.Error(ex, "There was a problem while scanning for (legacy) libraries."); } }
public void UpdateKnownWebLibraryFromIntranet(string intranet_path, bool suppress_flush_to_disk = true, string extra_info_message_on_skip = "") { WPFDoEvents.AssertThisCodeIs_NOT_RunningInTheUIThread(); Logging.Info("+Updating known Intranet Library from {0}", intranet_path); IntranetLibraryDetail intranet_library_detail = IntranetLibraryDetail.Read(IntranetLibraryTools.GetLibraryDetailPath(intranet_path)); WebLibraryDetail new_web_library_detail = new WebLibraryDetail(); new_web_library_detail.IntranetPath = intranet_path; new_web_library_detail.Id = intranet_library_detail.Id; new_web_library_detail.Title = intranet_library_detail.Title; new_web_library_detail.Description = intranet_library_detail.Description; new_web_library_detail.Deleted = false; UpdateKnownWebLibrary(new_web_library_detail, suppress_flush_to_disk, extra_info_message_on_skip); Logging.Info("-Updating known Intranet Library from {0}", intranet_path); }
public void UpdateKnownWebLibraryFromIntranet(string intranet_path) { Logging.Info("+Updating known Intranet Library from " + intranet_path); IntranetLibraryDetail intranet_library_detail = IntranetLibraryDetail.Read(IntranetLibraryTools.GetLibraryDetailPath(intranet_path)); WebLibraryDetail new_web_library_detail = new WebLibraryDetail(); new_web_library_detail.IntranetPath = intranet_path; new_web_library_detail.Id = intranet_library_detail.Id; new_web_library_detail.Title = intranet_library_detail.Title; new_web_library_detail.Description = intranet_library_detail.Description; new_web_library_detail.IsReadOnly = false; new_web_library_detail.Deleted = false; UpdateKnownWebLibrary(new_web_library_detail); Logging.Info("-Updating known Intranet Library from " + intranet_path); }