db-model-router 1.0.5 → 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.
Files changed (136) hide show
  1. package/README.md +150 -11
  2. package/TODO.md +0 -14
  3. package/db-manager/.dbmanager.sqlite +0 -0
  4. package/db-manager/README.md +223 -0
  5. package/db-manager/adapter-proxy.js +361 -0
  6. package/db-manager/demo/cockroachdb.env +6 -0
  7. package/db-manager/demo/demo.sqlite +0 -0
  8. package/db-manager/demo/dynamodb.env +7 -0
  9. package/db-manager/demo/mongodb.env +4 -0
  10. package/db-manager/demo/mssql.env +6 -0
  11. package/db-manager/demo/mysql.env +6 -0
  12. package/db-manager/demo/oracle.env +6 -0
  13. package/db-manager/demo/postgres.env +6 -0
  14. package/db-manager/demo/redis.env +4 -0
  15. package/db-manager/demo/seeds/cockroachdb.sql +32 -0
  16. package/db-manager/demo/seeds/mssql.sql +32 -0
  17. package/db-manager/demo/seeds/mysql.sql +32 -0
  18. package/db-manager/demo/seeds/oracle.sql +43 -0
  19. package/db-manager/demo/seeds/postgres.sql +32 -0
  20. package/db-manager/demo/seeds/sqlite3.sql +32 -0
  21. package/db-manager/demo/sqlite3.env +2 -0
  22. package/db-manager/metadata-db.js +170 -0
  23. package/db-manager/public/.gitkeep +1 -0
  24. package/db-manager/public/css/style.css +1413 -0
  25. package/db-manager/public/js/app.js +1370 -0
  26. package/db-manager/routes/api.js +388 -0
  27. package/db-manager/routes/views.js +61 -0
  28. package/db-manager/server.js +39 -0
  29. package/db-manager/utils/build-filter-config.js +18 -0
  30. package/db-manager/utils/csv-export.js +59 -0
  31. package/db-manager/utils/export-filename.js +39 -0
  32. package/db-manager/utils/filter-tables.js +20 -0
  33. package/db-manager/utils/parse-filters.js +93 -0
  34. package/db-manager/utils/sort-state.js +35 -0
  35. package/db-manager/views/.gitkeep +1 -0
  36. package/db-manager/views/dashboard.ejs +53 -0
  37. package/db-manager/views/history.ejs +52 -0
  38. package/db-manager/views/index.ejs +35 -0
  39. package/db-manager/views/layout.ejs +31 -0
  40. package/db-manager/views/partials/data-panel.ejs +74 -0
  41. package/db-manager/views/partials/header.ejs +36 -0
  42. package/db-manager/views/partials/sidebar.ejs +30 -0
  43. package/db-manager/views/query.ejs +58 -0
  44. package/dbmr.schema.json +23 -45
  45. package/demo/.env.example +1 -0
  46. package/demo/app.js +3 -1
  47. package/demo/commons/db.js +11 -0
  48. package/demo/commons/migrate.js +3 -0
  49. package/demo/commons/modules.js +18 -0
  50. package/demo/commons/password.js +36 -0
  51. package/demo/commons/webhook.js +81 -0
  52. package/demo/dbmr.schema.json +22 -46
  53. package/demo/middleware/authenticate.js +14 -0
  54. package/demo/middleware/hasPermission.js +30 -0
  55. package/demo/middleware/tenantIsolation.js +17 -0
  56. package/demo/migrations/20260509170349_create_saas_tables.sql +69 -0
  57. package/demo/migrations/{20260430155809_create_tables.sql → 20260509170349_create_tables.sql} +11 -25
  58. package/demo/models/addresses.js +5 -3
  59. package/demo/models/cart_items.js +5 -3
  60. package/demo/models/carts.js +5 -3
  61. package/demo/models/categories.js +5 -3
  62. package/demo/models/coupons.js +5 -3
  63. package/demo/models/index.js +43 -0
  64. package/demo/models/order_items.js +4 -2
  65. package/demo/models/orders.js +5 -3
  66. package/demo/models/payments.js +5 -3
  67. package/demo/models/product_images.js +4 -2
  68. package/demo/models/product_reviews.js +5 -3
  69. package/demo/models/product_variants.js +5 -3
  70. package/demo/models/products.js +5 -3
  71. package/demo/models/role_permissions.js +17 -0
  72. package/demo/models/roles.js +17 -0
  73. package/demo/models/shipments.js +5 -3
  74. package/demo/models/tenants.js +18 -0
  75. package/demo/models/users.js +12 -8
  76. package/demo/models/webhook_logs.js +22 -0
  77. package/demo/models/webhooks.js +19 -0
  78. package/demo/models/wishlists.js +4 -2
  79. package/demo/openapi.json +1744 -616
  80. package/demo/package-lock.json +24 -24
  81. package/demo/package.json +9 -0
  82. package/demo/routes/{addresses.js → addresses/index.js} +1 -1
  83. package/demo/routes/auth/index.js +55 -0
  84. package/demo/routes/carts/{cart_items.js → cart_items/index.js} +1 -1
  85. package/demo/routes/{carts.js → carts/index.js} +1 -1
  86. package/demo/routes/{categories.js → categories/index.js} +1 -1
  87. package/demo/routes/{coupons.js → coupons/index.js} +1 -1
  88. package/demo/routes/index.js +39 -24
  89. package/demo/routes/{orders.js → orders/index.js} +1 -1
  90. package/demo/routes/orders/{order_items.js → order_items/index.js} +1 -1
  91. package/demo/routes/orders/{payments.js → payments/index.js} +1 -1
  92. package/demo/routes/orders/{shipments.js → shipments/index.js} +1 -1
  93. package/demo/routes/{products.js → products/index.js} +1 -1
  94. package/demo/routes/products/{product_images.js → product_images/index.js} +1 -1
  95. package/demo/routes/products/{product_reviews.js → product_reviews/index.js} +1 -1
  96. package/demo/routes/products/{product_variants.js → product_variants/index.js} +1 -1
  97. package/demo/routes/roles/index.js +75 -0
  98. package/demo/routes/roles/permissions/index.js +47 -0
  99. package/demo/routes/tenants/index.js +45 -0
  100. package/demo/routes/users/index.js +45 -0
  101. package/demo/routes/{wishlists.js → wishlists/index.js} +1 -1
  102. package/demo/seeds/saas-seed.js +329 -0
  103. package/docker-compose.yml +61 -0
  104. package/package.json +120 -113
  105. package/scripts/demo-create.js +1 -1
  106. package/skill/SKILL.md +119 -3
  107. package/src/cli/commands/db-manager.js +134 -0
  108. package/src/cli/commands/generate.js +112 -43
  109. package/src/cli/commands/help.js +0 -1
  110. package/src/cli/diff-engine.js +2 -1
  111. package/src/cli/generate-model.js +9 -4
  112. package/src/cli/generate-openapi.js +40 -13
  113. package/src/cli/generate-route.js +61 -22
  114. package/src/cli/generate-saas-structure.js +122 -0
  115. package/src/cli/init/generators.js +42 -30
  116. package/src/cli/init.js +8 -0
  117. package/src/cli/main.js +8 -1
  118. package/src/cli/saas/generate-saas-middleware.js +108 -0
  119. package/src/cli/saas/generate-saas-migrations.js +480 -0
  120. package/src/cli/saas/generate-saas-models.js +211 -0
  121. package/src/cli/saas/generate-saas-openapi.js +419 -0
  122. package/src/cli/saas/generate-saas-routes.js +435 -0
  123. package/src/cli/saas/generate-saas-seeds.js +243 -0
  124. package/src/cli/saas/generate-saas-utils.js +176 -0
  125. package/src/commons/kafka.js +139 -0
  126. package/src/commons/model.js +29 -9
  127. package/src/index.js +2 -0
  128. package/src/mssql/db.js +41 -3
  129. package/src/mysql/db.js +3 -0
  130. package/src/postgres/db.js +6 -0
  131. package/src/sqlite3/db.js +11 -0
  132. package/demo/docs/llm.md +0 -197
  133. package/demo/llms.txt +0 -70
  134. package/demo/routes/users.js +0 -6
  135. package/src/cli/commands/generate-llm-docs.js +0 -418
  136. /package/demo/migrations/{20260430155808_create_migrations_table.sql → 20260509170349_create_migrations_table.sql} +0 -0
@@ -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;
@@ -0,0 +1,6 @@
1
+ DB_TYPE=cockroachdb
2
+ DB_HOST=localhost
3
+ DB_PORT=26257
4
+ DB_NAME=defaultdb
5
+ DB_USER=root
6
+ DB_PASS=
Binary file
@@ -0,0 +1,7 @@
1
+ DB_TYPE=dynamodb
2
+ DB_HOST=localhost
3
+ DB_PORT=8000
4
+ DB_NAME=us-east-1
5
+ AWS_REGION=us-east-1
6
+ AWS_ACCESS_KEY_ID=fakeKey
7
+ AWS_SECRET_ACCESS_KEY=fakeSecret
@@ -0,0 +1,4 @@
1
+ DB_TYPE=mongodb
2
+ DB_HOST=localhost
3
+ DB_PORT=27017
4
+ DB_NAME=test_db
@@ -0,0 +1,6 @@
1
+ DB_TYPE=mssql
2
+ DB_HOST=localhost
3
+ DB_PORT=1433
4
+ DB_NAME=master
5
+ DB_USER=sa
6
+ DB_PASS=Password123!
@@ -0,0 +1,6 @@
1
+ DB_TYPE=mysql
2
+ DB_HOST=localhost
3
+ DB_PORT=3306
4
+ DB_NAME=test_db
5
+ DB_USER=root
6
+ DB_PASS=password
@@ -0,0 +1,6 @@
1
+ DB_TYPE=oracle
2
+ DB_HOST=localhost
3
+ DB_PORT=1521
4
+ DB_NAME=FREEPDB1
5
+ DB_USER=system
6
+ DB_PASS=oracle
@@ -0,0 +1,6 @@
1
+ DB_TYPE=postgres
2
+ DB_HOST=localhost
3
+ DB_PORT=5432
4
+ DB_NAME=test_db
5
+ DB_USER=postgres
6
+ DB_PASS=password
@@ -0,0 +1,4 @@
1
+ DB_TYPE=redis
2
+ DB_HOST=localhost
3
+ DB_PORT=6379
4
+ DB_NAME=0
@@ -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);
@@ -0,0 +1,2 @@
1
+ DB_TYPE=sqlite3
2
+ DB_NAME=./db-manager/demo/demo.sqlite