diff options
Diffstat (limited to 'logic')
| -rw-r--r-- | logic/database.gd | 72 | ||||
| -rw-r--r-- | logic/stage.gd | 41 |
2 files changed, 78 insertions, 35 deletions
diff --git a/logic/database.gd b/logic/database.gd index 2258f55..91328c5 100644 --- a/logic/database.gd +++ b/logic/database.gd @@ -1,7 +1,8 @@ extends TouchItemList class_name Database -const DATABASE_FILE_PATH: String = "user://database.csv" +const DATABASE_FILE_PATH: String = "user://database.json" +const DATABASE_FILE_VERSION: int = 1 var db: Array var selected_idx: int @@ -84,7 +85,7 @@ func delete_action_confirmed(): db.remove(selected_idx) self.remove_item(selected_idx) selected_idx = -1 - store_database() + save_database() clear_selection() @@ -125,7 +126,7 @@ func save_stage(entry: Dictionary): set_item_text(selected_idx, get_entry_view(db[selected_idx])) ensure_current_is_visible() - store_database() + save_database() staged_idx = -1 self.visible = true @@ -141,49 +142,84 @@ func discard_stage(): func load_database(file_path: String = DATABASE_FILE_PATH): var file := File.new() file.open(file_path, File.READ_WRITE) - var headers: PoolStringArray - var is_first_line := true + var file_content = file.get_as_text() + file.close() + var parse_result = JSON.parse(file_content) + + if parse_result.error != OK || typeof(parse_result.result) != TYPE_DICTIONARY: + push_error("Failed to parse database file: '%s'.") + return + + if parse_result.result["version"] != DATABASE_FILE_VERSION: + push_error("Invalid database file version '%s', expected '%s'." % DATABASE_FILE_VERSION) + return + + if typeof(parse_result.result["database"]) != TYPE_ARRAY: + push_error("Failed to load database file contents.") + return + + db = parse_result.result["database"] + + +func save_database(file_path: String = DATABASE_FILE_PATH): + var database_file := { + "version": DATABASE_FILE_VERSION, + "database": db, + } + var indentation_char := "" if file_path == DATABASE_FILE_PATH else "\t" + var file_content := JSON.print(database_file, indentation_char) + + var file := File.new() + file.open(file_path, File.WRITE) + file.store_string(file_content) + file.close() + + +static func import_database(file_path: String) -> Array: + var result: Array + var file := File.new() + file.open(file_path, File.READ_WRITE) + var headers := file.get_csv_line() while file.get_position() < file.get_len(): var csv_entry := file.get_csv_line() - if is_first_line: - is_first_line = false - headers = csv_entry - continue var entry = DatabaseEntry.instance_entry() for idx in headers.size(): var field_name := headers[idx] var field_value := csv_entry[idx] match field_name: + "date": + DatabaseEntry.set_entry_date(entry, field_value) "date_year", "date_month", "date_day": entry[field_name] = int(field_value) "is_urgency": entry[field_name] = true if field_value.strip_edges().to_lower() == "true" else false _: - entry[field_name] = field_value - db.append(entry) + if DatabaseEntry.ENTRY_PROTOTYPE.has(field_name): + entry[field_name] = field_value + if DatabaseEntry.is_valid_entry(entry): + result.append(entry) file.close() + return result -func store_database(file_path: String = DATABASE_FILE_PATH): +static func export_database(file_path: String, database: Array = db): var file := File.new() file.open(file_path, File.WRITE) var header := PoolStringArray(DatabaseEntry.ENTRY_PROTOTYPE.keys()) file.store_csv_line(header) - for it in db: + for it in database: # @DAM This approach depends on the order the dictionary fields are created. file.store_csv_line(it.values()) file.close() -func clear_database(save_changes: bool = false): +func clear_database(): clear_selection() self.clear() db.resize(0) - if save_changes: - store_database() -func fake_database(save_changes: bool = false): +func fake_database(): clear_database() for idx in range(500): var today := OS.get_date(true) @@ -199,7 +235,5 @@ func fake_database(save_changes: bool = false): }) db.append(fake_entry) self.add_item(get_entry_view(fake_entry)) - if save_changes: - store_database() diff --git a/logic/stage.gd b/logic/stage.gd index 892dee4..c0583b0 100644 --- a/logic/stage.gd +++ b/logic/stage.gd @@ -5,6 +5,7 @@ signal save # (database_entry: Dictionary) signal discard # () const OPTION_SETS_FILE_PATH: String = "user://option_sets.json" +const OPTION_SETS_FILE_VERSION: int = 1 const OPTION_SETS_NOT_AVAILABLE: String = "--" const OPTION_SETS_TREE_STRUCTURE := { "place": null, @@ -93,7 +94,7 @@ func save_action(): self.visible = false var staged_entry := get_stage() gather_option_sets(staged_entry) - store_option_sets() + save_option_sets() emit_signal("save", staged_entry) @@ -188,35 +189,43 @@ func gather_option_sets(entry: Dictionary, target: Dictionary = option_sets, blu gather_option_sets(entry, target[key][value], blueprint[key]) -func import_option_sets(file_path: String = OPTION_SETS_FILE_PATH): - load_option_sets(file_path) - sanitize_option_sets(option_sets) - store_option_sets() - - func load_option_sets(file_path: String = OPTION_SETS_FILE_PATH): var file := File.new() file.open(file_path, File.READ_WRITE) var file_content = file.get_as_text() file.close() var parse_result = JSON.parse(file_content) - if parse_result.error == OK && typeof(parse_result.result) == TYPE_DICTIONARY: - option_sets = parse_result.result - else: - option_sets = {} + + if parse_result.error != OK || typeof(parse_result.result) != TYPE_DICTIONARY: push_error("Failed to parse option sets file: '%s'.") + return + + if parse_result.result["version"] != OPTION_SETS_FILE_VERSION: + push_error("Invalid option sets file version '%s', expected '%s'." % OPTION_SETS_FILE_VERSION) + return + + if typeof(parse_result.result["option_sets"]) != TYPE_DICTIONARY: + push_error("Failed to load option sets file contents.") + return + + option_sets = parse_result.result["option_sets"] -func store_option_sets(file_path: String = OPTION_SETS_FILE_PATH): +func save_option_sets(file_path: String = OPTION_SETS_FILE_PATH): + var option_sets_file := { + "version": OPTION_SETS_FILE_VERSION, + "option_sets": option_sets, + } + var indentation_char := "" if file_path == OPTION_SETS_FILE_PATH else "\t" + var file_content := JSON.print(option_sets_file, indentation_char) + var file := File.new() file.open(file_path, File.WRITE) - file.store_string(JSON.print(option_sets, "" if file_path == OPTION_SETS_FILE_PATH else "\t")) + file.store_string(file_content) file.close() -func clear_option_sets(save_changes: bool = false): +func clear_option_sets(): option_sets = {} - if save_changes: - store_option_sets() |
