Skip to content

Commit

Permalink
Factorizo cmd-tool
Browse files Browse the repository at this point in the history
  • Loading branch information
diegoefe committed Oct 18, 2016
1 parent 9e5b70e commit 0bd200d
Show file tree
Hide file tree
Showing 5 changed files with 178 additions and 160 deletions.
38 changes: 38 additions & 0 deletions bin/common.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
"use strict";

var common = {};

var changing = require('best-globals').changing;
var fs = require('fs-promise');
var jsYaml = require('js-yaml');

common.createParams = function createParams(params, preparedParams) {
var res = {
tableName:params.tableName,
rawTable:params.rawTable,
opts: changing(params.opts, preparedParams.opts),
};
res.opts.columns = params.columns || preparedParams.columns;
return res;
}

common.writeConfigYaml = function writeConfigYaml(params, inputYaml) {
var create = false;
return fs.exists(inputYaml).then(function(exists) {
create = ! exists;
if(create) {
var createdParams = Object.assign({}, params);
if(! createdParams.opts.columns) { delete createdParams.opts.columns; }
delete createdParams.rawTable;
return fs.writeFile(inputYaml, jsYaml.safeDump(createdParams), {encoding:'utf8'});
}
}).then(function() {
if(create) {
process.stdout.write("Generated '"+inputYaml+"' with deduced options\n");
} else {
process.stdout.write("Not overwriding existing '"+inputYaml+"'\n");
}
});
}

module.exports = common;
120 changes: 120 additions & 0 deletions bin/fast.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
"use strict";

var fast = {};

var txtToSql = require('../lib/txt-to-sql.js');
var common = require('./common.js');
var fsSync = require('fs');
var readline = require('readline');

function fastProcessEncodingOptions(info) {
return txtToSql.getEncoding(info.rawTable).then(function(encoding) {
info.inputEncodingDetected = encoding;
if(! info.opts.inputEncoding) { info.opts.inputEncoding = info.inputEncodingDetected; }
if(! info.opts.outputEncoding) { info.opts.outputEncoding = info.inputEncodingDetected; }
return info;
});
}

function fastProcessLine(info, line) {
if(line && info.lines && info.lines.length<info.fastMaxLines) {
info.lines.push(line);
}
}

function fastAnalyzeLines(info) {
txtToSql.separateRows(info);
txtToSql.verifyColumnCount(info);
txtToSql.transformNames(info);
txtToSql.verifyColumnNames(info);
txtToSql.determineColumnTypes(info);
txtToSql.determineColumnValuesInfo(info);
txtToSql.determinePrimaryKey(info);
return txtToSql.generatePrepareResult(info);
}

function fastInsert(outStream, info, line) {
if(line.trim() !=='') {
var row = [txtToSql.separateOneRow(info, line)];
var rows = txtToSql.createAdaptedRows(info, row);
var insertInto = txtToSql.createInsertInto(info);
var insertValues = txtToSql.createInsertValues(rows, info.columnsInfo).map(function(c) { return insertInto + c + ";"; }).join('\n');
outStream.write(insertValues+'\n');
}
}

function fastCreateCreate(info) {
txtToSql.quoteNames(info);
txtToSql.generateDropTable(info);
txtToSql.generateCreateScript(info);
}

function fastFinalize(info, outStream) {
fastCreateCreate(info);
//txtToSql.removeIgnoredLines(info);
txtToSql.generateInsertScript(info);
//console.log("info", info.scripts)
info.scripts.forEach(function(script) {
outStream.write(script.sql);
});
}

function doFast(params, inputBase, fastBufferingThreshold) {
var inStream, outStream;
var rl;
var preparedResult;
return Promise.resolve().then(function() {
return txtToSql.verifyInputParams(params);
}).then(fastProcessEncodingOptions)
.then(function(info) {
//console.log("info", info);
inStream = fsSync.createReadStream(inputBase+'.txt', {encoding:'utf8'});
outStream = fsSync.createWriteStream(inputBase+'.sql', {encoding:'utf8'});
info.lines = [];
// maximo de lineas para utilizar procesamiento standard
info.fastMaxLines = fastBufferingThreshold;
rl = readline.createInterface({
input: inStream,
terminal: false
});
rl.on('line', function(line) {
//console.log("line", line);
if(! info.headers) {
info.headers = line;
txtToSql.determineSeparator(info);
txtToSql.determineDelimiter(info);
txtToSql.separateColumns(info);
} else {
fastProcessLine(info, line);
if(info.lines) {
if(info.lines.length===info.fastMaxLines) {
preparedResult = fastAnalyzeLines(info);
fastCreateCreate(info);
// deben estar drop y create
info.scripts.forEach(function(script) {
outStream.write(script.sql);
});
info.lines.forEach(function(ln) {
fastInsert(outStream, info, ln);
});
delete info.lines;
}
} else { // more than info.fastMaxLines
fastInsert(outStream, info, line);
}
}
});
rl.on('close', function() {
if(info.lines && info.lines.length<info.fastMaxLines) {
fastProcessLine(info);
preparedResult = fastAnalyzeLines(info);
fastFinalize(info, outStream);
}
//console.log("preparedResult", preparedResult);
common.writeConfigYaml(common.createParams(params, preparedResult), inputBase+'.yaml');
});
});
}

fast.doFast = doFast;
module.exports = fast;
178 changes: 20 additions & 158 deletions bin/txt-to-sql-run.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,29 +3,14 @@
"use strict";

var program = require('commander');
var common = require('./common.js');
var fast = require('./fast.js');
var txtToSql = require('../lib/txt-to-sql.js');
var Promises = require('best-promise');
var fs = require('fs-promise');
var fsSync = require('fs');

var Path = require('path');
var miniTools = require('mini-tools');
var jsYaml = require('js-yaml');
var changing = require('best-globals').changing;
var readline = require('readline');

function getOutputDir(inFile) {
return Promises.start(function() {
if(!inFile) { throw new Error("null file"); }
return fs.exists(inFile);
}).then(function(exists) {
if(! exists) { throw new Error("'"+inFile+"' does not exists"); }
return inFile;
}).then(function(inFile) {
return Path.dirname(Path.resolve(inFile));
}).catch(function(err) {
return Promise.reject(err);
});
};

program
.version(require('../package').version)
Expand All @@ -50,6 +35,20 @@ cmdParams.exportDefaults = program.exportDefaults;
// numero de lineas a leer para analizar entrada
var fastBufferingThreshold = 50;

function getOutputDir(inFile) {
return Promises.start(function() {
if(!inFile) { throw new Error("null file"); }
return fs.exists(inFile);
}).then(function(exists) {
if(! exists) { throw new Error("'"+inFile+"' does not exists"); }
return inFile;
}).then(function(inFile) {
return Path.dirname(Path.resolve(inFile));
}).catch(function(err) {
return Promise.reject(err);
});
};

function collectExistentFiles(files) {
var existentFiles = [];
return Promises.all(files.map(function(file) {
Expand All @@ -61,34 +60,6 @@ function collectExistentFiles(files) {
});
};

function createParams(params, preparedParams) {
var res = {
tableName:params.tableName,
rawTable:params.rawTable,
opts: changing(params.opts, preparedParams.opts),
};
res.opts.columns = params.columns || preparedParams.columns;
return res;
}

function writeConfigYaml(params, inputYaml) {
var create = false;
return fs.exists(inputYaml).then(function(exists) {
create = ! exists;
if(create) {
var createdParams = Object.assign({}, params);
if(! createdParams.opts.columns) { delete createdParams.opts.columns; }
delete createdParams.rawTable;
return fs.writeFile(inputYaml, jsYaml.safeDump(createdParams), {encoding:'utf8'});
}
}).then(function() {
if(create) {
process.stdout.write("Generated '"+inputYaml+"' with deduced options\n");
} else {
process.stdout.write("Not overwriding existing '"+inputYaml+"'\n");
}
});
}

function doPrepare(params, inputYaml) {
var res;
Expand All @@ -97,8 +68,8 @@ function doPrepare(params, inputYaml) {
if(result.warnings) {
process.stdout.write("There are warnings: \n "+result.warnings.join('\n ')+"\n");
}
res = createParams(params, result);
return writeConfigYaml(res, inputYaml);
res = common.createParams(params, result);
return common.writeConfigYaml(res, inputYaml);
}).then(function() {
return res;
});
Expand All @@ -116,115 +87,6 @@ function doGenerate(params, inputYaml, inputName) {
});
}

function fastProcessEncodingOptions(info) {
return txtToSql.getEncoding(info.rawTable).then(function(encoding) {
info.inputEncodingDetected = encoding;
if(! info.opts.inputEncoding) { info.opts.inputEncoding = info.inputEncodingDetected; }
if(! info.opts.outputEncoding) { info.opts.outputEncoding = info.inputEncodingDetected; }
return info;
});
}

function fastProcessLine(info, line) {
if(line && info.lines && info.lines.length<info.fastMaxLines) {
info.lines.push(line);
}
}

function fastAnalyzeLines(info) {
txtToSql.separateRows(info);
txtToSql.verifyColumnCount(info);
txtToSql.transformNames(info);
txtToSql.verifyColumnNames(info);
txtToSql.determineColumnTypes(info);
txtToSql.determineColumnValuesInfo(info);
txtToSql.determinePrimaryKey(info);
return txtToSql.generatePrepareResult(info);
}

function fastInsert(outStream, info, line) {
if(line.trim() !=='') {
var row = [txtToSql.separateOneRow(info, line)];
var rows = txtToSql.createAdaptedRows(info, row);
var insertInto = txtToSql.createInsertInto(info);
var insertValues = txtToSql.createInsertValues(rows, info.columnsInfo).map(function(c) { return insertInto + c + ";"; }).join('\n');
outStream.write(insertValues+'\n');
}
}

function fastCreateCreate(info) {
txtToSql.quoteNames(info);
txtToSql.generateDropTable(info);
txtToSql.generateCreateScript(info);
}

function fastFinalize(info, outStream) {
fastCreateCreate(info);
//txtToSql.removeIgnoredLines(info);
txtToSql.generateInsertScript(info);
//console.log("info", info.scripts)
info.scripts.forEach(function(script) {
outStream.write(script.sql);
});
}

function doFast(params, inputBase) {
var inStream, outStream;
var rl;
var preparedResult;
return Promise.resolve().then(function() {
return txtToSql.verifyInputParams(params);
}).then(fastProcessEncodingOptions)
.then(function(info) {
//console.log("info", info);
inStream = fsSync.createReadStream(inputBase+'.txt', {encoding:'utf8'});
outStream = fsSync.createWriteStream(inputBase+'.sql', {encoding:'utf8'});
info.lines = [];
// maximo de lineas para utilizar procesamiento standard
info.fastMaxLines = fastBufferingThreshold;
rl = readline.createInterface({
input: inStream,
terminal: false
});
rl.on('line', function(line) {
//console.log("line", line);
if(! info.headers) {
info.headers = line;
txtToSql.determineSeparator(info);
txtToSql.determineDelimiter(info);
txtToSql.separateColumns(info);
} else {
fastProcessLine(info, line);
if(info.lines) {
if(info.lines.length===info.fastMaxLines) {
preparedResult = fastAnalyzeLines(info);
fastCreateCreate(info);
// deben estar drop y create
info.scripts.forEach(function(script) {
outStream.write(script.sql);
});
info.lines.forEach(function(ln) {
fastInsert(outStream, info, ln);
});
delete info.lines;
}
} else { // more than info.fastMaxLines
fastInsert(outStream, info, line);
}
}
});
rl.on('close', function() {
if(info.lines && info.lines.length<info.fastMaxLines) {
fastProcessLine(info);
preparedResult = fastAnalyzeLines(info);
fastFinalize(info, outStream);
}
//console.log("preparedResult", preparedResult);
writeConfigYaml(createParams(params, preparedResult), inputBase+'.yaml');
});
});
}

var workingDir = Path.resolve('.');
var defYamlName = 'txt-to-sql-defaults.yaml';
var globalBaseDir = Path.dirname(Path.parse(__filename).dir);
Expand Down Expand Up @@ -262,7 +124,7 @@ Promises.start(function() {
}).then(function(rawInput) {
params.rawTable = rawInput;
if(cmdParams.fast) {
return doFast(params, inputBase);
return fast.doFast(params, inputBase, fastBufferingThreshold);
} else if (cmdParams.prepare) {
return doPrepare(params, inputYaml);
} else {
Expand Down
1 change: 0 additions & 1 deletion lib/txt-to-sql.js
Original file line number Diff line number Diff line change
Expand Up @@ -608,7 +608,6 @@ function processOutputBuffer(info) {
return info;
}


function setup(info) {
return Promise.resolve(info)
.then(verifyInputParams)
Expand Down
Loading

0 comments on commit 0bd200d

Please sign in to comment.