Skip to content

Commit 6e52001

Browse files
author
Fernando Leal
committed
atualização config
1 parent eb426ab commit 6e52001

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+646
-139
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "database-builder",
3-
"version": "0.5.8",
3+
"version": "0.6.0-alpha.1",
44
"description": "Library to assist in creating and maintaining SQL commands.",
55
"main": "./src/index.js",
66
"types": "./src/index.d.ts",

src/adapters/abstract-sqlite-database.adapter.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@ export abstract class DatabaseAbstractSQLiteService extends BaseDatabaseAdapter<
2626
databaseNative: DatabaseSQLiteObject
2727
): (fn: (transaction: WebSqlTransactionInterface) => void) => Promise<any> {
2828
return (fn: (transaction: DatabaseBaseTransaction) => void): Promise<any> => {
29-
return databaseNative.transaction(transiction => {
29+
return databaseNative.transaction(transaction => {
3030
fn({
3131
executeSql: (sql: string, values: any): Promise<DatabaseResult> => {
3232
return new Promise<DatabaseResult>((executeSqlResolve, executeSqlReject) => {
33-
transiction.executeSql(sql, Array.isArray(values) ? values : [],
33+
transaction.executeSql(sql, Array.isArray(values) ? values : [],
3434
(_s: any, r: DatabaseResult | PromiseLike<DatabaseResult>) => {
3535
executeSqlResolve(r);
3636
},
@@ -52,6 +52,15 @@ export abstract class DatabaseAbstractSQLiteService extends BaseDatabaseAdapter<
5252
};
5353
}
5454

55+
protected async getSQLiteVersion(databaseNative: DatabaseSQLiteObject): Promise<string> {
56+
const result = await databaseNative.executeSql("select sqlite_version()", []);
57+
return result.rows.item(0);
58+
}
59+
60+
protected getLimitVariables(_databaseNative: DatabaseSQLiteObject): Promise<number> {
61+
return Promise.resolve(10000);
62+
}
63+
5564
// public create(config: DatabaseConfig): Promise<DatabaseObject> {
5665
// return new Promise<DatabaseObject>((resolve, reject) => {
5766
// return this.sqliteCreate(config)

src/adapters/sqlite-database-adapter.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,20 @@ export class SQLiteDatabaseAdapter extends DatabaseAbstractSQLiteService {
2525
protected sqliteCreate(config: DatabaseConfig): Promise<DatabaseSQLiteObject> {
2626
return this._sqlite.create(config);
2727
}
28+
29+
private _sqliteLimitVariablesCached: number;
30+
31+
protected async getLimitVariables(databaseNative: DatabaseSQLiteObject): Promise<number> {
32+
if (this._sqliteLimitVariablesCached)
33+
return this._sqliteLimitVariablesCached;
34+
const version = await this.getSQLiteVersion(databaseNative);
35+
const versionBreakChange = 3.32;
36+
const versionNumber = +/\d+\.\d+/.exec(version)[0];
37+
38+
// https://www.sqlite.org/limits.html#max_variable_number
39+
if (versionNumber < versionBreakChange) {
40+
return this._sqliteLimitVariablesCached = 999;
41+
}
42+
return this._sqliteLimitVariablesCached = 32766;
43+
}
2844
}

src/core/executable-builder.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { DatabaseBase, DatabaseObject, DatabaseResult } from "../definitions/dat
22
import { QueryCompiled } from "./query-compiled";
33
import { ReplacementParam } from "./replacement-param";
44
import { Observable, Observer } from "rxjs";
5+
import { KeyUtils } from "./key-utils";
56

67
export class ExecutableBuilder {
78

@@ -96,7 +97,9 @@ export class ExecutableBuilder {
9697
): Observable<DatabaseResult[]> {
9798
return Observable.create((observer: Observer<DatabaseResult[]>) => {
9899
if (compiled && compiled.length > 0) {
99-
this.executeSql(database, this.checkParams(compiled[0], dataResultsApplied))
100+
this.executeSql(database, this.checkParams(compiled[0],
101+
KeyUtils.transformerDatabaseResultInArray(dataResultsApplied[0]))
102+
)
100103
.subscribe(result => {
101104
// remove o item executado
102105
compiled.shift();

src/core/key-utils.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { MapperTable } from "./../mapper-table";
22
import { MapperColumn } from "../mapper-column";
33
import { PrimaryKeyType } from "./enums/primary-key-type";
44
import { ModelUtils } from "./model-utils";
5+
import { DatabaseResult } from "../definitions";
56

67
export class KeyUtils {
78

@@ -28,4 +29,36 @@ export class KeyUtils {
2829
public static primaryKeysMapper(mapperTable: MapperTable): MapperColumn[] {
2930
return mapperTable.columns.filter(x => !!x.primaryKeyType);
3031
}
32+
33+
public static setKeyByResult<T>(models: Array<T>, result: DatabaseResult, mapper: MapperTable) {
34+
for (let index = 0; index < models.length; index++) {
35+
const model = models[index];
36+
if (KeyUtils.primaryKeyType(mapper) === PrimaryKeyType.AutoIncrement) {
37+
// calcule id by result
38+
const currentId = result.insertId - (result.rowsAffected - (index + 1))
39+
KeyUtils.setKey(mapper, model, currentId);
40+
} else {
41+
const keyValue = KeyUtils.getKey(mapper, model);
42+
try {
43+
result.insertId = keyValue;
44+
} catch (error) {
45+
// ignore error readonly property
46+
}
47+
}
48+
}
49+
return models;
50+
}
51+
52+
public static transformerDatabaseResultInArray(databaseResult: DatabaseResult): Array<DatabaseResult> {
53+
const result: Array<DatabaseResult> = [];
54+
if (databaseResult) {
55+
for (let index = 0; index < databaseResult.rowsAffected; index++) {
56+
const currentId = databaseResult.insertId - (databaseResult.rowsAffected - (index + 1));
57+
result.push({
58+
insertId: currentId
59+
} as DatabaseResult);
60+
}
61+
}
62+
return result;
63+
}
3164
}

src/core/utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ export class Utils {
7878
return typeof value === type;
7979
}
8080

81-
public static isArray(value: any): boolean {
81+
public static isArray(value: any): value is any[] {
8282
return Array.isArray(value);
8383
}
8484

src/crud/commander-builder.ts

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,61 +2,63 @@ import { DatabaseBuilderError, QueryCompiled } from "../core";
22
import { Utils, ValueType } from "../core/utils";
33
import { MapperColumn } from "../mapper-column";
44
import { MapperTable } from "../mapper-table";
5+
import { ConfigCommander } from "./config-commander";
56

67
export class CommanderBuilder {
78

8-
public static delete(tableName: string)
9+
constructor(private _config: ConfigCommander) {
10+
}
11+
12+
public delete(tableName: string)
913
: QueryCompiled {
1014
return {
1115
params: [],
1216
query: `DELETE FROM ${tableName}`,
1317
};
1418
}
1519

16-
public static deleteMapper<T>(mapper: MapperTable)
20+
public deleteMapper<T>(mapper: MapperTable)
1721
: QueryCompiled {
1822
return this.delete(mapper.tableName);
1923
}
2024

21-
public static update(tableName: string, columnsNames: string[], params: ValueType[])
25+
public update(tableName: string, columnsNames: string[], params: ValueType[])
2226
: QueryCompiled {
2327
return {
2428
params: [].concat(params),
2529
query: `UPDATE ${tableName} SET ${columnsNames.join(", ")}`,
2630
};
2731
}
2832

29-
public static updateColumn<T>(tableName: string, columns: MapperColumn[], model: T)
33+
public updateColumn<T>(tableName: string, columns: MapperColumn[], model: T)
3034
: QueryCompiled {
3135
return this.update(tableName, columns.map(x => x.column), columns.map(column => Utils.getValue<any, any>(model, column.fieldReference)?.[0]));
3236
}
3337

34-
public static updateMapper<T>(mapper: MapperTable, model: T)
38+
public updateMapper<T>(mapper: MapperTable, model: T)
3539
: QueryCompiled {
3640
return this.updateColumn(mapper.tableName, mapper.columns, model);
3741
}
3842

39-
public static insert(tableName: string, columnsNames: string[], params: ValueType[])
43+
public insert(tableName: string, columnsNames: string[], params: ValueType[])
4044
: QueryCompiled {
4145
return this.batchInsert(tableName, columnsNames, [params])[0];
4246
}
4347

44-
public static insertColumn<T>(tableName: string, columns: MapperColumn[], model: T)
48+
public insertColumn<T>(tableName: string, columns: MapperColumn[], model: T)
4549
: QueryCompiled {
4650
return this.batchInsertColumn(tableName, columns, [model])[0];
4751
}
4852

49-
public static insertMapper<T>(mapper: MapperTable, model: T)
53+
public insertMapper<T>(mapper: MapperTable, model: T)
5054
: QueryCompiled {
5155
return this.batchInsertMapper(mapper, [model])[0];
5256
}
5357

54-
private static LIMIT_VARIABLES_INSERT = 10000;
55-
56-
public static batchInsert(tableName: string, columnsNames: string[], values: Array<ValueType[]>)
58+
public batchInsert(tableName: string, columnsNames: string[], values: Array<ValueType[]>)
5759
: QueryCompiled[] {
5860
if (this.validValues(values)) {
59-
return this.splitChunks(values, this.LIMIT_VARIABLES_INSERT).map(valuesChunk => {
61+
return this.splitChunks(values, Math.floor(this._config.sqliteLimitVariables / columnsNames.length)).map(valuesChunk => {
6062
return {
6163
params: [].concat(...valuesChunk),
6264
query: Utils.normalizeSqlString(
@@ -71,7 +73,7 @@ export class CommanderBuilder {
7173
}
7274
}
7375

74-
private static validValues(values: Array<ValueType[]>): boolean {
76+
private validValues(values: Array<ValueType[]>): boolean {
7577
if (values.length < 1)
7678
throw new DatabaseBuilderError(`Values not informed`);
7779
const sizeInnerArray = values?.[0].length;
@@ -82,7 +84,7 @@ export class CommanderBuilder {
8284
return true;
8385
}
8486

85-
public static batchInsertColumn<T>(tableName: string, columns: MapperColumn[], models: Array<T>)
87+
public batchInsertColumn<T>(tableName: string, columns: MapperColumn[], models: Array<T>)
8688
: QueryCompiled[] {
8789
return this.batchInsert(tableName, columns.map(x => x.column),
8890
models.map(model => {
@@ -91,12 +93,12 @@ export class CommanderBuilder {
9193
);
9294
}
9395

94-
public static batchInsertMapper<T>(mapper: MapperTable, models: Array<T>)
96+
public batchInsertMapper<T>(mapper: MapperTable, models: Array<T>)
9597
: QueryCompiled[] {
9698
return this.batchInsertColumn(mapper.tableName, mapper.columns, models);
9799
}
98100

99-
private static splitChunks(sourceArray: any[], chunkSize: number): any[][] {
101+
private splitChunks(sourceArray: any[], chunkSize: number): any[][] {
100102
const result: any[][] = [];
101103
for (var i = 0; i < sourceArray.length; i += chunkSize) {
102104
result[i / chunkSize] = sourceArray.slice(i, i + chunkSize);

src/crud/config-commander.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export interface ConfigCommander {
2+
sqliteLimitVariables: number;
3+
}

src/crud/crud-base-builder.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import { ColumnsCompiled } from "../core/columns-compiled";
44
import { MapperTable } from "../mapper-table";
55
import { SqlBaseBuilder } from "./sql-base-builder";
66
import { QueryCompiled } from "../core/query-compiled";
7+
import { ConfigCommander } from "./config-commander";
8+
import { CommanderBuilder } from "./commander-builder";
79

810
export abstract class CrudBaseBuilder<
911
T,
@@ -16,12 +18,16 @@ export abstract class CrudBaseBuilder<
1618
keyColumns: []
1719
};
1820

21+
protected readonly _commanderBuilder: CommanderBuilder;
22+
1923
constructor(
2024
typeT: new () => T,
2125
mapperTable: MapperTable,
26+
public config: ConfigCommander,
2227
alias: string = void 0,
2328
) {
2429
super(typeT, typeT, mapperTable, alias);
30+
this._commanderBuilder = new CommanderBuilder(config);
2531
}
2632

2733
public compile(): QueryCompiled {

src/crud/crud-base.ts

Lines changed: 49 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -65,29 +65,60 @@ export abstract class CrudBase<
6565
if (this._typeCrud === TypeCrud.CREATE) {
6666
return observable.pipe(map(results => {
6767
const models: Array<T> = Utils.isArray(this.model())
68-
? this.model() as Array<T>
69-
: [this.model() as T];
70-
if(models.length > 1 && models.length != results.length){
71-
throw new DatabaseBuilderError(`Há ${models.length} models e ${results.length} results, e o "checkDatabaseResult" ainda não sabe como proceder nessa situação, possivelmente você está tentando executar multi comandos em combinação com comandos em cascade`);
68+
? this.model() as Array<T>
69+
: [this.model() as T];
70+
const mainResult = results[0];
71+
if (models.length > 1 && models.length != mainResult.rowsAffected) {
72+
throw new DatabaseBuilderError(`Há ${models.length} models e ${mainResult.rowsAffected} results afetados, isso parece incoerente, e não é possivel trata-lo`);
7273
}
74+
this.setKeyByResult(models, mainResult);
7375
// como não sei qual será o retorno do insertMultiple, vou continuar considerando apenas o primeiro para pegar o id inserted do head
74-
for (let index = 0; index < models.length; index++) {
75-
const result = results[index];
76-
const model = models[index];
77-
if (KeyUtils.primaryKeyType(this._builder.getMapper()) === PrimaryKeyType.AutoIncrement) {
78-
KeyUtils.setKey(this._builder.getMapper(), model, result.insertId);
79-
} else {
80-
const keyValue = KeyUtils.getKey(this._builder.getMapper(), model);
81-
try {
82-
result.insertId = keyValue;
83-
} catch (error) {
84-
// ignore error readonly property
85-
}
86-
}
87-
}
76+
77+
// for (let index = models.length - 1; index >= 0; index--) {
78+
// const model = models[index];
79+
80+
// }
81+
82+
// for (let index = 0; index < models.length; index++) {
83+
// const result = results[index];
84+
// const model = models[index];
85+
// if (KeyUtils.primaryKeyType(this._builder.getMapper()) === PrimaryKeyType.AutoIncrement) {
86+
// KeyUtils.setKey(this._builder.getMapper(), model, result.insertId);
87+
// } else {
88+
// const keyValue = KeyUtils.getKey(this._builder.getMapper(), model);
89+
// try {
90+
// result.insertId = keyValue;
91+
// } catch (error) {
92+
// // ignore error readonly property
93+
// }
94+
// }
95+
// }
8896
return results;
8997
}))
9098
}
9199
return observable;
92100
}
101+
102+
/**
103+
* rowsAffected: 3
104+
* id: 6
105+
*/
106+
protected setKeyByResult(models: Array<T>, result: DatabaseResult) {
107+
for (let index = 0; index < models.length; index++) {
108+
const model = models[index];
109+
if (KeyUtils.primaryKeyType(this._builder.getMapper()) === PrimaryKeyType.AutoIncrement) {
110+
// calcule id by result
111+
const currentId = result.insertId - (result.rowsAffected - (index + 1))
112+
KeyUtils.setKey(this._builder.getMapper(), model, currentId);
113+
} else {
114+
const keyValue = KeyUtils.getKey(this._builder.getMapper(), model);
115+
try {
116+
result.insertId = keyValue;
117+
} catch (error) {
118+
// ignore error readonly property
119+
}
120+
}
121+
}
122+
return models;
123+
}
93124
}

0 commit comments

Comments
 (0)