aboutsummaryrefslogtreecommitdiff
path: root/logic/database.gd
diff options
context:
space:
mode:
Diffstat (limited to 'logic/database.gd')
-rw-r--r--logic/database.gd72
1 files changed, 53 insertions, 19 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()