freelang-v4 4.3.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/README.md +548 -0
- package/dist/ast.d.ts +367 -0
- package/dist/ast.js +4 -0
- package/dist/ast.js.map +1 -0
- package/dist/async-basic.test.d.ts +1 -0
- package/dist/async-basic.test.js +88 -0
- package/dist/async-basic.test.js.map +1 -0
- package/dist/async-jest.test.d.ts +1 -0
- package/dist/async-jest.test.js +99 -0
- package/dist/async-jest.test.js.map +1 -0
- package/dist/channel-jest.test.d.ts +1 -0
- package/dist/channel-jest.test.js +148 -0
- package/dist/channel-jest.test.js.map +1 -0
- package/dist/checker-jest.test.d.ts +1 -0
- package/dist/checker-jest.test.js +160 -0
- package/dist/checker-jest.test.js.map +1 -0
- package/dist/checker.d.ts +149 -0
- package/dist/checker.js +1565 -0
- package/dist/checker.js.map +1 -0
- package/dist/checker.test.d.ts +1 -0
- package/dist/checker.test.js +217 -0
- package/dist/checker.test.js.map +1 -0
- package/dist/compiler-jest.test.d.ts +1 -0
- package/dist/compiler-jest.test.js +233 -0
- package/dist/compiler-jest.test.js.map +1 -0
- package/dist/compiler.d.ts +127 -0
- package/dist/compiler.js +1588 -0
- package/dist/compiler.js.map +1 -0
- package/dist/compiler.test.d.ts +1 -0
- package/dist/compiler.test.js +313 -0
- package/dist/compiler.test.js.map +1 -0
- package/dist/db-100m-full.d.ts +5 -0
- package/dist/db-100m-full.js +78 -0
- package/dist/db-100m-full.js.map +1 -0
- package/dist/db-100m-no-index.d.ts +12 -0
- package/dist/db-100m-no-index.js +119 -0
- package/dist/db-100m-no-index.js.map +1 -0
- package/dist/db-100m-real.d.ts +5 -0
- package/dist/db-100m-real.js +131 -0
- package/dist/db-100m-real.js.map +1 -0
- package/dist/db-100m-streaming.d.ts +15 -0
- package/dist/db-100m-streaming.js +164 -0
- package/dist/db-100m-streaming.js.map +1 -0
- package/dist/db-100m-test.d.ts +5 -0
- package/dist/db-100m-test.js +111 -0
- package/dist/db-100m-test.js.map +1 -0
- package/dist/db-jest.test.d.ts +1 -0
- package/dist/db-jest.test.js +182 -0
- package/dist/db-jest.test.js.map +1 -0
- package/dist/db-runtime.d.ts +24 -0
- package/dist/db-runtime.js +204 -0
- package/dist/db-runtime.js.map +1 -0
- package/dist/db.d.ts +249 -0
- package/dist/db.js +593 -0
- package/dist/db.js.map +1 -0
- package/dist/file-io-jest.test.d.ts +1 -0
- package/dist/file-io-jest.test.js +225 -0
- package/dist/file-io-jest.test.js.map +1 -0
- package/dist/for-of-jest.test.d.ts +1 -0
- package/dist/for-of-jest.test.js +230 -0
- package/dist/for-of-jest.test.js.map +1 -0
- package/dist/for-of.test.d.ts +1 -0
- package/dist/for-of.test.js +305 -0
- package/dist/for-of.test.js.map +1 -0
- package/dist/function-literal-jest.test.d.ts +1 -0
- package/dist/function-literal-jest.test.js +180 -0
- package/dist/function-literal-jest.test.js.map +1 -0
- package/dist/function-literal.test.d.ts +1 -0
- package/dist/function-literal.test.js +245 -0
- package/dist/function-literal.test.js.map +1 -0
- package/dist/generics-jest.test.d.ts +1 -0
- package/dist/generics-jest.test.js +93 -0
- package/dist/generics-jest.test.js.map +1 -0
- package/dist/ir-gen.d.ts +15 -0
- package/dist/ir-gen.js +400 -0
- package/dist/ir-gen.js.map +1 -0
- package/dist/ir.d.ts +114 -0
- package/dist/ir.js +5 -0
- package/dist/ir.js.map +1 -0
- package/dist/lexer.d.ts +110 -0
- package/dist/lexer.js +467 -0
- package/dist/lexer.js.map +1 -0
- package/dist/lexer.test.d.ts +1 -0
- package/dist/lexer.test.js +426 -0
- package/dist/lexer.test.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.js +241 -0
- package/dist/main.js.map +1 -0
- package/dist/module-jest.test.d.ts +1 -0
- package/dist/module-jest.test.js +123 -0
- package/dist/module-jest.test.js.map +1 -0
- package/dist/parser.d.ts +56 -0
- package/dist/parser.js +1060 -0
- package/dist/parser.js.map +1 -0
- package/dist/parser.test.d.ts +1 -0
- package/dist/parser.test.js +461 -0
- package/dist/parser.test.js.map +1 -0
- package/dist/pattern-matching-jest.test.d.ts +1 -0
- package/dist/pattern-matching-jest.test.js +158 -0
- package/dist/pattern-matching-jest.test.js.map +1 -0
- package/dist/pkg/init.d.ts +1 -0
- package/dist/pkg/init.js +118 -0
- package/dist/pkg/init.js.map +1 -0
- package/dist/pkg/install.d.ts +1 -0
- package/dist/pkg/install.js +77 -0
- package/dist/pkg/install.js.map +1 -0
- package/dist/pkg/registry.d.ts +23 -0
- package/dist/pkg/registry.js +106 -0
- package/dist/pkg/registry.js.map +1 -0
- package/dist/pkg/run.d.ts +1 -0
- package/dist/pkg/run.js +76 -0
- package/dist/pkg/run.js.map +1 -0
- package/dist/pkg/toml.d.ts +5 -0
- package/dist/pkg/toml.js +117 -0
- package/dist/pkg/toml.js.map +1 -0
- package/dist/repl.d.ts +15 -0
- package/dist/repl.js +197 -0
- package/dist/repl.js.map +1 -0
- package/dist/runtime/bytecode.d.ts +92 -0
- package/dist/runtime/bytecode.js +253 -0
- package/dist/runtime/bytecode.js.map +1 -0
- package/dist/runtime/value.d.ts +102 -0
- package/dist/runtime/value.js +302 -0
- package/dist/runtime/value.js.map +1 -0
- package/dist/runtime/vm.d.ts +65 -0
- package/dist/runtime/vm.js +293 -0
- package/dist/runtime/vm.js.map +1 -0
- package/dist/struct-instance-jest.test.d.ts +1 -0
- package/dist/struct-instance-jest.test.js +209 -0
- package/dist/struct-instance-jest.test.js.map +1 -0
- package/dist/struct-instance.test.d.ts +1 -0
- package/dist/struct-instance.test.js +291 -0
- package/dist/struct-instance.test.js.map +1 -0
- package/dist/struct-jest.test.d.ts +1 -0
- package/dist/struct-jest.test.js +176 -0
- package/dist/struct-jest.test.js.map +1 -0
- package/dist/struct.test.d.ts +1 -0
- package/dist/struct.test.js +231 -0
- package/dist/struct.test.js.map +1 -0
- package/dist/trait-jest.test.d.ts +1 -0
- package/dist/trait-jest.test.js +120 -0
- package/dist/trait-jest.test.js.map +1 -0
- package/dist/vm-jest.test.d.ts +1 -0
- package/dist/vm-jest.test.js +569 -0
- package/dist/vm-jest.test.js.map +1 -0
- package/dist/vm.d.ts +81 -0
- package/dist/vm.js +1956 -0
- package/dist/vm.js.map +1 -0
- package/dist/vm.test.d.ts +1 -0
- package/dist/vm.test.js +337 -0
- package/dist/vm.test.js.map +1 -0
- package/dist/web-repl/sandbox.d.ts +11 -0
- package/dist/web-repl/sandbox.js +76 -0
- package/dist/web-repl/sandbox.js.map +1 -0
- package/dist/web-repl/server.d.ts +1 -0
- package/dist/web-repl/server.js +111 -0
- package/dist/web-repl/server.js.map +1 -0
- package/dist/while-loop-jest.test.d.ts +1 -0
- package/dist/while-loop-jest.test.js +201 -0
- package/dist/while-loop-jest.test.js.map +1 -0
- package/dist/while-loop.test.d.ts +1 -0
- package/dist/while-loop.test.js +262 -0
- package/dist/while-loop.test.js.map +1 -0
- package/docs/EXPERIENCE.md +787 -0
- package/docs/README.md +175 -0
- package/docs/V1_V2_V3_ANALYSIS.md +107 -0
- package/docs/_config.yml +36 -0
- package/docs/api-reference.md +459 -0
- package/docs/architecture.md +470 -0
- package/docs/benchmarks.md +295 -0
- package/docs/comparison.md +454 -0
- package/docs/index.md +335 -0
- package/docs/language-completeness.md +228 -0
- package/docs/learning-guide.md +651 -0
- package/package.json +65 -0
- package/src/api/deploy_key.fl +294 -0
- package/src/api/issue.fl +302 -0
- package/src/api/org.fl +356 -0
- package/src/api/repo.fl +394 -0
- package/src/api/team.fl +299 -0
- package/src/api/user.fl +385 -0
- package/src/api/webhook.fl +273 -0
- package/src/ast.ts +158 -0
- package/src/async-basic.test.ts +94 -0
- package/src/async-jest.test.ts +107 -0
- package/src/channel-jest.test.ts +158 -0
- package/src/checker-jest.test.ts +189 -0
- package/src/checker.test.ts +279 -0
- package/src/checker.ts +1861 -0
- package/src/commands/analyze.fl +227 -0
- package/src/commands/auth.fl +315 -0
- package/src/commands/batch.fl +349 -0
- package/src/commands/config.fl +199 -0
- package/src/commands/deploy_key.fl +352 -0
- package/src/commands/issue.fl +275 -0
- package/src/commands/main.fl +492 -0
- package/src/commands/org.fl +425 -0
- package/src/commands/repo.fl +581 -0
- package/src/commands/team.fl +244 -0
- package/src/commands/user.fl +423 -0
- package/src/commands/webhook.fl +400 -0
- package/src/compiler-jest.test.ts +275 -0
- package/src/compiler.test.ts +375 -0
- package/src/compiler.ts +1770 -0
- package/src/config.fl +175 -0
- package/src/core/batch.fl +355 -0
- package/src/core/cache.fl +284 -0
- package/src/core/ensure.fl +324 -0
- package/src/db-100m-full.ts +96 -0
- package/src/db-100m-no-index.ts +133 -0
- package/src/db-100m-real.ts +152 -0
- package/src/db-100m-streaming.ts +154 -0
- package/src/db-100m-test.ts +136 -0
- package/src/db-jest.test.ts +161 -0
- package/src/db-runtime.ts +242 -0
- package/src/db.ts +676 -0
- package/src/errors.fl +134 -0
- package/src/for-of-jest.test.ts +246 -0
- package/src/for-of.test.ts +308 -0
- package/src/function-literal-jest.test.ts +193 -0
- package/src/function-literal.test.ts +248 -0
- package/src/generics-jest.test.ts +104 -0
- package/src/http/client.fl +327 -0
- package/src/ir-gen.ts +459 -0
- package/src/ir.ts +80 -0
- package/src/lexer.test.ts +499 -0
- package/src/lexer.ts +522 -0
- package/src/main.ts +223 -0
- package/src/models.fl +162 -0
- package/src/module-jest.test.ts +145 -0
- package/src/parser.test.ts +542 -0
- package/src/parser.ts +1211 -0
- package/src/pattern-matching-jest.test.ts +170 -0
- package/src/pkg/init.ts +91 -0
- package/src/pkg/install.ts +56 -0
- package/src/pkg/registry.ts +103 -0
- package/src/pkg/run.ts +49 -0
- package/src/pkg/toml.ts +129 -0
- package/src/repl.ts +190 -0
- package/src/runtime/bytecode.ts +291 -0
- package/src/runtime/value.ts +322 -0
- package/src/runtime/vm.ts +354 -0
- package/src/self-host/bootstrap.fl +68 -0
- package/src/self-host/interpreter.fl +361 -0
- package/src/self-host/lexer-simple.fl +22 -0
- package/src/self-host/lexer.fl +305 -0
- package/src/self-host/parser.fl +580 -0
- package/src/struct-instance-jest.test.ts +221 -0
- package/src/struct-instance.test.ts +293 -0
- package/src/struct-jest.test.ts +187 -0
- package/src/struct.test.ts +234 -0
- package/src/trait-jest.test.ts +136 -0
- package/src/vm-jest.test.ts +754 -0
- package/src/vm.ts +1976 -0
- package/src/web-repl/public/index.html +50 -0
- package/src/web-repl/public/main.js +105 -0
- package/src/web-repl/public/style.css +225 -0
- package/src/web-repl/sandbox.ts +88 -0
- package/src/web-repl/server.ts +97 -0
- package/src/while-loop-jest.test.ts +218 -0
- package/src/while-loop.test.ts +267 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const lexer_1 = require("./lexer");
|
|
37
|
+
const parser_1 = require("./parser");
|
|
38
|
+
const checker_1 = require("./checker");
|
|
39
|
+
const compiler_1 = require("./compiler");
|
|
40
|
+
const vm_1 = require("./vm");
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
42
|
+
async function exec(source) {
|
|
43
|
+
const { tokens, errors: lexErrors } = new lexer_1.Lexer(source).tokenize();
|
|
44
|
+
if (lexErrors.length > 0) {
|
|
45
|
+
return { output: [], error: `lex error: ${lexErrors[0].message}` };
|
|
46
|
+
}
|
|
47
|
+
const { program, errors: parseErrors } = new parser_1.Parser(tokens).parse();
|
|
48
|
+
if (parseErrors.length > 0) {
|
|
49
|
+
return { output: [], error: `parse error: ${parseErrors[0].message}` };
|
|
50
|
+
}
|
|
51
|
+
const checkErrors = new checker_1.TypeChecker().check(program);
|
|
52
|
+
if (checkErrors.length > 0) {
|
|
53
|
+
return { output: [], error: `type error: ${checkErrors[0].message}` };
|
|
54
|
+
}
|
|
55
|
+
const chunk = new compiler_1.Compiler().compile(program);
|
|
56
|
+
return await new vm_1.VM().run(chunk);
|
|
57
|
+
}
|
|
58
|
+
describe("Database Operations", () => {
|
|
59
|
+
// Clean up test database files
|
|
60
|
+
afterEach(() => {
|
|
61
|
+
try {
|
|
62
|
+
if (fs.existsSync("./test_db.db")) {
|
|
63
|
+
fs.unlinkSync("./test_db.db");
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// ignore
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
it("sqlite_open: creates or opens database file", async () => {
|
|
71
|
+
const { output, error } = await exec(`
|
|
72
|
+
var db = sqlite_open("./test_db.db")
|
|
73
|
+
println("DB opened")
|
|
74
|
+
`);
|
|
75
|
+
expect(error).toBeNull();
|
|
76
|
+
expect(output).toContain("DB opened");
|
|
77
|
+
});
|
|
78
|
+
it("sqlite_execute: creates table and inserts data", async () => {
|
|
79
|
+
const { output, error } = await exec(`
|
|
80
|
+
var db = sqlite_open("./test_db.db")
|
|
81
|
+
var create_result = sqlite_execute(db, "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT NOT NULL, email TEXT UNIQUE)", [])
|
|
82
|
+
println("Table created")
|
|
83
|
+
var insert_result = sqlite_execute(db, "INSERT INTO users (name, email) VALUES (?, ?)", ["Alice", "alice@example.com"])
|
|
84
|
+
println("Record inserted")
|
|
85
|
+
`);
|
|
86
|
+
expect(error).toBeNull();
|
|
87
|
+
expect(output).toContain("Table created");
|
|
88
|
+
expect(output).toContain("Record inserted");
|
|
89
|
+
});
|
|
90
|
+
it("sqlite_query: retrieves data from table", async () => {
|
|
91
|
+
const { output, error } = await exec(`
|
|
92
|
+
var db = sqlite_open("./test_db.db")
|
|
93
|
+
sqlite_execute(db, "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT NOT NULL, email TEXT UNIQUE)", [])
|
|
94
|
+
sqlite_execute(db, "INSERT INTO users (name, email) VALUES (?, ?)", ["Alice", "alice@example.com"])
|
|
95
|
+
sqlite_execute(db, "INSERT INTO users (name, email) VALUES (?, ?)", ["Bob", "bob@example.com"])
|
|
96
|
+
var result = sqlite_query(db, "SELECT * FROM users", [])
|
|
97
|
+
println("Query complete")
|
|
98
|
+
`);
|
|
99
|
+
expect(error).toBeNull();
|
|
100
|
+
expect(output).toContain("Query complete");
|
|
101
|
+
});
|
|
102
|
+
it("sqlite_close: closes database", async () => {
|
|
103
|
+
const { output, error } = await exec(`
|
|
104
|
+
var db = sqlite_open("./test_db.db")
|
|
105
|
+
sqlite_close(db)
|
|
106
|
+
println("DB closed")
|
|
107
|
+
`);
|
|
108
|
+
expect(error).toBeNull();
|
|
109
|
+
expect(output).toContain("DB closed");
|
|
110
|
+
});
|
|
111
|
+
it("database handle error: invalid first argument", async () => {
|
|
112
|
+
const { output, error } = await exec(`
|
|
113
|
+
var result = sqlite_query("not a db", "SELECT 1", [])
|
|
114
|
+
println("Query attempted")
|
|
115
|
+
`);
|
|
116
|
+
// Should fail because first arg is not a database
|
|
117
|
+
expect(error || output.join(" ")).toBeTruthy();
|
|
118
|
+
});
|
|
119
|
+
it("sqlite_execute: returns ok result", async () => {
|
|
120
|
+
const { output, error } = await exec(`
|
|
121
|
+
var db = sqlite_open("./test_db.db")
|
|
122
|
+
sqlite_execute(db, "CREATE TABLE IF NOT EXISTS items (id INTEGER PRIMARY KEY, name TEXT NOT NULL)", [])
|
|
123
|
+
var result = sqlite_execute(db, "INSERT INTO items (name) VALUES (?)", ["Item1"])
|
|
124
|
+
println("Executed")
|
|
125
|
+
`);
|
|
126
|
+
expect(error).toBeNull();
|
|
127
|
+
expect(output).toContain("Executed");
|
|
128
|
+
});
|
|
129
|
+
it("sqlite_query: multiple rows", async () => {
|
|
130
|
+
const { output, error } = await exec(`
|
|
131
|
+
var db = sqlite_open("./test_db.db")
|
|
132
|
+
sqlite_execute(db, "CREATE TABLE IF NOT EXISTS people (id INTEGER PRIMARY KEY, name TEXT)", [])
|
|
133
|
+
sqlite_execute(db, "INSERT INTO people (name) VALUES (?)", ["Alice"])
|
|
134
|
+
sqlite_execute(db, "INSERT INTO people (name) VALUES (?)", ["Bob"])
|
|
135
|
+
sqlite_execute(db, "INSERT INTO people (name) VALUES (?)", ["Charlie"])
|
|
136
|
+
var rows = sqlite_query(db, "SELECT * FROM people", [])
|
|
137
|
+
println("All rows retrieved")
|
|
138
|
+
`);
|
|
139
|
+
expect(error).toBeNull();
|
|
140
|
+
expect(output).toContain("All rows retrieved");
|
|
141
|
+
});
|
|
142
|
+
it("sqlite_begin/commit: manual transaction", async () => {
|
|
143
|
+
const { output, error } = await exec(`
|
|
144
|
+
var db = sqlite_open("./test_db.db")
|
|
145
|
+
sqlite_execute(db, "CREATE TABLE IF NOT EXISTS accounts (id INTEGER PRIMARY KEY, balance INTEGER)", [])
|
|
146
|
+
sqlite_begin(db, "immediate")
|
|
147
|
+
sqlite_execute(db, "INSERT INTO accounts (balance) VALUES (?)", ["1000"])
|
|
148
|
+
sqlite_commit(db)
|
|
149
|
+
println("Transaction committed")
|
|
150
|
+
`);
|
|
151
|
+
expect(error).toBeNull();
|
|
152
|
+
expect(output).toContain("Transaction committed");
|
|
153
|
+
});
|
|
154
|
+
it("sqlite_begin/rollback: transaction rollback", async () => {
|
|
155
|
+
const { output, error } = await exec(`
|
|
156
|
+
var db = sqlite_open("./test_db.db")
|
|
157
|
+
sqlite_execute(db, "CREATE TABLE IF NOT EXISTS logs (id INTEGER PRIMARY KEY, message TEXT)", [])
|
|
158
|
+
sqlite_begin(db)
|
|
159
|
+
sqlite_execute(db, "INSERT INTO logs (message) VALUES (?)", ["Before rollback"])
|
|
160
|
+
sqlite_rollback(db)
|
|
161
|
+
var count = sqlite_query(db, "SELECT COUNT(*) as cnt FROM logs", [])
|
|
162
|
+
println("Rollback done")
|
|
163
|
+
`);
|
|
164
|
+
expect(error).toBeNull();
|
|
165
|
+
expect(output).toContain("Rollback done");
|
|
166
|
+
});
|
|
167
|
+
it("pg_connect: connection attempt (no server expected)", async () => {
|
|
168
|
+
const { output, error } = await exec(`
|
|
169
|
+
var result = pg_connect("localhost", "5432", "postgres", "password", "testdb")
|
|
170
|
+
println("pg_connect called")
|
|
171
|
+
`);
|
|
172
|
+
expect(output).toContain("pg_connect called");
|
|
173
|
+
});
|
|
174
|
+
it("mysql_connect: connection attempt (no server expected)", async () => {
|
|
175
|
+
const { output, error } = await exec(`
|
|
176
|
+
var result = mysql_connect("localhost", "3306", "root", "password", "testdb")
|
|
177
|
+
println("mysql_connect called")
|
|
178
|
+
`);
|
|
179
|
+
expect(output).toContain("mysql_connect called");
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
//# sourceMappingURL=db-jest.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-jest.test.js","sourceRoot":"","sources":["../src/db-jest.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FreeLang v4 Database Runtime
|
|
3
|
+
* 100M Clone 데이터베이스 구축 및 테스트
|
|
4
|
+
*/
|
|
5
|
+
interface Record {
|
|
6
|
+
[key: string]: any;
|
|
7
|
+
}
|
|
8
|
+
export declare class DBRuntime {
|
|
9
|
+
private tables;
|
|
10
|
+
private variables;
|
|
11
|
+
insert(tableName: string, record: Record): boolean;
|
|
12
|
+
selectById(tableName: string, id: number): Record | null;
|
|
13
|
+
selectAll(tableName: string): Record[];
|
|
14
|
+
createTable(name: string, schema: {
|
|
15
|
+
[key: string]: string;
|
|
16
|
+
}): void;
|
|
17
|
+
getStats(tableName: string): {
|
|
18
|
+
table: string;
|
|
19
|
+
rows: number;
|
|
20
|
+
memory_mb: number;
|
|
21
|
+
};
|
|
22
|
+
bulkInsert(tableName: string, records: Record[]): number;
|
|
23
|
+
}
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* FreeLang v4 Database Runtime
|
|
4
|
+
* 100M Clone 데이터베이스 구축 및 테스트
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.DBRuntime = void 0;
|
|
8
|
+
// ============================================================
|
|
9
|
+
// FreeLang v4 DB Runtime
|
|
10
|
+
// ============================================================
|
|
11
|
+
class DBRuntime {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.tables = new Map();
|
|
14
|
+
this.variables = new Map();
|
|
15
|
+
}
|
|
16
|
+
// INSERT
|
|
17
|
+
insert(tableName, record) {
|
|
18
|
+
const table = this.tables.get(tableName);
|
|
19
|
+
if (!table) {
|
|
20
|
+
console.error(`Table "${tableName}" not found`);
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
// 스키마 검증
|
|
24
|
+
for (const [key, type] of Object.entries(table.schema)) {
|
|
25
|
+
if (!(key in record)) {
|
|
26
|
+
console.error(`Missing field "${key}" in record`);
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
table.rows.push(record);
|
|
31
|
+
// 인덱스 업데이트
|
|
32
|
+
for (const [field, index] of table.indices) {
|
|
33
|
+
const value = record[field];
|
|
34
|
+
if (!index.has(value)) {
|
|
35
|
+
index.set(value, []);
|
|
36
|
+
}
|
|
37
|
+
index.get(value).push(table.rows.length - 1);
|
|
38
|
+
}
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
// SELECT by ID
|
|
42
|
+
selectById(tableName, id) {
|
|
43
|
+
const table = this.tables.get(tableName);
|
|
44
|
+
if (!table)
|
|
45
|
+
return null;
|
|
46
|
+
// 인덱스로 빠른 조회
|
|
47
|
+
const idIndex = table.indices.get('id');
|
|
48
|
+
if (idIndex && idIndex.has(id)) {
|
|
49
|
+
const indices = idIndex.get(id);
|
|
50
|
+
return table.rows[indices[0]] || null;
|
|
51
|
+
}
|
|
52
|
+
// 풀 스캔
|
|
53
|
+
for (const row of table.rows) {
|
|
54
|
+
if (row['id'] === id)
|
|
55
|
+
return row;
|
|
56
|
+
}
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
// SELECT all
|
|
60
|
+
selectAll(tableName) {
|
|
61
|
+
const table = this.tables.get(tableName);
|
|
62
|
+
return table ? table.rows : [];
|
|
63
|
+
}
|
|
64
|
+
// CREATE TABLE
|
|
65
|
+
createTable(name, schema) {
|
|
66
|
+
this.tables.set(name, {
|
|
67
|
+
schema,
|
|
68
|
+
rows: [],
|
|
69
|
+
indices: new Map([['id', new Map()]])
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
// STATS
|
|
73
|
+
getStats(tableName) {
|
|
74
|
+
const table = this.tables.get(tableName);
|
|
75
|
+
if (!table)
|
|
76
|
+
return { table: tableName, rows: 0, memory_mb: 0 };
|
|
77
|
+
// 대략적인 메모리 계산 (JSON 직렬화)
|
|
78
|
+
const json = JSON.stringify(table.rows);
|
|
79
|
+
const memory_bytes = Buffer.byteLength(json, 'utf8');
|
|
80
|
+
const memory_mb = memory_bytes / (1024 * 1024);
|
|
81
|
+
return {
|
|
82
|
+
table: tableName,
|
|
83
|
+
rows: table.rows.length,
|
|
84
|
+
memory_mb: Math.round(memory_mb * 100) / 100
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
// BULK INSERT (고성능)
|
|
88
|
+
bulkInsert(tableName, records) {
|
|
89
|
+
const table = this.tables.get(tableName);
|
|
90
|
+
if (!table)
|
|
91
|
+
return 0;
|
|
92
|
+
let count = 0;
|
|
93
|
+
for (const record of records) {
|
|
94
|
+
table.rows.push(record);
|
|
95
|
+
// 인덱스 업데이트
|
|
96
|
+
for (const [field, index] of table.indices) {
|
|
97
|
+
const value = record[field];
|
|
98
|
+
if (!index.has(value)) {
|
|
99
|
+
index.set(value, []);
|
|
100
|
+
}
|
|
101
|
+
index.get(value).push(table.rows.length - 1);
|
|
102
|
+
}
|
|
103
|
+
count++;
|
|
104
|
+
}
|
|
105
|
+
return count;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
exports.DBRuntime = DBRuntime;
|
|
109
|
+
// ============================================================
|
|
110
|
+
// 메인: 100M Clone Database Test
|
|
111
|
+
// ============================================================
|
|
112
|
+
async function main() {
|
|
113
|
+
console.log('\n🚀 FreeLang v4 Database Runtime');
|
|
114
|
+
console.log('================================\n');
|
|
115
|
+
const db = new DBRuntime();
|
|
116
|
+
// 스키마 정의
|
|
117
|
+
db.createTable('clone_results', {
|
|
118
|
+
id: 'i32',
|
|
119
|
+
app: 'string',
|
|
120
|
+
clone_id: 'i32',
|
|
121
|
+
status: 'string',
|
|
122
|
+
test_time_ms: 'f64'
|
|
123
|
+
});
|
|
124
|
+
// Phase 1: 작은 규모 테스트
|
|
125
|
+
console.log('📊 Phase 1: Inserting 100K records...');
|
|
126
|
+
const start1 = Date.now();
|
|
127
|
+
for (let i = 0; i < 100000; i++) {
|
|
128
|
+
db.insert('clone_results', {
|
|
129
|
+
id: i,
|
|
130
|
+
app: ['proof_ai', 'cwm', 'freelang', 'kim_ai_os'][i % 4],
|
|
131
|
+
clone_id: i,
|
|
132
|
+
status: Math.random() > 0.01 ? 'success' : 'failed',
|
|
133
|
+
test_time_ms: Math.random() * 100
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
const time1 = Date.now() - start1;
|
|
137
|
+
let stats1 = db.getStats('clone_results');
|
|
138
|
+
console.log(`✅ 100K inserted in ${time1}ms`);
|
|
139
|
+
console.log(` Rows: ${stats1.rows}, Memory: ${stats1.memory_mb}MB\n`);
|
|
140
|
+
// Phase 2: 대규모 테스트 (100K → 1M)
|
|
141
|
+
console.log('📊 Phase 2: Scaling to 1M records...');
|
|
142
|
+
const start2 = Date.now();
|
|
143
|
+
for (let i = 100000; i < 1000000; i++) {
|
|
144
|
+
db.insert('clone_results', {
|
|
145
|
+
id: i,
|
|
146
|
+
app: ['proof_ai', 'cwm', 'freelang', 'kim_ai_os'][i % 4],
|
|
147
|
+
clone_id: i,
|
|
148
|
+
status: Math.random() > 0.01 ? 'success' : 'failed',
|
|
149
|
+
test_time_ms: Math.random() * 100
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
const time2 = Date.now() - start2;
|
|
153
|
+
stats1 = db.getStats('clone_results');
|
|
154
|
+
console.log(`✅ 900K inserted in ${time2}ms`);
|
|
155
|
+
console.log(` Total: ${stats1.rows} rows, Memory: ${stats1.memory_mb}MB\n`);
|
|
156
|
+
// Phase 3: 쿼리 성능 (SELECT)
|
|
157
|
+
console.log('📊 Phase 3: Query Performance...');
|
|
158
|
+
const queries = 10000;
|
|
159
|
+
const start3 = Date.now();
|
|
160
|
+
for (let i = 0; i < queries; i++) {
|
|
161
|
+
const randomId = Math.floor(Math.random() * 1000000);
|
|
162
|
+
db.selectById('clone_results', randomId);
|
|
163
|
+
}
|
|
164
|
+
const time3 = Date.now() - start3;
|
|
165
|
+
const qps = Math.round((queries / time3) * 1000);
|
|
166
|
+
console.log(`✅ ${queries} queries in ${time3}ms`);
|
|
167
|
+
console.log(` ${qps.toLocaleString()} queries/sec\n`);
|
|
168
|
+
// Phase 4: BULK INSERT 성능
|
|
169
|
+
console.log('📊 Phase 4: Bulk Insert (추가 100K)...');
|
|
170
|
+
const bulkRecords = [];
|
|
171
|
+
for (let i = 1000000; i < 1100000; i++) {
|
|
172
|
+
bulkRecords.push({
|
|
173
|
+
id: i,
|
|
174
|
+
app: ['proof_ai', 'cwm', 'freelang', 'kim_ai_os'][i % 4],
|
|
175
|
+
clone_id: i,
|
|
176
|
+
status: 'success',
|
|
177
|
+
test_time_ms: Math.random() * 100
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
const start4 = Date.now();
|
|
181
|
+
const inserted = db.bulkInsert('clone_results', bulkRecords);
|
|
182
|
+
const time4 = Date.now() - start4;
|
|
183
|
+
stats1 = db.getStats('clone_results');
|
|
184
|
+
console.log(`✅ ${inserted.toLocaleString()} records inserted in ${time4}ms`);
|
|
185
|
+
console.log(` Total: ${stats1.rows.toLocaleString()} rows, Memory: ${stats1.memory_mb}MB`);
|
|
186
|
+
console.log(` Rate: ${Math.round((inserted / time4) * 1000).toLocaleString()} inserts/sec\n`);
|
|
187
|
+
// 최종 리포트
|
|
188
|
+
console.log('═══════════════════════════════════════════════');
|
|
189
|
+
console.log('📊 FINAL REPORT');
|
|
190
|
+
console.log('═══════════════════════════════════════════════\n');
|
|
191
|
+
const finalStats = db.getStats('clone_results');
|
|
192
|
+
console.log(`Table: clone_results`);
|
|
193
|
+
console.log(`Total Records: ${finalStats.rows.toLocaleString()}`);
|
|
194
|
+
console.log(`Memory Used: ${finalStats.memory_mb}MB`);
|
|
195
|
+
console.log(`Avg Per Record: ${(finalStats.memory_mb * 1024 / finalStats.rows).toFixed(2)}KB\n`);
|
|
196
|
+
console.log(`Operations Summary:`);
|
|
197
|
+
console.log(` Phase 1 (100K): ${time1}ms`);
|
|
198
|
+
console.log(` Phase 2 (900K): ${time2}ms`);
|
|
199
|
+
console.log(` Phase 3 (Queries): ${time3}ms (${qps.toLocaleString()} qps)`);
|
|
200
|
+
console.log(` Phase 4 (Bulk): ${time4}ms (${Math.round((inserted / time4) * 1000).toLocaleString()} inserts/sec)`);
|
|
201
|
+
console.log('\n✅ FreeLang v4 Database Test Complete!');
|
|
202
|
+
}
|
|
203
|
+
main().catch(console.error);
|
|
204
|
+
//# sourceMappingURL=db-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-runtime.js","sourceRoot":"","sources":["../src/db-runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/db.d.ts
ADDED
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FreeLang Database API
|
|
3
|
+
* 모든 데이터베이스 작업을 통일된 인터페이스로 제공
|
|
4
|
+
*/
|
|
5
|
+
export interface Row {
|
|
6
|
+
[key: string]: any;
|
|
7
|
+
}
|
|
8
|
+
export interface QueryResult {
|
|
9
|
+
rows: Row[];
|
|
10
|
+
changes: number;
|
|
11
|
+
}
|
|
12
|
+
export interface TransactionOptions {
|
|
13
|
+
isolation?: "deferred" | "immediate" | "exclusive";
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 모든 DB 드라이버가 구현해야 하는 공통 인터페이스
|
|
17
|
+
*/
|
|
18
|
+
export interface DBAdapter {
|
|
19
|
+
query(sql: string, params?: any[]): Promise<Row[]>;
|
|
20
|
+
execute(sql: string, params?: any[]): Promise<{
|
|
21
|
+
changes: number;
|
|
22
|
+
}>;
|
|
23
|
+
begin(isolation?: string): Promise<void>;
|
|
24
|
+
commit(): Promise<void>;
|
|
25
|
+
rollback(): Promise<void>;
|
|
26
|
+
close(): Promise<void>;
|
|
27
|
+
readonly driverName: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* SQLite 데이터베이스 구현 (sql.js 기반)
|
|
31
|
+
*/
|
|
32
|
+
export declare class SQLiteDB implements DBAdapter {
|
|
33
|
+
private db;
|
|
34
|
+
private filename;
|
|
35
|
+
private inTransaction;
|
|
36
|
+
private initialized;
|
|
37
|
+
readonly driverName = "sqlite";
|
|
38
|
+
constructor(filename: string);
|
|
39
|
+
/**
|
|
40
|
+
* 초기화 (비동기)
|
|
41
|
+
*/
|
|
42
|
+
init(): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* 디스크에 저장
|
|
45
|
+
*/
|
|
46
|
+
save(): void;
|
|
47
|
+
/**
|
|
48
|
+
* SELECT 쿼리 실행
|
|
49
|
+
*/
|
|
50
|
+
query(sql: string, params?: any[]): Promise<Row[]>;
|
|
51
|
+
/**
|
|
52
|
+
* 단일 행 조회
|
|
53
|
+
*/
|
|
54
|
+
queryOne(sql: string, params?: any[]): Promise<Row | null>;
|
|
55
|
+
/**
|
|
56
|
+
* INSERT/UPDATE/DELETE 실행
|
|
57
|
+
*/
|
|
58
|
+
execute(sql: string, params?: any[]): Promise<{
|
|
59
|
+
changes: number;
|
|
60
|
+
}>;
|
|
61
|
+
/**
|
|
62
|
+
* 트랜잭션 실행
|
|
63
|
+
*/
|
|
64
|
+
transaction<T>(callback: () => Promise<T> | T): Promise<T>;
|
|
65
|
+
/**
|
|
66
|
+
* 트랜잭션 시작 (수동)
|
|
67
|
+
*/
|
|
68
|
+
begin(isolation?: "deferred" | "immediate" | "exclusive"): Promise<void>;
|
|
69
|
+
/**
|
|
70
|
+
* 트랜잭션 커밋
|
|
71
|
+
*/
|
|
72
|
+
commit(): Promise<void>;
|
|
73
|
+
/**
|
|
74
|
+
* 트랜잭션 롤백
|
|
75
|
+
*/
|
|
76
|
+
rollback(): Promise<void>;
|
|
77
|
+
/**
|
|
78
|
+
* 테이블 생성
|
|
79
|
+
*/
|
|
80
|
+
createTable(tableName: string, columns: {
|
|
81
|
+
[key: string]: string;
|
|
82
|
+
}): Promise<void>;
|
|
83
|
+
/**
|
|
84
|
+
* 테이블 삭제
|
|
85
|
+
*/
|
|
86
|
+
dropTable(tableName: string): Promise<void>;
|
|
87
|
+
/**
|
|
88
|
+
* 모든 테이블 목록
|
|
89
|
+
*/
|
|
90
|
+
listTables(): Promise<string[]>;
|
|
91
|
+
/**
|
|
92
|
+
* 테이블 스키마 조회
|
|
93
|
+
*/
|
|
94
|
+
getTableSchema(tableName: string): Promise<any[]>;
|
|
95
|
+
/**
|
|
96
|
+
* 데이터베이스 연결 종료
|
|
97
|
+
*/
|
|
98
|
+
close(): Promise<void>;
|
|
99
|
+
/**
|
|
100
|
+
* 데이터베이스 정보
|
|
101
|
+
*/
|
|
102
|
+
getInfo(): {
|
|
103
|
+
filename: string;
|
|
104
|
+
initialized: boolean;
|
|
105
|
+
inTransaction: boolean;
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* 쿼리 빌더
|
|
110
|
+
*/
|
|
111
|
+
export declare class QueryBuilder {
|
|
112
|
+
private table;
|
|
113
|
+
private whereConditions;
|
|
114
|
+
private orderByClause;
|
|
115
|
+
private limitValue;
|
|
116
|
+
private offsetValue;
|
|
117
|
+
private selectColumns;
|
|
118
|
+
private joinClauses;
|
|
119
|
+
private params;
|
|
120
|
+
constructor(table: string);
|
|
121
|
+
select(...columns: string[]): QueryBuilder;
|
|
122
|
+
where(condition: string, ...params: any[]): QueryBuilder;
|
|
123
|
+
join(table: string, on: string): QueryBuilder;
|
|
124
|
+
orderBy(column: string, direction?: "ASC" | "DESC"): QueryBuilder;
|
|
125
|
+
limit(n: number): QueryBuilder;
|
|
126
|
+
offset(n: number): QueryBuilder;
|
|
127
|
+
build(): {
|
|
128
|
+
sql: string;
|
|
129
|
+
params: any[];
|
|
130
|
+
};
|
|
131
|
+
execute(db: SQLiteDB): Promise<Row[]>;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* 마이그레이션 관리자
|
|
135
|
+
*/
|
|
136
|
+
export declare class MigrationManager {
|
|
137
|
+
private db;
|
|
138
|
+
private migrationsDir;
|
|
139
|
+
constructor(db: SQLiteDB, migrationsDir?: string);
|
|
140
|
+
private init;
|
|
141
|
+
/**
|
|
142
|
+
* 모든 마이그레이션 실행
|
|
143
|
+
*/
|
|
144
|
+
up(): Promise<void>;
|
|
145
|
+
/**
|
|
146
|
+
* 마이그레이션 이력 조회
|
|
147
|
+
*/
|
|
148
|
+
status(): Promise<Row[]>;
|
|
149
|
+
/**
|
|
150
|
+
* 마이그레이션 롤백 (역순 실행)
|
|
151
|
+
*/
|
|
152
|
+
down(): Promise<void>;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* PostgreSQL 데이터베이스 구현 (pg 드라이버 기반)
|
|
156
|
+
*/
|
|
157
|
+
export declare class PostgreSQLDB implements DBAdapter {
|
|
158
|
+
private config;
|
|
159
|
+
private client;
|
|
160
|
+
private connected;
|
|
161
|
+
readonly driverName = "postgresql";
|
|
162
|
+
constructor(config: {
|
|
163
|
+
host: string;
|
|
164
|
+
port: number;
|
|
165
|
+
user: string;
|
|
166
|
+
password: string;
|
|
167
|
+
database: string;
|
|
168
|
+
});
|
|
169
|
+
/**
|
|
170
|
+
* 연결 초기화
|
|
171
|
+
*/
|
|
172
|
+
connect(): Promise<void>;
|
|
173
|
+
/**
|
|
174
|
+
* SQL 플레이스홀더 변환 (? → $1, $2, ...)
|
|
175
|
+
*/
|
|
176
|
+
private convertPlaceholders;
|
|
177
|
+
/**
|
|
178
|
+
* SELECT 쿼리 실행
|
|
179
|
+
*/
|
|
180
|
+
query(sql: string, params?: any[]): Promise<Row[]>;
|
|
181
|
+
/**
|
|
182
|
+
* INSERT/UPDATE/DELETE 실행
|
|
183
|
+
*/
|
|
184
|
+
execute(sql: string, params?: any[]): Promise<{
|
|
185
|
+
changes: number;
|
|
186
|
+
}>;
|
|
187
|
+
/**
|
|
188
|
+
* 트랜잭션 시작
|
|
189
|
+
*/
|
|
190
|
+
begin(isolation?: string): Promise<void>;
|
|
191
|
+
/**
|
|
192
|
+
* 트랜잭션 커밋
|
|
193
|
+
*/
|
|
194
|
+
commit(): Promise<void>;
|
|
195
|
+
/**
|
|
196
|
+
* 트랜잭션 롤백
|
|
197
|
+
*/
|
|
198
|
+
rollback(): Promise<void>;
|
|
199
|
+
/**
|
|
200
|
+
* 연결 종료
|
|
201
|
+
*/
|
|
202
|
+
close(): Promise<void>;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* MySQL 데이터베이스 구현 (mysql2/promise 드라이버 기반)
|
|
206
|
+
*/
|
|
207
|
+
export declare class MySQLDB implements DBAdapter {
|
|
208
|
+
private config;
|
|
209
|
+
private conn;
|
|
210
|
+
private connected;
|
|
211
|
+
readonly driverName = "mysql";
|
|
212
|
+
constructor(config: {
|
|
213
|
+
host: string;
|
|
214
|
+
port: number;
|
|
215
|
+
user: string;
|
|
216
|
+
password: string;
|
|
217
|
+
database: string;
|
|
218
|
+
});
|
|
219
|
+
/**
|
|
220
|
+
* 연결 초기화
|
|
221
|
+
*/
|
|
222
|
+
connect(): Promise<void>;
|
|
223
|
+
/**
|
|
224
|
+
* SELECT 쿼리 실행
|
|
225
|
+
*/
|
|
226
|
+
query(sql: string, params?: any[]): Promise<Row[]>;
|
|
227
|
+
/**
|
|
228
|
+
* INSERT/UPDATE/DELETE 실행
|
|
229
|
+
*/
|
|
230
|
+
execute(sql: string, params?: any[]): Promise<{
|
|
231
|
+
changes: number;
|
|
232
|
+
}>;
|
|
233
|
+
/**
|
|
234
|
+
* 트랜잭션 시작
|
|
235
|
+
*/
|
|
236
|
+
begin(isolation?: string): Promise<void>;
|
|
237
|
+
/**
|
|
238
|
+
* 트랜잭션 커밋
|
|
239
|
+
*/
|
|
240
|
+
commit(): Promise<void>;
|
|
241
|
+
/**
|
|
242
|
+
* 트랜잭션 롤백
|
|
243
|
+
*/
|
|
244
|
+
rollback(): Promise<void>;
|
|
245
|
+
/**
|
|
246
|
+
* 연결 종료
|
|
247
|
+
*/
|
|
248
|
+
close(): Promise<void>;
|
|
249
|
+
}
|