loader/lib/LoaderModule.js (38 lines of code) (raw):
/*
Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights
reserved.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; version 2 of
the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
02110-1301 USA
*/
"use strict";
/* LoaderModule is constructed with an optionHandler so that a module
plugged into dbLoader can handle command-line options.
A LoaderModule with optionHandler = null can be used,
but will throw an exception if addOption() is called.
*/
function LoaderModule(optionHandler) {
this.optionHandler = optionHandler;
}
/* addOption(shortForm, longForm, helpText, callback).
Callback will receive(args, index), where args is the array of command
line arguments, and index is the index in that array of either the short
or long form of this option.
The callback should RETURN the number of parameters consumed
starting at index, e.g.:
0: this plugin did not recognize the option at options[index]
1: this plugin consumed a flag, e.g. "-x"
2: this plugin consumed an option and its value, e.g. "-expect pass"
*/
// dataLoader.addOptionHandler("-x","--extra","do extra work",
// function(args,index) { return 1; });
LoaderModule.prototype.addOption = function() {
this.optionHandler.addOption(Option.apply({}, arguments));
};
/* onReadRecord(record)
Gives the plugin access to a Domain Object that has been created by
the FieldScanner. The user can modify it before it is handed to the
loader.
record.row holds an object containing the data parsed into fields. If
you modify record.row, different values will be stored.
record.class holds the Domain Object Constructor that maps the object
to the database. If you change record.class, you cause the record to be
stored in a different table.
record.source holds a reference to the disk buffer containing this record
in the input file. The text source of the record is the substring of
record.source from record.start to record.end.
If onReadRecord returns false, THE RECORD WILL NOT BE PERSISTED.
It will also not be logged. Logging of discarded records is left up
to the plugin.
On any other return value, the record will be stored in the database.
*/
LoaderModule.prototype.onReadRecord = function(record) {
};
/* onScanLine()
Gives the plugin access to a line scanned from the data file.
Only lines that will be evaluated for data are delivered; not blank
lines, comment lines, or skipped lines.
lineNo is the physical line number in the source file.
The line of data is the substring from source[startPos] to source[endPos].
*/
LoaderModule.prototype.onScanLine = function(lineNo, source, startPos, endPos) {
};
/* onTick()
Gives the plugin access to the internal timer interval.
This function will be called approximately once every 20 milliseconds.
stats is an object containing these counters:
rowsProcessed // all rows processed by data source
rowsSkipped // rows procesed by data source but skipped
rowsComplete // all rows completed by writer (success or failure)
rowsError // rows failed by writer
tickNumber // starts at zero
*/
LoaderModule.prototype.onTick = function(stats) {
};
/* onRecordError(record)
Called after a record has been received by the database.
If an error has occured, record.error will be set.
*/
LoaderModule.prototype.onRecordError = function(record) {
};
/* onRecordStored(record)
Called after a record has been succesfully stored in the database.
*/
LoaderModule.prototype.onRecordStored = function(record) {
};
/* onFinished(controller)
This will be called at the end of processing. It gives the plugin a chance
to asynchronously close any resources. When processing is finished, the
plugin must call the provided callback function.
*/
LoaderModule.prototype.onFinished = function(callbackOnClosed) {
callbackOnClosed();
};
/* onSqlScan(scannerError, tokenList)
Gives the plugin access to the control file text ("LOAD DATA INFILE...")
as an array of tokens from the SQL scanner, and to any error produced by
the scanner.
*/
// dataLoader.onSqlScan = function(scannerError, tokenList) {
// };
LoaderModule.prototype.onSqlScan = function(scannerError, tokenList) {
if(scannerError) {
throw scannerError;
}
};
/* onSqlParse(parserError, parseTree)
Gives the plugin access to the control file text ("LOAD DATA INFILE...")
as a tree of parse nodes from the SQL parser, and to any error produced by
the parser.
*/
// dataLoader.onSqlParse = function(parserError, parseTree) {
// };
LoaderModule.prototype.onSqlParse = function(parserError, parseTree) {
if(parserError) {
throw parserError;
}
};
/* onLoaderJob(semanticError, loaderJob)
Gives the plugin access to the LoaderJob that will control the loader's
behavior. If a control file text was supplied (either on the command line
or from a file), the LoaderJob will have been generated from the parse
tree for that text. Otherwise, the LoaderJob will be instantiated with
all default values, and the user must fill in at least the data source and
destination table (see LoaderJob documentation).
*/
// dataLoader.onLoaderJob = function(semanticError, loaderJob) {
// };
LoaderModule.prototype.onLoaderJob = function(semanticError, loaderJob) {
if(semanticError) {
throw semanticError;
}
};
/* createMappings()
Allows the plugin to create TableMappings before connecting to the database.
Every table used by the loader must be mapped.
By default, a mapping is created for any table mentioned in the control file.
RETURN an array of Domain Object Constructors with applied TableMappings.
*/
// dataLoader.createMappings = function() {
// };
LoaderModule.prototype.createMappings = function() {
};
exports.LoaderModule = LoaderModule;