RingOfRaces/addons/godot-sqlite/godot-sqlite-wrapper.gd

222 lines
9.1 KiB
GDScript3
Raw Normal View History

2023-03-25 20:42:54 +00:00
class_name SQLiteWrapper
# This class aims to make documentation accessible in the Godot editor and
# is meant to be fully interchangeable with `gdsqlite.gdns`.
# More extensive documentation can be found here:
# https://github.com/2shady4u/godot-sqlite/blob/master/README.md
var SQLite = preload("res://addons/godot-sqlite/bin/gdsqlite.gdns")
var db
enum VerbosityLevel {
QUIET = 0,
NORMAL = 1,
VERBOSE = 2,
VERY_VERBOSE = 3
}
func _init():
db = SQLite.new()
# VARIABLES --------------------------------------------------------------------
# NAME: path
# DEFAULT: ""
# DESCRIPTION:
# Path to the database, should be set before opening the database with `open_db()`.
var path : String setget set_path, get_path
func set_path(value : String) -> void:
if db: db.path = value
func get_path() -> String:
if db: return db.path
return ""
# NAME: error_message
# DEFAULT: ""
# DESCRIPTION:
# Contains the zErrMsg returned by the SQLite query in human-readable form.
var error_message : String setget set_error_message, get_error_message
func set_error_message(message: String) -> void:
if db: db.error_message = message
func get_error_message() -> String:
if db: return db.error_message
return ""
# NAME: default_extension
# DEFAULT: "db"
# DESCRIPTION:
# Default extension that is automatically appended to the `path`-variable whenever
# **no** extension is detected or given.
var default_extension :String setget set_default_extension, get_default_extension
func set_default_extension(value : String) -> void:
if db: db.default_extension = value
func get_default_extension() -> String:
if db: return db.default_extension
return ""
# NAME: foreign_keys
# DEFAULT: false
# DESCRIPTION:
# Enables or disables the availability of foreign keys in the SQLite database.
var foreign_keys : bool setget set_foreign_keys, get_foreign_keys
func set_foreign_keys(value : bool) -> void:
if db: db.foreign_keys = value
func get_foreign_keys() -> bool:
if db: return db.foreign_keys
return false
# NAME: read_only
# DEFAULT: false
# DESCRIPTION:
# Enabling this property opens the database in read-only mode & allows databases
# to be packaged inside of the PCK.
var read_only : bool setget set_read_only, get_read_only
func set_read_only(value : bool) -> void:
if db: db.read_only = value
func get_read_only() -> bool:
if db: return db.read_only
return false
# NAME: query_result
# DEFAULT: []
# DESCRIPTION:
# Contains the results from the latest query by value; meaning that this property
# is safe to use when looping successive queries as it does not get overwritten by any future queries.
var query_result : Array setget set_query_result, get_query_result
func set_query_result(value : Array) -> void:
if db: db.query_result = value
func get_query_result() -> Array:
if db: return db.query_result
return []
# NAME: query_result_by_reference
# DEFAULT: []
# DESCRIPTION:
# Contains the results from the latest query **by reference** and is, as a direct result,
# cleared and repopulated after every new query.
var query_result_by_reference : Array setget set_query_result_by_reference, get_query_result_by_reference
func set_query_result_by_reference(value : Array) -> void:
if db: db.query_result_by_reference = value
func get_query_result_by_reference() -> Array:
if db: return db.query_result_by_reference
return []
# NAME: last_insert_rowid
# DEFAULT: -1
# DESCRIPTION:
# Exposes both the `sqlite3_last_insert_rowid()`- and `sqlite3_set_last_insert_rowid()`-methods to Godot as described [here](https://www.sqlite.org/c3ref/last_insert_rowid.html) and [here](https://www.sqlite.org/c3ref/set_last_insert_rowid.html) respectively.
var last_insert_rowid : int setget set_last_insert_rowid, get_last_insert_rowid
func set_last_insert_rowid(value : int) -> void:
if db: db.last_insert_rowid = value
func get_last_insert_rowid() -> int:
if !db: return db.last_insert_rowid
return -1
# NAME: verbosity_level
# DEFAULT: -1
# DESCRIPTION:
# The verbosity_level determines the amount of logging to the Godot console that is handy for debugging your (possibly faulty) SQLite queries.
# Following levels are available:
# QUIET (0) : Don't print anything to the console
# NORMAL (1) : Print essential information to the console
# VERBOSE (2) : Print additional information to the console
# VERY_VERBOSE (3): Same as VERBOSE
# **NOTE:** VERBOSE and higher levels might considerably slow down your queries due to excessive logging.
var verbosity_level : int setget set_verbosity_level, get_verbosity_level
func set_verbosity_level(var value) -> void:
if db: db.verbosity_level = value
func get_verbosity_level() -> int:
if db: return db.verbosity_level
return -1
# FUNCTIONS --------------------------------------------------------------------
# Open a connection to the database at the path set by the `path`-variable.
# **NOTE:** The `path`-variable has to be set beforehand!
func open_db() -> bool:
return db.open_db()
# Close the connection to the database.
func close_db() -> void:
db.close_db()
# Executes a query on the database connection.
# **NOTE:** Allowing the user to directly access this method makes you vulnerable to SQL injection attacks!
func query(query_string : String) -> bool:
return db.query(query_string)
# Executes a query with bindings on the database connection.
# For example, calling `query_with_bindings("SELECT name from monsters WHERE health < ?", [24])`
# would select all monsters with health below 24.
func query_with_bindings(query_string : String, param_bindings : Array) -> bool:
return db.query_with_bindings(query_string, param_bindings)
# Creates the table with the name "table_name" if it doesn't already exist.
# For more information regarding the composition of the `table_dictionary`-property see:
# https://github.com/2shady4u/godot-sqlite/blob/master/README.md#functions
func create_table(table_name: String, table_dictionary: Dictionary) -> bool:
return db.create_table(table_name, table_dictionary)
# Drops (removes) the table with the name "table_name" from the database.
func drop_table(table_name: String) -> bool:
return db.drop_table(table_name)
# Insert a new row into the table with the given properties.
# For example, calling `insert_row("monsters", {"name": "Wolf", "health": 20})`
# would add a new row to the "monsters" table with the given properties.
func insert_row(table_name: String, row_dictionary : Dictionary) -> bool:
return db.insert_row(table_name, row_dictionary)
# Insert multiple rows into the table with the given properties.
# For example, calling `insert_rows("monsters", [{"name": "Wolf", "health": 20}, {"name": "Boar", "health": 12}])`
# would add 2 new rows to the "monsters" table with the given properties.
func insert_rows(table_name: String, row_array : Array) -> bool:
return db.insert_rows(table_name,row_array)
# Select all rows from the table that match the given conditions and return the wanted columns.
# For example, calling `select_rows("monsters", "health < 24", ["name", "health"])`
# would select all monsters with health below 24 and return their names & health in an array of dictionaries.
func select_rows(table_name : String, query_conditions: String, selected_columns: Array) -> Array:
return db.select_rows(table_name,query_conditions,selected_columns)
# Update all rows from the table that match the given conditions.
# For example, calling `update_rows("monsters", "name = 'Wolf'", {"health": 24})`
# would update/change the health of all monsters with the name "Wolf" to 24.
func update_rows(table_name : String, query_conditions: String, updated_row_dictionary: Dictionary) -> bool:
return db.update_rows(table_name, query_conditions, updated_row_dictionary)
# Delete all the rows in the table that match the given conditions.
# For example, calling `delete_rows("monsters", "name = 'Wolf' AND health > 18")`
# would delete all the rows in the "monsters" table that match the following conditions:
# - A "name" column value equal to "Wolf"
# - A "health" column value that is greater than 18
func delete_rows(table_name: String, query_conditions: String) -> bool:
return db.delete_rows(table_name, query_conditions)
# Drops all database tables and imports the database structure and content present inside of `import_path.json`.
func import_from_json(import_path: String) -> bool:
return db.import_from_json(import_path)
# Exports the database structure and content to `export_path.json` as a backup or for ease of editing.
func export_to_json(export_path : String) -> bool:
return db.export_to_json(export_path)
# Bind a scalar SQL function to the database that can then be used in subsequent queries.
# Creating a function should only be seen as a measure of last resort and only be used when you perfectly know what you are doing.
func create_function(function_name: String, function_reference: FuncRef, number_of_arguments: int) -> bool:
return db.create_function(function_name, function_reference, number_of_arguments)
# Get the current autocommit mode of the open database connection which can be used to check if
# there's any database transactions in progress, see here:
# http://www.sqlite.org/c3ref/get_autocommit.html
func get_autocommit() -> int:
return db.get_autocommit()