@startuml database-diagram title CR-Core — Database (SQLite wrapper) skinparam classAttributeIconSize 0 hide empty members package "fr.luc.crcore.util.database" { class Database { - connection: Connection + Database(file: File) + execute(sql, params...): void + update(sql, params...): int + queryOne(sql, mapper, params...): Optional + query(sql, mapper, params...): List + inTransaction(block: Runnable): void + table(name: String): TableBuilder + tableExists(name: String): boolean + getConnection(): Connection + close(): void } Database ..|> "java.lang.AutoCloseable" class TableBuilder { - database: Database - name: String - columns: List - ifNotExists: boolean + ifNotExists(): TableBuilder + column(name, type): ColumnDef + create(): void } class "TableBuilder.ColumnDef" as ColumnDef { - name: String - type: ColumnType - primaryKey: boolean - notNull: boolean - unique: boolean - defaultValue: String + primaryKey(): ColumnDef + notNull(): ColumnDef + unique(): ColumnDef + defaultValue(expr: String): ColumnDef + column(name, type): ColumnDef + create(): void } enum ColumnType { INTEGER REAL TEXT BLOB BOOLEAN UUID -- + getSqlType(): String } interface "RowMapper" as RowMapper { + map(rs: ResultSet): T } class DatabaseException DatabaseException --|> RuntimeException Database "1" *-- "*" TableBuilder : creates TableBuilder "1" *-- "*" ColumnDef : contains ColumnDef --> ColumnType : type Database ..> RowMapper : uses Database ..> DatabaseException : throws } note right of Database Repositories SQLite de CR-Core (SqliteTeamRepository, SqlitePlayerProfileRepository) utilisent Database pour persister state team/player. Les plugins de jeu utilisent Database.table(...) pour créer leurs tables custom. end note @enduml