Skip to content

Commit

Permalink
Adds preliminary documentation for ndatabase
Browse files Browse the repository at this point in the history
- Also fixes failing build, although the entities as-is are not going to work
  • Loading branch information
boskoramen committed Sep 23, 2024
1 parent 2c90a32 commit 6780ab2
Show file tree
Hide file tree
Showing 36 changed files with 393 additions and 257 deletions.
111 changes: 111 additions & 0 deletions .github/guides/NDATABASE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
# Database
The actual interface for interacting with the database we are using.
## Adapter
### Core functions
TBD
#### Sync Table Meta (sync_table_meta)
TBD
#### Sync Table (sync_table)
TBD
#### Sync Index (sync_index)
TBD
#### Read Table (read_table)
TBD
#### Update Table (update_table)
TBD
#### Insert Table (insert_table)
TBD
#### Delete Table (delete_table)
TBD
#### Read Filter (read_filter)
TBD
#### Prepare View (prepare_view)
TBD
#### Read View (read_view)
TBD
### Filters
TBD
# Query
## Read Single (read_single)
Executes the given query,
## Connection
# Schema
Different structures we use for defining the structure of our data within the database.
## Entity
TBD
## Link
TBD
## Index
TBD
## Entity View
Virtual table to view a subset of data from a specific entity and that entity's links.

Differs from a standard database view in that the fields of an entity view must ALWAYS be derived from its parent entity and its links.

Standard database views are currently not implemented.
# Database Drivers
## brsql
The Rust MySQL database driver
### [Adapter](#Adapter)
TBD
### [Query](#Query)
See [rust-g query execution code](https://github.com/tgstation/rust-g/blob/9682fc08fe0306247fabc303cc93dd9858f2ce76/src/sql.rs#L147-L226)

Query response JSON schema:
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "rust-g SQL Query Response",
"description": "The JSON object returned from any rust-g query calls via the `rustg_sql_check_query()` proc.",
"type": "object",
"properties": {
"status": {
"type": "string"
},
"affected": {
"type": "integer"
},
"last_insert_id": {
"type": [ "integer", "null" ]
},
"columns": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
}
}
}
},
"rows": {
"type": "array",
"items": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
},
{
"type": "null"
},
{
"type": "array",
"items": {
"type": "number"
}
}
]
}
}
}
}
```
## Native
BYOND internal database driver: http://www.byond.com/docs/ref/#/database

Uses SQLite as its DB
> A /database datum gives you the ability to create or access a database using SQLite
Original file line number Diff line number Diff line change
Expand Up @@ -161,177 +161,177 @@
#define FIELD_INT(entity, field) \
/datum/db_field/##entity/##field{ name = #field; field_type = DB_FIELDTYPE_INT; parent_entity_type = /datum/entity/##entity; }; \
/datum/entity/##entity/var/datum/db_field/##entity/##field/##field; \
/datum/entity_meta/##entity/setup_field_types() { \
/datum/entity_meta/##entity/setup_field_typepaths() { \
..(); \
LAZYSET(field_types, #field, /datum/db_field/##entity/##field); \
LAZYSET(field_typepaths, #field, /datum/db_field/##entity/##field); \
}
#define FIELD_DEFAULT_VALUE_INT(entity, field, default) \
/datum/db_field/##entity/##field{ name = #field; field_type = DB_FIELDTYPE_INT; parent_entity_type = /datum/entity/##entity; }; \
/datum/db_field/##entity/##field/New() { . = ..(); value = default; } \
/datum/entity/##entity/var/datum/db_field/##entity/##field/##field; \
/datum/entity_meta/##entity/setup_field_types() { \
/datum/entity_meta/##entity/setup_field_typepaths() { \
..(); \
LAZYSET(field_types, #field, /datum/db_field/##entity/##field); \
LAZYSET(field_typepaths, #field, /datum/db_field/##entity/##field); \
}

#define FIELD_BIGINT(entity, field) \
/datum/db_field/##entity/##field{ name = #field; field_type = DB_FIELDTYPE_BIGINT; parent_entity_type = /datum/entity/##entity; }; \
/datum/entity/##entity/var/datum/db_field/##entity/##field/##field; \
/datum/entity_meta/##entity/setup_field_types() { \
/datum/entity_meta/##entity/setup_field_typepaths() { \
..(); \
LAZYSET(field_types, #field, /datum/db_field/##entity/##field); \
LAZYSET(field_typepaths, #field, /datum/db_field/##entity/##field); \
}
#define FIELD_DEFAULT_VALUE_BIGINT(entity, field, default) \
/datum/db_field/##entity/##field{ name = #field; field_type = DB_FIELDTYPE_BIGINT; parent_entity_type = /datum/entity/##entity; }; \
/datum/db_field/##entity/##field/New() { . = ..(); value = default; } \
/datum/entity/##entity/var/datum/db_field/##entity/##field/##field; \
/datum/entity_meta/##entity/setup_field_types() { \
/datum/entity_meta/##entity/setup_field_typepaths() { \
..(); \
LAZYSET(field_types, #field, /datum/db_field/##entity/##field); \
LAZYSET(field_typepaths, #field, /datum/db_field/##entity/##field); \
}

#define FIELD_CHAR(entity, field) \
/datum/db_field/##entity/##field{ name = #field; field_type = DB_FIELDTYPE_CHAR; parent_entity_type = /datum/entity/##entity; }; \
/datum/entity/##entity/var/datum/db_field/##entity/##field/##field; \
/datum/entity_meta/##entity/setup_field_types() { \
/datum/entity_meta/##entity/setup_field_typepaths() { \
..(); \
LAZYSET(field_types, #field, /datum/db_field/##entity/##field); \
LAZYSET(field_typepaths, #field, /datum/db_field/##entity/##field); \
}
#define FIELD_DEFAULT_VALUE_CHAR(entity, field, default) \
/datum/db_field/##entity/##field{ name = #field; field_type = DB_FIELDTYPE_CHAR; parent_entity_type = /datum/entity/##entity; }; \
/datum/db_field/##entity/##field/New() { . = ..(); value = default; } \
/datum/entity/##entity/var/datum/db_field/##entity/##field/##field; \
/datum/entity_meta/##entity/setup_field_types() { \
/datum/entity_meta/##entity/setup_field_typepaths() { \
..(); \
LAZYSET(field_types, #field, /datum/db_field/##entity/##field); \
LAZYSET(field_typepaths, #field, /datum/db_field/##entity/##field); \
}

#define FIELD_STRING_SMALL(entity, field) \
/datum/db_field/##entity/##field{ name = #field; field_type = DB_FIELDTYPE_STRING_SMALL; parent_entity_type = /datum/entity/##entity; }; \
/datum/entity/##entity/var/datum/db_field/##entity/##field/##field; \
/datum/entity_meta/##entity/setup_field_types() { \
/datum/entity_meta/##entity/setup_field_typepaths() { \
..(); \
LAZYSET(field_types, #field, /datum/db_field/##entity/##field); \
LAZYSET(field_typepaths, #field, /datum/db_field/##entity/##field); \
}
#define FIELD_DEFAULT_VALUE_STRING_SMALL(entity, field, default) \
/datum/db_field/##entity/##field{ name = #field; field_type = DB_FIELDTYPE_STRING_SMALL; parent_entity_type = /datum/entity/##entity; }; \
/datum/db_field/##entity/##field/New() { . = ..(); value = default; } \
/datum/entity/##entity/var/datum/db_field/##entity/##field/##field; \
/datum/entity_meta/##entity/setup_field_types() { \
/datum/entity_meta/##entity/setup_field_typepaths() { \
..(); \
LAZYSET(field_types, #field, /datum/db_field/##entity/##field); \
LAZYSET(field_typepaths, #field, /datum/db_field/##entity/##field); \
}

#define FIELD_STRING_MEDIUM(entity, field) \
/datum/db_field/##entity/##field{ name = #field; field_type = DB_FIELDTYPE_STRING_MEDIUM; parent_entity_type = /datum/entity/##entity; }; \
/datum/entity/##entity/var/datum/db_field/##entity/##field/##field; \
/datum/entity_meta/##entity/setup_field_types() { \
/datum/entity_meta/##entity/setup_field_typepaths() { \
..(); \
LAZYSET(field_types, #field, /datum/db_field/##entity/##field); \
LAZYSET(field_typepaths, #field, /datum/db_field/##entity/##field); \
}
#define FIELD_DEFAULT_VALUE_STRING_MEDIUM(entity, field, default) \
/datum/db_field/##entity/##field{ name = #field; field_type = DB_FIELDTYPE_STRING_MEDIUM; parent_entity_type = /datum/entity/##entity; }; \
/datum/db_field/##entity/##field/New() { . = ..(); value = default; } \
/datum/entity/##entity/var/datum/db_field/##entity/##field/##field; \
/datum/entity_meta/##entity/setup_field_types() { \
/datum/entity_meta/##entity/setup_field_typepaths() { \
..(); \
LAZYSET(field_types, #field, /datum/db_field/##entity/##field); \
LAZYSET(field_typepaths, #field, /datum/db_field/##entity/##field); \
}

#define FIELD_STRING_LARGE(entity, field) \
/datum/db_field/##entity/##field{ name = #field; field_type = DB_FIELDTYPE_STRING_LARGE; parent_entity_type = /datum/entity/##entity; }; \
/datum/entity/##entity/var/datum/db_field/##entity/##field/##field; \
/datum/entity_meta/##entity/setup_field_types() { \
/datum/entity_meta/##entity/setup_field_typepaths() { \
..(); \
LAZYSET(field_types, #field, /datum/db_field/##entity/##field); \
LAZYSET(field_typepaths, #field, /datum/db_field/##entity/##field); \
}
#define FIELD_DEFAULT_VALUE_STRING_LARGE(entity, field, default) \
/datum/db_field/##entity/##field{ name = #field; field_type = DB_FIELDTYPE_STRING_LARGE; parent_entity_type = /datum/entity/##entity; }; \
/datum/db_field/##entity/##field/New() { . = ..(); value = default; } \
/datum/entity/##entity/var/datum/db_field/##entity/##field/##field; \
/datum/entity_meta/##entity/setup_field_types() { \
/datum/entity_meta/##entity/setup_field_typepaths() { \
..(); \
LAZYSET(field_types, #field, /datum/db_field/##entity/##field); \
LAZYSET(field_typepaths, #field, /datum/db_field/##entity/##field); \
}

#define FIELD_STRING_MAX(entity, field) \
/datum/db_field/##entity/##field{ name = #field; field_type = DB_FIELDTYPE_STRING_MAX; parent_entity_type = /datum/entity/##entity; }; \
/datum/entity/##entity/var/datum/db_field/##entity/##field/##field; \
/datum/entity_meta/##entity/setup_field_types() { \
/datum/entity_meta/##entity/setup_field_typepaths() { \
..(); \
LAZYSET(field_types, #field, /datum/db_field/##entity/##field); \
LAZYSET(field_typepaths, #field, /datum/db_field/##entity/##field); \
}
#define FIELD_DEFAULT_VALUE_STRING_MAX(entity, field, default) \
/datum/db_field/##entity/##field{ name = #field; field_type = DB_FIELDTYPE_STRING_MAX; parent_entity_type = /datum/entity/##entity; }; \
/datum/db_field/##entity/##field/New() { . = ..(); value = default; } \
/datum/entity/##entity/var/datum/db_field/##entity/##field/##field; \
/datum/entity_meta/##entity/setup_field_types() { \
/datum/entity_meta/##entity/setup_field_typepaths() { \
..(); \
LAZYSET(field_types, #field, /datum/db_field/##entity/##field); \
LAZYSET(field_typepaths, #field, /datum/db_field/##entity/##field); \
}

#define FIELD_DATE(entity, field) \
/datum/db_field/##entity/##field{ name = #field; field_type = DB_FIELDTYPE_DATE; parent_entity_type = /datum/entity/##entity; }; \
/datum/entity/##entity/var/datum/db_field/##entity/##field/##field; \
/datum/entity_meta/##entity/setup_field_types() { \
/datum/entity_meta/##entity/setup_field_typepaths() { \
..(); \
LAZYSET(field_types, #field, /datum/db_field/##entity/##field); \
LAZYSET(field_typepaths, #field, /datum/db_field/##entity/##field); \
}
#define FIELD_DEFAULT_VALUE_DATE(entity, field, default) \
/datum/db_field/##entity/##field{ name = #field; field_type = DB_FIELDTYPE_DATE; parent_entity_type = /datum/entity/##entity; }; \
/datum/db_field/##entity/##field/New() { . = ..(); value = default; } \
/datum/entity/##entity/var/datum/db_field/##entity/##field/##field; \
/datum/entity_meta/##entity/setup_field_types() { \
/datum/entity_meta/##entity/setup_field_typepaths() { \
..(); \
LAZYSET(field_types, #field, /datum/db_field/##entity/##field); \
LAZYSET(field_typepaths, #field, /datum/db_field/##entity/##field); \
}

#define FIELD_TEXT(entity, field) \
/datum/db_field/##entity/##field{ name = #field; field_type = DB_FIELDTYPE_TEXT; parent_entity_type = /datum/entity/##entity; }; \
/datum/entity/##entity/var/datum/db_field/##entity/##field/##field; \
/datum/entity_meta/##entity/setup_field_types() { \
/datum/entity_meta/##entity/setup_field_typepaths() { \
..(); \
LAZYSET(field_types, #field, /datum/db_field/##entity/##field); \
LAZYSET(field_typepaths, #field, /datum/db_field/##entity/##field); \
}
#define FIELD_DEFAULT_VALUE_TEXT(entity, field, default) \
/datum/db_field/##entity/##field{ name = #field; field_type = DB_FIELDTYPE_TEXT; parent_entity_type = /datum/entity/##entity; }; \
/datum/db_field/##entity/##field/New() { . = ..(); value = default; } \
/datum/entity/##entity/var/datum/db_field/##entity/##field/##field; \
/datum/entity_meta/##entity/setup_field_types() { \
/datum/entity_meta/##entity/setup_field_typepaths() { \
..(); \
LAZYSET(field_types, #field, /datum/db_field/##entity/##field); \
LAZYSET(field_typepaths, #field, /datum/db_field/##entity/##field); \
}

#define FIELD_BLOB(entity, field) \
/datum/db_field/##entity/##field{ name = #field; field_type = DB_FIELDTYPE_BLOB; parent_entity_type = /datum/entity/##entity; }; \
/datum/entity/##entity/var/datum/db_field/##entity/##field/##field; \
/datum/entity_meta/##entity/setup_field_types() { \
/datum/entity_meta/##entity/setup_field_typepaths() { \
..(); \
LAZYSET(field_types, #field, /datum/db_field/##entity/##field); \
LAZYSET(field_typepaths, #field, /datum/db_field/##entity/##field); \
}
#define FIELD_DEFAULT_VALUE_BLOB(entity, field, default) \
/datum/db_field/##entity/##field{ name = #field; field_type = DB_FIELDTYPE_BLOB; parent_entity_type = /datum/entity/##entity; }; \
/datum/db_field/##entity/##field/New() { . = ..(); value = default; } \
/datum/entity/##entity/var/datum/db_field/##entity/##field/##field; \
/datum/entity_meta/##entity/setup_field_types() { \
/datum/entity_meta/##entity/setup_field_typepaths() { \
..(); \
LAZYSET(field_types, #field, /datum/db_field/##entity/##field); \
LAZYSET(field_typepaths, #field, /datum/db_field/##entity/##field); \
}

#define FIELD_DECIMAL(entity, field) \
/datum/db_field/##entity/##field{ name = #field; field_type = DB_FIELDTYPE_DECIMAL; parent_entity_type = /datum/entity/##entity; }; \
/datum/entity/##entity/var/datum/db_field/##entity/##field/##field; \
/datum/entity_meta/##entity/setup_field_types() { \
/datum/entity_meta/##entity/setup_field_typepaths() { \
..(); \
LAZYSET(field_types, #field, /datum/db_field/##entity/##field); \
LAZYSET(field_typepaths, #field, /datum/db_field/##entity/##field); \
}
#define FIELD_DEFAULT_VALUE_DECIMAL(entity, field, default) \
/datum/db_field/##entity/##field{ name = #field; field_type = DB_FIELDTYPE_DECIMAL; parent_entity_type = /datum/entity/##entity; }; \
/datum/db_field/##entity/##field/New() { . = ..(); value = default; } \
/datum/entity/##entity/var/datum/db_field/##entity/##field/##field; \
/datum/entity_meta/##entity/setup_field_types() { \
/datum/entity_meta/##entity/setup_field_typepaths() { \
..(); \
LAZYSET(field_types, #field, /datum/db_field/##entity/##field); \
LAZYSET(field_typepaths, #field, /datum/db_field/##entity/##field); \
}

/// Defines an entity link where `child_entity` refers to `parent_entity` through its column `foreign_key`.
Expand Down
File renamed without changes.
Loading

0 comments on commit 6780ab2

Please sign in to comment.