aboutsummaryrefslogtreecommitdiff
path: root/logic
diff options
context:
space:
mode:
Diffstat (limited to 'logic')
-rw-r--r--logic/database.gd72
-rw-r--r--logic/stage.gd41
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()