Skip to content

Commit ea21a3b

Browse files
committed
feat: add write-cache and some stuff | functional
1 parent 5213b42 commit ea21a3b

8 files changed

Lines changed: 332 additions & 11 deletions

File tree

build.gradle

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
plugins {
22
id 'net.fabricmc.fabric-loom-remap' version "${loom_version}"
3-
id 'maven-publish'
43
}
54

65
version = "${project.mod_version}+${project.minecraft_version}"

src/main/java/es/superstrellaa/storagemanager/StorageManagerAPI.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package es.superstrellaa.storagemanager;
22

33
import es.superstrellaa.storagemanager.internal.SQLiteBackend;
4+
import es.superstrellaa.storagemanager.internal.cache.WriteCache;
45
import es.superstrellaa.storagemanager.internal.lifecycle.ShutdownHook;
56
import net.fabricmc.api.ModInitializer;
67
import org.slf4j.Logger;
@@ -11,11 +12,14 @@ public class StorageManagerAPI implements ModInitializer {
1112
public static final String MOD_ID = "storagemanager-api";
1213
public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID);
1314

15+
//TODO General: Optimizar algo más, separar clases grandes en varias pequeñas y nuevas funcionalidades(añadir sistema de usar otro tipo de Backend aparte de SQLite, como texto plano(json, xml...) o PostgreSQL/MySQL)
16+
1417
@Override
1518
public void onInitialize() {
1619
SQLiteBackend.init();
20+
WriteCache.getInstance().start();
1721
ShutdownHook.register();
1822

19-
LOGGER.info("StorageManager API initialized");
23+
LOGGER.info("StorageManager API initialized with write-behind cache");
2024
}
21-
}
25+
}

src/main/java/es/superstrellaa/storagemanager/api/StorageManager.java

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,78 @@
33
import es.superstrellaa.storagemanager.api.data.RowData;
44
import es.superstrellaa.storagemanager.api.schema.TableSchema;
55
import es.superstrellaa.storagemanager.internal.TableExecutor;
6+
import es.superstrellaa.storagemanager.internal.cache.WriteCache;
67

78
import java.util.List;
89
import java.util.Map;
910

11+
/**
12+
* API principal para interactuar con StorageManager.
13+
*
14+
* Por defecto, todas las operaciones de escritura usan un sistema de caché
15+
* que agrupa operaciones y las ejecuta en lotes cada 5 segundos.
16+
*
17+
* Para datos críticos que necesitas guardar inmediatamente, usa los métodos *Immediate
18+
* o llama a flush() manualmente.
19+
*/
1020
public final class StorageManager {
1121

22+
/**
23+
* Registra una tabla en la base de datos
24+
*/
1225
public static void registerTable(TableSchema schema) {
1326
TableExecutor.createTable(schema);
1427
}
1528

29+
/**
30+
* Inserta datos (modo async con caché, recomendado para la mayoría de casos)
31+
*/
1632
public static void insert(String table, RowData data) {
17-
TableExecutor.insert(table, data);
33+
TableExecutor.insert(table, data, false);
1834
}
1935

36+
/**
37+
* Inserta datos inmediatamente sin usar caché (para datos críticos)
38+
*/
39+
public static void insertImmediate(String table, RowData data) {
40+
TableExecutor.insert(table, data, true);
41+
}
42+
43+
/**
44+
* Selecciona datos de una tabla.
45+
* Automáticamente hace flush de la caché antes de leer.
46+
*/
2047
public static List<RowData> select(String table, Map<String, Object> where) {
2148
return TableExecutor.select(table, where);
2249
}
2350

51+
/**
52+
* Elimina datos (modo async con caché)
53+
*/
2454
public static void delete(String table, Map<String, Object> where) {
25-
TableExecutor.delete(table, where);
55+
TableExecutor.delete(table, where, false);
56+
}
57+
58+
/**
59+
* Elimina datos inmediatamente sin usar caché
60+
*/
61+
public static void deleteImmediate(String table, Map<String, Object> where) {
62+
TableExecutor.delete(table, where, true);
63+
}
64+
65+
/**
66+
* Fuerza el guardado de todas las operaciones pendientes de una tabla específica
67+
*/
68+
public static void flush(String table) {
69+
WriteCache.getInstance().flushTable(table);
70+
}
71+
72+
/**
73+
* Fuerza el guardado de todas las operaciones pendientes de todas las tablas
74+
*/
75+
public static void flushAll() {
76+
WriteCache.getInstance().flushAll();
2677
}
2778

2879
private StorageManager() {}
29-
}
80+
}

src/main/java/es/superstrellaa/storagemanager/internal/SQLiteBackend.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@ public final class SQLiteBackend {
1212

1313
private static Connection connection;
1414

15-
//TODO: Separar esta barbaridad en otras clases auxiliares
16-
1715
public static void init() {
1816
try {
1917
Path dbPath = StoragePaths.getDatabasePath();

src/main/java/es/superstrellaa/storagemanager/internal/TableExecutor.java

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import es.superstrellaa.storagemanager.api.data.RowData;
55
import es.superstrellaa.storagemanager.api.schema.Column;
66
import es.superstrellaa.storagemanager.api.schema.TableSchema;
7+
import es.superstrellaa.storagemanager.internal.cache.WriteCache;
78

89
import java.sql.*;
910
import java.util.ArrayList;
@@ -13,6 +14,9 @@
1314

1415
public final class TableExecutor {
1516

17+
/**
18+
* Crea una tabla según el esquema proporcionado
19+
*/
1620
public static void createTable(TableSchema schema) {
1721
StringBuilder sql = new StringBuilder();
1822
sql.append("CREATE TABLE IF NOT EXISTS ")
@@ -46,7 +50,29 @@ public static void createTable(TableSchema schema) {
4650
execute(sql.toString());
4751
}
4852

53+
/**
54+
* Inserta datos usando la caché (modo async, más rápido)
55+
*/
4956
public static void insert(String table, RowData data) {
57+
insert(table, data, false);
58+
}
59+
60+
/**
61+
* Inserta datos con opción de bypass de caché
62+
* @param immediate si es true, escribe inmediatamente a DB sin usar caché
63+
*/
64+
public static void insert(String table, RowData data, boolean immediate) {
65+
if (immediate) {
66+
insertImmediate(table, data);
67+
} else {
68+
WriteCache.getInstance().queueInsert(table, data);
69+
}
70+
}
71+
72+
/**
73+
* Inserción inmediata sin caché (para datos críticos)
74+
*/
75+
private static void insertImmediate(String table, RowData data) {
5076
StringJoiner columns = new StringJoiner(", ");
5177
StringJoiner values = new StringJoiner(", ");
5278

@@ -72,7 +98,14 @@ public static void insert(String table, RowData data) {
7298
}
7399
}
74100

101+
/**
102+
* SELECT siempre lee directamente de la DB
103+
* Antes de leer, hace flush de la tabla para asegurar que los datos estén actualizados
104+
*/
75105
public static List<RowData> select(String table, Map<String, Object> where) {
106+
// Flush antes de leer para tener datos actualizados por si acaso
107+
WriteCache.getInstance().flushTable(table);
108+
76109
List<RowData> results = new ArrayList<>();
77110

78111
StringBuilder sql = new StringBuilder("SELECT * FROM ").append(table);
@@ -108,11 +141,29 @@ public static List<RowData> select(String table, Map<String, Object> where) {
108141
return results;
109142
}
110143

144+
/**
145+
* Elimina usando caché por defecto
146+
*/
111147
public static void delete(String table, Map<String, Object> where) {
148+
delete(table, where, false);
149+
}
150+
151+
/**
152+
* Elimina con opción de inmediatez
153+
*/
154+
public static void delete(String table, Map<String, Object> where, boolean immediate) {
112155
if (where.isEmpty()) {
113156
throw new IllegalArgumentException("DELETE without WHERE is not allowed");
114157
}
115158

159+
if (immediate) {
160+
deleteImmediate(table, where);
161+
} else {
162+
WriteCache.getInstance().queueDelete(table, where);
163+
}
164+
}
165+
166+
private static void deleteImmediate(String table, Map<String, Object> where) {
116167
String sql = "DELETE FROM " + table +
117168
" WHERE " + buildWhereClause(where) + ";";
118169

@@ -151,4 +202,4 @@ private static void execute(String sql) {
151202
}
152203

153204
private TableExecutor() {}
154-
}
205+
}

0 commit comments

Comments
 (0)