Skip to content

Commit 67703b5

Browse files
author
otadmin
committed
in progress
1 parent 7bf7517 commit 67703b5

21 files changed

+2509
-740
lines changed

.gitignore

100644100755
+2-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
/nbproject/
22
/node_modules/
33
/package-lock.js
4-
/coverage/
4+
/coverage/
5+
/.nyc_output/

.travis.yml

100644100755
+1-2
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,4 @@ node_js:
33
- "node"
44
services:
55
- mysql
6-
script: npm run coverage
7-
after_success: 'npm run coveralls'
6+
after_success: npm run coverage

CONTRIBUTING.md

100644100755
File mode changed.

Gruntfile.js

100644100755
File mode changed.

LICENSE

100644100755
File mode changed.

README.md

100644100755
+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<img src='https://i.imgur.com/AOfuTLA.png'>
88
</p>
99

10-
*Version 3.0.6* - [Github](https://github.com/Pamblam/mysql-import/) - [NPM](https://www.npmjs.com/package/mysql-import)
10+
*Version 4.0.23* - [Github](https://github.com/Pamblam/mysql-import/) - [NPM](https://www.npmjs.com/package/mysql-import)
1111

1212
[![Build Status](https://api.travis-ci.org/Pamblam/mysql-import.svg?branch=master)](https://travis-ci.org/Pamblam/mysql-import/) [![Coverage Status](https://coveralls.io/repos/github/Pamblam/mysql-import/badge.svg?branch=master)](https://coveralls.io/github/Pamblam/mysql-import?branch=master)
1313

mysql-import.js

100644100755
+202-79
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* mysql-import - v3.0.6
2+
* mysql-import - v4.0.23
33
* Import .sql into a MySQL database with Node.
44
* @author Rob Parham
55
* @website https://github.com/pamblam/mysql-import#readme
@@ -12,107 +12,230 @@ const mysql = require('mysql');
1212
const fs = require('fs');
1313
const path = require("path");
1414

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;
1826
this.conn = null;
19-
this.err_handler = (e)=>{
20-
err_handler(e);
21-
this.disconnect();
22-
}
27+
this.encoding = 'utf8';
2328
}
2429

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;
2744
}
2845

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+
});
3560
}
3661

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;
5068
}
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+
});
5790
}
5891

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();
69108
});
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);
73154
}
74-
}).then(()=>{
75-
done();
76155
});
77156
});
78157
}
79158

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+
}
89167
});
90168
});
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 };
105169
}
106170

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+
}
108182

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+
}
111194

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+
}
114236

115-
module.exports = importer;
237+
Importer.version = '4.0.23';
238+
module.exports = Importer;
116239

117240
/**
118241
* Execute the loopBody function once for each item in the items array,

0 commit comments

Comments
 (0)