db-model-router 1.0.6 → 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +150 -11
- package/TODO.md +0 -15
- package/db-manager/.dbmanager.sqlite +0 -0
- package/db-manager/README.md +223 -0
- package/db-manager/adapter-proxy.js +361 -0
- package/db-manager/demo/cockroachdb.env +6 -0
- package/db-manager/demo/demo.sqlite +0 -0
- package/db-manager/demo/dynamodb.env +7 -0
- package/db-manager/demo/mongodb.env +4 -0
- package/db-manager/demo/mssql.env +6 -0
- package/db-manager/demo/mysql.env +6 -0
- package/db-manager/demo/oracle.env +6 -0
- package/db-manager/demo/postgres.env +6 -0
- package/db-manager/demo/redis.env +4 -0
- package/db-manager/demo/seeds/cockroachdb.sql +32 -0
- package/db-manager/demo/seeds/mssql.sql +32 -0
- package/db-manager/demo/seeds/mysql.sql +32 -0
- package/db-manager/demo/seeds/oracle.sql +43 -0
- package/db-manager/demo/seeds/postgres.sql +32 -0
- package/db-manager/demo/seeds/sqlite3.sql +32 -0
- package/db-manager/demo/sqlite3.env +2 -0
- package/db-manager/metadata-db.js +170 -0
- package/db-manager/public/.gitkeep +1 -0
- package/db-manager/public/css/style.css +1413 -0
- package/db-manager/public/js/app.js +1370 -0
- package/db-manager/routes/api.js +388 -0
- package/db-manager/routes/views.js +61 -0
- package/db-manager/server.js +39 -0
- package/db-manager/utils/build-filter-config.js +18 -0
- package/db-manager/utils/csv-export.js +59 -0
- package/db-manager/utils/export-filename.js +39 -0
- package/db-manager/utils/filter-tables.js +20 -0
- package/db-manager/utils/parse-filters.js +93 -0
- package/db-manager/utils/sort-state.js +35 -0
- package/db-manager/views/.gitkeep +1 -0
- package/db-manager/views/dashboard.ejs +53 -0
- package/db-manager/views/history.ejs +52 -0
- package/db-manager/views/index.ejs +35 -0
- package/db-manager/views/layout.ejs +31 -0
- package/db-manager/views/partials/data-panel.ejs +74 -0
- package/db-manager/views/partials/header.ejs +36 -0
- package/db-manager/views/partials/sidebar.ejs +30 -0
- package/db-manager/views/query.ejs +58 -0
- package/dbmr.schema.json +22 -44
- package/demo/.dockerignore +7 -0
- package/demo/.env.example +14 -0
- package/demo/Dockerfile +20 -0
- package/demo/app.js +39 -0
- package/demo/commons/add_migration.js +43 -0
- package/demo/commons/db.js +28 -0
- package/demo/commons/migrate.js +68 -0
- package/demo/commons/modules.js +18 -0
- package/demo/commons/password.js +36 -0
- package/demo/commons/security.js +30 -0
- package/demo/commons/session.js +13 -0
- package/demo/commons/webhook.js +81 -0
- package/demo/dbmr.schema.json +338 -0
- package/demo/middleware/authenticate.js +14 -0
- package/demo/middleware/hasPermission.js +30 -0
- package/demo/middleware/logger.js +67 -0
- package/demo/middleware/tenantIsolation.js +17 -0
- package/demo/migrations/20260509170349_create_migrations_table.sql +6 -0
- package/demo/migrations/20260509170349_create_saas_tables.sql +69 -0
- package/demo/migrations/20260509170349_create_tables.sql +193 -0
- package/demo/models/addresses.js +24 -0
- package/demo/models/cart_items.js +20 -0
- package/demo/models/carts.js +18 -0
- package/demo/models/categories.js +22 -0
- package/demo/models/coupons.js +25 -0
- package/demo/models/index.js +43 -0
- package/demo/models/order_items.js +23 -0
- package/demo/models/orders.js +27 -0
- package/demo/models/payments.js +23 -0
- package/demo/models/product_images.js +20 -0
- package/demo/models/product_reviews.js +22 -0
- package/demo/models/product_variants.js +22 -0
- package/demo/models/products.js +32 -0
- package/demo/models/role_permissions.js +17 -0
- package/demo/models/roles.js +17 -0
- package/demo/models/shipments.js +21 -0
- package/demo/models/tenants.js +18 -0
- package/demo/models/users.js +23 -0
- package/demo/models/webhook_logs.js +22 -0
- package/demo/models/webhooks.js +19 -0
- package/demo/models/wishlists.js +17 -0
- package/demo/openapi.json +7000 -0
- package/demo/package-lock.json +2810 -0
- package/demo/package.json +43 -0
- package/demo/routes/addresses/index.js +6 -0
- package/demo/routes/auth/index.js +55 -0
- package/demo/routes/carts/cart_items/index.js +7 -0
- package/demo/routes/carts/index.js +6 -0
- package/demo/routes/categories/index.js +6 -0
- package/demo/routes/coupons/index.js +6 -0
- package/demo/routes/docs.js +18 -0
- package/demo/routes/health.js +35 -0
- package/demo/routes/index.js +54 -0
- package/demo/routes/orders/index.js +6 -0
- package/demo/routes/orders/order_items/index.js +7 -0
- package/demo/routes/orders/payments/index.js +7 -0
- package/demo/routes/orders/shipments/index.js +7 -0
- package/demo/routes/products/index.js +6 -0
- package/demo/routes/products/product_images/index.js +7 -0
- package/demo/routes/products/product_reviews/index.js +7 -0
- package/demo/routes/products/product_variants/index.js +7 -0
- package/demo/routes/roles/index.js +75 -0
- package/demo/routes/roles/permissions/index.js +47 -0
- package/demo/routes/tenants/index.js +45 -0
- package/demo/routes/users/index.js +45 -0
- package/demo/routes/wishlists/index.js +6 -0
- package/demo/seeds/saas-seed.js +329 -0
- package/docker-compose.yml +61 -0
- package/package.json +120 -113
- package/scripts/demo-create.js +1 -1
- package/skill/SKILL.md +119 -3
- package/src/cli/commands/db-manager.js +134 -0
- package/src/cli/commands/generate.js +106 -60
- package/src/cli/commands/help.js +0 -1
- package/src/cli/generate-route.js +60 -21
- package/src/cli/generate-saas-structure.js +122 -0
- package/src/cli/init/generators.js +6 -0
- package/src/cli/init.js +8 -0
- package/src/cli/main.js +8 -1
- package/src/cli/saas/generate-saas-middleware.js +108 -0
- package/src/cli/saas/generate-saas-migrations.js +480 -0
- package/src/cli/saas/generate-saas-models.js +211 -0
- package/src/cli/saas/generate-saas-openapi.js +419 -0
- package/src/cli/saas/generate-saas-routes.js +435 -0
- package/src/cli/saas/generate-saas-seeds.js +243 -0
- package/src/cli/saas/generate-saas-utils.js +176 -0
- package/src/commons/kafka.js +139 -0
- package/src/commons/model.js +29 -9
- package/src/index.js +2 -0
- package/src/mssql/db.js +41 -3
- package/src/mysql/db.js +3 -0
- package/src/postgres/db.js +6 -0
- package/src/cli/generate-db-manager.js +0 -1573
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Creates an adapter proxy that translates API requests into library adapter calls.
|
|
5
|
+
* Handles adapter-specific table listing queries and delegates CRUD operations.
|
|
6
|
+
*
|
|
7
|
+
* @param {object} db - The library adapter instance (from src/index.js init())
|
|
8
|
+
* @param {string} dbType - The database type (e.g., 'sqlite3', 'mysql', 'postgres')
|
|
9
|
+
* @returns {object} Adapter proxy interface
|
|
10
|
+
*/
|
|
11
|
+
function createAdapterProxy(db, dbType) {
|
|
12
|
+
const type = (dbType || "").toLowerCase();
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Returns the SQL or command to list tables for the given adapter type.
|
|
16
|
+
* @returns {{ sql: string, extract: function }} Query config for table listing
|
|
17
|
+
*/
|
|
18
|
+
function getTableListConfig() {
|
|
19
|
+
switch (type) {
|
|
20
|
+
case "sqlite3":
|
|
21
|
+
return {
|
|
22
|
+
sql: "SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'",
|
|
23
|
+
extract: (rows) => rows.map((r) => r.name),
|
|
24
|
+
};
|
|
25
|
+
case "mysql":
|
|
26
|
+
case "mariadb":
|
|
27
|
+
return {
|
|
28
|
+
sql: "SHOW TABLES",
|
|
29
|
+
extract: (rows) =>
|
|
30
|
+
rows.map((r) => {
|
|
31
|
+
// SHOW TABLES returns rows with a dynamic key like "Tables_in_dbname"
|
|
32
|
+
const keys = Object.keys(r);
|
|
33
|
+
return r[keys[0]];
|
|
34
|
+
}),
|
|
35
|
+
};
|
|
36
|
+
case "postgres":
|
|
37
|
+
case "postgresql":
|
|
38
|
+
case "cockroachdb":
|
|
39
|
+
return {
|
|
40
|
+
sql: "SELECT tablename FROM pg_tables WHERE schemaname='public'",
|
|
41
|
+
extract: (rows) => rows.map((r) => r.tablename),
|
|
42
|
+
};
|
|
43
|
+
case "mssql":
|
|
44
|
+
return {
|
|
45
|
+
sql: "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'",
|
|
46
|
+
extract: (rows) => rows.map((r) => r.TABLE_NAME),
|
|
47
|
+
};
|
|
48
|
+
case "oracle":
|
|
49
|
+
return {
|
|
50
|
+
sql: "SELECT table_name FROM user_tables",
|
|
51
|
+
extract: (rows) => rows.map((r) => r.TABLE_NAME || r.table_name),
|
|
52
|
+
};
|
|
53
|
+
case "mongodb":
|
|
54
|
+
return {
|
|
55
|
+
sql: "listCollections",
|
|
56
|
+
extract: (rows) => {
|
|
57
|
+
if (Array.isArray(rows)) {
|
|
58
|
+
return rows.map((r) => r.name || r);
|
|
59
|
+
}
|
|
60
|
+
return [];
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
case "dynamodb":
|
|
64
|
+
return {
|
|
65
|
+
sql: "ListTables",
|
|
66
|
+
extract: (rows) => {
|
|
67
|
+
if (Array.isArray(rows)) {
|
|
68
|
+
return rows.map((r) => r.TableName || r);
|
|
69
|
+
}
|
|
70
|
+
if (rows && rows.TableNames) {
|
|
71
|
+
return rows.TableNames;
|
|
72
|
+
}
|
|
73
|
+
return [];
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
case "redis":
|
|
77
|
+
return {
|
|
78
|
+
sql: "KEYS *",
|
|
79
|
+
extract: (rows) => {
|
|
80
|
+
if (Array.isArray(rows)) {
|
|
81
|
+
return rows;
|
|
82
|
+
}
|
|
83
|
+
return [];
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
default:
|
|
87
|
+
return {
|
|
88
|
+
sql: "SHOW TABLES",
|
|
89
|
+
extract: (rows) =>
|
|
90
|
+
rows.map((r) => {
|
|
91
|
+
const keys = Object.keys(r);
|
|
92
|
+
return r[keys[0]];
|
|
93
|
+
}),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Returns the SQL to get schema/column info for a table.
|
|
100
|
+
* @param {string} table - Table name
|
|
101
|
+
* @returns {{ sql: string, params: Array, extract: function }}
|
|
102
|
+
*/
|
|
103
|
+
function getSchemaConfig(table) {
|
|
104
|
+
switch (type) {
|
|
105
|
+
case "sqlite3":
|
|
106
|
+
return {
|
|
107
|
+
sql: `PRAGMA table_info("${table.replace(/"/g, '""')}")`,
|
|
108
|
+
params: [],
|
|
109
|
+
extract: (rows) => {
|
|
110
|
+
let pk = null;
|
|
111
|
+
const columns = rows.map((r) => {
|
|
112
|
+
const isPk = r.pk === 1;
|
|
113
|
+
if (isPk) pk = r.name;
|
|
114
|
+
return {
|
|
115
|
+
name: r.name,
|
|
116
|
+
type: r.type || "TEXT",
|
|
117
|
+
nullable: isPk ? false : r.notnull === 0,
|
|
118
|
+
default: r.dflt_value,
|
|
119
|
+
pk: isPk,
|
|
120
|
+
};
|
|
121
|
+
});
|
|
122
|
+
return { columns, pk };
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
case "mysql":
|
|
126
|
+
case "mariadb":
|
|
127
|
+
return {
|
|
128
|
+
sql: `SHOW COLUMNS FROM \`${table.replace(/`/g, "``")}\``,
|
|
129
|
+
params: [],
|
|
130
|
+
extract: (rows) => {
|
|
131
|
+
let pk = null;
|
|
132
|
+
const columns = rows.map((r) => {
|
|
133
|
+
const isPk = r.Key === "PRI";
|
|
134
|
+
if (isPk && !pk) pk = r.Field;
|
|
135
|
+
return {
|
|
136
|
+
name: r.Field,
|
|
137
|
+
type: r.Type,
|
|
138
|
+
nullable: r.Null === "YES",
|
|
139
|
+
default: r.Default,
|
|
140
|
+
pk: isPk,
|
|
141
|
+
};
|
|
142
|
+
});
|
|
143
|
+
return { columns, pk };
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
case "postgres":
|
|
147
|
+
case "postgresql":
|
|
148
|
+
case "cockroachdb":
|
|
149
|
+
return {
|
|
150
|
+
sql: `SELECT c.column_name, c.data_type, c.is_nullable, c.column_default,
|
|
151
|
+
CASE WHEN tc.constraint_type = 'PRIMARY KEY' THEN true ELSE false END as is_pk
|
|
152
|
+
FROM information_schema.columns c
|
|
153
|
+
LEFT JOIN information_schema.key_column_usage kcu
|
|
154
|
+
ON c.table_name = kcu.table_name AND c.column_name = kcu.column_name
|
|
155
|
+
LEFT JOIN information_schema.table_constraints tc
|
|
156
|
+
ON kcu.constraint_name = tc.constraint_name AND tc.constraint_type = 'PRIMARY KEY'
|
|
157
|
+
WHERE c.table_name = '${table.replace(/'/g, "''")}'
|
|
158
|
+
AND c.table_schema = 'public'
|
|
159
|
+
ORDER BY c.ordinal_position`,
|
|
160
|
+
params: [],
|
|
161
|
+
extract: (rows) => {
|
|
162
|
+
let pk = null;
|
|
163
|
+
const columns = rows.map((r) => {
|
|
164
|
+
const isPk = r.is_pk === true || r.is_pk === "true";
|
|
165
|
+
if (isPk && !pk) pk = r.column_name;
|
|
166
|
+
return {
|
|
167
|
+
name: r.column_name,
|
|
168
|
+
type: r.data_type,
|
|
169
|
+
nullable: r.is_nullable === "YES",
|
|
170
|
+
default: r.column_default,
|
|
171
|
+
pk: isPk,
|
|
172
|
+
};
|
|
173
|
+
});
|
|
174
|
+
return { columns, pk };
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
case "mssql":
|
|
178
|
+
return {
|
|
179
|
+
sql: `SELECT c.COLUMN_NAME, c.DATA_TYPE, c.IS_NULLABLE, c.COLUMN_DEFAULT,
|
|
180
|
+
CASE WHEN kcu.COLUMN_NAME IS NOT NULL THEN 1 ELSE 0 END as IS_PK
|
|
181
|
+
FROM INFORMATION_SCHEMA.COLUMNS c
|
|
182
|
+
LEFT JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu
|
|
183
|
+
ON c.TABLE_NAME = kcu.TABLE_NAME AND c.COLUMN_NAME = kcu.COLUMN_NAME
|
|
184
|
+
AND kcu.CONSTRAINT_NAME IN (
|
|
185
|
+
SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
|
|
186
|
+
WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = '${table.replace(/'/g, "''")}'
|
|
187
|
+
)
|
|
188
|
+
WHERE c.TABLE_NAME = '${table.replace(/'/g, "''")}'
|
|
189
|
+
ORDER BY c.ORDINAL_POSITION`,
|
|
190
|
+
params: [],
|
|
191
|
+
extract: (rows) => {
|
|
192
|
+
let pk = null;
|
|
193
|
+
const columns = rows.map((r) => {
|
|
194
|
+
const isPk = r.IS_PK === 1;
|
|
195
|
+
if (isPk && !pk) pk = r.COLUMN_NAME;
|
|
196
|
+
return {
|
|
197
|
+
name: r.COLUMN_NAME,
|
|
198
|
+
type: r.DATA_TYPE,
|
|
199
|
+
nullable: r.IS_NULLABLE === "YES",
|
|
200
|
+
default: r.COLUMN_DEFAULT,
|
|
201
|
+
pk: isPk,
|
|
202
|
+
};
|
|
203
|
+
});
|
|
204
|
+
return { columns, pk };
|
|
205
|
+
},
|
|
206
|
+
};
|
|
207
|
+
case "oracle":
|
|
208
|
+
return {
|
|
209
|
+
sql: `SELECT c.COLUMN_NAME, c.DATA_TYPE, c.NULLABLE, c.DATA_DEFAULT,
|
|
210
|
+
CASE WHEN cc.COLUMN_NAME IS NOT NULL THEN 1 ELSE 0 END as IS_PK
|
|
211
|
+
FROM USER_TAB_COLUMNS c
|
|
212
|
+
LEFT JOIN (
|
|
213
|
+
SELECT cc2.COLUMN_NAME FROM USER_CONS_COLUMNS cc2
|
|
214
|
+
JOIN USER_CONSTRAINTS uc ON cc2.CONSTRAINT_NAME = uc.CONSTRAINT_NAME
|
|
215
|
+
WHERE uc.CONSTRAINT_TYPE = 'P' AND uc.TABLE_NAME = '${table.replace(/'/g, "''").toUpperCase()}'
|
|
216
|
+
) cc ON c.COLUMN_NAME = cc.COLUMN_NAME
|
|
217
|
+
WHERE c.TABLE_NAME = '${table.replace(/'/g, "''").toUpperCase()}'
|
|
218
|
+
ORDER BY c.COLUMN_ID`,
|
|
219
|
+
params: [],
|
|
220
|
+
extract: (rows) => {
|
|
221
|
+
let pk = null;
|
|
222
|
+
const columns = rows.map((r) => {
|
|
223
|
+
const isPk = r.IS_PK === 1;
|
|
224
|
+
if (isPk && !pk) pk = r.COLUMN_NAME;
|
|
225
|
+
return {
|
|
226
|
+
name: r.COLUMN_NAME,
|
|
227
|
+
type: r.DATA_TYPE,
|
|
228
|
+
nullable: r.NULLABLE === "Y",
|
|
229
|
+
default: r.DATA_DEFAULT,
|
|
230
|
+
pk: isPk,
|
|
231
|
+
};
|
|
232
|
+
});
|
|
233
|
+
return { columns, pk };
|
|
234
|
+
},
|
|
235
|
+
};
|
|
236
|
+
case "mongodb":
|
|
237
|
+
// MongoDB doesn't have a fixed schema; return empty columns
|
|
238
|
+
return {
|
|
239
|
+
sql: null,
|
|
240
|
+
params: [],
|
|
241
|
+
extract: () => ({ columns: [], pk: "_id" }),
|
|
242
|
+
};
|
|
243
|
+
case "dynamodb":
|
|
244
|
+
// DynamoDB schema is defined at table creation; return minimal info
|
|
245
|
+
return {
|
|
246
|
+
sql: null,
|
|
247
|
+
params: [],
|
|
248
|
+
extract: () => ({ columns: [], pk: null }),
|
|
249
|
+
};
|
|
250
|
+
case "redis":
|
|
251
|
+
// Redis is key-value; no column schema
|
|
252
|
+
return {
|
|
253
|
+
sql: null,
|
|
254
|
+
params: [],
|
|
255
|
+
extract: () => ({ columns: [], pk: "key" }),
|
|
256
|
+
};
|
|
257
|
+
default:
|
|
258
|
+
return {
|
|
259
|
+
sql: `SHOW COLUMNS FROM \`${table.replace(/`/g, "``")}\``,
|
|
260
|
+
params: [],
|
|
261
|
+
extract: (rows) => {
|
|
262
|
+
let pk = null;
|
|
263
|
+
const columns = rows.map((r) => {
|
|
264
|
+
const isPk = r.Key === "PRI";
|
|
265
|
+
if (isPk && !pk) pk = r.Field;
|
|
266
|
+
return {
|
|
267
|
+
name: r.Field,
|
|
268
|
+
type: r.Type,
|
|
269
|
+
nullable: r.Null === "YES",
|
|
270
|
+
default: r.Default,
|
|
271
|
+
pk: isPk,
|
|
272
|
+
};
|
|
273
|
+
});
|
|
274
|
+
return { columns, pk };
|
|
275
|
+
},
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
return {
|
|
281
|
+
/**
|
|
282
|
+
* Lists all tables in the connected database.
|
|
283
|
+
* @returns {Promise<string[]>} Array of table names
|
|
284
|
+
*/
|
|
285
|
+
async getTables() {
|
|
286
|
+
const config = getTableListConfig();
|
|
287
|
+
const result = await Promise.resolve(db.query(config.sql));
|
|
288
|
+
return config.extract(result);
|
|
289
|
+
},
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Gets the schema (columns and primary key) for a table.
|
|
293
|
+
* @param {string} table - Table name
|
|
294
|
+
* @returns {Promise<{ columns: Array, pk: string|null }>}
|
|
295
|
+
*/
|
|
296
|
+
async getSchema(table) {
|
|
297
|
+
const config = getSchemaConfig(table);
|
|
298
|
+
if (config.sql === null) {
|
|
299
|
+
return config.extract();
|
|
300
|
+
}
|
|
301
|
+
const result = await Promise.resolve(db.query(config.sql, config.params));
|
|
302
|
+
return config.extract(result);
|
|
303
|
+
},
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* Lists rows from a table with optional filtering, sorting, and pagination.
|
|
307
|
+
* Delegates to db.list().
|
|
308
|
+
* @param {string} table - Table name
|
|
309
|
+
* @param {Array} filter - Filter conditions (library format)
|
|
310
|
+
* @param {Array} sort - Sort directives (e.g., ["-name", "id"])
|
|
311
|
+
* @param {number} page - Page number (0-indexed)
|
|
312
|
+
* @param {number} limit - Rows per page
|
|
313
|
+
* @returns {Promise<{ data: Array, count: number }>}
|
|
314
|
+
*/
|
|
315
|
+
async listRows(table, filter = [], sort = [], page = 0, limit = 30) {
|
|
316
|
+
const result = await Promise.resolve(
|
|
317
|
+
db.list(table, filter, sort, null, page, limit),
|
|
318
|
+
);
|
|
319
|
+
return result;
|
|
320
|
+
},
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Inserts a new row into a table.
|
|
324
|
+
* Delegates to db.insert().
|
|
325
|
+
* @param {string} table - Table name
|
|
326
|
+
* @param {object} data - Row data object
|
|
327
|
+
* @returns {Promise<{ rows: number, message: string, type: string, id?: number }>}
|
|
328
|
+
*/
|
|
329
|
+
async insertRow(table, data) {
|
|
330
|
+
const result = await Promise.resolve(db.insert(table, data));
|
|
331
|
+
return result;
|
|
332
|
+
},
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* Upserts a row (insert or update on conflict).
|
|
336
|
+
* Delegates to db.upsert().
|
|
337
|
+
* @param {string} table - Table name
|
|
338
|
+
* @param {object} data - Row data object
|
|
339
|
+
* @param {string[]} uniqueKeys - Columns that define uniqueness
|
|
340
|
+
* @returns {Promise<{ rows: number, message: string, type: string, id?: number }>}
|
|
341
|
+
*/
|
|
342
|
+
async upsertRow(table, data, uniqueKeys = []) {
|
|
343
|
+
const result = await Promise.resolve(db.upsert(table, data, uniqueKeys));
|
|
344
|
+
return result;
|
|
345
|
+
},
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* Removes rows from a table matching the given filter.
|
|
349
|
+
* Delegates to db.remove().
|
|
350
|
+
* @param {string} table - Table name
|
|
351
|
+
* @param {Array} filter - Filter conditions (library format)
|
|
352
|
+
* @returns {Promise<{ message: string }>}
|
|
353
|
+
*/
|
|
354
|
+
async removeRows(table, filter) {
|
|
355
|
+
const result = await Promise.resolve(db.remove(table, filter));
|
|
356
|
+
return result;
|
|
357
|
+
},
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
module.exports = createAdapterProxy;
|
|
Binary file
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
-- CockroachDB seed data for DB Manager demo
|
|
2
|
+
-- Creates users and products tables with sample data
|
|
3
|
+
|
|
4
|
+
DROP TABLE IF EXISTS users;
|
|
5
|
+
DROP TABLE IF EXISTS products;
|
|
6
|
+
|
|
7
|
+
CREATE TABLE users (
|
|
8
|
+
id SERIAL PRIMARY KEY,
|
|
9
|
+
name VARCHAR(255) NOT NULL,
|
|
10
|
+
email VARCHAR(255) NOT NULL,
|
|
11
|
+
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
CREATE TABLE products (
|
|
15
|
+
id SERIAL PRIMARY KEY,
|
|
16
|
+
name VARCHAR(255) NOT NULL,
|
|
17
|
+
price NUMERIC(10,2) NOT NULL DEFAULT 0,
|
|
18
|
+
stock INTEGER NOT NULL DEFAULT 0,
|
|
19
|
+
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');
|
|
23
|
+
INSERT INTO users (name, email) VALUES ('Bob', 'bob@example.com');
|
|
24
|
+
INSERT INTO users (name, email) VALUES ('Charlie', 'charlie@example.com');
|
|
25
|
+
INSERT INTO users (name, email) VALUES ('Diana', 'diana@example.com');
|
|
26
|
+
INSERT INTO users (name, email) VALUES ('Eve', 'eve@example.com');
|
|
27
|
+
|
|
28
|
+
INSERT INTO products (name, price, stock) VALUES ('Widget', 9.99, 100);
|
|
29
|
+
INSERT INTO products (name, price, stock) VALUES ('Gadget', 24.99, 50);
|
|
30
|
+
INSERT INTO products (name, price, stock) VALUES ('Doohickey', 4.99, 200);
|
|
31
|
+
INSERT INTO products (name, price, stock) VALUES ('Thingamajig', 49.99, 25);
|
|
32
|
+
INSERT INTO products (name, price, stock) VALUES ('Whatchamacallit', 14.99, 75);
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
-- MSSQL seed data for DB Manager demo
|
|
2
|
+
-- Creates users and products tables with sample data
|
|
3
|
+
|
|
4
|
+
IF OBJECT_ID('dbo.users', 'U') IS NOT NULL DROP TABLE dbo.users;
|
|
5
|
+
IF OBJECT_ID('dbo.products', 'U') IS NOT NULL DROP TABLE dbo.products;
|
|
6
|
+
|
|
7
|
+
CREATE TABLE users (
|
|
8
|
+
id INT IDENTITY(1,1) PRIMARY KEY,
|
|
9
|
+
name NVARCHAR(255) NOT NULL,
|
|
10
|
+
email NVARCHAR(255) NOT NULL,
|
|
11
|
+
created_at DATETIME2 NOT NULL DEFAULT GETDATE()
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
CREATE TABLE products (
|
|
15
|
+
id INT IDENTITY(1,1) PRIMARY KEY,
|
|
16
|
+
name NVARCHAR(255) NOT NULL,
|
|
17
|
+
price DECIMAL(10,2) NOT NULL DEFAULT 0,
|
|
18
|
+
stock INT NOT NULL DEFAULT 0,
|
|
19
|
+
created_at DATETIME2 NOT NULL DEFAULT GETDATE()
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');
|
|
23
|
+
INSERT INTO users (name, email) VALUES ('Bob', 'bob@example.com');
|
|
24
|
+
INSERT INTO users (name, email) VALUES ('Charlie', 'charlie@example.com');
|
|
25
|
+
INSERT INTO users (name, email) VALUES ('Diana', 'diana@example.com');
|
|
26
|
+
INSERT INTO users (name, email) VALUES ('Eve', 'eve@example.com');
|
|
27
|
+
|
|
28
|
+
INSERT INTO products (name, price, stock) VALUES ('Widget', 9.99, 100);
|
|
29
|
+
INSERT INTO products (name, price, stock) VALUES ('Gadget', 24.99, 50);
|
|
30
|
+
INSERT INTO products (name, price, stock) VALUES ('Doohickey', 4.99, 200);
|
|
31
|
+
INSERT INTO products (name, price, stock) VALUES ('Thingamajig', 49.99, 25);
|
|
32
|
+
INSERT INTO products (name, price, stock) VALUES ('Whatchamacallit', 14.99, 75);
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
-- MySQL seed data for DB Manager demo
|
|
2
|
+
-- Creates users and products tables with sample data
|
|
3
|
+
|
|
4
|
+
DROP TABLE IF EXISTS users;
|
|
5
|
+
DROP TABLE IF EXISTS products;
|
|
6
|
+
|
|
7
|
+
CREATE TABLE users (
|
|
8
|
+
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
9
|
+
name VARCHAR(255) NOT NULL,
|
|
10
|
+
email VARCHAR(255) NOT NULL,
|
|
11
|
+
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
CREATE TABLE products (
|
|
15
|
+
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
16
|
+
name VARCHAR(255) NOT NULL,
|
|
17
|
+
price DECIMAL(10,2) NOT NULL DEFAULT 0,
|
|
18
|
+
stock INT NOT NULL DEFAULT 0,
|
|
19
|
+
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');
|
|
23
|
+
INSERT INTO users (name, email) VALUES ('Bob', 'bob@example.com');
|
|
24
|
+
INSERT INTO users (name, email) VALUES ('Charlie', 'charlie@example.com');
|
|
25
|
+
INSERT INTO users (name, email) VALUES ('Diana', 'diana@example.com');
|
|
26
|
+
INSERT INTO users (name, email) VALUES ('Eve', 'eve@example.com');
|
|
27
|
+
|
|
28
|
+
INSERT INTO products (name, price, stock) VALUES ('Widget', 9.99, 100);
|
|
29
|
+
INSERT INTO products (name, price, stock) VALUES ('Gadget', 24.99, 50);
|
|
30
|
+
INSERT INTO products (name, price, stock) VALUES ('Doohickey', 4.99, 200);
|
|
31
|
+
INSERT INTO products (name, price, stock) VALUES ('Thingamajig', 49.99, 25);
|
|
32
|
+
INSERT INTO products (name, price, stock) VALUES ('Whatchamacallit', 14.99, 75);
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
-- Oracle seed data for DB Manager demo
|
|
2
|
+
-- Creates users and products tables with sample data
|
|
3
|
+
|
|
4
|
+
BEGIN
|
|
5
|
+
EXECUTE IMMEDIATE 'DROP TABLE users CASCADE CONSTRAINTS';
|
|
6
|
+
EXCEPTION
|
|
7
|
+
WHEN OTHERS THEN NULL;
|
|
8
|
+
END;
|
|
9
|
+
/
|
|
10
|
+
|
|
11
|
+
BEGIN
|
|
12
|
+
EXECUTE IMMEDIATE 'DROP TABLE products CASCADE CONSTRAINTS';
|
|
13
|
+
EXCEPTION
|
|
14
|
+
WHEN OTHERS THEN NULL;
|
|
15
|
+
END;
|
|
16
|
+
/
|
|
17
|
+
|
|
18
|
+
CREATE TABLE users (
|
|
19
|
+
id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
20
|
+
name VARCHAR2(255) NOT NULL,
|
|
21
|
+
email VARCHAR2(255) NOT NULL,
|
|
22
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
CREATE TABLE products (
|
|
26
|
+
id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
27
|
+
name VARCHAR2(255) NOT NULL,
|
|
28
|
+
price NUMBER(10,2) DEFAULT 0 NOT NULL,
|
|
29
|
+
stock NUMBER DEFAULT 0 NOT NULL,
|
|
30
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');
|
|
34
|
+
INSERT INTO users (name, email) VALUES ('Bob', 'bob@example.com');
|
|
35
|
+
INSERT INTO users (name, email) VALUES ('Charlie', 'charlie@example.com');
|
|
36
|
+
INSERT INTO users (name, email) VALUES ('Diana', 'diana@example.com');
|
|
37
|
+
INSERT INTO users (name, email) VALUES ('Eve', 'eve@example.com');
|
|
38
|
+
|
|
39
|
+
INSERT INTO products (name, price, stock) VALUES ('Widget', 9.99, 100);
|
|
40
|
+
INSERT INTO products (name, price, stock) VALUES ('Gadget', 24.99, 50);
|
|
41
|
+
INSERT INTO products (name, price, stock) VALUES ('Doohickey', 4.99, 200);
|
|
42
|
+
INSERT INTO products (name, price, stock) VALUES ('Thingamajig', 49.99, 25);
|
|
43
|
+
INSERT INTO products (name, price, stock) VALUES ('Whatchamacallit', 14.99, 75);
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
-- PostgreSQL seed data for DB Manager demo
|
|
2
|
+
-- Creates users and products tables with sample data
|
|
3
|
+
|
|
4
|
+
DROP TABLE IF EXISTS users;
|
|
5
|
+
DROP TABLE IF EXISTS products;
|
|
6
|
+
|
|
7
|
+
CREATE TABLE users (
|
|
8
|
+
id SERIAL PRIMARY KEY,
|
|
9
|
+
name VARCHAR(255) NOT NULL,
|
|
10
|
+
email VARCHAR(255) NOT NULL,
|
|
11
|
+
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
CREATE TABLE products (
|
|
15
|
+
id SERIAL PRIMARY KEY,
|
|
16
|
+
name VARCHAR(255) NOT NULL,
|
|
17
|
+
price NUMERIC(10,2) NOT NULL DEFAULT 0,
|
|
18
|
+
stock INTEGER NOT NULL DEFAULT 0,
|
|
19
|
+
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');
|
|
23
|
+
INSERT INTO users (name, email) VALUES ('Bob', 'bob@example.com');
|
|
24
|
+
INSERT INTO users (name, email) VALUES ('Charlie', 'charlie@example.com');
|
|
25
|
+
INSERT INTO users (name, email) VALUES ('Diana', 'diana@example.com');
|
|
26
|
+
INSERT INTO users (name, email) VALUES ('Eve', 'eve@example.com');
|
|
27
|
+
|
|
28
|
+
INSERT INTO products (name, price, stock) VALUES ('Widget', 9.99, 100);
|
|
29
|
+
INSERT INTO products (name, price, stock) VALUES ('Gadget', 24.99, 50);
|
|
30
|
+
INSERT INTO products (name, price, stock) VALUES ('Doohickey', 4.99, 200);
|
|
31
|
+
INSERT INTO products (name, price, stock) VALUES ('Thingamajig', 49.99, 25);
|
|
32
|
+
INSERT INTO products (name, price, stock) VALUES ('Whatchamacallit', 14.99, 75);
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
-- SQLite3 seed data for DB Manager demo
|
|
2
|
+
-- Creates users and products tables with sample data
|
|
3
|
+
|
|
4
|
+
DROP TABLE IF EXISTS users;
|
|
5
|
+
DROP TABLE IF EXISTS products;
|
|
6
|
+
|
|
7
|
+
CREATE TABLE users (
|
|
8
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
9
|
+
name TEXT NOT NULL,
|
|
10
|
+
email TEXT NOT NULL,
|
|
11
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
CREATE TABLE products (
|
|
15
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
16
|
+
name TEXT NOT NULL,
|
|
17
|
+
price REAL NOT NULL DEFAULT 0,
|
|
18
|
+
stock INTEGER NOT NULL DEFAULT 0,
|
|
19
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');
|
|
23
|
+
INSERT INTO users (name, email) VALUES ('Bob', 'bob@example.com');
|
|
24
|
+
INSERT INTO users (name, email) VALUES ('Charlie', 'charlie@example.com');
|
|
25
|
+
INSERT INTO users (name, email) VALUES ('Diana', 'diana@example.com');
|
|
26
|
+
INSERT INTO users (name, email) VALUES ('Eve', 'eve@example.com');
|
|
27
|
+
|
|
28
|
+
INSERT INTO products (name, price, stock) VALUES ('Widget', 9.99, 100);
|
|
29
|
+
INSERT INTO products (name, price, stock) VALUES ('Gadget', 24.99, 50);
|
|
30
|
+
INSERT INTO products (name, price, stock) VALUES ('Doohickey', 4.99, 200);
|
|
31
|
+
INSERT INTO products (name, price, stock) VALUES ('Thingamajig', 49.99, 25);
|
|
32
|
+
INSERT INTO products (name, price, stock) VALUES ('Whatchamacallit', 14.99, 75);
|