xansql 1.0.0
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/Types/fields/Array.d.ts +7 -0
- package/Types/fields/Array.js +6 -0
- package/Types/fields/Array.js.map +1 -0
- package/Types/fields/Array.mjs +6 -0
- package/Types/fields/Array.mjs.map +1 -0
- package/Types/fields/Boolean.d.ts +8 -0
- package/Types/fields/Boolean.js +11 -0
- package/Types/fields/Boolean.js.map +1 -0
- package/Types/fields/Boolean.mjs +11 -0
- package/Types/fields/Boolean.mjs.map +1 -0
- package/Types/fields/Date.d.ts +10 -0
- package/Types/fields/Date.js +22 -0
- package/Types/fields/Date.js.map +1 -0
- package/Types/fields/Date.mjs +22 -0
- package/Types/fields/Date.mjs.map +1 -0
- package/Types/fields/Enum.d.ts +8 -0
- package/Types/fields/Enum.js +10 -0
- package/Types/fields/Enum.js.map +1 -0
- package/Types/fields/Enum.mjs +10 -0
- package/Types/fields/Enum.mjs.map +1 -0
- package/Types/fields/File.d.ts +7 -0
- package/Types/fields/File.js +6 -0
- package/Types/fields/File.js.map +1 -0
- package/Types/fields/File.mjs +6 -0
- package/Types/fields/File.mjs.map +1 -0
- package/Types/fields/IDField.d.ts +6 -0
- package/Types/fields/IDField.js +2 -0
- package/Types/fields/IDField.js.map +1 -0
- package/Types/fields/IDField.mjs +2 -0
- package/Types/fields/IDField.mjs.map +1 -0
- package/Types/fields/Number.d.ts +8 -0
- package/Types/fields/Number.js +11 -0
- package/Types/fields/Number.js.map +1 -0
- package/Types/fields/Number.mjs +11 -0
- package/Types/fields/Number.mjs.map +1 -0
- package/Types/fields/Object.d.ts +8 -0
- package/Types/fields/Object.js +11 -0
- package/Types/fields/Object.js.map +1 -0
- package/Types/fields/Object.mjs +11 -0
- package/Types/fields/Object.mjs.map +1 -0
- package/Types/fields/Record.d.ts +8 -0
- package/Types/fields/Record.js +11 -0
- package/Types/fields/Record.js.map +1 -0
- package/Types/fields/Record.mjs +11 -0
- package/Types/fields/Record.mjs.map +1 -0
- package/Types/fields/Schema.d.ts +16 -0
- package/Types/fields/Schema.js +34 -0
- package/Types/fields/Schema.js.map +1 -0
- package/Types/fields/Schema.mjs +34 -0
- package/Types/fields/Schema.mjs.map +1 -0
- package/Types/fields/String.d.ts +10 -0
- package/Types/fields/String.js +20 -0
- package/Types/fields/String.js.map +1 -0
- package/Types/fields/String.mjs +20 -0
- package/Types/fields/String.mjs.map +1 -0
- package/Types/fields/Tuple.d.ts +8 -0
- package/Types/fields/Tuple.js +11 -0
- package/Types/fields/Tuple.js.map +1 -0
- package/Types/fields/Tuple.mjs +11 -0
- package/Types/fields/Tuple.mjs.map +1 -0
- package/Types/fields/Union.d.ts +8 -0
- package/Types/fields/Union.js +11 -0
- package/Types/fields/Union.js.map +1 -0
- package/Types/fields/Union.mjs +11 -0
- package/Types/fields/Union.mjs.map +1 -0
- package/Types/index.d.ts +56 -0
- package/Types/index.js +129 -0
- package/Types/index.js.map +1 -0
- package/Types/index.mjs +129 -0
- package/Types/index.mjs.map +1 -0
- package/Types/types.d.ts +20 -0
- package/core/ExcuteMeta.d.ts +11 -0
- package/core/ExcuteMeta.js +22 -0
- package/core/ExcuteMeta.js.map +1 -0
- package/core/ExcuteMeta.mjs +22 -0
- package/core/ExcuteMeta.mjs.map +1 -0
- package/core/Xansql.d.ts +46 -0
- package/core/Xansql.js +132 -0
- package/core/Xansql.js.map +1 -0
- package/core/Xansql.mjs +132 -0
- package/core/Xansql.mjs.map +1 -0
- package/core/XansqlError.js +11 -0
- package/core/XansqlError.js.map +1 -0
- package/core/XansqlError.mjs +11 -0
- package/core/XansqlError.mjs.map +1 -0
- package/core/XansqlResult.d.ts +12 -0
- package/core/XansqlResult.js +32 -0
- package/core/XansqlResult.js.map +1 -0
- package/core/XansqlResult.mjs +32 -0
- package/core/XansqlResult.mjs.map +1 -0
- package/core/classes/EventManager.d.ts +72 -0
- package/core/classes/EventManager.js +21 -0
- package/core/classes/EventManager.js.map +1 -0
- package/core/classes/EventManager.mjs +21 -0
- package/core/classes/EventManager.mjs.map +1 -0
- package/core/classes/ForeignInfo.js +51 -0
- package/core/classes/ForeignInfo.js.map +1 -0
- package/core/classes/ForeignInfo.mjs +51 -0
- package/core/classes/ForeignInfo.mjs.map +1 -0
- package/core/classes/Migration/ForeingMigration.d.ts +12 -0
- package/core/classes/Migration/ForeingMigration.js +52 -0
- package/core/classes/Migration/ForeingMigration.js.map +1 -0
- package/core/classes/Migration/ForeingMigration.mjs +52 -0
- package/core/classes/Migration/ForeingMigration.mjs.map +1 -0
- package/core/classes/Migration/IndexMigration.d.ts +12 -0
- package/core/classes/Migration/IndexMigration.js +49 -0
- package/core/classes/Migration/IndexMigration.js.map +1 -0
- package/core/classes/Migration/IndexMigration.mjs +49 -0
- package/core/classes/Migration/IndexMigration.mjs.map +1 -0
- package/core/classes/Migration/TableMigration.d.ts +33 -0
- package/core/classes/Migration/TableMigration.js +215 -0
- package/core/classes/Migration/TableMigration.js.map +1 -0
- package/core/classes/Migration/TableMigration.mjs +215 -0
- package/core/classes/Migration/TableMigration.mjs.map +1 -0
- package/core/classes/Migration/index.d.ts +12 -0
- package/core/classes/Migration/index.js +189 -0
- package/core/classes/Migration/index.js.map +1 -0
- package/core/classes/Migration/index.mjs +189 -0
- package/core/classes/Migration/index.mjs.map +1 -0
- package/core/classes/ModelFormatter.js +166 -0
- package/core/classes/ModelFormatter.js.map +1 -0
- package/core/classes/ModelFormatter.mjs +166 -0
- package/core/classes/ModelFormatter.mjs.map +1 -0
- package/core/classes/TypesGenerator.d.ts +13 -0
- package/core/classes/TypesGenerator.js +170 -0
- package/core/classes/TypesGenerator.js.map +1 -0
- package/core/classes/TypesGenerator.mjs +170 -0
- package/core/classes/TypesGenerator.mjs.map +1 -0
- package/core/classes/XansqlConfig.js +33 -0
- package/core/classes/XansqlConfig.js.map +1 -0
- package/core/classes/XansqlConfig.mjs +33 -0
- package/core/classes/XansqlConfig.mjs.map +1 -0
- package/core/classes/XansqlFetch.js +304 -0
- package/core/classes/XansqlFetch.js.map +1 -0
- package/core/classes/XansqlFetch.mjs +304 -0
- package/core/classes/XansqlFetch.mjs.map +1 -0
- package/core/classes/XansqlTransaction.d.ts +13 -0
- package/core/classes/XansqlTransaction.js +46 -0
- package/core/classes/XansqlTransaction.js.map +1 -0
- package/core/classes/XansqlTransaction.mjs +46 -0
- package/core/classes/XansqlTransaction.mjs.map +1 -0
- package/core/type.d.ts +117 -0
- package/index.d.ts +3 -0
- package/index.js +1 -0
- package/index.js.map +1 -0
- package/index.mjs +1 -0
- package/index.mjs.map +1 -0
- package/model/Args/RelationExcuteArgs.js +5 -0
- package/model/Args/RelationExcuteArgs.js.map +1 -0
- package/model/Args/RelationExcuteArgs.mjs +5 -0
- package/model/Args/RelationExcuteArgs.mjs.map +1 -0
- package/model/Args/WhereArgs.js +226 -0
- package/model/Args/WhereArgs.js.map +1 -0
- package/model/Args/WhereArgs.mjs +226 -0
- package/model/Args/WhereArgs.mjs.map +1 -0
- package/model/Base.d.ts +26 -0
- package/model/Base.js +64 -0
- package/model/Base.js.map +1 -0
- package/model/Base.mjs +64 -0
- package/model/Base.mjs.map +1 -0
- package/model/Executer/Aggregate/SelectArgs.js +59 -0
- package/model/Executer/Aggregate/SelectArgs.js.map +1 -0
- package/model/Executer/Aggregate/SelectArgs.mjs +59 -0
- package/model/Executer/Aggregate/SelectArgs.mjs.map +1 -0
- package/model/Executer/Aggregate/index.js +59 -0
- package/model/Executer/Aggregate/index.js.map +1 -0
- package/model/Executer/Aggregate/index.mjs +59 -0
- package/model/Executer/Aggregate/index.mjs.map +1 -0
- package/model/Executer/Create/CreateDataArgs.js +145 -0
- package/model/Executer/Create/CreateDataArgs.js.map +1 -0
- package/model/Executer/Create/CreateDataArgs.mjs +145 -0
- package/model/Executer/Create/CreateDataArgs.mjs.map +1 -0
- package/model/Executer/Create/index.js +101 -0
- package/model/Executer/Create/index.js.map +1 -0
- package/model/Executer/Create/index.mjs +101 -0
- package/model/Executer/Create/index.mjs.map +1 -0
- package/model/Executer/Delete/index.js +112 -0
- package/model/Executer/Delete/index.js.map +1 -0
- package/model/Executer/Delete/index.mjs +112 -0
- package/model/Executer/Delete/index.mjs.map +1 -0
- package/model/Executer/Find/DistinctArgs.js +32 -0
- package/model/Executer/Find/DistinctArgs.js.map +1 -0
- package/model/Executer/Find/DistinctArgs.mjs +32 -0
- package/model/Executer/Find/DistinctArgs.mjs.map +1 -0
- package/model/Executer/Find/LimitArgs.js +31 -0
- package/model/Executer/Find/LimitArgs.js.map +1 -0
- package/model/Executer/Find/LimitArgs.mjs +31 -0
- package/model/Executer/Find/LimitArgs.mjs.map +1 -0
- package/model/Executer/Find/OrderByArgs.js +29 -0
- package/model/Executer/Find/OrderByArgs.js.map +1 -0
- package/model/Executer/Find/OrderByArgs.mjs +29 -0
- package/model/Executer/Find/OrderByArgs.mjs.map +1 -0
- package/model/Executer/Find/SelectArgs.js +119 -0
- package/model/Executer/Find/SelectArgs.js.map +1 -0
- package/model/Executer/Find/SelectArgs.mjs +119 -0
- package/model/Executer/Find/SelectArgs.mjs.map +1 -0
- package/model/Executer/Find/index.js +338 -0
- package/model/Executer/Find/index.js.map +1 -0
- package/model/Executer/Find/index.mjs +338 -0
- package/model/Executer/Find/index.mjs.map +1 -0
- package/model/Executer/Update/UpdateDataArgs.js +124 -0
- package/model/Executer/Update/UpdateDataArgs.js.map +1 -0
- package/model/Executer/Update/UpdateDataArgs.mjs +124 -0
- package/model/Executer/Update/UpdateDataArgs.mjs.map +1 -0
- package/model/Executer/Update/index.js +207 -0
- package/model/Executer/Update/index.js.map +1 -0
- package/model/Executer/Update/index.mjs +207 -0
- package/model/Executer/Update/index.mjs.map +1 -0
- package/model/include/ValueFormatter.js +99 -0
- package/model/include/ValueFormatter.js.map +1 -0
- package/model/include/ValueFormatter.mjs +99 -0
- package/model/include/ValueFormatter.mjs.map +1 -0
- package/model/index.d.ts +29 -0
- package/model/index.js +236 -0
- package/model/index.js.map +1 -0
- package/model/index.mjs +236 -0
- package/model/index.mjs.map +1 -0
- package/model/type.d.ts +106 -0
- package/package.json +32 -0
- package/readme.md +359 -0
- package/utils/chunker.js +53 -0
- package/utils/chunker.js.map +1 -0
- package/utils/chunker.mjs +53 -0
- package/utils/chunker.mjs.map +1 -0
- package/utils/index.js +49 -0
- package/utils/index.js.map +1 -0
- package/utils/index.mjs +49 -0
- package/utils/index.mjs.map +1 -0
- package/utils/sha256.js +66 -0
- package/utils/sha256.js.map +1 -0
- package/utils/sha256.mjs +66 -0
- package/utils/sha256.mjs.map +1 -0
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import XqlArray from'../../../Types/fields/Array.mjs';import XqlBoolean from'../../../Types/fields/Boolean.mjs';import XqlDate from'../../../Types/fields/Date.mjs';import XqlEnum from'../../../Types/fields/Enum.mjs';import XqlFile from'../../../Types/fields/File.mjs';import XqlIDField from'../../../Types/fields/IDField.mjs';import XqlNumber from'../../../Types/fields/Number.mjs';import XqlObject from'../../../Types/fields/Object.mjs';import XqlRecord from'../../../Types/fields/Record.mjs';import XqlSchema from'../../../Types/fields/Schema.mjs';import XqlString from'../../../Types/fields/String.mjs';import XqlTuple from'../../../Types/fields/Tuple.mjs';import XqlUnion from'../../../Types/fields/Union.mjs';import {quote}from'../../../utils/index.mjs';import XansqlError from'../../XansqlError.mjs';import Foreign from'../ForeignInfo.mjs';import ForeignKeyMigration from'./ForeingMigration.mjs';import IndexMigration from'./IndexMigration.mjs';class Migration {
|
|
2
|
+
constructor(xansql) {
|
|
3
|
+
this.xansql = xansql;
|
|
4
|
+
this.ForeignKeyMigration = new ForeignKeyMigration(xansql);
|
|
5
|
+
this.IndexMigration = new IndexMigration(xansql);
|
|
6
|
+
}
|
|
7
|
+
statements() {
|
|
8
|
+
const engine = this.xansql.config.dialect.engine;
|
|
9
|
+
const models = this.xansql.models;
|
|
10
|
+
const options = [];
|
|
11
|
+
const tables = [];
|
|
12
|
+
const indexes = [];
|
|
13
|
+
if (engine === 'sqlite') {
|
|
14
|
+
options.push(`PRAGMA foreign_keys = ON;`);
|
|
15
|
+
options.push(`PRAGMA journal_mode = WAL;`);
|
|
16
|
+
options.push(`PRAGMA wal_autocheckpoint = 1000;`);
|
|
17
|
+
options.push(`PRAGMA synchronous = NORMAL;`);
|
|
18
|
+
}
|
|
19
|
+
else if (engine === 'postgresql') {
|
|
20
|
+
options.push(`SET client_min_messages TO WARNING;`);
|
|
21
|
+
options.push(`SET standard_conforming_strings = ON;`);
|
|
22
|
+
}
|
|
23
|
+
else if (engine === 'mysql') {
|
|
24
|
+
options.push(`SET sql_mode = 'STRICT_ALL_TABLES';`);
|
|
25
|
+
options.push(`SET FOREIGN_KEY_CHECKS = 1;`);
|
|
26
|
+
options.push(`SET sql_safe_updates = 1;`);
|
|
27
|
+
}
|
|
28
|
+
for (const table of models.keys()) {
|
|
29
|
+
const model = models.get(table);
|
|
30
|
+
const { sql, indexes: modelIndexes } = this.buildCreate(model);
|
|
31
|
+
indexes.push(...modelIndexes);
|
|
32
|
+
tables.push({
|
|
33
|
+
table,
|
|
34
|
+
sql
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
options,
|
|
39
|
+
tables,
|
|
40
|
+
indexes
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
buildCreate(model) {
|
|
44
|
+
const engine = this.xansql.config.dialect.engine;
|
|
45
|
+
let indexes = [];
|
|
46
|
+
const table = model.table;
|
|
47
|
+
const schema = (model === null || model === void 0 ? void 0 : model.schema) || {};
|
|
48
|
+
let sqls = [];
|
|
49
|
+
for (const column in schema) {
|
|
50
|
+
const field = schema[column];
|
|
51
|
+
const meta = field.meta || {};
|
|
52
|
+
const sql = this.buildColumn(table, column);
|
|
53
|
+
sql && sqls.push(sql);
|
|
54
|
+
if (Foreign.isSchema(field)) {
|
|
55
|
+
const info = Foreign.get(model, column);
|
|
56
|
+
const fk = this.ForeignKeyMigration.buildCreate(table, column, info.table, info.relation.main);
|
|
57
|
+
if (fk) {
|
|
58
|
+
sqls.push(fk);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (meta.index && !meta.unique) {
|
|
62
|
+
const indexSql = this.IndexMigration.buildCreate(table, column);
|
|
63
|
+
indexes.push({ table, sql: indexSql });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
let sql = `CREATE TABLE IF NOT EXISTS ${quote(engine, table)} (${sqls.join(',')})`;
|
|
67
|
+
if (engine === 'mysql') {
|
|
68
|
+
sql += ` ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;`;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
sql += ` ;`;
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
sql,
|
|
75
|
+
indexes
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
buildDrop(model) {
|
|
79
|
+
const engine = this.xansql.config.dialect.engine;
|
|
80
|
+
const table = model.table;
|
|
81
|
+
let sql = `DROP TABLE IF EXISTS ${quote(engine, table)};`;
|
|
82
|
+
return sql;
|
|
83
|
+
}
|
|
84
|
+
buildColumn(table, column) {
|
|
85
|
+
const engine = this.xansql.config.dialect.engine;
|
|
86
|
+
const model = this.xansql.models.get(table);
|
|
87
|
+
const field = model === null || model === void 0 ? void 0 : model.schema[column];
|
|
88
|
+
const meta = (field === null || field === void 0 ? void 0 : field.meta) || {};
|
|
89
|
+
const nullable = meta.nullable || meta.optional ? 'NULL' : 'NOT NULL';
|
|
90
|
+
const unique = meta.unique ? 'UNIQUE' : '';
|
|
91
|
+
const col = (column, sqlType) => {
|
|
92
|
+
return ` ${quote(engine, column)} ${sqlType} ${nullable} ${unique}`.trim();
|
|
93
|
+
};
|
|
94
|
+
let sql = '';
|
|
95
|
+
if (field instanceof XqlIDField) {
|
|
96
|
+
if (engine === 'mysql') {
|
|
97
|
+
sql += col(column, "INT AUTO_INCREMENT PRIMARY KEY");
|
|
98
|
+
}
|
|
99
|
+
else if (engine === 'postgresql') {
|
|
100
|
+
sql += col(column, "SERIAL PRIMARY KEY");
|
|
101
|
+
}
|
|
102
|
+
else if (engine === 'sqlite') {
|
|
103
|
+
sql += col(column, "INTEGER PRIMARY KEY AUTOINCREMENT");
|
|
104
|
+
}
|
|
105
|
+
else if (engine === 'mssql') {
|
|
106
|
+
sql += col(column, "INT IDENTITY(1,1) PRIMARY KEY");
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else if (field instanceof XqlSchema) {
|
|
110
|
+
if (engine === 'mysql') {
|
|
111
|
+
sql += col(column, "INT");
|
|
112
|
+
}
|
|
113
|
+
else if (engine === 'postgresql' || engine === 'sqlite') {
|
|
114
|
+
sql += col(column, "INTEGER");
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
else if (field instanceof XqlString) {
|
|
118
|
+
let length = meta.length || meta.max;
|
|
119
|
+
if (meta.text || length > 65535 || engine === 'sqlite') {
|
|
120
|
+
sql += col(column, "TEXT");
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
sql += col(column, `VARCHAR(${length || 255})`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
else if (field instanceof XqlFile) {
|
|
127
|
+
sql += col(column, "VARCHAR(255)");
|
|
128
|
+
}
|
|
129
|
+
else if (field instanceof XqlNumber) {
|
|
130
|
+
if (engine === "mysql") {
|
|
131
|
+
if (meta.integer) {
|
|
132
|
+
sql += col(column, "INT");
|
|
133
|
+
}
|
|
134
|
+
else if (meta.float) {
|
|
135
|
+
sql += col(column, "FLOAT");
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
sql += col(column, "DECIMAL(10, 2)");
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
else if (engine === "postgresql" || engine === "sqlite") {
|
|
142
|
+
if (meta.integer) {
|
|
143
|
+
sql += col(column, "INTEGER");
|
|
144
|
+
}
|
|
145
|
+
else if (meta.float) {
|
|
146
|
+
sql += col(column, "REAL");
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
sql += col(column, engine === "sqlite" ? "NUMERIC" : "NUMERIC(10, 2)");
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
else if (field instanceof XqlBoolean) {
|
|
154
|
+
if (engine === "mysql" || engine === "postgresql") {
|
|
155
|
+
sql += col(column, "BOOLEAN");
|
|
156
|
+
}
|
|
157
|
+
else if (engine === "sqlite") {
|
|
158
|
+
sql += col(column, "INTEGER"); // SQLite has no BOOLEAN → use INTEGER (0/1)
|
|
159
|
+
}
|
|
160
|
+
else if (engine === "mssql") {
|
|
161
|
+
sql += col(column, "BIT"); // MSSQL uses BIT for boolean
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
else if (field instanceof XqlDate) {
|
|
165
|
+
if (engine === "mysql") {
|
|
166
|
+
sql += col(column, "DATETIME");
|
|
167
|
+
}
|
|
168
|
+
else if (engine === "postgresql") {
|
|
169
|
+
sql += col(column, "TIMESTAMP");
|
|
170
|
+
}
|
|
171
|
+
else if (engine === "sqlite") {
|
|
172
|
+
sql += col(column, "TEXT"); // store ISO string (SQLite has no native DATETIME)
|
|
173
|
+
}
|
|
174
|
+
else if (engine === "mssql") {
|
|
175
|
+
sql += col(column, "DATETIME2");
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
else if (field instanceof XqlEnum) {
|
|
179
|
+
if (engine === "mysql") {
|
|
180
|
+
sql += col(column, `ENUM(${field.values.map((v) => quote(engine, v)).join(', ')})`);
|
|
181
|
+
}
|
|
182
|
+
else if (engine === "postgresql") {
|
|
183
|
+
const enumName = `${column}_enum`;
|
|
184
|
+
sql += `CREATE TYPE ${enumName} AS ENUM (${field.values.map((v) => quote(engine, v)).join(', ')}); `;
|
|
185
|
+
sql += col(column, enumName);
|
|
186
|
+
}
|
|
187
|
+
else if (engine === "sqlite") {
|
|
188
|
+
const values = field.values.map((v) => quote(engine, v)).join(", ");
|
|
189
|
+
sql += `"${column}" TEXT CHECK("${column}" IN (${values})) ${nullable} ${unique}, `;
|
|
190
|
+
}
|
|
191
|
+
else if (engine === "mssql") {
|
|
192
|
+
const values = field.values.map((v) => quote(engine, v)).join(", ");
|
|
193
|
+
sql += `"${column}" NVARCHAR(255) CHECK("${column}" IN (${values})) ${nullable} ${unique}, `;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
else if (field instanceof XqlObject || field instanceof XqlRecord || field instanceof XqlTuple || field instanceof XqlUnion) {
|
|
197
|
+
sql += col(column, "TEXT");
|
|
198
|
+
}
|
|
199
|
+
else if (field instanceof XqlArray) {
|
|
200
|
+
const arrayType = field.type;
|
|
201
|
+
const isSchemaArray = arrayType instanceof XqlSchema;
|
|
202
|
+
if (!isSchemaArray) {
|
|
203
|
+
sql += col(column, "TEXT");
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
throw new XansqlError({
|
|
208
|
+
message: `Unsupported field type for column "${column}" in table "${table}".`,
|
|
209
|
+
model: table,
|
|
210
|
+
column
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
return sql;
|
|
214
|
+
}
|
|
215
|
+
}export{Migration as default};//# sourceMappingURL=TableMigration.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TableMigration.mjs","sources":["../../../../src/core/classes/Migration/TableMigration.ts"],"sourcesContent":["import Model from \"../../../model\";\nimport XqlArray from \"../../../Types/fields/Array\";\nimport XqlBoolean from \"../../../Types/fields/Boolean\";\nimport XqlDate from \"../../../Types/fields/Date\";\nimport XqlEnum from \"../../../Types/fields/Enum\";\nimport XqlFile from \"../../../Types/fields/File\";\nimport XqlIDField from \"../../../Types/fields/IDField\";\nimport XqlNumber from \"../../../Types/fields/Number\";\nimport XqlObject from \"../../../Types/fields/Object\";\nimport XqlRecord from \"../../../Types/fields/Record\";\nimport XqlSchema from \"../../../Types/fields/Schema\";\nimport XqlString from \"../../../Types/fields/String\";\nimport XqlTuple from \"../../../Types/fields/Tuple\";\nimport XqlUnion from \"../../../Types/fields/Union\";\nimport { quote } from \"../../../utils\";\nimport Xansql from \"../../Xansql\";\nimport XansqlError from \"../../XansqlError\";\nimport Foreign from \"../ForeignInfo\";\nimport ForeignKeyMigration from \"./ForeingMigration\";\nimport IndexMigration from \"./IndexMigration\";\n\nclass Migration {\n xansql: Xansql;\n readonly ForeignKeyMigration: ForeignKeyMigration\n readonly IndexMigration: IndexMigration\n constructor(xansql: Xansql) {\n this.xansql = xansql;\n this.ForeignKeyMigration = new ForeignKeyMigration(xansql);\n this.IndexMigration = new IndexMigration(xansql);\n }\n\n statements() {\n const engine = this.xansql.config.dialect.engine;\n const models = this.xansql.models;\n\n const options: string[] = []\n const tables: ({ table: string, sql: string })[] = [];\n const indexes: ({ table: string, sql: string })[] = [];\n\n if (engine === 'sqlite') {\n options.push(`PRAGMA foreign_keys = ON;`);\n options.push(`PRAGMA journal_mode = WAL;`);\n options.push(`PRAGMA wal_autocheckpoint = 1000;`);\n options.push(`PRAGMA synchronous = NORMAL;`);\n } else if (engine === 'postgresql') {\n options.push(`SET client_min_messages TO WARNING;`);\n options.push(`SET standard_conforming_strings = ON;`);\n } else if (engine === 'mysql') {\n options.push(`SET sql_mode = 'STRICT_ALL_TABLES';`);\n options.push(`SET FOREIGN_KEY_CHECKS = 1;`);\n options.push(`SET sql_safe_updates = 1;`);\n }\n\n for (const table of models.keys()) {\n const model = models.get(table);\n const { sql, indexes: modelIndexes } = this.buildCreate(model!);\n indexes.push(...modelIndexes);\n tables.push({\n table,\n sql\n });\n }\n\n return {\n options,\n tables,\n indexes\n }\n }\n\n buildCreate(model: Model) {\n const engine = this.xansql.config.dialect.engine;\n let indexes: ({ table: string, sql: string })[] = [];\n const table = model.table;\n const schema = model?.schema || {};\n let sqls: string[] = [];\n\n for (const column in schema) {\n const field = schema[column];\n const meta = field.meta || {};\n const sql = this.buildColumn(table, column);\n sql && sqls.push(sql);\n\n if (Foreign.isSchema(field)) {\n const info = Foreign.get(model!, column)\n const fk = this.ForeignKeyMigration.buildCreate(table, column, info.table, info.relation.main);\n if (fk) {\n sqls.push(fk);\n }\n }\n\n if (meta.index && !meta.unique) {\n const indexSql = this.IndexMigration.buildCreate(table, column);\n indexes.push({ table, sql: indexSql });\n }\n }\n\n let sql = `CREATE TABLE IF NOT EXISTS ${quote(engine, table)} (${sqls.join(',')})`;\n if (engine === 'mysql') {\n sql += ` ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;`;\n } else {\n sql += ` ;`;\n }\n\n return {\n sql,\n indexes\n }\n }\n\n buildDrop(model: any) {\n const engine = this.xansql.config.dialect.engine;\n const table = model.table;\n let sql = `DROP TABLE IF EXISTS ${quote(engine, table)};`;\n return sql;\n }\n\n buildColumn(table: string, column: string) {\n const engine = this.xansql.config.dialect.engine;\n const model = this.xansql.models.get(table);\n const field = model?.schema[column];\n const meta = field?.meta || {};\n const nullable = meta.nullable || meta.optional ? 'NULL' : 'NOT NULL';\n const unique = meta.unique ? 'UNIQUE' : '';\n const col = (column: string, sqlType: string) => {\n return ` ${quote(engine, column)} ${sqlType} ${nullable} ${unique}`.trim()\n };\n let sql = ''\n if (field instanceof XqlIDField) {\n if (engine === 'mysql') {\n sql += col(column, \"INT AUTO_INCREMENT PRIMARY KEY\");\n } else if (engine === 'postgresql') {\n sql += col(column, \"SERIAL PRIMARY KEY\")\n } else if (engine === 'sqlite') {\n sql += col(column, \"INTEGER PRIMARY KEY AUTOINCREMENT\")\n } else if (engine === 'mssql') {\n sql += col(column, \"INT IDENTITY(1,1) PRIMARY KEY\")\n }\n } else if (field instanceof XqlSchema) {\n if (engine === 'mysql') {\n sql += col(column, \"INT\")\n } else if (engine === 'postgresql' || engine === 'sqlite') {\n sql += col(column, \"INTEGER\")\n }\n } else if (field instanceof XqlString) {\n let length = meta.length || meta.max\n if (meta.text || length > 65535 || engine === 'sqlite') {\n sql += col(column, \"TEXT\")\n } else {\n sql += col(column, `VARCHAR(${length || 255})`)\n }\n } else if (field instanceof XqlFile) {\n sql += col(column, \"VARCHAR(255)\")\n } else if (field instanceof XqlNumber) {\n if (engine === \"mysql\") {\n if (meta.integer) {\n sql += col(column, \"INT\")\n } else if (meta.float) {\n sql += col(column, \"FLOAT\")\n } else {\n sql += col(column, \"DECIMAL(10, 2)\")\n }\n } else if (engine === \"postgresql\" || engine === \"sqlite\") {\n if (meta.integer) {\n sql += col(column, \"INTEGER\")\n } else if (meta.float) {\n sql += col(column, \"REAL\")\n } else {\n sql += col(column, engine === \"sqlite\" ? \"NUMERIC\" : \"NUMERIC(10, 2)\")\n }\n }\n } else if (field instanceof XqlBoolean) {\n if (engine === \"mysql\" || engine === \"postgresql\") {\n sql += col(column, \"BOOLEAN\")\n } else if (engine === \"sqlite\") {\n sql += col(column, \"INTEGER\") // SQLite has no BOOLEAN → use INTEGER (0/1)\n } else if (engine === \"mssql\") {\n sql += col(column, \"BIT\") // MSSQL uses BIT for boolean\n }\n } else if (field instanceof XqlDate) {\n if (engine === \"mysql\") {\n sql += col(column, \"DATETIME\")\n } else if (engine === \"postgresql\") {\n sql += col(column, \"TIMESTAMP\")\n } else if (engine === \"sqlite\") {\n sql += col(column, \"TEXT\") // store ISO string (SQLite has no native DATETIME)\n } else if (engine === \"mssql\") {\n sql += col(column, \"DATETIME2\")\n }\n } else if (field instanceof XqlEnum) {\n if (engine === \"mysql\") {\n sql += col(column, `ENUM(${(field as any).values.map((v: any) => quote(engine, v)).join(', ')})`)\n } else if (engine === \"postgresql\") {\n const enumName = `${column}_enum`;\n sql += `CREATE TYPE ${enumName} AS ENUM (${(field as any).values.map((v: any) => quote(engine, v)).join(', ')}); `\n sql += col(column, enumName)\n } else if (engine === \"sqlite\") {\n const values = (field as any).values.map((v: any) => quote(engine, v)).join(\", \");\n sql += `\"${column}\" TEXT CHECK(\"${column}\" IN (${values})) ${nullable} ${unique}, `\n } else if (engine === \"mssql\") {\n const values = (field as any).values.map((v: any) => quote(engine, v)).join(\", \");\n sql += `\"${column}\" NVARCHAR(255) CHECK(\"${column}\" IN (${values})) ${nullable} ${unique}, `\n }\n } else if (field instanceof XqlObject || field instanceof XqlRecord || field instanceof XqlTuple || field instanceof XqlUnion) {\n sql += col(column, \"TEXT\")\n } else if (field instanceof XqlArray) {\n const arrayType = (field as any).type;\n const isSchemaArray = arrayType instanceof XqlSchema;\n if (!isSchemaArray) {\n sql += col(column, \"TEXT\")\n }\n } else {\n throw new XansqlError({\n message: `Unsupported field type for column \"${column}\" in table \"${table}\".`,\n model: table,\n column\n });\n }\n return sql;\n }\n}\n\nexport default Migration"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import Xansql from '../../Xansql.js';
|
|
2
|
+
import Migration from './TableMigration.js';
|
|
3
|
+
|
|
4
|
+
declare class XansqlMigration {
|
|
5
|
+
readonly xansql: Xansql;
|
|
6
|
+
readonly TableMigration: Migration;
|
|
7
|
+
constructor(xansql: Xansql);
|
|
8
|
+
migrate(force?: boolean): Promise<boolean>;
|
|
9
|
+
generate(): Promise<string[]>;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export { XansqlMigration as default };
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var File=require('../../../Types/fields/File.js'),ExcuteMeta=require('../../ExcuteMeta.js'),TableMigration=require('./TableMigration.js'),ForeignInfo=require('../ForeignInfo.js'),index=require('../../../utils/index.js'),IDField=require('../../../Types/fields/IDField.js');class XansqlMigration {
|
|
2
|
+
constructor(xansql) {
|
|
3
|
+
this.xansql = xansql;
|
|
4
|
+
this.TableMigration = new TableMigration.default(xansql);
|
|
5
|
+
}
|
|
6
|
+
async migrate(force) {
|
|
7
|
+
const xansql = this.xansql;
|
|
8
|
+
const engine = xansql.config.dialect.engine;
|
|
9
|
+
const { options, tables, indexes } = this.TableMigration.statements();
|
|
10
|
+
if (force) {
|
|
11
|
+
const models = Array.from(xansql.ModelFactory.values()).reverse();
|
|
12
|
+
for (let model of models) {
|
|
13
|
+
const fileWhere = [];
|
|
14
|
+
for (let column in model.schema) {
|
|
15
|
+
const field = model.schema[column];
|
|
16
|
+
if (field instanceof File.default) {
|
|
17
|
+
fileWhere.push({ [column]: { isNotNull: true } });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
if (Object.keys(fileWhere).length > 0) {
|
|
21
|
+
try {
|
|
22
|
+
await model.delete({
|
|
23
|
+
where: fileWhere,
|
|
24
|
+
select: { [model.IDColumn]: true }
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
catch (error) { }
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
for (let model of models) {
|
|
31
|
+
const dsql = this.TableMigration.buildDrop(model);
|
|
32
|
+
let executeId = undefined;
|
|
33
|
+
if (typeof window !== "undefined") {
|
|
34
|
+
executeId = ExcuteMeta.default.set({
|
|
35
|
+
model,
|
|
36
|
+
action: "DROP_TABLE",
|
|
37
|
+
modelType: "main",
|
|
38
|
+
args: {}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
await xansql.execute(dsql, executeId);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
for (let option of options) {
|
|
45
|
+
await xansql.dialect.execute(option);
|
|
46
|
+
}
|
|
47
|
+
for (let { table, sql } of tables) {
|
|
48
|
+
let executeId = undefined;
|
|
49
|
+
if (typeof window !== "undefined") {
|
|
50
|
+
executeId = ExcuteMeta.default.set({
|
|
51
|
+
model: xansql.getModel(table),
|
|
52
|
+
action: "CREATE_TABLE",
|
|
53
|
+
modelType: "main",
|
|
54
|
+
args: {}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
await xansql.execute(sql, executeId);
|
|
58
|
+
}
|
|
59
|
+
for (let { sql, table } of indexes) {
|
|
60
|
+
try {
|
|
61
|
+
let executeId = undefined;
|
|
62
|
+
if (typeof window !== "undefined") {
|
|
63
|
+
executeId = ExcuteMeta.default.set({
|
|
64
|
+
model: xansql.getModel(table),
|
|
65
|
+
action: "CREATE_INDEX",
|
|
66
|
+
modelType: "main",
|
|
67
|
+
args: {}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
await xansql.execute(sql, executeId);
|
|
71
|
+
}
|
|
72
|
+
catch (error) { }
|
|
73
|
+
}
|
|
74
|
+
if (!force) {
|
|
75
|
+
const raw_schema = await xansql.getRawSchema();
|
|
76
|
+
for (let { table } of tables) {
|
|
77
|
+
const model = xansql.getModel(table);
|
|
78
|
+
const model_columns = model.schema;
|
|
79
|
+
const raw_columns = raw_schema[table] || [];
|
|
80
|
+
for (let column in model_columns) {
|
|
81
|
+
if (model_columns[column] instanceof IDField.default)
|
|
82
|
+
continue;
|
|
83
|
+
const has_column = raw_columns.find((rc) => rc.name === column);
|
|
84
|
+
if (!has_column && !ForeignInfo.default.isArray(model_columns[column])) {
|
|
85
|
+
let executeId = undefined;
|
|
86
|
+
if (typeof window !== "undefined") {
|
|
87
|
+
executeId = ExcuteMeta.default.set({
|
|
88
|
+
model,
|
|
89
|
+
action: "ADD_COLUMN",
|
|
90
|
+
modelType: "main",
|
|
91
|
+
args: { column }
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
const buildColumn = this.TableMigration.buildColumn(table, column);
|
|
95
|
+
const sql = `ALTER TABLE ${index.quote(engine, table)} ADD COLUMN ${buildColumn};`;
|
|
96
|
+
await xansql.execute(sql, executeId);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
for (let rc of raw_columns) {
|
|
100
|
+
if (!(rc.name in model_columns)) {
|
|
101
|
+
let executeId = undefined;
|
|
102
|
+
if (typeof window !== "undefined") {
|
|
103
|
+
executeId = ExcuteMeta.default.set({
|
|
104
|
+
model,
|
|
105
|
+
action: "DROP_COLUMN",
|
|
106
|
+
modelType: "main",
|
|
107
|
+
args: { column: rc.name }
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
const sql = `ALTER TABLE ${index.quote(engine, table)} DROP COLUMN ${index.quote(engine, rc.name)};`;
|
|
111
|
+
await xansql.execute(sql, executeId);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
for (let column in model_columns) {
|
|
115
|
+
if (model_columns[column] instanceof IDField.default || ForeignInfo.default.isArray(model_columns[column]))
|
|
116
|
+
continue;
|
|
117
|
+
const has_column = raw_columns.find((rc) => rc.name === column);
|
|
118
|
+
if (has_column) {
|
|
119
|
+
const buildColumnSql = this.TableMigration.buildColumn(table, column).split(' ').slice(1).join(' ');
|
|
120
|
+
const raw_column_sql = `${has_column.type.toUpperCase()} ${has_column.notnull ? 'NOT NULL' : 'NULL'}${has_column.default_value ? ' DEFAULT ' + has_column.default_value : ''}${has_column.unique ? " UNIQUE" : ""}`.trim();
|
|
121
|
+
if (buildColumnSql !== raw_column_sql) {
|
|
122
|
+
let executeId = undefined;
|
|
123
|
+
if (typeof window !== "undefined") {
|
|
124
|
+
executeId = ExcuteMeta.default.set({
|
|
125
|
+
model,
|
|
126
|
+
action: "MODIFY_COLUMN",
|
|
127
|
+
modelType: "main",
|
|
128
|
+
args: { column }
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
const buildColumn = this.TableMigration.buildColumn(table, column);
|
|
132
|
+
const sql = `ALTER TABLE ${index.quote(engine, table)} ALTER COLUMN ${buildColumn};`;
|
|
133
|
+
await xansql.execute(sql, executeId);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return true;
|
|
140
|
+
}
|
|
141
|
+
async generate() {
|
|
142
|
+
const xansql = this.xansql;
|
|
143
|
+
const models = Array.from(xansql.ModelFactory.values());
|
|
144
|
+
const raw_schema = await xansql.getRawSchema();
|
|
145
|
+
const tables = Object.keys(raw_schema);
|
|
146
|
+
const migration_sql = [];
|
|
147
|
+
for (let model of models) {
|
|
148
|
+
if (!tables.includes(model.table)) {
|
|
149
|
+
const { sql } = this.TableMigration.buildCreate(model);
|
|
150
|
+
migration_sql.push(sql);
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
const model_columns = model.schema;
|
|
154
|
+
const raw_columns = raw_schema[model.table] || [];
|
|
155
|
+
for (let column in model_columns) {
|
|
156
|
+
if (model_columns[column] instanceof IDField.default)
|
|
157
|
+
continue;
|
|
158
|
+
const has_column = raw_columns.find((rc) => rc.name === column);
|
|
159
|
+
if (!has_column && !ForeignInfo.default.isArray(model_columns[column])) {
|
|
160
|
+
const buildColumn = this.TableMigration.buildColumn(model.table, column);
|
|
161
|
+
const sql = `ALTER TABLE ${index.quote(xansql.config.dialect.engine, model.table)} ADD COLUMN ${buildColumn};`;
|
|
162
|
+
migration_sql.push(sql);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
for (let rc of raw_columns) {
|
|
166
|
+
if (!(rc.name in model_columns)) {
|
|
167
|
+
const sql = `ALTER TABLE ${index.quote(xansql.config.dialect.engine, model.table)} DROP COLUMN ${index.quote(xansql.config.dialect.engine, rc.name)};`;
|
|
168
|
+
migration_sql.push(sql);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
for (let column in model_columns) {
|
|
172
|
+
if (model_columns[column] instanceof IDField.default || ForeignInfo.default.isArray(model_columns[column]))
|
|
173
|
+
continue;
|
|
174
|
+
const has_column = raw_columns.find((rc) => rc.name === column);
|
|
175
|
+
if (has_column) {
|
|
176
|
+
const buildColumnSql = this.TableMigration.buildColumn(model.table, column).split(' ').slice(1).join(' ');
|
|
177
|
+
const raw_column_sql = `${has_column.type.toUpperCase()} ${has_column.notnull ? 'NOT NULL' : 'NULL'}${has_column.default_value ? ' DEFAULT ' + has_column.default_value : ''}${has_column.unique ? " UNIQUE" : ""}`.trim();
|
|
178
|
+
if (buildColumnSql !== raw_column_sql) {
|
|
179
|
+
const buildColumn = this.TableMigration.buildColumn(model.table, column);
|
|
180
|
+
const sql = `ALTER TABLE ${index.quote(xansql.config.dialect.engine, model.table)} ALTER COLUMN ${buildColumn};`;
|
|
181
|
+
migration_sql.push(sql);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return migration_sql;
|
|
188
|
+
}
|
|
189
|
+
}exports.default=XansqlMigration;//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/core/classes/Migration/index.ts"],"sourcesContent":["import XqlFile from \"../../../Types/fields/File\";\nimport ExecuteMeta from \"../../ExcuteMeta\";\nimport Xansql from \"../../Xansql\";\nimport TableMigration from \"./TableMigration\";\nimport Foreign from \"../ForeignInfo\";\nimport { XansqlDialectSchemaType } from \"../../type\";\nimport { quote } from \"../../../utils\";\nimport XqlIDField from \"../../../Types/fields/IDField\";\n\nclass XansqlMigration {\n readonly xansql: Xansql\n readonly TableMigration: TableMigration\n\n constructor(xansql: Xansql) {\n this.xansql = xansql;\n this.TableMigration = new TableMigration(xansql);\n }\n\n async migrate(force?: boolean) {\n const xansql = this.xansql;\n const engine = xansql.config.dialect.engine;\n const { options, tables, indexes } = this.TableMigration.statements();\n if (force) {\n const models = Array.from(xansql.ModelFactory.values()).reverse();\n\n for (let model of models) {\n const fileWhere: any[] = [];\n for (let column in model.schema) {\n const field = model.schema[column];\n if (field instanceof XqlFile) {\n fileWhere.push({ [column]: { isNotNull: true } });\n }\n }\n\n if (Object.keys(fileWhere).length > 0) {\n try {\n await model.delete({\n where: fileWhere,\n select: { [model.IDColumn]: true }\n });\n } catch (error) { }\n }\n }\n\n for (let model of models) {\n const dsql = this.TableMigration.buildDrop(model);\n let executeId = undefined;\n if (typeof window !== \"undefined\") {\n executeId = ExecuteMeta.set({\n model,\n action: \"DROP_TABLE\",\n modelType: \"main\",\n args: {}\n });\n }\n await xansql.execute(dsql, executeId);\n }\n }\n\n for (let option of options) {\n await xansql.dialect.execute(option);\n }\n\n for (let { table, sql } of tables) {\n let executeId = undefined;\n if (typeof window !== \"undefined\") {\n executeId = ExecuteMeta.set({\n model: xansql.getModel(table),\n action: \"CREATE_TABLE\",\n modelType: \"main\",\n args: {}\n });\n }\n\n await xansql.execute(sql, executeId);\n }\n\n for (let { sql, table } of indexes) {\n try {\n let executeId = undefined;\n if (typeof window !== \"undefined\") {\n executeId = ExecuteMeta.set({\n model: xansql.getModel(table),\n action: \"CREATE_INDEX\",\n modelType: \"main\",\n args: {}\n });\n }\n await xansql.execute(sql, executeId);\n } catch (error) { }\n }\n\n if (!force) {\n const raw_schema: XansqlDialectSchemaType = await xansql.getRawSchema() as any\n\n for (let { table } of tables) {\n const model = xansql.getModel(table);\n const model_columns = model.schema;\n const raw_columns = raw_schema[table] || [];\n\n for (let column in model_columns) {\n if (model_columns[column] instanceof XqlIDField) continue;\n const has_column = raw_columns.find((rc: any) => rc.name === column);\n if (!has_column && !Foreign.isArray(model_columns[column])) {\n let executeId = undefined;\n if (typeof window !== \"undefined\") {\n executeId = ExecuteMeta.set({\n model,\n action: \"ADD_COLUMN\",\n modelType: \"main\",\n args: { column }\n });\n }\n\n const buildColumn = this.TableMigration.buildColumn(table, column);\n const sql = `ALTER TABLE ${quote(engine, table)} ADD COLUMN ${buildColumn};`;\n await xansql.execute(sql, executeId);\n }\n }\n\n for (let rc of raw_columns) {\n if (!(rc.name in model_columns)) {\n let executeId = undefined;\n if (typeof window !== \"undefined\") {\n executeId = ExecuteMeta.set({\n model,\n action: \"DROP_COLUMN\",\n modelType: \"main\",\n args: { column: rc.name }\n });\n }\n\n const sql = `ALTER TABLE ${quote(engine, table)} DROP COLUMN ${quote(engine, rc.name)};`;\n await xansql.execute(sql, executeId);\n }\n }\n\n for (let column in model_columns) {\n if (model_columns[column] instanceof XqlIDField || Foreign.isArray(model_columns[column])) continue;\n\n const has_column = raw_columns.find((rc: any) => rc.name === column);\n if (has_column) {\n const buildColumnSql = this.TableMigration.buildColumn(table, column).split(' ').slice(1).join(' ');\n const raw_column_sql = `${has_column.type.toUpperCase()} ${has_column.notnull ? 'NOT NULL' : 'NULL'}${has_column.default_value ? ' DEFAULT ' + has_column.default_value : ''}${has_column.unique ? \" UNIQUE\" : \"\"}`.trim();\n if (buildColumnSql !== raw_column_sql) {\n let executeId = undefined;\n if (typeof window !== \"undefined\") {\n executeId = ExecuteMeta.set({\n model,\n action: \"MODIFY_COLUMN\",\n modelType: \"main\",\n args: { column }\n });\n }\n\n const buildColumn = this.TableMigration.buildColumn(table, column);\n const sql = `ALTER TABLE ${quote(engine, table)} ALTER COLUMN ${buildColumn};`;\n await xansql.execute(sql, executeId);\n }\n }\n }\n }\n }\n\n return true;\n }\n\n async generate() {\n const xansql = this.xansql;\n const models = Array.from(xansql.ModelFactory.values());\n const raw_schema: XansqlDialectSchemaType = await xansql.getRawSchema() as any\n const tables = Object.keys(raw_schema);\n const migration_sql: string[] = [];\n\n for (let model of models) {\n if (!tables.includes(model.table)) {\n const { sql } = this.TableMigration.buildCreate(model);\n migration_sql.push(sql);\n } else {\n const model_columns = model.schema;\n const raw_columns = raw_schema[model.table] || [];\n\n for (let column in model_columns) {\n if (model_columns[column] instanceof XqlIDField) continue;\n const has_column = raw_columns.find((rc: any) => rc.name === column);\n if (!has_column && !Foreign.isArray(model_columns[column])) {\n const buildColumn = this.TableMigration.buildColumn(model.table, column);\n const sql = `ALTER TABLE ${quote(xansql.config.dialect.engine, model.table)} ADD COLUMN ${buildColumn};`;\n migration_sql.push(sql);\n }\n }\n\n for (let rc of raw_columns) {\n if (!(rc.name in model_columns)) {\n const sql = `ALTER TABLE ${quote(xansql.config.dialect.engine, model.table)} DROP COLUMN ${quote(xansql.config.dialect.engine, rc.name)};`;\n migration_sql.push(sql);\n }\n }\n\n for (let column in model_columns) {\n if (model_columns[column] instanceof XqlIDField || Foreign.isArray(model_columns[column])) continue;\n\n const has_column = raw_columns.find((rc: any) => rc.name === column);\n if (has_column) {\n const buildColumnSql = this.TableMigration.buildColumn(model.table, column).split(' ').slice(1).join(' ');\n const raw_column_sql = `${has_column.type.toUpperCase()} ${has_column.notnull ? 'NOT NULL' : 'NULL'}${has_column.default_value ? ' DEFAULT ' + has_column.default_value : ''}${has_column.unique ? \" UNIQUE\" : \"\"}`.trim();\n if (buildColumnSql !== raw_column_sql) {\n const buildColumn = this.TableMigration.buildColumn(model.table, column);\n const sql = `ALTER TABLE ${quote(xansql.config.dialect.engine, model.table)} ALTER COLUMN ${buildColumn};`;\n migration_sql.push(sql);\n }\n }\n }\n }\n }\n\n return migration_sql;\n\n }\n}\n\nexport default XansqlMigration;"],"names":["TableMigration","XqlFile","ExecuteMeta","XqlIDField","Foreign","quote"],"mappings":"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"}
|