1
1
/**
2
- * mysql-import - v3 .0.6
2
+ * mysql-import - v4 .0.23
3
3
* Import .sql into a MySQL database with Node.
4
4
* @author Rob Parham
5
5
* @website https://github.com/pamblam/mysql-import#readme
@@ -12,107 +12,230 @@ const mysql = require('mysql');
12
12
const fs = require ( 'fs' ) ;
13
13
const path = require ( "path" ) ;
14
14
15
- class importer {
16
- constructor ( settings , err_handler ) {
17
- this . settings = settings ;
15
+
16
+ /**
17
+ * mysql-import - Importer class
18
+ * @version 4.0.23
19
+ * https://github.com/Pamblam/mysql-import
20
+ */
21
+
22
+ class Importer {
23
+
24
+ constructor ( settings ) {
25
+ this . connection_settings = settings ;
18
26
this . conn = null ;
19
- this . err_handler = ( e ) => {
20
- err_handler ( e ) ;
21
- this . disconnect ( ) ;
22
- }
27
+ this . encoding = 'utf8' ;
23
28
}
24
29
25
- connect ( ) {
26
- this . conn = this . conn || mysql . createConnection ( this . settings ) ;
30
+ setEncoding ( encoding ) {
31
+ var supported_encodings = [
32
+ 'utf8' ,
33
+ 'ucs2' ,
34
+ 'utf16le' ,
35
+ 'latin1' ,
36
+ 'ascii' ,
37
+ 'base64' ,
38
+ 'hex'
39
+ ] ;
40
+ if ( ! supported_encodings . includes ( encoding ) ) {
41
+ throw new Error ( "Unsupported encoding: " + encoding ) ;
42
+ }
43
+ this . encoding = encoding ;
27
44
}
28
45
29
- disconnect ( ) {
30
- if ( ! this . conn ) return ;
31
- try {
32
- this . conn . end ( ) ;
33
- } catch ( e ) { }
34
- this . conn = null ;
46
+ use ( database ) {
47
+ return new Promise ( ( resolve , reject ) => {
48
+ if ( ! this . conn ) {
49
+ this . connection_settings . database = database ;
50
+ return ;
51
+ }
52
+ this . conn . changeUser ( { database} , err => {
53
+ if ( err ) {
54
+ reject ( err ) ;
55
+ } else {
56
+ resolve ( ) ;
57
+ }
58
+ } ) ;
59
+ } ) ;
35
60
}
36
61
37
- getSQLFilePaths ( paths ) {
38
- if ( ! Array . isArray ( paths ) ) paths = [ paths ] ;
39
- var full_paths = [ ] ;
40
- for ( var i = paths . length ; i -- ; ) {
41
- let exists = fs . existsSync ( paths [ i ] ) ;
42
- if ( ! exists ) continue ;
43
- let stat = fs . lstatSync ( paths [ i ] ) ;
44
- let isFile = stat . isFile ( ) ;
45
- let isDir = stat . isDirectory ( ) ;
46
- if ( ! isFile && ! isDir ) continue ;
47
- if ( isFile ) {
48
- if ( paths [ i ] . toLowerCase ( ) . substring ( paths [ i ] . length - 4 ) === '.sql' ) {
49
- full_paths . push ( path . resolve ( paths [ i ] ) ) ;
62
+ importSingleFile ( filepath ) {
63
+ return new Promise ( ( resolve , reject ) => {
64
+ fs . readFile ( filepath , this . encoding , ( err , queriesString ) => {
65
+ if ( err ) {
66
+ reject ( err ) ;
67
+ return ;
50
68
}
51
- } else {
52
- var more_paths = fs . readdirSync ( paths [ i ] ) . map ( p => path . join ( paths [ i ] , p ) ) ;
53
- full_paths . push ( ...this . getSQLFilePaths ( more_paths ) ) ;
54
- }
55
- }
56
- return full_paths ;
69
+ var queries = new queryParser ( queriesString ) . queries ;
70
+ var error = null ;
71
+ slowLoop ( queries , ( query , index , next ) => {
72
+ if ( error ) {
73
+ next ( ) ;
74
+ return ;
75
+ }
76
+ this . conn . query ( query , err => {
77
+ if ( err ) error = err ;
78
+ next ( ) ;
79
+ } ) ;
80
+ } ) . then ( ( ) => {
81
+ if ( error ) {
82
+ reject ( error ) ;
83
+ } else {
84
+ resolve ( ) ;
85
+ }
86
+ } ) ;
87
+
88
+ } ) ;
89
+ } ) ;
57
90
}
58
91
59
- importSingleFile ( filename ) {
60
- return new Promise ( done => {
61
- var queriesString = fs . readFileSync ( filename , 'utf8' ) ;
62
- var queries = new queryParser ( queriesString ) . queries ;
63
- slowLoop ( queries , ( q , i , d ) => {
64
- try {
65
- this . conn . query ( q , err => {
66
- /* istanbul ignore next */
67
- if ( err ) this . err_handler ( err ) ;
68
- else d ( ) ;
92
+ import ( ...input ) {
93
+ return new Promise ( async ( resolve , reject ) => {
94
+ try {
95
+ await this . _connect ( ) ;
96
+ var files = await this . _getSQLFilePaths ( ...input ) ;
97
+ var error = null ;
98
+ await slowLoop ( files , ( file , index , next ) => {
99
+ if ( error ) {
100
+ next ( ) ;
101
+ return ;
102
+ }
103
+ this . importSingleFile ( file ) . then ( ( ) => {
104
+ next ( ) ;
105
+ } ) . catch ( err => {
106
+ error = err ;
107
+ next ( ) ;
69
108
} ) ;
70
- } catch ( e ) {
71
- /* istanbul ignore next */
72
- this . err_handler ( e ) ;
109
+ } ) ;
110
+ if ( error ) throw error ;
111
+ await this . disconnect ( ) ;
112
+ resolve ( ) ;
113
+ } catch ( err ) {
114
+ reject ( err ) ;
115
+ }
116
+ } ) ;
117
+ } ;
118
+
119
+ disconnect ( graceful = true ) {
120
+ return new Promise ( ( resolve , reject ) => {
121
+ if ( ! this . conn ) {
122
+ resolve ( ) ;
123
+ return ;
124
+ }
125
+ if ( graceful ) {
126
+ this . conn . end ( err => {
127
+ if ( err ) {
128
+ reject ( err ) ;
129
+ return ;
130
+ }
131
+ this . conn = null ;
132
+ resolve ( ) ;
133
+ } ) ;
134
+ } else {
135
+ this . conn . destroy ( ) ;
136
+ resolve ( ) ;
137
+ }
138
+ } ) ;
139
+ }
140
+
141
+ _connect ( ) {
142
+ return new Promise ( ( resolve , reject ) => {
143
+ if ( this . conn ) {
144
+ resolve ( this . conn ) ;
145
+ return ;
146
+ }
147
+ var connection = mysql . createConnection ( this . connection_settings ) ;
148
+ connection . connect ( err => {
149
+ if ( err ) {
150
+ reject ( err ) ;
151
+ } else {
152
+ this . conn = connection ;
153
+ resolve ( this . conn ) ;
73
154
}
74
- } ) . then ( ( ) => {
75
- done ( ) ;
76
155
} ) ;
77
156
} ) ;
78
157
}
79
158
80
- import ( input ) {
81
- return new Promise ( done => {
82
- this . connect ( ) ;
83
- var files = this . getSQLFilePaths ( input ) ;
84
- slowLoop ( files , ( f , i , d ) => {
85
- this . importSingleFile ( f ) . then ( d ) ;
86
- } ) . then ( ( ) => {
87
- this . disconnect ( ) ;
88
- done ( ) ;
159
+ _fileExists ( filepath ) {
160
+ return new Promise ( ( resolve , reject ) => {
161
+ fs . access ( filepath , fs . F_OK , err => {
162
+ if ( err ) {
163
+ reject ( err ) ;
164
+ } else {
165
+ resolve ( ) ;
166
+ }
89
167
} ) ;
90
168
} ) ;
91
- } ;
92
-
93
- }
94
-
95
- importer . version = '3.0.6' ;
96
- importer . config = function ( settings ) {
97
- const valid = settings . hasOwnProperty ( 'host' ) && typeof settings . host === "string" &&
98
- settings . hasOwnProperty ( 'user' ) && typeof settings . user === "string" &&
99
- settings . hasOwnProperty ( 'password' ) && typeof settings . password === "string" &&
100
- settings . hasOwnProperty ( 'database' ) && typeof settings . database === "string" ;
101
-
102
- /* istanbul ignore next */
103
- if ( ! settings . hasOwnProperty ( "onerror" ) || typeof settings . onerror !== "function" ) {
104
- settings . onerror = err => { throw err } ;
105
169
}
106
170
107
- var err_handler = settings . onerror ;
171
+ _statFile ( filepath ) {
172
+ return new Promise ( ( resolve , reject ) => {
173
+ fs . lstat ( filepath , ( err , stat ) => {
174
+ if ( err ) {
175
+ reject ( err ) ;
176
+ } else {
177
+ resolve ( stat ) ;
178
+ }
179
+ } ) ;
180
+ } ) ;
181
+ }
108
182
109
- /* istanbul ignore next */
110
- if ( ! valid ) return settings . onerror ( new Error ( "Invalid host, user, password, or database parameters" ) ) ;
183
+ _readDir ( filepath ) {
184
+ return new Promise ( ( resolve , reject ) => {
185
+ fs . readdir ( filepath , ( err , files ) => {
186
+ if ( err ) {
187
+ reject ( err ) ;
188
+ } else {
189
+ resolve ( files ) ;
190
+ }
191
+ } ) ;
192
+ } ) ;
193
+ }
111
194
112
- return new importer ( settings , err_handler ) ;
113
- } ;
195
+ _getSQLFilePaths ( ...paths ) {
196
+ return new Promise ( async ( resolve , reject ) => {
197
+ var full_paths = [ ] ;
198
+ var error = null ;
199
+ paths = [ ] . concat . apply ( [ ] , paths ) ; // flatten array of paths
200
+ await slowLoop ( paths , async ( filepath , index , next ) => {
201
+ if ( error ) {
202
+ next ( ) ;
203
+ return ;
204
+ }
205
+ try {
206
+ await this . _fileExists ( filepath ) ;
207
+ var stat = await this . _statFile ( filepath ) ;
208
+ if ( stat . isFile ( ) ) {
209
+ if ( filepath . toLowerCase ( ) . substring ( filepath . length - 4 ) === '.sql' ) {
210
+ full_paths . push ( path . resolve ( filepath ) ) ;
211
+ }
212
+ next ( ) ;
213
+ } else if ( stat . isDirectory ( ) ) {
214
+ var more_paths = await this . _readDir ( filepath ) ;
215
+ more_paths = more_paths . map ( p => path . join ( filepath , p ) ) ;
216
+ var sql_files = await this . _getSQLFilePaths ( ...more_paths ) ;
217
+ full_paths . push ( ...sql_files ) ;
218
+ next ( ) ;
219
+ } else {
220
+ next ( ) ;
221
+ }
222
+ } catch ( err ) {
223
+ error = err ;
224
+ next ( ) ;
225
+ }
226
+ } ) ;
227
+ if ( error ) {
228
+ reject ( error ) ;
229
+ } else {
230
+ resolve ( full_paths ) ;
231
+ }
232
+ } ) ;
233
+ }
234
+
235
+ }
114
236
115
- module . exports = importer ;
237
+ Importer . version = '4.0.23' ;
238
+ module . exports = Importer ;
116
239
117
240
/**
118
241
* Execute the loopBody function once for each item in the items array,
0 commit comments