From 8106e72981dd5a62f165a016ae145524b8fe2c0f Mon Sep 17 00:00:00 2001 From: Akhil Narang Date: Thu, 13 Feb 2025 11:48:17 +0530 Subject: [PATCH] refactor: use a database file directly, instead of an SQL file Signed-off-by: Akhil Narang --- frappe/database/db_manager.py | 9 +- frappe/database/sqlite/framework_sqlite.db | Bin 0 -> 102400 bytes frappe/database/sqlite/framework_sqlite.sql | 320 -------------------- frappe/database/sqlite/setup_db.py | 26 +- frappe/utils/backups.py | 18 +- 5 files changed, 36 insertions(+), 337 deletions(-) create mode 100644 frappe/database/sqlite/framework_sqlite.db delete mode 100644 frappe/database/sqlite/framework_sqlite.sql diff --git a/frappe/database/db_manager.py b/frappe/database/db_manager.py index 1d9e3f93b8..450bbd91d1 100644 --- a/frappe/database/db_manager.py +++ b/frappe/database/db_manager.py @@ -78,11 +78,12 @@ class DbManager: else: command.extend(["cat", source, "|"]) - # Newer versions of MariaDB add in a line that'll break on older versions, so remove it - command.extend(["sed", r"'/\/\*M\{0,1\}!999999\\- enable the sandbox mode \*\//d'", "|"]) + if frappe.conf.db_type == "mariadb": + # Newer versions of MariaDB add in a line that'll break on older versions, so remove it + command.extend(["sed", r"'/\/\*M\{0,1\}!999999\\- enable the sandbox mode \*\//d'", "|"]) - # Remove view security definers - command.extend(["sed", r"'/\/\*![0-9]* DEFINER=[^ ]* SQL SECURITY DEFINER \*\//d'", "|"]) + # Remove view security definers + command.extend(["sed", r"'/\/\*![0-9]* DEFINER=[^ ]* SQL SECURITY DEFINER \*\//d'", "|"]) # Generate the restore command bin, args, bin_name = get_command( diff --git a/frappe/database/sqlite/framework_sqlite.db b/frappe/database/sqlite/framework_sqlite.db new file mode 100644 index 0000000000000000000000000000000000000000..5bd714c68d8d663eac338e3aaf32b48037067b11 GIT binary patch literal 102400 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 literal 0 HcmV?d00001 diff --git a/frappe/database/sqlite/framework_sqlite.sql b/frappe/database/sqlite/framework_sqlite.sql deleted file mode 100644 index 4130c26e3f..0000000000 --- a/frappe/database/sqlite/framework_sqlite.sql +++ /dev/null @@ -1,320 +0,0 @@ --- Core Elements to install WNFramework --- To be called from install.py - --- --- Table structure for table `tabDocField` --- - -DROP TABLE IF EXISTS `tabDocField`; -CREATE TABLE `tabDocField` ( - `name` TEXT NOT NULL, - `creation` TEXT DEFAULT NULL, - `modified` TEXT DEFAULT NULL, - `modified_by` TEXT DEFAULT NULL, - `owner` TEXT DEFAULT NULL, - `docstatus` INTEGER NOT NULL DEFAULT 0, - `parent` TEXT DEFAULT NULL, - `parentfield` TEXT DEFAULT NULL, - `parenttype` TEXT DEFAULT NULL, - `idx` INTEGER NOT NULL DEFAULT 0, - `fieldname` TEXT DEFAULT NULL, - `label` TEXT DEFAULT NULL, - `oldfieldname` TEXT DEFAULT NULL, - `fieldtype` TEXT DEFAULT NULL, - `oldfieldtype` TEXT DEFAULT NULL, - `options` TEXT, - `search_index` INTEGER NOT NULL DEFAULT 0, - `show_dashboard` INTEGER NOT NULL DEFAULT 0, - `hidden` INTEGER NOT NULL DEFAULT 0, - `set_only_once` INTEGER NOT NULL DEFAULT 0, - `allow_in_quick_entry` INTEGER NOT NULL DEFAULT 0, - `print_hide` INTEGER NOT NULL DEFAULT 0, - `report_hide` INTEGER NOT NULL DEFAULT 0, - `reqd` INTEGER NOT NULL DEFAULT 0, - `bold` INTEGER NOT NULL DEFAULT 0, - `in_global_search` INTEGER NOT NULL DEFAULT 0, - `collapsible` INTEGER NOT NULL DEFAULT 0, - `unique` INTEGER NOT NULL DEFAULT 0, - `no_copy` INTEGER NOT NULL DEFAULT 0, - `allow_on_submit` INTEGER NOT NULL DEFAULT 0, - `show_preview_popup` INTEGER NOT NULL DEFAULT 0, - `trigger` TEXT DEFAULT NULL, - `collapsible_depends_on` TEXT, - `mandatory_depends_on` TEXT, - `read_only_depends_on` TEXT, - `depends_on` TEXT, - `permlevel` INTEGER NOT NULL DEFAULT 0, - `ignore_user_permissions` INTEGER NOT NULL DEFAULT 0, - `width` TEXT DEFAULT NULL, - `print_width` TEXT DEFAULT NULL, - `columns` INTEGER NOT NULL DEFAULT 0, - `default` TEXT, - `description` TEXT, - `in_list_view` INTEGER NOT NULL DEFAULT 0, - `fetch_if_empty` INTEGER NOT NULL DEFAULT 0, - `in_filter` INTEGER NOT NULL DEFAULT 0, - `remember_last_selected_value` INTEGER NOT NULL DEFAULT 0, - `ignore_xss_filter` INTEGER NOT NULL DEFAULT 0, - `print_hide_if_no_value` INTEGER NOT NULL DEFAULT 0, - `allow_bulk_edit` INTEGER NOT NULL DEFAULT 0, - `in_standard_filter` INTEGER NOT NULL DEFAULT 0, - `in_preview` INTEGER NOT NULL DEFAULT 0, - `read_only` INTEGER NOT NULL DEFAULT 0, - `precision` TEXT DEFAULT NULL, - `max_height` TEXT DEFAULT NULL, - `length` INTEGER NOT NULL DEFAULT 0, - `translatable` INTEGER NOT NULL DEFAULT 0, - `hide_border` INTEGER NOT NULL DEFAULT 0, - `hide_days` INTEGER NOT NULL DEFAULT 0, - `hide_seconds` INTEGER NOT NULL DEFAULT 0, - PRIMARY KEY (`name`) -); - --- --- Table structure for table `tabDocPerm` --- - -DROP TABLE IF EXISTS `tabDocPerm`; -CREATE TABLE `tabDocPerm` ( - `name` TEXT NOT NULL, - `creation` TEXT DEFAULT NULL, - `modified` TEXT DEFAULT NULL, - `modified_by` TEXT DEFAULT NULL, - `owner` TEXT DEFAULT NULL, - `docstatus` INTEGER NOT NULL DEFAULT 0, - `parent` TEXT DEFAULT NULL, - `parentfield` TEXT DEFAULT NULL, - `parenttype` TEXT DEFAULT NULL, - `idx` INTEGER NOT NULL DEFAULT 0, - `permlevel` INTEGER DEFAULT 0, - `role` TEXT DEFAULT NULL, - `match` TEXT DEFAULT NULL, - `read` INTEGER NOT NULL DEFAULT 1, - `write` INTEGER NOT NULL DEFAULT 1, - `create` INTEGER NOT NULL DEFAULT 1, - `submit` INTEGER NOT NULL DEFAULT 0, - `cancel` INTEGER NOT NULL DEFAULT 0, - `delete` INTEGER NOT NULL DEFAULT 1, - `amend` INTEGER NOT NULL DEFAULT 0, - `report` INTEGER NOT NULL DEFAULT 1, - `export` INTEGER NOT NULL DEFAULT 1, - `import` INTEGER NOT NULL DEFAULT 0, - `share` INTEGER NOT NULL DEFAULT 1, - `print` INTEGER NOT NULL DEFAULT 1, - `email` INTEGER NOT NULL DEFAULT 1, - PRIMARY KEY (`name`) -); - --- --- Table structure for table `tabDocType Action` --- - -DROP TABLE IF EXISTS `tabDocType Action`; -CREATE TABLE `tabDocType Action` ( - `name` TEXT NOT NULL, - `creation` TEXT DEFAULT NULL, - `modified` TEXT DEFAULT NULL, - `modified_by` TEXT DEFAULT NULL, - `owner` TEXT DEFAULT NULL, - `docstatus` INTEGER NOT NULL DEFAULT 0, - `parent` TEXT DEFAULT NULL, - `parentfield` TEXT DEFAULT NULL, - `parenttype` TEXT DEFAULT NULL, - `idx` INTEGER NOT NULL DEFAULT 0, - `label` TEXT DEFAULT NULL, - `group` TEXT DEFAULT NULL, - `action_type` TEXT DEFAULT NULL, - `action` TEXT DEFAULT NULL, - PRIMARY KEY (`name`) -); - --- --- Table structure for table `tabDocType Link` --- - -DROP TABLE IF EXISTS `tabDocType Link`; -CREATE TABLE `tabDocType Link` ( - `name` TEXT NOT NULL, - `creation` TEXT DEFAULT NULL, - `modified` TEXT DEFAULT NULL, - `modified_by` TEXT DEFAULT NULL, - `owner` TEXT DEFAULT NULL, - `docstatus` INTEGER NOT NULL DEFAULT 0, - `parent` TEXT DEFAULT NULL, - `parentfield` TEXT DEFAULT NULL, - `parenttype` TEXT DEFAULT NULL, - `idx` INTEGER NOT NULL DEFAULT 0, - `group` TEXT DEFAULT NULL, - `link_doctype` TEXT DEFAULT NULL, - `link_fieldname` TEXT DEFAULT NULL, - PRIMARY KEY (`name`) -); - --- --- Table structure for table `tabDocType` --- - -DROP TABLE IF EXISTS `tabDocType`; -CREATE TABLE `tabDocType` ( - `name` TEXT NOT NULL, - `creation` TEXT DEFAULT NULL, - `modified` TEXT DEFAULT NULL, - `modified_by` TEXT DEFAULT NULL, - `owner` TEXT DEFAULT NULL, - `docstatus` INTEGER NOT NULL DEFAULT 0, - `idx` INTEGER NOT NULL DEFAULT 0, - `search_fields` TEXT DEFAULT NULL, - `issingle` INTEGER NOT NULL DEFAULT 0, - `is_virtual` INTEGER NOT NULL DEFAULT 0, - `is_tree` INTEGER NOT NULL DEFAULT 0, - `istable` INTEGER NOT NULL DEFAULT 0, - `editable_grid` INTEGER NOT NULL DEFAULT 1, - `track_changes` INTEGER NOT NULL DEFAULT 0, - `module` TEXT DEFAULT NULL, - `restrict_to_domain` TEXT DEFAULT NULL, - `app` TEXT DEFAULT NULL, - `autoname` TEXT DEFAULT NULL, - `naming_rule` TEXT DEFAULT NULL, - `title_field` TEXT DEFAULT NULL, - `image_field` TEXT DEFAULT NULL, - `timeline_field` TEXT DEFAULT NULL, - `sort_field` TEXT DEFAULT NULL, - `sort_order` TEXT DEFAULT NULL, - `description` TEXT, - `colour` TEXT DEFAULT NULL, - `read_only` INTEGER NOT NULL DEFAULT 0, - `in_create` INTEGER NOT NULL DEFAULT 0, - `menu_index` INTEGER DEFAULT NULL, - `parent_node` TEXT DEFAULT NULL, - `smallicon` TEXT DEFAULT NULL, - `allow_copy` INTEGER NOT NULL DEFAULT 0, - `allow_rename` INTEGER NOT NULL DEFAULT 0, - `allow_import` INTEGER NOT NULL DEFAULT 0, - `hide_toolbar` INTEGER NOT NULL DEFAULT 0, - `track_seen` INTEGER NOT NULL DEFAULT 0, - `max_attachments` INTEGER NOT NULL DEFAULT 0, - `print_outline` TEXT DEFAULT NULL, - `document_type` TEXT DEFAULT NULL, - `icon` TEXT DEFAULT NULL, - `color` TEXT DEFAULT NULL, - `tag_fields` TEXT DEFAULT NULL, - `subject` TEXT DEFAULT NULL, - `_last_update` TEXT DEFAULT NULL, - `engine` TEXT DEFAULT 'InnoDB', - `default_print_format` TEXT DEFAULT NULL, - `is_submittable` INTEGER NOT NULL DEFAULT 0, - `show_name_in_global_search` INTEGER NOT NULL DEFAULT 0, - `_user_tags` TEXT DEFAULT NULL, - `custom` INTEGER NOT NULL DEFAULT 0, - `beta` INTEGER NOT NULL DEFAULT 0, - `has_web_view` INTEGER NOT NULL DEFAULT 0, - `allow_guest_to_view` INTEGER NOT NULL DEFAULT 0, - `route` TEXT DEFAULT NULL, - `is_published_field` TEXT DEFAULT NULL, - `website_search_field` TEXT DEFAULT NULL, - `email_append_to` INTEGER NOT NULL DEFAULT 0, - `subject_field` TEXT DEFAULT NULL, - `sender_field` TEXT DEFAULT NULL, - `show_title_field_in_link` INTEGER NOT NULL DEFAULT 0, - `migration_hash` TEXT DEFAULT NULL, - `translated_doctype` INTEGER NOT NULL DEFAULT 0, - PRIMARY KEY (`name`) -); - --- --- Table structure for table `tabSeries` --- - -DROP TABLE IF EXISTS `tabSeries`; -CREATE TABLE `tabSeries` ( - `name` TEXT NOT NULL, - `current` INTEGER NOT NULL DEFAULT 0, - PRIMARY KEY(`name`) -); - --- --- Table structure for table `tabSessions` --- - -DROP TABLE IF EXISTS `tabSessions`; -CREATE TABLE `tabSessions` ( - `user` TEXT DEFAULT NULL, - `sid` TEXT DEFAULT NULL, - `sessiondata` TEXT, - `ipaddress` TEXT DEFAULT NULL, - `lastupdate` TEXT DEFAULT NULL, - `status` TEXT DEFAULT NULL, - PRIMARY KEY (`sid`) -); - --- --- Table structure for table `tabSingles` --- - -DROP TABLE IF EXISTS `tabSingles`; -CREATE TABLE `tabSingles` ( - `doctype` TEXT DEFAULT NULL, - `field` TEXT DEFAULT NULL, - `value` TEXT, - PRIMARY KEY (`doctype`, `field`) -); - --- --- Table structure for table `__Auth` --- - -DROP TABLE IF EXISTS `__Auth`; -CREATE TABLE `__Auth` ( - `doctype` TEXT NOT NULL, - `name` TEXT NOT NULL, - `fieldname` TEXT NOT NULL, - `password` TEXT NOT NULL, - `encrypted` INTEGER NOT NULL DEFAULT 0, - PRIMARY KEY (`doctype`, `name`, `fieldname`) -); - --- --- Table structure for table `tabFile` --- - -DROP TABLE IF EXISTS `tabFile`; -CREATE TABLE `tabFile` ( - `name` TEXT NOT NULL, - `creation` TEXT DEFAULT NULL, - `modified` TEXT DEFAULT NULL, - `modified_by` TEXT DEFAULT NULL, - `owner` TEXT DEFAULT NULL, - `docstatus` INTEGER NOT NULL DEFAULT 0, - `parent` TEXT DEFAULT NULL, - `parentfield` TEXT DEFAULT NULL, - `parenttype` TEXT DEFAULT NULL, - `idx` INTEGER NOT NULL DEFAULT 0, - `file_name` TEXT DEFAULT NULL, - `file_url` TEXT DEFAULT NULL, - `module` TEXT DEFAULT NULL, - `attached_to_name` TEXT DEFAULT NULL, - `file_size` INTEGER NOT NULL DEFAULT 0, - `attached_to_doctype` TEXT DEFAULT NULL, - PRIMARY KEY (`name`) -); - --- --- Table structure for table `tabDefaultValue` --- - -DROP TABLE IF EXISTS `tabDefaultValue`; -CREATE TABLE `tabDefaultValue` ( - `name` TEXT NOT NULL, - `creation` TEXT DEFAULT NULL, - `modified` TEXT DEFAULT NULL, - `modified_by` TEXT DEFAULT NULL, - `owner` TEXT DEFAULT NULL, - `docstatus` INTEGER NOT NULL DEFAULT 0, - `parent` TEXT DEFAULT NULL, - `parentfield` TEXT DEFAULT NULL, - `parenttype` TEXT DEFAULT NULL, - `idx` INTEGER NOT NULL DEFAULT 0, - `defvalue` TEXT, - `defkey` TEXT DEFAULT NULL, - PRIMARY KEY (`name`) -); diff --git a/frappe/database/sqlite/setup_db.py b/frappe/database/sqlite/setup_db.py index 6cd66d46cb..c626f10fa0 100644 --- a/frappe/database/sqlite/setup_db.py +++ b/frappe/database/sqlite/setup_db.py @@ -1,4 +1,6 @@ import os +import shutil +import sys from pathlib import Path import click @@ -18,10 +20,10 @@ def setup_database(force, verbose): root_conn.close() -def bootstrap_database(verbose, source_sql=None): +def bootstrap_database(verbose, source_db=None): import sys - import_db_from_sql(source_sql, verbose) + copy_db(source_db, verbose) frappe.connect() if "tabDefaultValue" not in frappe.db.get_tables(cached=False): @@ -36,15 +38,25 @@ def bootstrap_database(verbose, source_sql=None): sys.exit(1) -def import_db_from_sql(source_sql=None, verbose=False): +def copy_db(db_file=None, verbose=False): if verbose: print("Starting database import...") db_name = frappe.conf.db_name - if not source_sql: - source_sql = os.path.join(os.path.dirname(__file__), "framework_sqlite.sql") - DbManager().restore_database(verbose, db_name, source_sql, frappe.conf.db_user, frappe.conf.db_password) + if not db_file: + db_file = os.path.join(os.path.dirname(__file__), "framework_sqlite.db") + db_path = Path(db_file) + if not db_path.exists(): + click.secho(f"Database {db_path.as_posix()} does not exist", fg="red") + sys.exit(1) + + destination_db_folder = Path(frappe.get_site_path()) / "db" + if not destination_db_folder.exists(): + destination_db_folder.mkdir() + destination_db_path = destination_db_folder / f"{db_name}.db" + + shutil.copy(db_path, destination_db_path) if verbose: - print("Imported from database {}".format(source_sql)) + print("Imported from database {}".format(db_path)) def drop_database(db_name: str): diff --git a/frappe/utils/backups.py b/frappe/utils/backups.py index ef06ab9e3d..b8d4b2b2d9 100644 --- a/frappe/utils/backups.py +++ b/frappe/utils/backups.py @@ -376,6 +376,18 @@ class BackupGenerator: n.write(c.read()) def take_dump(self): + if self.db_type == "sqlite": + from pathlib import Path + + import frappe + + db_path = Path(frappe.get_site_path()) / "db" / f"{self.db_name}.db" + command = f"gzip -k {db_path} -c > {self.backup_path_db}" + + frappe.utils.execute_in_shell(command, low_priority=True, check_exit_code=True) + + return + import shlex import frappe.utils @@ -431,12 +443,6 @@ class BackupGenerator: elif self.backup_excludes: extra.extend([f"--ignore-table={self.db_name}.{table}" for table in self.backup_excludes]) - elif self.db_type == "sqlite": - if self.backup_includes: - extra.extend([f'"{table}"' for table in self.backup_includes]) - elif self.backup_excludes: - click.secho("Excluding tables is not supported for SQLite", fg="yellow") - elif self.db_type == "postgres": if self.backup_includes: extra.extend([f'--table=public."{table}"' for table in self.backup_includes])