-
-
Notifications
You must be signed in to change notification settings - Fork 6.2k
/
ReactNativeDriver.ts
99 lines (81 loc) · 3.45 KB
/
ReactNativeDriver.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import {AbstractSqliteDriver} from "../sqlite-abstract/AbstractSqliteDriver";
import {ReactNativeConnectionOptions} from "./ReactNativeConnectionOptions";
import {ReactNativeQueryRunner} from "./ReactNativeQueryRunner";
import {QueryRunner} from "../../query-runner/QueryRunner";
import {Connection} from "../../connection/Connection";
import {DriverOptionNotSetError} from "../../error/DriverOptionNotSetError";
import {DriverPackageNotInstalledError} from "../../error/DriverPackageNotInstalledError";
import {ReplicationMode} from "../types/ReplicationMode";
export class ReactNativeDriver extends AbstractSqliteDriver {
options: ReactNativeConnectionOptions;
// -------------------------------------------------------------------------
// Constructor
// -------------------------------------------------------------------------
constructor(connection: Connection) {
super(connection);
this.database = this.options.database;
// validate options to make sure everything is set
if (!this.options.database)
throw new DriverOptionNotSetError("database");
if (!this.options.location)
throw new DriverOptionNotSetError("location");
// load sqlite package
this.loadDependencies();
}
// -------------------------------------------------------------------------
// Public Methods
// -------------------------------------------------------------------------
/**
* Closes connection with database.
*/
async disconnect(): Promise<void> {
return new Promise<void>((ok, fail) => {
this.queryRunner = undefined;
this.databaseConnection.close(ok, fail);
});
}
/**
* Creates a query runner used to execute database queries.
*/
createQueryRunner(mode: ReplicationMode): QueryRunner {
if (!this.queryRunner)
this.queryRunner = new ReactNativeQueryRunner(this);
return this.queryRunner;
}
// -------------------------------------------------------------------------
// Protected Methods
// -------------------------------------------------------------------------
/**
* Creates connection with the database.
*/
protected createDatabaseConnection() {
return new Promise<void>((ok, fail) => {
const options = Object.assign({}, {
name: this.options.database,
location: this.options.location,
}, this.options.extra || {});
this.sqlite.openDatabase(options, (db: any) => {
const databaseConnection = db;
// we need to enable foreign keys in sqlite to make sure all foreign key related features
// working properly. this also makes onDelete work with sqlite.
databaseConnection.executeSql(`PRAGMA foreign_keys = ON;`, [], (result: any) => {
ok(databaseConnection);
}, (error: any) => {
fail(error);
});
}, (error: any) => {
fail(error);
});
});
}
/**
* If driver dependency is not given explicitly, then try to load it via "require".
*/
protected loadDependencies(): void {
try {
this.sqlite = require("react-native-sqlite-storage");
} catch (e) {
throw new DriverPackageNotInstalledError("React-Native", "react-native-sqlite-storage");
}
}
}