From 1127493d262975041e0cae202a5e06ab17ee851e Mon Sep 17 00:00:00 2001 From: Shinichi Tomita Date: Wed, 9 Jan 2013 16:34:58 +0900 Subject: [PATCH 01/24] add bulk loading feature --- lib/bulk.js | 345 ++++++++++++++++++++++++++++++++++++++++++++++ lib/connection.js | 71 ++++++++-- lib/csv.js | 140 +++++++++++++++++++ lib/salesforce.js | 1 + package.json | 1 + test/bulk.test.js | 44 ++++++ 6 files changed, 587 insertions(+), 15 deletions(-) create mode 100644 lib/bulk.js create mode 100644 lib/csv.js create mode 100644 test/bulk.test.js diff --git a/lib/bulk.js b/lib/bulk.js new file mode 100644 index 0000000..752886d --- /dev/null +++ b/lib/bulk.js @@ -0,0 +1,345 @@ +var fs = require('fs'), + events = require('events'), + request = require('request'), + async = require('async'), + _ = require('underscore')._, + Connection = require('./connection'), + CSV = require('./csv'); + +/** + * + */ +var bulkRequestOption = { + beforesend: function(conn, params) { + params.headers["X-SFDC-SESSION"] = conn.accessToken; + }, + parseError: function(err) { + return { + code: err.error.exceptionCode, + message: err.error.exceptionMessage + }; + } +}; + + +/*--------------------------------------------*/ + +/** + * + */ +var Job = function(conn, type, operation, jobId) { + this._conn = conn; + this.type = type; + this.id = jobId; + this.operation = operation; + this.batches = []; +}; + +Job.prototype = new events.EventEmitter(); + +/** + * + */ +Job.prototype.open = function() { + var self = this; + var logger = this._conn._logger; + var body = [ + '', + '', + '' + this.operation.toLowerCase() + '', + '' + this.type + '', + 'CSV', + '' + ].join(''); + + this._conn._request({ + method : 'POST', + url : this._conn.urls.bulk.base + "/job", + body : body, + headers : { + "Content-Type" : "application/xml; charset=utf-8" + } + }, function(err, res) { + if (err) { + self.emit("error", err); + } else { + self.id = res.jobInfo.id; + logger.debug(res.jobInfo); + self.emit("open", res.jobInfo); + } + }, bulkRequestOption); +}; + +/** + * + */ +Job.prototype.addBatch = function() { + var batch = new Batch(this._conn, this); + this.batches.push(batch); + return batch; +}; + +/** + * + */ +Job.prototype.getBatch = function(batchId) { + var batch = new Batch(this._conn, this, batchId); + this.batches.push(batch); + return batch; +}; + +/** + * + */ +Job.prototype.close = function() { + var self = this; + var logger = this._conn._logger; + + if (this.id) { return; } + var body = [ + '', + '', + 'Closed', + '' + ].join(''); + + this._conn._request({ + method : 'POST', + url : this._conn.urls.bulk.base + "/job/" + this.id, + body : body, + headers : { + "Content-Type" : "application/xml; charset=utf-8" + } + }, function(err, res) { + if (err) { + self.emit("error", err); + } else { + self.id = null; + logger.debug(res.jobInfo); + self.emit("close", res.jobInfo); + } + }, bulkRequestOption); + +}; + + +/*--------------------------------------------*/ + +/** + * + */ +var Batch = function(conn, job, batchId) { + this._conn = conn; + this.job = job; + this.id = batchId; +}; + +Batch.prototype = new events.EventEmitter(); + +/** + * + */ +Batch.prototype.run = +Batch.prototype.exec = +Batch.prototype.execute = function(input) { + var self = this; + var logger = this._conn._logger; + var jobId = this.job.id; + + if (!jobId) { + this.job.on("open", function() { self.execute(input); }); + return; + } + + var body = input; + if (_.isArray(input)) { + body = CSV.toCSV(input); + } + + this._conn._request({ + method : 'POST', + url : this._conn.urls.bulk.base + "/job/" + jobId + "/batch", + body : body, + headers : { + "Content-Type" : "text/csv" + } + }, function(err, res) { + if (err) { + self.emit('error', err); + } else { + logger.debug(res.batchInfo); + self.id = res.batchInfo.id; + self.emit('queue', res.batchInfo); + } + }, bulkRequestOption); + +}; + +/** + * + */ +Batch.prototype.check = function(callback) { + var self = this; + var logger = this._conn._logger; + var jobId = this.job.id; + var batchId = this.id; + if (!jobId || !batchId) { + return callback({ message : "Batch not started." }); + } + this._conn._request({ + method : 'GET', + url : this._conn.urls.bulk.base + "/job/" + jobId + "/batch/" + batchId + }, function(err, res) { + if (res) { logger.debug(res.batchInfo); } + callback(err, res && res.batchInfo); + }, bulkRequestOption); +}; + + +/** + * + */ +Batch.prototype.poll = function(interval, timeout) { + var self = this; + var jobId = this.job.id; + var batchId = this.id; + if (!jobId || !batchId) { + throw new Error("Batch not started."); + } + var startTime = new Date().getTime(); + var poll = function() { + var now = new Date().getTime(); + if (startTime + timeout < now) { + self.emit('error', { messsage: "polling time out" }); + return; + } + self.check(function(err, res) { + if (err) { + self.emit('error', err); + } else { + if (res.state === "Failed") { + if (parseInt(res.numberRecordsProcessed, 10) > 0) { + self.retrieve(); + } else { + self.emit('error', { message: "Batch request failed." }); + } + } else if (res.state === "Completed") { + self.retrieve(); + } else { + setTimeout(poll, interval); + } + } + }); + }; + setTimeout(poll, interval); +}; + +/** + * + */ +Batch.prototype.retrieve = function(callback) { + var self = this; + var jobId = this.job.id; + var batchId = this.id; + if (!jobId || !batchId) { + return callback({ message : "Batch not started." }); + } + this._conn._request({ + method : 'GET', + url : this._conn.urls.bulk.base + "/job/" + jobId + "/batch/" + batchId + "/result" + }, function(err, res) { + if (err) { + self.emit('error', err); + } else { + self.emit('response', res); + } + if (callback) { + callback(err, res); + } + }, bulkRequestOption); +}; + +/*--------------------------------------------*/ + +/** + * + */ +var Bulkloader = function(conn) { + this._conn = conn; +}; + +Bulkloader.prototype.pollInterval = 1000; +Bulkloader.prototype.pollTimeout = 10000; + +/** + * + */ +Bulkloader.prototype.bulkload = function(type, operation, input, callback) { + var self = this; + var job = this.createJob(type, operation); + var batch = job.addBatch(); + var cleanup = function() { job.close(); }; + batch.on('response', cleanup); + batch.on('error', cleanup); + if (typeof callback === 'function') { + batch.on('response', function(res) { callback(null, res); }); + batch.on('error', function(err) { callback(err); }); + batch.on('queue', function() { batch.poll(self.pollInterval, self.pollTimeout); }); + batch.execute(input); + } + return batch; +}; + +/** + * + */ +Bulkloader.prototype.stream = function(type, operation) { + // TODO +}; + +/** + * + */ +Bulkloader.prototype.createJob = function(type, operation) { + var job = new Job(this._conn, type, operation); + job.open(); + return job; +}; + +/** + * + */ +Bulkloader.prototype.getJob = function(jobId) { + return new Job(this._conn, null, null, jobId); +}; + + +/*--------------------------------------------*/ + +/** + * + */ +Connection.prototype.bulkload = function(type, operation, input, callback) { + if (!this._bulkloader) { + this._bulkloader = new Bulkloader(this); + } + this._bulkloader.bulkload(type, operation, input, callback); +}; + + +/** + * + */ +Connection.prototype.bulkStream = function(type, operation) { + if (!this._bulkloader) { + this._bulkloader = new Bulkloader(this); + } + return this._bulkloader.stream(type, operation); +}; + +/*--------------------------------------------*/ + +/** + * + */ +module.exports = Bulkloader; \ No newline at end of file diff --git a/lib/connection.js b/lib/connection.js index d39a3dc..5a9616d 100644 --- a/lib/connection.js +++ b/lib/connection.js @@ -43,6 +43,9 @@ Connection.prototype.initialize = function(options) { }, streaming: { base : [ this.instanceUrl, "cometd", this.version ].join('/') + }, + bulk: { + base : [ this.instanceUrl, "services/async", this.version ].join('/') } }; var oauth2 = options.oauth2; @@ -77,7 +80,8 @@ Connection.prototype.initialize = function(options) { * Sending request to API endpoint * @private */ -Connection.prototype._request = function(params, callback, noContentResponse) { +Connection.prototype._request = function(params, callback, options) { + options = options || {}; var self = this; var logger = this._logger; var onResume = function(err) { @@ -85,7 +89,7 @@ Connection.prototype._request = function(params, callback, noContentResponse) { callback(err); return; } - self._request(params, callback, noContentResponse); + self._request(params, callback, options); }; if (self._suspended) { self.once('resume', onResume); @@ -95,6 +99,10 @@ Connection.prototype._request = function(params, callback, noContentResponse) { if (this.accessToken) { params.headers.Authorization = "Bearer " + this.accessToken; } + + // hook in sending + if (options.beforesend) { options.beforesend(this, params); } + self.emit('request', params.method, params.url, params); logger.debug(" method=" + params.method + ", url=" + params.url); @@ -103,13 +111,14 @@ Connection.prototype._request = function(params, callback, noContentResponse) { request(params, function(err, response) { var responseTime = Date.now(); - logger.debug(" status=" + response.statusCode + ", url=" + params.url); logger.debug("elappsed time : " + (responseTime - requestTime) + "msec"); if (err) { logger.error(err); callback(err); } else { + logger.debug(" status=" + response.statusCode + ", url=" + params.url); + self.emit('response', response.statusCode, response.body, response); // Refresh token if status code requires authentication // when oauth2 info and refresh token is available. @@ -126,32 +135,58 @@ Connection.prototype._request = function(params, callback, noContentResponse) { } return; } + + // check response content type to choose parser + var contentType = response.headers["content-type"]; + var parseBody = /^application\/xml(;|$)/.test(contentType) ? parseXML : + /^application\/json(;|$)/.test(contentType) ? parseJSON : + /^text\/csv(;|$)/.test(contentType) ? parseCSV : + parseText; + var error; + if (response.statusCode >= 400) { - var errors; try { - errors = JSON.parse(response.body); + var parseError = options.parseError || function(errs) { return errs[0]; }; + error = parseError(parseBody(response.body)); } catch(e) { - errors = [{ message : response.body }]; + error = [{ message : response.body }]; } - callback(errors[0]); + callback(error); } else if (response.statusCode === 204) { - callback(null, noContentResponse); + callback(null, options.noContentResponse); } else { var res; try { - res = JSON.parse(response.body); + res = parseBody(response.body); } catch(e2) { - err = e2; + error = e2; } if (response.statusCode === 300) { // Multiple Choices - err = { message : 'Multiple records found' }; + error = { message : 'Multiple records found' }; } - callback(err, res); + callback(error, res); } } }); }; +/** + * + */ +function parseJSON(str) { + return JSON.parse(str); +} + +function parseXML(str) { + return require('xml2json').toJson(str, { object: true }); +} + +function parseCSV(str) { + return require('./csv').parseCSV(str); +} + +function parseText(str) { return str; } + /** * Refresh access token * @private @@ -307,7 +342,9 @@ Connection.prototype.update = function(type, records, callback) { headers : { "Content-Type" : "application/json" } - }, cb, { id : id, success : true, errors : [] }); + }, cb, { + noContentResponse: { id : id, success : true, errors : [] } + }); }; }), function(err, results) { callback(err, !isArray && _.isArray(results) ? results[0] : results); @@ -353,7 +390,9 @@ Connection.prototype.upsert = function(type, records, extIdField, callback) { headers : { "Content-Type" : "application/json" } - }, cb, { success : true, errors : [] }); + }, cb, { + noContentResponse: { success : true, errors : [] } + }); }; }), function(err, results) { callback(err, !isArray && _.isArray(results) ? results[0] : results); @@ -380,7 +419,9 @@ Connection.prototype.destroy = function(type, ids, callback) { self._request({ method : 'DELETE', url : url - }, cb, { id : id, success : true, errors : [] }); + }, cb, { + noContentResponse: { id : id, success : true, errors : [] } + }); }; }), function(err, results) { callback(err, !isArray && _.isArray(results) ? results[0] : results); diff --git a/lib/csv.js b/lib/csv.js new file mode 100644 index 0000000..f1052af --- /dev/null +++ b/lib/csv.js @@ -0,0 +1,140 @@ +var _ = require('underscore'), + SfDate = require('./date'); + +/** + * + */ +module.exports.toCSV = function(records, options) { + options = options || {}; + var _headers = {}; + + _.forEach(records, function(record) { + for (var key in record) { + var value = record[key]; + if (record.hasOwnProperty(key) && + key !== 'attributes' && + key !== 'type' && + typeof value !== 'object') { + _headers[key] = true; + } + } + }); + + var headers = _.keys(_headers); + + var rows = _.map(records, function(record) { + var row = []; + _.forEach(headers, function(header) { + var value = record[header]; + row.push(escape(value || "")); + }); + return row.join(','); + }); + + return headers.join(',') + '\n' + rows.join('\n'); +}; + +function escape(str) { + str = String(str); + if (str.indexOf('"') >= 0 || str.indexOf(',') >= 0) { + str = '"' + str.replace(/"/g, '""') + '"'; + } + return str; +} + + +/** + * + */ +var CSVParser = function(text) { + this.text = text; + this.cursor = 0; +}; + +CSVParser.prototype = { + + nextToken : function() { + var cell; + var dquoted = false; + var firstChar = this.text.charAt(this.cursor); + if (firstChar === '' || firstChar === '\r' || firstChar === '\n') { + return null; + } + if (firstChar === '"') { + dquoted = true; + } + if (dquoted) { + var dq = this.cursor; + while(true) { + dq++; + dq = this.text.indexOf('"', dq); + if (dq<0 || this.text.charAt(dq+1) !== '"') { + break; + } else { + dq++; + } + } + if (dq>=0) { + var delim = this.text.charAt(dq+1); + cell = this.text.substring(this.cursor, dq+1); + this.cursor = dq + (delim === ',' ? 2 : 1); + } else { + cell = this.text.substring(this.cursor); + this.cursor = this.text.length; + } + return cell.replace(/""/g,'"').replace(/^"/,'').replace(/"$/,''); + } else { + var comma = this.text.indexOf(',', this.cursor); + var cr = this.text.indexOf('\r', this.cursor); + var lf = this.text.indexOf('\n', this.cursor); + comma = comma<0 ? this.text.length+1 : comma; + cr = cr<0 ? this.text.length+1 : cr; + lf = lf<0 ? this.text.length+1 : lf; + var pivot = Math.min(comma, cr, lf, this.text.length); + cell = this.text.substring(this.cursor, pivot); + this.cursor = pivot; + if (comma === pivot) { + this.cursor++; + } + return cell; + } + }, + + nextLine : function() { + for (var c = this.text.charAt(this.cursor); + c === '\r' || c === '\n'; + c = this.text.charAt(++this.cursor)) + {} + return this.cursor !== this.text.length; + } + +}; + +/** + * + */ +module.exports.parseCSV = function(str) { + var parser = new CSVParser(str); + var headers = []; + var token; + if (parser.nextLine()) { + token = parser.nextToken(); + while (!_.isUndefined(token) && !_.isNull(token)) { + headers.push(token); + token = parser.nextToken(); + } + } + var rows = []; + while (parser.nextLine()) { + var row = {}; + token = parser.nextToken(); + var i = 0; + while (!_.isUndefined(token) && !_.isNull(token)) { + var header = headers[i++]; + row[header] = token; + token = parser.nextToken(); + } + rows.push(row); + } + return rows; +}; diff --git a/lib/salesforce.js b/lib/salesforce.js index d22a33d..cb72bab 100644 --- a/lib/salesforce.js +++ b/lib/salesforce.js @@ -2,3 +2,4 @@ exports.Connection = require('./connection'); exports.OAuth2 = require('./oauth2'); exports.Date = require("./date"); require('./streaming'); +require('./bulk'); diff --git a/package.json b/package.json index 9d4b244..835f94c 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "async": ">= 0.1.12", "request": ">= 2.1.1", "underscore": ">= 1.2.1", + "xml2json": "0.3.2", "faye": "0.8.x" }, "devDependencies": { diff --git a/test/bulk.test.js b/test/bulk.test.js new file mode 100644 index 0000000..cf2fbeb --- /dev/null +++ b/test/bulk.test.js @@ -0,0 +1,44 @@ +var vows = require('vows'), + assert = require('assert'), + async = require('async'), + sf = require('../lib/salesforce'), + config = require('./config/salesforce'); + +var conn = new sf.Connection({ logLevel : config.logLevel }); +var context = {}; + +vows.describe("bulk").addBatch({ + "login" : { + topic : function() { + conn.login(config.username, config.password, this.callback); + }, + "done" : function() { + assert.isString(conn.accessToken); + } + } + +}).addBatch({ + + "bulkload records" : { + topic : function() { + var records = [ + { Name: 'Account #1', NumberOfEmployees: 300 }, + { Name: 'Account #2', NumberOfEmployees: 400 }, + { Name: 'Account #3', NumberOfEmployees: 100 }, + { Name: 'Account #4' }, + { BillingState: 'CA' } + ]; + conn.bulkload("Account", "insert", records, this.callback); + }, + "should return result status" : function (rets) { + assert.isArray(rets); + console.log(rets); + for (var i=0; i Date: Wed, 9 Jan 2013 17:46:48 +0900 Subject: [PATCH 02/24] add bulkload test for create/update/delete --- lib/bulk.js | 13 +++++++-- test/bulk.test.js | 74 +++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 72 insertions(+), 15 deletions(-) diff --git a/lib/bulk.js b/lib/bulk.js index 752886d..c8e5b84 100644 --- a/lib/bulk.js +++ b/lib/bulk.js @@ -247,14 +247,21 @@ Batch.prototype.retrieve = function(callback) { this._conn._request({ method : 'GET', url : this._conn.urls.bulk.base + "/job/" + jobId + "/batch/" + batchId + "/result" - }, function(err, res) { + }, function(err, results) { + results = _.map(results, function(ret) { + return { + id: ret.Id || null, + success: ret.Success === "true", + errors: ret.Error ? [ ret.Error ] : [] + }; + }); if (err) { self.emit('error', err); } else { - self.emit('response', res); + self.emit('response', results); } if (callback) { - callback(err, res); + callback(err, results); } }, bulkRequestOption); }; diff --git a/test/bulk.test.js b/test/bulk.test.js index cf2fbeb..8efe9bb 100644 --- a/test/bulk.test.js +++ b/test/bulk.test.js @@ -19,26 +19,76 @@ vows.describe("bulk").addBatch({ }).addBatch({ - "bulkload records" : { + "bulk insert records" : { topic : function() { - var records = [ - { Name: 'Account #1', NumberOfEmployees: 300 }, - { Name: 'Account #2', NumberOfEmployees: 400 }, - { Name: 'Account #3', NumberOfEmployees: 100 }, - { Name: 'Account #4' }, - { BillingState: 'CA' } - ]; + var records = []; + for (var i=0; i<200; i++) { + records.push({ + Name: 'Bulk Account #'+(i+1), + NumberOfEmployees: 300 * (i+1) + }); + } + records.push({ BillingState: 'CA' }); // should raise error conn.bulkload("Account", "insert", records, this.callback); }, "should return result status" : function (rets) { assert.isArray(rets); - console.log(rets); + var ret; + for (var i=0; i<200; i++) { + ret = rets[i]; + assert.isString(ret.id); + assert.equal(true, ret.success); + } + ret = rets[200]; + assert.isNull(ret.id); + assert.equal(false, ret.success); + }, + + "then bulk update" : { + topic: function() { + conn.sobject('Account') + .find({ Name : { $like : 'Bulk Account%' }}, { Id: 1, Name : 1 }) + .execute(this.callback); + }, + "." : { + topic: function(records) { + records = records.map(function(rec) { + rec.Name = rec.Name + ' (Updated)'; + return rec; + }); + conn.bulkload('Account', 'update', records, this.callback); + }, + "should return updated status" : function (rets) { + assert.isArray(rets); + var ret; + for (var i=0; i Date: Wed, 9 Jan 2013 18:30:34 +0900 Subject: [PATCH 03/24] fix Job#close is not working --- lib/bulk.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/bulk.js b/lib/bulk.js index c8e5b84..7cfe2ad 100644 --- a/lib/bulk.js +++ b/lib/bulk.js @@ -95,7 +95,8 @@ Job.prototype.close = function() { var self = this; var logger = this._conn._logger; - if (this.id) { return; } + if (!this.id) { return; } + var body = [ '', '', From 564fc158b5fd7524476575199042531a8e740af6 Mon Sep 17 00:00:00 2001 From: Shinichi Tomita Date: Thu, 10 Jan 2013 00:21:57 +0900 Subject: [PATCH 04/24] add stream batch upload --- .gitignore | 1 - lib/bulk.js | 139 +++++++++++++++++++++++----------- lib/connection.js | 2 +- lib/csv.js | 5 +- test/bulk.test.js | 104 +++++++++++++++++++++----- test/data/Account.csv | 168 ++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 352 insertions(+), 67 deletions(-) create mode 100644 test/data/Account.csv diff --git a/.gitignore b/.gitignore index 66b5b4c..c8e98f0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,6 @@ lib-cov *.seed *.log -*.csv *.dat *.out *.pid diff --git a/lib/bulk.js b/lib/bulk.js index 7cfe2ad..494bd10 100644 --- a/lib/bulk.js +++ b/lib/bulk.js @@ -1,4 +1,5 @@ -var fs = require('fs'), +var stream = require('stream'), + Stream = stream.Stream, events = require('events'), request = require('request'), async = require('async'), @@ -32,7 +33,7 @@ var Job = function(conn, type, operation, jobId) { this.type = type; this.id = jobId; this.operation = operation; - this.batches = []; + this.batches = {}; }; Job.prototype = new events.EventEmitter(); @@ -75,7 +76,10 @@ Job.prototype.open = function() { */ Job.prototype.addBatch = function() { var batch = new Batch(this._conn, this); - this.batches.push(batch); + var self = this; + batch.on('queue', function() { + self.batches[batch.id] = batch; + }); return batch; }; @@ -83,8 +87,11 @@ Job.prototype.addBatch = function() { * */ Job.prototype.getBatch = function(batchId) { - var batch = new Batch(this._conn, this, batchId); - this.batches.push(batch); + var batch = this.batches[batchId]; + if (!batch) { + batch = new Batch(this._conn, this, batchId); + this.batches[batchId] = batch; + } return batch; }; @@ -133,6 +140,7 @@ var Batch = function(conn, job, batchId) { this._conn = conn; this.job = job; this.id = batchId; + this.writable = true; }; Batch.prototype = new events.EventEmitter(); @@ -144,38 +152,96 @@ Batch.prototype.run = Batch.prototype.exec = Batch.prototype.execute = function(input) { var self = this; - var logger = this._conn._logger; var jobId = this.job.id; - if (!jobId) { this.job.on("open", function() { self.execute(input); }); return; } - var body = input; - if (_.isArray(input)) { - body = CSV.toCSV(input); + if (input instanceof Stream) { + input.pipe(this.stream()); + } else { + var data; + if (_.isArray(input)) { + var records = _.map(input, function(rec) { + rec = _.clone(rec); + if (self.job.operation === "insert") { + delete rec.Id; + } + delete rec.type; + delete rec.attributes; + return rec; + }); + data = CSV.toCSV(records); + } else if (_.isString(input)){ + data = input; + } + var stream = this.stream(); + stream.write(data); + stream.end(); } +}; - this._conn._request({ - method : 'POST', - url : this._conn.urls.bulk.base + "/job/" + jobId + "/batch", - body : body, - headers : { - "Content-Type" : "text/csv" +/** + * + */ +Batch.prototype.stream = function() { + if (this._stream) { + return this._stream; + } + var batch = this; + var logger = this._conn._logger; + + var reqStream; + var requestStream = function() { + if (!reqStream) { + reqStream = batch._conn._request({ + method : 'POST', + url : batch._conn.urls.bulk.base + "/job/" + batch.job.id + "/batch", + headers: { + "Content-Type": "text/csv" + } + }, function(err, res) { + if (err) { + batch.emit('error', err); + } else { + logger.debug(res.batchInfo); + batch.id = res.batchInfo.id; + batch.emit('queue', res.batchInfo); + } + }, bulkRequestOption); } - }, function(err, res) { - if (err) { - self.emit('error', err); - } else { - logger.debug(res.batchInfo); - self.id = res.batchInfo.id; - self.emit('queue', res.batchInfo); + return reqStream; + }; + + var bstream = this._stream = new Stream(); + bstream.writable = true; + + bstream.write = function(data) { + if (!batch.job.id) { + batch.job.on("open", function() { bstream.write(data); }); + return; } - }, bulkRequestOption); + requestStream().write(data); + }; + bstream.end = function(data) { + if (!batch.job.id) { + batch.job.on("open", function() { bstream.end(data); }); + return; + } + bstream.writable = false; + requestStream().end(data); + }; + + bstream.on("pipe", function(istream) { + istream.resume(); + }); + + return bstream; }; + /** * */ @@ -289,21 +355,15 @@ Bulkloader.prototype.bulkload = function(type, operation, input, callback) { var cleanup = function() { job.close(); }; batch.on('response', cleanup); batch.on('error', cleanup); + batch.on('queue', function() { batch.poll(self.pollInterval, self.pollTimeout); }); if (typeof callback === 'function') { batch.on('response', function(res) { callback(null, res); }); batch.on('error', function(err) { callback(err); }); - batch.on('queue', function() { batch.poll(self.pollInterval, self.pollTimeout); }); batch.execute(input); } return batch; }; -/** - * - */ -Bulkloader.prototype.stream = function(type, operation) { - // TODO -}; /** * @@ -321,30 +381,27 @@ Bulkloader.prototype.getJob = function(jobId) { return new Job(this._conn, null, null, jobId); }; - -/*--------------------------------------------*/ - /** * */ -Connection.prototype.bulkload = function(type, operation, input, callback) { - if (!this._bulkloader) { - this._bulkloader = new Bulkloader(this); - } - this._bulkloader.bulkload(type, operation, input, callback); +Bulkloader.prototype.getBatch = function(jobId, batchId) { + var job = this.getJob(jobId); + job.getBatch(batchId); }; +/*--------------------------------------------*/ /** * */ -Connection.prototype.bulkStream = function(type, operation) { +Connection.prototype.bulkload = function(type, operation, input, callback) { if (!this._bulkloader) { this._bulkloader = new Bulkloader(this); } - return this._bulkloader.stream(type, operation); + return this._bulkloader.bulkload(type, operation, input, callback); }; + /*--------------------------------------------*/ /** diff --git a/lib/connection.js b/lib/connection.js index 5a9616d..113c0a1 100644 --- a/lib/connection.js +++ b/lib/connection.js @@ -108,7 +108,7 @@ Connection.prototype._request = function(params, callback, options) { logger.debug(" method=" + params.method + ", url=" + params.url); var requestTime = Date.now(); - request(params, function(err, response) { + return request(params, function(err, response) { var responseTime = Date.now(); logger.debug("elappsed time : " + (responseTime - requestTime) + "msec"); diff --git a/lib/csv.js b/lib/csv.js index f1052af..a627d25 100644 --- a/lib/csv.js +++ b/lib/csv.js @@ -11,10 +11,7 @@ module.exports.toCSV = function(records, options) { _.forEach(records, function(record) { for (var key in record) { var value = record[key]; - if (record.hasOwnProperty(key) && - key !== 'attributes' && - key !== 'type' && - typeof value !== 'object') { + if (record.hasOwnProperty(key) && typeof value !== 'object') { _headers[key] = true; } } diff --git a/test/bulk.test.js b/test/bulk.test.js index 8efe9bb..697fe21 100644 --- a/test/bulk.test.js +++ b/test/bulk.test.js @@ -1,6 +1,7 @@ var vows = require('vows'), assert = require('assert'), async = require('async'), + fs = require('fs'), sf = require('../lib/salesforce'), config = require('./config/salesforce'); @@ -44,20 +45,25 @@ vows.describe("bulk").addBatch({ assert.equal(false, ret.success); }, + "then bulk update" : { topic: function() { - conn.sobject('Account') - .find({ Name : { $like : 'Bulk Account%' }}, { Id: 1, Name : 1 }) - .execute(this.callback); + async.waterfall([ + function(next) { + conn.sobject('Account') + .find({ Name : { $like : 'Bulk Account%' }}, { Id: 1, Name : 1 }) + .execute(next); + }, + function(records, next) { + records = records.map(function(rec) { + rec.Name = rec.Name + ' (Updated)'; + return rec; + }); + conn.bulkload('Account', 'update', records, next); + } + ], this.callback); }, - "." : { - topic: function(records) { - records = records.map(function(rec) { - rec.Name = rec.Name + ' (Updated)'; - return rec; - }); - conn.bulkload('Account', 'update', records, this.callback); - }, + "should return updated status" : function (rets) { assert.isArray(rets); var ret; @@ -70,15 +76,41 @@ vows.describe("bulk").addBatch({ "then bulk delete" : { topic: function() { - conn.sobject('Account') - .find({ Name : { $like : 'Bulk Account%' }}) - .execute(this.callback); + async.waterfall([ + function(next) { + conn.sobject('Account') + .find({ Name : { $like : 'Bulk Account%' }}) + .execute(next); + }, + function(records, next) { + conn.bulkload('Account', 'delete', records, next); + } + ], this.callback); }, - "." : { - topic: function(records) { - conn.bulkload('Account', 'delete', records, this.callback); - }, "should return deleted status" : function (rets) { + assert.isArray(rets); + for (var i=0; i Date: Thu, 10 Jan 2013 00:27:35 +0900 Subject: [PATCH 05/24] remove unneeded libs --- lib/bulk.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/bulk.js b/lib/bulk.js index 494bd10..693f6bd 100644 --- a/lib/bulk.js +++ b/lib/bulk.js @@ -1,8 +1,6 @@ var stream = require('stream'), Stream = stream.Stream, events = require('events'), - request = require('request'), - async = require('async'), _ = require('underscore')._, Connection = require('./connection'), CSV = require('./csv'); From 0fd07a8acec88bd0078e5c90f8722e6912170d77 Mon Sep 17 00:00:00 2001 From: Shinichi Tomita Date: Thu, 10 Jan 2013 16:25:38 +0900 Subject: [PATCH 06/24] add record stream interface to allow streaming manipulation of record --- lib/csv.js | 74 +++++++++++---- lib/query.js | 104 +++++---------------- lib/record-stream.js | 216 +++++++++++++++++++++++++++++++++++++++++++ test/query.test.js | 25 ++--- 4 files changed, 307 insertions(+), 112 deletions(-) create mode 100644 lib/record-stream.js diff --git a/lib/csv.js b/lib/csv.js index a627d25..76d6526 100644 --- a/lib/csv.js +++ b/lib/csv.js @@ -4,42 +4,67 @@ var _ = require('underscore'), /** * */ -module.exports.toCSV = function(records, options) { +function toCSV(records, headers, options) { options = options || {}; - var _headers = {}; + if (!headers) { + headers = extractHeaders(records, options); + } + var rows = _.map(records, function(record){ return recordToCSV(record, headers); }); + return arrayToCSV(headers) + "\n" + rows.join("\n"); +} +/** + * + */ +function extractHeaders(records, options) { + options = options || {}; + var headers = {}; _.forEach(records, function(record) { for (var key in record) { var value = record[key]; - if (record.hasOwnProperty(key) && typeof value !== 'object') { - _headers[key] = true; + if (record.hasOwnProperty(key) && (value === null || typeof value !== 'object')) { + headers[key] = true; } } }); + return _.keys(headers); +} - var headers = _.keys(_headers); - - var rows = _.map(records, function(record) { - var row = []; - _.forEach(headers, function(header) { - var value = record[header]; - row.push(escape(value || "")); - }); - return row.join(','); +/** + * + */ +function recordToCSV(record, headers) { + var row = []; + _.forEach(headers, function(header) { + var value = record[header]; + if (typeof value === 'undefined') { value = null; } + row.push(value); }); + return arrayToCSV(row); +} - return headers.join(',') + '\n' + rows.join('\n'); -}; +/** + * + */ + +function arrayToCSV(arr) { + return _.map(arr, escapeCSV).join(','); +} -function escape(str) { +/** + * + */ +function escapeCSV(str) { + if (str === null || typeof str === 'undefined') { str = ''; } str = String(str); - if (str.indexOf('"') >= 0 || str.indexOf(',') >= 0) { + if (str.indexOf('"') >= 0 || str.indexOf(',') >= 0 || /[\n\r]/.test(str)) { str = '"' + str.replace(/"/g, '""') + '"'; } return str; } + /** * */ @@ -110,7 +135,7 @@ CSVParser.prototype = { /** * */ -module.exports.parseCSV = function(str) { +function parseCSV(str) { var parser = new CSVParser(str); var headers = []; var token; @@ -134,4 +159,17 @@ module.exports.parseCSV = function(str) { rows.push(row); } return rows; +} + + +/** + * + */ +module.exports = { + toCSV : toCSV, + extractHeaders : extractHeaders, + recordToCSV : recordToCSV, + arrayToCSV : arrayToCSV, + parseCSV : parseCSV }; + \ No newline at end of file diff --git a/lib/query.js b/lib/query.js index 4b422ba..dfbd654 100644 --- a/lib/query.js +++ b/lib/query.js @@ -2,7 +2,8 @@ var util = require('util'), events = require('events'), _ = require('underscore')._, SfDate = require("./date"), - SOQLBuilder = require("./soql-builder"); + SOQLBuilder = require("./soql-builder"), + RecordStream = require("./record-stream"); /** * Query @@ -21,9 +22,11 @@ var Query = module.exports = function(conn, config, locator) { this._buffer = []; this._paused = false; this._closed = false; + + Query.super_.apply(this); }; -util.inherits(Query, events.EventEmitter); +util.inherits(Query, RecordStream); /** * Limit the returning result @@ -99,6 +102,7 @@ Query.prototype.setResponseTarget = function(responseTarget) { /** * Pause record fetch + * @override */ Query.prototype.pause = function() { this._paused = true; @@ -106,10 +110,10 @@ Query.prototype.pause = function() { /** * Resume record fetch and query execution + * @override */ Query.prototype.resume = function() { if (this._closed) { - console.log("error"); throw new Error("resuming already closed stream"); } this._paused = false; @@ -140,86 +144,6 @@ Query.prototype.close = function() { }; -/** - * Streaming pipe for record manipulation - * Originally from Node.js's Stream#pipe - * https://github.com/joyent/node/blob/master/lib/stream.js - */ -Query.prototype.pipe = function (dest, options) { - var source = this; - - var onRecord = function(record) { - if (dest.send && false === dest.send(record)) { source.pause(); } - }; - - source.on('record', onRecord); - - var onDrain = function() { source.resume(); }; - - dest.on('drain', onDrain); - - var didOnEnd = false; - var onEnd = function() { - if (didOnEnd) { return; } - didOnEnd = true; - dest.end(); - }; - - var onClose = function() { - if (didOnEnd) { return; } - didOnEnd = true; - if (typeof dest.destroy === 'function') { dest.destroy(); } - }; - - // If the 'end' option is not supplied, dest.end() will be called when - // source gets the 'end' or 'close' events. Only dest.end() once. - if (!options || options.end !== false) { - source.on('end', onEnd); - source.on('close', onClose); - } - - // don't leave dangling pipes when there are errors. - var onError = function(err) { - cleanup(); - if (this.listeners('error').length === 0) { - throw err; // Unhandled stream error in pipe. - } - }; - - source.on('error', onError); - dest.on('error', onError); - - // remove all the event listeners that were added. - var cleanup = function() { - source.removeListener('record', onRecord); - dest.removeListener('drain', onDrain); - - source.removeListener('end', onEnd); - source.removeListener('close', onClose); - - source.removeListener('error', onError); - dest.removeListener('error', onError); - - source.removeListener('end', cleanup); - source.removeListener('close', cleanup); - - dest.removeListener('end', cleanup); - dest.removeListener('close', cleanup); - }; - - source.on('end', cleanup); - source.on('close', cleanup); - - dest.on('end', cleanup); - dest.on('close', cleanup); - - dest.emit('pipe', source); - - // Allow for unix-like usage: A.pipe(B).pipe(C) - return dest; -}; - - /** * Running (or executing) query and fetch records from server. */ @@ -307,3 +231,17 @@ Query.prototype.execute = function(options, callback) { }; +/** + * Create ReadableStream instance for serializing records + */ +Query.prototype.stream = function(type) { + type = type || 'csv'; + var stream; + if (type === "csv") { + stream = new RecordStream.CSVStream(); + } + if (!stream) { + throw new Error("No stream type defined for '"+type+"'."); + } + return this.pipe(stream); +}; \ No newline at end of file diff --git a/lib/record-stream.js b/lib/record-stream.js new file mode 100644 index 0000000..e7037f4 --- /dev/null +++ b/lib/record-stream.js @@ -0,0 +1,216 @@ +var events = require('events'), + stream = require('stream'), + Stream = stream.Stream, + util = require('util'), + _ = require('underscore'), + CSV = require('./csv'); + +/** + * + */ +var RecordStream = function() { + this.sendable = true; + this.receivable = true; + this.on('error', function() { + this.sendable = false; + this.recievable = false; + }); + this.on('end', function() { + this.recievable = false; + }); +}; + +util.inherits(RecordStream, events.EventEmitter); + + +/*--- Output Record Stream methods ---*/ + +/** + * Receive record into stream. + */ +RecordStream.prototype.send = function(record) { + // abstract +}; + +/** + * Resume record fetch and query execution + */ +RecordStream.prototype.end = function() { + this.sendable = false; +}; + +/** + * Destroy record stream; + */ +RecordStream.prototype.destroy = function() { + this.reciebable = false; + this.sendable = false; +}; + +/** + * Destroy record stream after all record submission in the queue; + * @abstract + */ +RecordStream.prototype.destroySoon = function() { + // +}; + + +/*--- Input Record Stream methods ---*/ + +/* + * Pause record fetch + */ +RecordStream.prototype.pause = function() { + // abstract +}; + +/** + * Resume record fetch and query execution + * @abstract + */ +RecordStream.prototype.resume = function() { + // abstract +}; + +/** + * Streaming pipe for record manipulation + * Originally from Node.js's Stream#pipe + * https://github.com/joyent/node/blob/master/lib/stream.js + */ +RecordStream.prototype.pipe = function (dest, options) { + var source = this; + + var onRecord = function(record) { + if (dest.send && false === dest.send(record)) { source.pause(); } + }; + + source.on('record', onRecord); + + var onDrain = function() { source.resume(); }; + + dest.on('drain', onDrain); + + var didOnEnd = false; + var onEnd = function() { + if (didOnEnd) { return; } + didOnEnd = true; + dest.end(); + }; + + var onClose = function() { + if (didOnEnd) { return; } + didOnEnd = true; + if (typeof dest.destroy === 'function') { dest.destroy(); } + }; + + // If the 'end' option is not supplied, dest.end() will be called when + // source gets the 'end' or 'close' events. Only dest.end() once. + if (!options || options.end !== false) { + source.on('end', onEnd); + source.on('close', onClose); + } + + // don't leave dangling pipes when there are errors. + var onError = function(err) { + cleanup(); + if (this.listeners('error').length === 0) { + throw err; // Unhandled stream error in pipe. + } + }; + + source.on('error', onError); + dest.on('error', onError); + + // remove all the event listeners that were added. + var cleanup = function() { + source.removeListener('record', onRecord); + dest.removeListener('drain', onDrain); + + source.removeListener('end', onEnd); + source.removeListener('close', onClose); + + source.removeListener('error', onError); + dest.removeListener('error', onError); + + source.removeListener('end', cleanup); + source.removeListener('close', cleanup); + + dest.removeListener('end', cleanup); + dest.removeListener('close', cleanup); + }; + + source.on('end', cleanup); + source.on('close', cleanup); + + dest.on('end', cleanup); + dest.on('close', cleanup); + + dest.emit('pipe', source); + + // Allow for unix-like usage: A.pipe(B).pipe(C) + return dest; +}; + + +/* --------------------------------------------------- */ + +/** + * CSVStream (extends OutputRecordStream implements ReadableStream) + */ +var CSVStream = function(headers) { + this.sendable = true; + this.readable = true; + this.headers = headers; + this.wroteHeaders = false; +}; + +util.inherits(CSVStream, RecordStream); + +/** + * + */ +CSVStream.prototype.send = function(record) { + if (!this.wroteHeaders) { + if (this.headers) { + var headers = {}; + for (var key in record) { + var value = record[key]; + if (typeof value === 'string' || value === null) { + headers[key] = true; + } + } + this.headers = _.keys(headers); + } + this.emit("data", CSV.arrayToCSV(this.headers)); + this.wroteHeaders = true; + } + var row = []; + _.forEach(this.headers, function(header) { + var value = record[header]; + if (_.isNull(value) || _.isUndefined(value) || typeof value !== 'string') { + value = ''; + } + row.push(String(value)); + }); + this.emit("data", CSV.arrayToCSV(row) + "\n"); +}; + +/** + * + */ +CSVStream.prototype.end = function(record) { + this.readable = false; + this.sendable = false; + this.write(record); + this.emit("end"); +}; + + +RecordStream.CSVStream = CSVStream; + + +/* --------------------------------------------------- */ + + +module.exports = RecordStream; diff --git a/test/query.test.js b/test/query.test.js index 14c0cf7..e35704a 100644 --- a/test/query.test.js +++ b/test/query.test.js @@ -4,6 +4,7 @@ var vows = require('vows'), events = require('events'), querystring = require('querystring'), sf = require('../lib/salesforce'), + RecordStream = require('../lib/record-stream'), config = require('./config/salesforce'); @@ -88,33 +89,35 @@ vows.describe("query").addBatch({ }, - "query big tables by piping randomly-waiting send stream object" : { + + "query big tables by piping randomly-waiting output record stream object" : { topic : function() { var self = this; var records = []; var query = conn.query("SELECT Id, Name FROM " + (config.bigTable || 'Account')); - var sendstream = new events.EventEmitter(); - sendstream.sendable = true; - sendstream.send = function(record) { + var outStream = new RecordStream(); + outStream.sendable = true; + outStream.send = function(record) { records.push(record); if (records.length % 100 === 0) { - sendstream.sendable = false; + outStream.sendable = false; setTimeout(function() { - sendstream.sendable = true; - sendstream.emit('drain'); + outStream.sendable = true; + outStream.emit('drain'); }, 1000 * Math.random()); } - return sendstream.sendable; + return outStream.sendable; }; - sendstream.end = function() { + outStream.end = function() { self.callback(null, { query : query, records : records }); }; - query.pipe(sendstream); + query.pipe(outStream); query.resume(); + query.on("error", function(err) { self.callback(err); }); }, - "should scan records up to maxFetch num" : function(result) { + "should scan records via stream up to maxFetch num" : function(result) { assert.ok(result.query.totalFetched === result.records.length); assert.ok(result.query.totalSize > 5000 ? result.query.totalFetched === 5000 : From d9d0705b1e3fcb89c9e37dabfe48145bb43c80fb Mon Sep 17 00:00:00 2001 From: Shinichi Tomita Date: Thu, 10 Jan 2013 16:28:34 +0900 Subject: [PATCH 07/24] change bulk load interfaces --- lib/bulk.js | 211 +++++++++++++++++++++++++++++++--------------- lib/connection.js | 7 +- test/bulk.test.js | 34 +++++--- 3 files changed, 171 insertions(+), 81 deletions(-) diff --git a/lib/bulk.js b/lib/bulk.js index 693f6bd..8505633 100644 --- a/lib/bulk.js +++ b/lib/bulk.js @@ -8,17 +8,20 @@ var stream = require('stream'), /** * */ -var bulkRequestOption = { - beforesend: function(conn, params) { - params.headers["X-SFDC-SESSION"] = conn.accessToken; - }, - parseError: function(err) { - return { - code: err.error.exceptionCode, - message: err.error.exceptionMessage - }; - } -}; +function createRequestOption(contentType) { + return { + responseContentType: contentType, + beforesend: function(conn, params) { + params.headers["X-SFDC-SESSION"] = conn.accessToken; + }, + parseError: function(err) { + return { + code: err.error.exceptionCode, + message: err.error.exceptionMessage + }; + } + }; +} /*--------------------------------------------*/ @@ -26,12 +29,14 @@ var bulkRequestOption = { /** * */ -var Job = function(conn, type, operation, jobId) { +var Job = function(conn, type, operation, options, jobId) { this._conn = conn; this.type = type; - this.id = jobId; this.operation = operation; - this.batches = {}; + this.options = options || {}; + this.id = jobId; + this.state = this.id ? 'Open' : 'Unknown'; + this._batches = {}; }; Job.prototype = new events.EventEmitter(); @@ -42,11 +47,15 @@ Job.prototype = new events.EventEmitter(); Job.prototype.open = function() { var self = this; var logger = this._conn._logger; + var body = [ '', '', '' + this.operation.toLowerCase() + '', '' + this.type + '', + (this.options.extIdField ? + ''+this.options.extIdField+'' : + ''), 'CSV', '' ].join(''); @@ -62,21 +71,23 @@ Job.prototype.open = function() { if (err) { self.emit("error", err); } else { - self.id = res.jobInfo.id; logger.debug(res.jobInfo); + self.id = res.jobInfo.id; + self.state = res.jobInfo.state; self.emit("open", res.jobInfo); } - }, bulkRequestOption); + }, createRequestOption("application/xml")); }; /** * */ -Job.prototype.addBatch = function() { +Job.prototype.createBatch = function() { var batch = new Batch(this._conn, this); var self = this; batch.on('queue', function() { - self.batches[batch.id] = batch; + self._batches[batch.id] = batch; + self.list(function() {}); }); return batch; }; @@ -84,28 +95,105 @@ Job.prototype.addBatch = function() { /** * */ -Job.prototype.getBatch = function(batchId) { - var batch = this.batches[batchId]; +Job.prototype.batch = function(batchId) { + var batch = this._batches[batchId]; if (!batch) { batch = new Batch(this._conn, this, batchId); - this.batches[batchId] = batch; + this._batches[batchId] = batch; } return batch; }; +/** + * + */ +Job.prototype.check = function(callback) { + var self = this; + var logger = this._conn._logger; + + if (!this.id) { throw new Error("No job id assigned yet."); } + + this._conn._request({ + method : 'GET', + url : this._conn.urls.bulk.base + "/job/" + this.id + }, function(err, res) { + if (res) { + logger.debug(res.jobInfo); + self.state = res.jobInfo.state; + } + callback(err, res && res.jobInfo); + }, createRequestOption("application/xml")); +}; + +/** + * + */ +Job.prototype.list = function(callback) { + var self = this; + var logger = this._conn._logger; + + if (!this.id) { throw new Error("No job id assigned yet."); } + + this._conn._request({ + method : 'GET', + url : this._conn.urls.bulk.base + "/job/" + this.id + "/batch" + }, function(err, res) { + var batchInfoList; + if (res) { + logger.debug(res.batchInfoList); + batchInfoList = res.batchInfoList; + batchInfoList = _.isArray(batchInfoList.batchInfo) ? batchInfoList.batchInfo : [ batchInfoList.batchInfo ]; + } + callback(err, batchInfoList); + }, createRequestOption("application/xml")); +}; + /** * */ Job.prototype.close = function() { var self = this; + + this._changeState("Closed", function(err, jobInfo) { + if (err) { + self.emit("error", err); + } else { + self.id = null; + self.emit("close", jobInfo); + } + }); +}; + +/** + * + */ +Job.prototype.abort = function() { + var self = this; + + this._changeState("Aborted", function(err, jobInfo) { + if (err) { + self.emit("error", err); + } else { + self.id = null; + self.emit("abort", jobInfo); + self.state = "Aborted"; + } + }); +}; + +/** + * @private + */ +Job.prototype._changeState = function(state, callback) { + var self = this; var logger = this._conn._logger; - if (!this.id) { return; } + if (!this.id) { throw new Error("No job id assigned yet."); } var body = [ '', '', - 'Closed', + '' + state + '', '' ].join(''); @@ -117,14 +205,12 @@ Job.prototype.close = function() { "Content-Type" : "application/xml; charset=utf-8" } }, function(err, res) { - if (err) { - self.emit("error", err); - } else { - self.id = null; + if (res) { logger.debug(res.jobInfo); - self.emit("close", res.jobInfo); + self.state = res.jobInfo.state; } - }, bulkRequestOption); + callback(err, res && res.jobInfo); + }, createRequestOption("application/xml")); }; @@ -148,14 +234,21 @@ Batch.prototype = new events.EventEmitter(); */ Batch.prototype.run = Batch.prototype.exec = -Batch.prototype.execute = function(input) { +Batch.prototype.execute = function(input, callback) { var self = this; var jobId = this.job.id; if (!jobId) { - this.job.on("open", function() { self.execute(input); }); + this.job.on("open", function() { self.execute(input, callback); }); return; } + if (this.id) { + throw new Error("Batch already executed and has id."); + } + if (callback) { + this.on('response', function(res) { callback(null, res); }); + this.on('error', function(err) { callback(err); }); + } if (input instanceof Stream) { input.pipe(this.stream()); } else { @@ -207,7 +300,7 @@ Batch.prototype.stream = function() { batch.id = res.batchInfo.id; batch.emit('queue', res.batchInfo); } - }, bulkRequestOption); + }, createRequestOption("application/xml")); } return reqStream; }; @@ -257,7 +350,7 @@ Batch.prototype.check = function(callback) { }, function(err, res) { if (res) { logger.debug(res.batchInfo); } callback(err, res && res.batchInfo); - }, bulkRequestOption); + }, createRequestOption("application/xml")); }; @@ -328,7 +421,7 @@ Batch.prototype.retrieve = function(callback) { if (callback) { callback(err, results); } - }, bulkRequestOption); + }, createRequestOption()); }; /*--------------------------------------------*/ @@ -336,28 +429,31 @@ Batch.prototype.retrieve = function(callback) { /** * */ -var Bulkloader = function(conn) { +var Bulk = function(conn) { this._conn = conn; }; -Bulkloader.prototype.pollInterval = 1000; -Bulkloader.prototype.pollTimeout = 10000; +Bulk.prototype.pollInterval = 1000; +Bulk.prototype.pollTimeout = 10000; /** * */ -Bulkloader.prototype.bulkload = function(type, operation, input, callback) { +Bulk.prototype.load = function(type, operation, options, input, callback) { var self = this; - var job = this.createJob(type, operation); - var batch = job.addBatch(); + if (typeof input === 'function') { + callback = input; + input = options; + options = null; + } + var job = this.createJob(type, operation, options); + var batch = job.createBatch(); var cleanup = function() { job.close(); }; batch.on('response', cleanup); batch.on('error', cleanup); batch.on('queue', function() { batch.poll(self.pollInterval, self.pollTimeout); }); if (typeof callback === 'function') { - batch.on('response', function(res) { callback(null, res); }); - batch.on('error', function(err) { callback(err); }); - batch.execute(input); + batch.execute(input, callback); } return batch; }; @@ -366,8 +462,8 @@ Bulkloader.prototype.bulkload = function(type, operation, input, callback) { /** * */ -Bulkloader.prototype.createJob = function(type, operation) { - var job = new Job(this._conn, type, operation); +Bulk.prototype.createJob = function(type, operation, options) { + var job = new Job(this._conn, type, operation, options); job.open(); return job; }; @@ -375,29 +471,10 @@ Bulkloader.prototype.createJob = function(type, operation) { /** * */ -Bulkloader.prototype.getJob = function(jobId) { - return new Job(this._conn, null, null, jobId); -}; - -/** - * - */ -Bulkloader.prototype.getBatch = function(jobId, batchId) { - var job = this.getJob(jobId); - job.getBatch(batchId); +Bulk.prototype.job = function(jobId) { + return new Job(this._conn, null, null, null, jobId); }; -/*--------------------------------------------*/ - -/** - * - */ -Connection.prototype.bulkload = function(type, operation, input, callback) { - if (!this._bulkloader) { - this._bulkloader = new Bulkloader(this); - } - return this._bulkloader.bulkload(type, operation, input, callback); -}; /*--------------------------------------------*/ @@ -405,4 +482,4 @@ Connection.prototype.bulkload = function(type, operation, input, callback) { /** * */ -module.exports = Bulkloader; \ No newline at end of file +module.exports = Bulk; \ No newline at end of file diff --git a/lib/connection.js b/lib/connection.js index 113c0a1..dabadf7 100644 --- a/lib/connection.js +++ b/lib/connection.js @@ -5,7 +5,8 @@ var events = require('events'), Logger = require('./logger'), OAuth2 = require('./oauth2'), Query = require('./query'), - SObject = require('./sobject'); + SObject = require('./sobject'), + Bulk = require('./bulk'); /** @@ -73,6 +74,8 @@ Connection.prototype.initialize = function(options) { this.userInfo = options.userInfo; this.maxRequest = options.maxRequest || this.maxRequest || 10; this._initializedAt = Date.now(); + + this.bulk = new Bulk(this); }; @@ -137,7 +140,7 @@ Connection.prototype._request = function(params, callback, options) { } // check response content type to choose parser - var contentType = response.headers["content-type"]; + var contentType = options.responseContentType || response.headers["content-type"]; var parseBody = /^application\/xml(;|$)/.test(contentType) ? parseXML : /^application\/json(;|$)/.test(contentType) ? parseJSON : /^text\/csv(;|$)/.test(contentType) ? parseCSV : diff --git a/test/bulk.test.js b/test/bulk.test.js index 697fe21..ccd8e9e 100644 --- a/test/bulk.test.js +++ b/test/bulk.test.js @@ -30,7 +30,7 @@ vows.describe("bulk").addBatch({ }); } records.push({ BillingState: 'CA' }); // should raise error - conn.bulkload("Account", "insert", records, this.callback); + conn.bulk.load("Account", "insert", records, this.callback); }, "should return result status" : function (rets) { assert.isArray(rets); @@ -59,7 +59,7 @@ vows.describe("bulk").addBatch({ rec.Name = rec.Name + ' (Updated)'; return rec; }); - conn.bulkload('Account', 'update', records, next); + conn.bulk.load('Account', 'update', records, next); } ], this.callback); }, @@ -83,7 +83,7 @@ vows.describe("bulk").addBatch({ .execute(next); }, function(records, next) { - conn.bulkload('Account', 'delete', records, next); + conn.bulk.load('Account', 'delete', records, next); } ], this.callback); }, @@ -105,7 +105,7 @@ vows.describe("bulk").addBatch({ topic: function() { var self = this; var fstream = fs.createReadStream(__dirname + "/data/Account.csv"); - var batch = conn.bulkload("Account", "insert"); + var batch = conn.bulk.load("Account", "insert"); batch.on('response', function(results) { self.callback(null, results); }); batch.on('error', function(err) { self.callback(err); }); fstream.pipe(batch.stream()); @@ -122,22 +122,32 @@ vows.describe("bulk").addBatch({ "then bulk delete from file" : { topic: function() { + var batch; async.waterfall([ - function(cb) { - conn.sobject('Account').find({ Name : { $like : 'Bulk Account%' }}, cb); + function(next) { + conn.sobject('Account').find({ Name : { $like : 'Bulk Account%' }}, next); }, - function(records, cb) { + function(records, next) { var data = "Id\n"; for (var i=0; i Date: Thu, 10 Jan 2013 18:11:09 +0900 Subject: [PATCH 08/24] fix zombie scraping process in test script --- package.json | 2 +- test/connection.test.js | 72 +++++++++++++++++++++++------------------ 2 files changed, 42 insertions(+), 32 deletions(-) diff --git a/package.json b/package.json index 835f94c..d851157 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,6 @@ "devDependencies": { "express": "2.5.x", "vows": "0.5.x", - "zombie": "0.12.x" + "zombie": "1.4.x" } } diff --git a/test/connection.test.js b/test/connection.test.js index 4fd6dc3..d3336b2 100644 --- a/test/connection.test.js +++ b/test/connection.test.js @@ -287,37 +287,48 @@ vows.describe("connection").addBatch({ redirectUri : config.redirectUri, logLevel : config.logLevel }); - browser.visit(conn.oauth2.getAuthorizationUrl(), function() { - browser.wait(1500, self.callback); - }); - }, - "." : { - topic : function() { - var self = this; - browser.fill("input[name=un]", config.username) - .fill("input[name=pw]", config.password) - .pressButton("input[name=Login]", function() { - browser.wait(1500, self.callback); - }); - }, - - "." : { - topic : function() { - var url = browser.location.href; - if (url.indexOf(config.redirectUri) === 0) { - this.callback(); - } else { - browser.pressButton("#oaapprove", this.callback); - } + browser.visit(conn.oauth2.getAuthorizationUrl()) + .then(function() { + return browser.wait(1500); + }) + .fail(function(err) { + // ignore js errors + console.log(err); + }) + .then(function() { + browser.fill("input[name=un]", config.username); + browser.fill("input[name=pw]", config.password); + return browser.pressButton("input[name=Login]"); + }) + .then(function() { + return browser.wait(1500); + }) + .then(function() { + var url = browser.location.href; + if (url.indexOf(config.redirectUri) === 0) { + return; + } else { + return browser.pressButton("#oaapprove"); + } + }) + .then(function() { + return browser.wait(1500); + }) + .fail(function(err) { + console.log(err); + // ignore connection failure + }) + .then(function() { + var url = browser.location.href; + url = require('url').parse(url); + var params = querystring.parse(url.query); + conn.authorize(params.code, self.callback); + }) + .fail(function(err) { + self.callback(err); + }); }, - "." : { - topic : function() { - var url = browser.location.href; - url = require('url').parse(url); - var params = querystring.parse(url.query); - conn.authorize(params.code, this.callback); - }, "done" : function(userInfo) { assert.isString(userInfo.id); assert.isString(userInfo.organizationId); @@ -394,8 +405,7 @@ vows.describe("connection").addBatch({ assert.equal("invalid_grant", err.error); } - }}}}}}}} - + }}}}} From b693d3e1b95c5f263fe3b74e339a07d437681bb7 Mon Sep 17 00:00:00 2001 From: Shinichi Tomita Date: Thu, 10 Jan 2013 19:46:44 +0900 Subject: [PATCH 09/24] add test for readable query stream --- lib/query.js | 4 +++- lib/record-stream.js | 21 ++++++++++++++------- test/connection.test.js | 2 -- test/query.test.js | 32 ++++++++++++++++++++++++++++++++ test/soql-builder.test.js | 2 +- 5 files changed, 50 insertions(+), 11 deletions(-) diff --git a/lib/query.js b/lib/query.js index dfbd654..f914fca 100644 --- a/lib/query.js +++ b/lib/query.js @@ -243,5 +243,7 @@ Query.prototype.stream = function(type) { if (!stream) { throw new Error("No stream type defined for '"+type+"'."); } - return this.pipe(stream); + this.pipe(stream); + this.resume(); + return stream; }; \ No newline at end of file diff --git a/lib/record-stream.js b/lib/record-stream.js index e7037f4..135dd30 100644 --- a/lib/record-stream.js +++ b/lib/record-stream.js @@ -9,8 +9,8 @@ var events = require('events'), * */ var RecordStream = function() { - this.sendable = true; - this.receivable = true; + this.sendable = false; + this.receivable = false; this.on('error', function() { this.sendable = false; this.recievable = false; @@ -156,7 +156,7 @@ RecordStream.prototype.pipe = function (dest, options) { /* --------------------------------------------------- */ /** - * CSVStream (extends OutputRecordStream implements ReadableStream) + * CSVStream (extends extends ReadableStream implements OutputRecordStream) */ var CSVStream = function(headers) { this.sendable = true; @@ -165,14 +165,14 @@ var CSVStream = function(headers) { this.wroteHeaders = false; }; -util.inherits(CSVStream, RecordStream); +util.inherits(CSVStream, Stream); /** * */ CSVStream.prototype.send = function(record) { if (!this.wroteHeaders) { - if (this.headers) { + if (!this.headers) { var headers = {}; for (var key in record) { var value = record[key]; @@ -182,7 +182,7 @@ CSVStream.prototype.send = function(record) { } this.headers = _.keys(headers); } - this.emit("data", CSV.arrayToCSV(this.headers)); + this.emit("data", CSV.arrayToCSV(this.headers) + "\n"); this.wroteHeaders = true; } var row = []; @@ -202,11 +202,18 @@ CSVStream.prototype.send = function(record) { CSVStream.prototype.end = function(record) { this.readable = false; this.sendable = false; - this.write(record); + if (record) { this.send(record); } this.emit("end"); }; +CSVStream.prototype.destroy = +CSVStream.prototype.destroySoon = function() { + this.sendable = false; + this.readable = false; +}; + + RecordStream.CSVStream = CSVStream; diff --git a/test/connection.test.js b/test/connection.test.js index d3336b2..a503c8f 100644 --- a/test/connection.test.js +++ b/test/connection.test.js @@ -293,7 +293,6 @@ vows.describe("connection").addBatch({ }) .fail(function(err) { // ignore js errors - console.log(err); }) .then(function() { browser.fill("input[name=un]", config.username); @@ -315,7 +314,6 @@ vows.describe("connection").addBatch({ return browser.wait(1500); }) .fail(function(err) { - console.log(err); // ignore connection failure }) .then(function() { diff --git a/test/query.test.js b/test/query.test.js index e35704a..14a9cc7 100644 --- a/test/query.test.js +++ b/test/query.test.js @@ -1,7 +1,10 @@ var vows = require('vows'), assert = require('assert'), + fs = require('fs'), async = require('async'), events = require('events'), + stream = require('stream'), + Stream = stream.Stream, querystring = require('querystring'), sf = require('../lib/salesforce'), RecordStream = require('../lib/record-stream'), @@ -127,6 +130,35 @@ vows.describe("query").addBatch({ } +}).addBatch({ + + "query table and convert to readable stream": { + topic : function() { + var self = this; + var query = conn.query("SELECT Id, Name FROM Account LIMIT 10"); + var csvOut = new Stream(); + csvOut.writable = true; + var result = ''; + csvOut.write = function(data) { + result += data; + }; + csvOut.end = function(data) { + result += data; + csvOut.writable = false; + self.callback(null, result); + }; + query.stream().pipe(csvOut); + }, + + "should get CSV text" : function(csv) { + assert.isString(csv); + var header = csv.split("\n")[0]; + assert.equal(header, "Id,Name"); + } + + } + + }).export(module); diff --git a/test/soql-builder.test.js b/test/soql-builder.test.js index 2da1941..faf9791 100644 --- a/test/soql-builder.test.js +++ b/test/soql-builder.test.js @@ -3,7 +3,7 @@ var vows = require('vows'), SOQLBuilder = require('../lib/soql-builder'), SfDate = require('../lib/date'); -vows.describe("query").addBatch({ +vows.describe("soql-builder").addBatch({ "Simple query" : { topic : SOQLBuilder.createSOQL({ From c42c4d150f24a383e2127676fea3d03da94d693b Mon Sep 17 00:00:00 2001 From: Shinichi Tomita Date: Thu, 10 Jan 2013 20:53:04 +0900 Subject: [PATCH 10/24] change oauth2 constructor to work independently and separate process in initialization which called only once in construction of connection --- lib/connection.js | 62 +++++++++++++++++++++++++---------------------- lib/oauth2.js | 17 +++++++++++-- lib/salesforce.js | 1 + 3 files changed, 49 insertions(+), 31 deletions(-) diff --git a/lib/connection.js b/lib/connection.js index dabadf7..9846088 100644 --- a/lib/connection.js +++ b/lib/connection.js @@ -9,12 +9,40 @@ var events = require('events'), Bulk = require('./bulk'); +var defaults = { + loginUrl: "https://login.salesforce.com", + instanceUrl: "https://{instance}.salesforce.com", + version: "26.0" +}; + /** * constructor */ var Connection = module.exports = function(options) { - this._logger = new Logger(options && options.logLevel); - this.initialize(options || {}); + options = options || {}; + + this._logger = new Logger(options.logLevel); + + var oauth2 = options.oauth2; + if (!oauth2 && options.clientId) { // if oauth2 client config is written in flat (for compatibility) + oauth2 = { + loginUrl : options.loginUrl, + clientId : options.clientId, + clientSecret : options.clientSecret, + redirectUri : options.redirectUri + }; + } + if (oauth2) { + this.oauth2 = oauth2 instanceof OAuth2 ? oauth2 : new OAuth2(oauth2); + } + + this.loginUrl = options.loginUrl || (oauth2 && oauth2.loginUrl) || defaults.loginUrl; + this.version = options.version || defaults.version; + this.maxRequest = options.maxRequest || this.maxRequest || 10; + + this.bulk = new Bulk(this); + + this.initialize(options); }; /** @@ -22,18 +50,12 @@ var Connection = module.exports = function(options) { */ Connection.prototype = new events.EventEmitter(); -var loginUrl = "https://login.salesforce.com", - instanceUrl = "https://{instance}.salesforce.com", - version = "26.0"; - /** * initialize */ Connection.prototype.initialize = function(options) { - this.loginUrl = options.loginUrl || this.loginUrl || loginUrl; - this.version = options.version || this.version || version; this.instanceUrl = options.instanceUrl || options.serverUrl || this.instanceUrl || - instanceUrl.replace("{instance}", options.instance || "na1"); + defaults.instanceUrl.replace("{instance}", options.instance || "na1"); this.urls = { soap : { login : [ this.loginUrl, "services/Soap/u", this.version ].join('/'), @@ -49,33 +71,15 @@ Connection.prototype.initialize = function(options) { base : [ this.instanceUrl, "services/async", this.version ].join('/') } }; - var oauth2 = options.oauth2; - if (!oauth2 && options.clientId) { // if oauth2 client config is written in flat (for compatibility) - oauth2 = { - clientId : options.clientId, - clientSecret : options.clientSecret, - redirectUri : options.redirectUri - }; - } - if (oauth2) { - if (!(oauth2 instanceof OAuth2)) { - oauth2 = new OAuth2(_.extend({ - authzServiceUrl : this.loginUrl + "/services/oauth2/authorize", - tokenServiceUrl : this.loginUrl + "/services/oauth2/token" - }, oauth2)); - } - this.oauth2 = oauth2; - } + this.accessToken = options.sessionId || options.accessToken || this.accessToken; this.refreshToken = options.refreshToken || this.refreshToken; if (this.refreshToken && !this.oauth2) { throw new Error("Refersh token is specified without oauth2 client information"); } this.userInfo = options.userInfo; - this.maxRequest = options.maxRequest || this.maxRequest || 10; - this._initializedAt = Date.now(); - this.bulk = new Bulk(this); + this._initializedAt = Date.now(); }; diff --git a/lib/oauth2.js b/lib/oauth2.js index 9162983..338f517 100644 --- a/lib/oauth2.js +++ b/lib/oauth2.js @@ -34,13 +34,26 @@ function postParams(url, params, callback) { }); } +/** + * + */ +var defaults = { + loginUrl : "https://login.salesforce.com" +}; /** * OAuth2 */ var OAuth2 = module.exports = function(options) { - this.authzServiceUrl = options.authzServiceUrl; - this.tokenServiceUrl = options.tokenServiceUrl; + if (options.authzServiceUrl && options.tokenServiceUrl) { + this.loginUrl = options.authzServiceUrl.split('/').slice(0, 3).join('/'); + this.authzServiceUrl = options.authzServiceUrl; + this.tokenServiceUrl = options.tokenServiceUrl; + } else { + this.loginUrl = options.loginUrl || defaults.loginUrl; + this.authzServiceUrl = this.loginUrl + "/services/oauth2/authorize"; + this.tokenServiceUrl = this.loginUrl + "/services/oauth2/token"; + } this.clientId = options.clientId; this.clientSecret = options.clientSecret; this.redirectUri = options.redirectUri; diff --git a/lib/salesforce.js b/lib/salesforce.js index cb72bab..049fd9c 100644 --- a/lib/salesforce.js +++ b/lib/salesforce.js @@ -1,5 +1,6 @@ exports.Connection = require('./connection'); exports.OAuth2 = require('./oauth2'); exports.Date = require("./date"); +exports.RecordStream = require('./record-stream'); require('./streaming'); require('./bulk'); From c72b3371afa70eaf3ffc9a49fddffc9fda7e6e22 Mon Sep 17 00:00:00 2001 From: Shinichi Tomita Date: Thu, 10 Jan 2013 21:40:23 +0900 Subject: [PATCH 11/24] change test not to fail in zombie scraping --- test/config/oauth2.js.example | 3 +-- test/connection.test.js | 13 +++++------ test/oauth2.test.js | 41 ++++++++++++++++++++++++++++++----- 3 files changed, 41 insertions(+), 16 deletions(-) diff --git a/test/config/oauth2.js.example b/test/config/oauth2.js.example index 48682a0..30d1abc 100644 --- a/test/config/oauth2.js.example +++ b/test/config/oauth2.js.example @@ -1,6 +1,5 @@ module.exports = { - authzServiceUrl : "https://login.salesforce.com/services/oauth2/authorize", - tokenServiceUrl : "https://login.salesforce.com/services/oauth2/token", + loginUrl: "https://login.salesforce.com", clientId : "oauth2 client id is here", clientSecret : "oauth2 client secret is here", redirectUri : "http://localhost:4000/oauth2/callback", diff --git a/test/connection.test.js b/test/connection.test.js index a503c8f..1e87fa7 100644 --- a/test/connection.test.js +++ b/test/connection.test.js @@ -289,10 +289,11 @@ vows.describe("connection").addBatch({ }); browser.visit(conn.oauth2.getAuthorizationUrl()) .then(function() { - return browser.wait(1500); + return browser.wait(2000); }) .fail(function(err) { // ignore js errors + console.log(err.message); }) .then(function() { browser.fill("input[name=un]", config.username); @@ -300,21 +301,17 @@ vows.describe("connection").addBatch({ return browser.pressButton("input[name=Login]"); }) .then(function() { - return browser.wait(1500); + return browser.wait(2000); }) .then(function() { - var url = browser.location.href; - if (url.indexOf(config.redirectUri) === 0) { - return; - } else { - return browser.pressButton("#oaapprove"); - } + return browser.pressButton("#oaapprove"); }) .then(function() { return browser.wait(1500); }) .fail(function(err) { // ignore connection failure + console.log(err.message); }) .then(function() { var url = browser.location.href; diff --git a/test/oauth2.test.js b/test/oauth2.test.js index 4410cde..580b224 100644 --- a/test/oauth2.test.js +++ b/test/oauth2.test.js @@ -12,16 +12,26 @@ var oauth2 = new OAuth2(config); var browser = new zombie.Browser(); browser.runScripts = true; - vows.describe("oauth2").addBatch({ "OAuth2 web server flow : access to authz url" : { topic : function() { - browser.visit(oauth2.getAuthorizationUrl({ state : "hello" }), this.callback); + var self = this; + browser.visit(oauth2.getAuthorizationUrl({ state : "hello" })) + .then(function() { + return browser.wait(2000); + }) + .fail(function(err) { + console.log(err.message); + }) + .then(function() { + self.callback(); + }); }, "should get login page" : function() { assert.ok(browser.success); + assert.equal(browser.location.href.indexOf(oauth2.loginUrl), 0); assert.lengthOf(browser.body.querySelectorAll('input[name=username]'), 1); assert.lengthOf(browser.body.querySelectorAll('input[name=pw]'), 1); assert.lengthOf(browser.body.querySelectorAll('input[name=Login]'), 1); @@ -30,11 +40,20 @@ vows.describe("oauth2").addBatch({ ", then input username/password" : { topic : function() { var self = this; + browser.fill("input[name=un]", config.username) .fill("input[name=pw]", config.password) - .pressButton("input[name=Login]", function() { - browser.wait(1500, self.callback); + .pressButton("input[name=Login]") + .then(function() { + return browser.wait(2000); + }) + .fail(function(err) { + console.log(err.message); + }) + .then(function() { + self.callback(); }); + }, "should get authz page" : function() { @@ -43,16 +62,26 @@ vows.describe("oauth2").addBatch({ ", then press authorize, if it is required" : { topic : function() { + var self = this; var url = browser.location.href; if (url.indexOf(config.redirectUri) === 0) { this.callback(); } else { - browser.pressButton("#oaapprove", this.callback); + browser.pressButton("#oaapprove") + .then(function() { + return browser.wait(2000); + }) + .fail(function(err) { + console.log(err.message); + }) + .then(function() { + self.callback(); + }); + } }, "should get authorization code and state" : function() { - assert.ok(browser.success); var url = browser.location.href; assert.equal(url.indexOf(config.redirectUri), 0); url = require('url').parse(url); From f06ae3922ceec4e824e4bd0f2f321f1f3f810c00 Mon Sep 17 00:00:00 2001 From: Shinichi Tomita Date: Fri, 11 Jan 2013 12:09:51 +0900 Subject: [PATCH 12/24] change loading csv data --- test/data/Account.csv | 705 ++++++++++++++++++++++++++++++++---------- 1 file changed, 537 insertions(+), 168 deletions(-) diff --git a/test/data/Account.csv b/test/data/Account.csv index 22defff..04d4640 100644 --- a/test/data/Account.csv +++ b/test/data/Account.csv @@ -1,168 +1,537 @@ -NAME,TYPE,PARENTID,BILLINGSTREET,BILLINGCITY,BILLINGSTATE,BILLINGPOSTALCODE,BILLINGCOUNTRY,SHIPPINGSTREET,SHIPPINGCITY,SHIPPINGSTATE,SHIPPINGPOSTALCODE,SHIPPINGCOUNTRY,PHONE,FAX,ACCOUNTNUMBER,WEBSITE,SIC,INDUSTRY,ANNUALREVENUE,NUMBEROFEMPLOYEES,OWNERSHIP,TICKERSYMBOL,DESCRIPTION,RATING,SITE,CUSTOMERPRIORITY__C,SLA__C,ACTIVE__C,NUMBEROFLOCATIONS__C,UPSELLOPPORTUNITY__C,SLASERIALNUMBER__C,SLAEXPIRATIONDATE__C -Bulk Account - Dell,Customer - Direct,,Staffing Dept. One Dell Way - SP1,Round Rock,TX,78682,United States,,,,,,(512) 338-4400,(800) 926-7595,A-127657,www.dell.com,,Personal Computers,6.11E+10,54470,,NASDAQ: DELL,"Dell Inc. (NASDAQ: DELL) listens to customers and delivers innovative technology and services they trust and value. Uniquely enabled by its direct business model, Dell is a leading global systems and services company and No. 34 on the Fortune 500. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - United Parcel Service,Old Customer,,55 Glenlake Pkwy,Atlanta,GA,30328,United States,,,,,,(404) 828-6000,(404) 828-6440,A-127581,www.ups.com,,Freight Services,4.97E+10,428000,Unlisted,NYSE: UPS,"United Parcel Service, Inc. (UPS) is a package delivery and supply chain management company. The primary business of the Company includes time-definite delivery of packages and documents. The Company has extended its service portfolio to include less-than-truckload (LTL) transportation, primarily in the United States, and supply chain services. The Company operates in three segments: U.S. Domestic Package operations, International Package operations, and Supply Chain & Freight operations. As of December 31, 2007, the Company delivered packages each business day for 1.8 million shipping customers to 6.1 million consignees in over 200 countries and territories. During the year ended December 31, 2007, UPS delivered an average of 15.75 million pieces per day worldwide. In addition, its supply chain solutions capabilities are available to clients in over 175 countries and territories. In 2007, the Company added six daily flights between the United States and Nagoya, Japan. -(Source: 10-K) Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Nissan Motors,Customer,,"6-17-1, Ginza",Chuo-Ku,TKY,104-0061,Japan,,,,,,+81 3 3543 5523,(310) 516-7967,A-127598,www.nissan-global.com,,Motor Vehicles,9.48E+10,162180,Listed,,"Nissan Motor Co., Ltd. is a Japan-based company mainly engaged in automobile business. The Company is involved in the planning, manufacture and sale of passenger vehicles, forklifts, marine vehicles and related vehicle parts. The Company has 365 subsidiaries and 37 associated companies in Japan, France, Holland, the United Kingdom, Italia, Spain, the United States, Canada, Mexico, Australia, South Africa, China, Thailand and United Arab Emirates. -(Source: ARS) Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Bentley Motors,Customer Candidate,,Pyms Lane,Crewe,Cheshire,CW1 3PL,United Kingdom,,,,,,+44 1270 255155,+44 1270 586 548,A-127612,www.bentleymotors.com,,Motor Vehicles,4.97E+10,1300,Listed,,"Bentley Motors was founded by W.O. Bentley in 1919 when the first Bentley engine burst into life at New Street Mews, London. From these modest beginnings, W.O's company went from strength to strength through the 1920s, with an evolving series of acclaimed motor cars and a parade of racing triumphs to prove their outstanding performance. These laurels were capped with five outright victories at Le Mans between 1924 - 1930 and a sixth in 2003. - -If we had mission statements in those days, it could not have been expressed more eloquently than in the words of W.O. himself, ""To build a good car, a fast car, the best in class"". - -These words are just as relevant today as they continue to inform our beliefs, actions and ambitions for the future. Located in Crewe, England since 1946 and owned since 1998 by Volkswagen AG, Bentley Motors is dedicated to making responsive and powerful Grand Tourers with the stamina to cross continents at pace, and drive in refined comfort and style. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Gap Inc.,Customer,,Two Folsom Street,San Francisco,CA,94105,United States,,,,,,(650) 952-4400,(650) 952-4407,A-127628,www.gapinc.com,,Apparel Retail,1.58E+10,150000,Listed,NYSE: GPS,"The Gap, Inc. is a global specialty retailer operating retail and online stores selling casual apparel, accessories, and personal care products for men, women and children under the Gap, Old Navy, Banana Republic, and Piperlime brands. The Company operates stores in the United States, Canada, the United Kingdom, France, Ireland, and Japan. It also has franchise agreements with unaffiliated franchisees to operate Gap and Banana Republic stores in Asia, Europe and the Middle East. Under these agreements, third parties operate or will operate stores that sell apparel, purchased from the Company, under its brand names. In addition, United States customers may shop online at www.gap.com, www.bananarepublic.com, www.oldnavy.com, and www.piperlime.com. -(Source: 10-K) Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Gateway,Partner,,"Gateway, Inc. 7565 Irvine Center Drive",Irvine,CA,92618,United States,,,,,,(949) 471-7000,(949) 471-7041,A-127630,www.gateway.com,,Consumer Electronics,4.16E+10,101,Listed,,"Gateway will not sell, rent or give away customer information to other companies for use in selling others' products or services. We do, however, use other third parties to provide us with necessary services such as credit card processing, shipping, credit financing or providing Internet service. When you request a service or purchase a product from Gateway, we will share your personal information as necessary for that third party to provide that service. These third-party service providers are prohibited from using your personally identifiable information for any other purpose. - -We gather personal information from our customers so we can better develop our relationship with those customers. Occasionally, we seek customer comments on our products and services. These comments allow us to determine which products and services our customers should be made aware of based on their specific needs. - -We will proactively communicate with customers via e-mail or other online delivery devices to provide offers and information we believe will be of interest. Customers who no longer wish to receive these communications should inform us and we will remove their names from our mailing lists. Gateway will be judicious in the use of e-mail and paper mail to communicate with customers, putting ourselves in the place of the recipients of our mail and treating our customers as we ourselves would like to be treated. If you would like to be taken off Gateway's various marketing programs, please click here to opt out and enter the information you wish, and you will be unsubscribed as you request. - -Our Web site shares usage information about site visitors with reputable third-party companies for targeting our Internet banner advertisements on this site and other sites, as well as for gathering aggregate information about site traffic and usage. For these purposes, we and our third-party companies note some of the pages you visit on our Web site using pixel tags (also called transparent gifs). The information collected by our third-party advertisers using these pixel tags is not personally identifiable. Some of the information collected by our third-party analytics provider may be personally identifiable; however, our provider is contractually precluded from selling, licensing or conveying any such information to any third party or from using that information in any way outside Gateway's own privacy policy. View more information about our third-party analytics provider, including how to exclude/include your sessions from data collection. - -Gateway is a licensee of the TRUSTe Privacy Program. TRUSTe is an independent, non-profit organization whose mission is to enable individuals and organizations to establish trusting relationships based on respect for personal identity and information by promoting the use of fair information practices. This privacy statement covers the site www.gateway.com. Because we want to demonstrate Gateway's commitment to our users' privacy related to the Web site, we have agreed to disclose its information practices and have its privacy practices reviewed for compliance by TRUSTe. - -If users have questions or concerns regarding this statement, they should call 800-846-2000. If they do not receive acknowledgment of their inquiry or their inquiry is not satisfactorily addressed, they should then contact TRUSTe through the TRUSTe Watchdog Dispute Resolution Form. TRUSTe will serve as a liaison with the Web site to resolve users' concerns. - -The TRUSTe program covers only information that is collected through this Web site, and does not cover information that may be collected through software downloaded from the site. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Countrywide Financial,Old Customer,,4500 Park Granada MS CH 143,Calabasas,CA,91302,United States,,,,,,(818) 225-3000,(818) 304-5979,A-127646,www.countrywide.com,,Banking,2.34E+10,50600,Listed,NYSE: CFC,"Founded in 1969, Countrywide Financial Corporation (NYSE: CFC) is a member of the S&P 500 and Fortune 500. Countrywide, through its subsidiaries, provides mortgage banking and diversified financial services in domestic and international markets. Mortgage banking businesses include loan production and servicing principally through Countrywide Home Loans, Inc., which originates, purchases, securitizes, sells, and services primarily prime- quality loans. The company is headquartered in Calabasas, California and has more than 40,000 employees with over 600 offices. - Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Fuji Photo Film,Old Customer,,555 Taxter Road,Elmsford,NY,10523,United States,,,,,,(914) 789-8100,(914) 789-8165,A-127656,www.fujifilm.com,,Photo Equipment,1.78E+08,3500,Unlisted,,"Fuji Photo Film U.S.A., Inc. is a subsidiary of Fuji Photo Film Co., Ltd. and delivers technology solutions to meet the imaging and information needs of retailers, consumers, professionals and business customers. Fujifilm,s U.S. headquarters are located in Valhalla, N.Y. - -Named after the legendary founder of Ranger Boats, Forrest L. Wood, FLW Outdoors administers the Wal-Mart FLW Tour, Wal-Mart FLW Series, Stren Series, Wal-Mart Bass Fishing League, Wal-Mart Texas Tournament Trail, Stratos Owners, Tournament Trail, Wal-Mart FLW Walleye Tour, Wal-Mart FLW Walleye League, Wal-Mart FLW Kingfish Tour, Wal-Mart FLW Kingfish Series and Wal-Mart FLW Redfish Series. These circuits offer combined purses exceeding $36.9 million through 241 events in 2006. FLW Outdoors also recently announced the addition of a striped bass circuit, which will debut this summer. - Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Walt Disney Company,Partner,,500 South Buena Vista St,Burbank,CA,91521,United States,,,,,,(818) 560-1000,(818) 560-1930,A-127620,www.disney.com,,Film Production,3.59E+10,137000,Unlisted,NYSE: DIS,"Disney Interactive Studios is the interactive entertainment affiliate of The Walt Disney Company (NYSE: DIS). Disney Interactive Studios self publishes and distributes a broad portfolio of multi-platform video games and interactive entertainment worldwide. The company also licenses properties and works directly with other interactive game publishers to bring products for all ages to market. Disney Interactive Studios is based in Glendale, California, and has five internal game development studios around the world including Avalanche Software, Fall Line Studio, Propaganda Games, Black Rock Studio and Junction Point Studios. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Eastman Kodak,Customer Candidate,,343 State Street,Rochester,NY,14650,United States,,,,,,(585) 724-4000,(585) 724-0663,A-127517,www.kodak.com,,Photo Equipment,1.12E+10,26930,Listed,NYSE: EK,"Eastman Kodak Company provides imaging technology products and services to the photographic and graphic communications markets. Its products span digital cameras and accessories; consumer inkjet printers and media; digital picture frames; retail printing kiosks and related media; online imaging services; prepress equipment and consumables; workflow software for commercial printing; electrophotographic equipment and consumables; inkjet printing systems; document scanners; origination and print films for the entertainment industry; consumer and professional photographic film; photographic paper and processing chemicals, and wholesale photofinishing services. On April 30, 2007, the Company closed on the sale of its Health Group to Onex Healthcare Holdings, Inc., a subsidiary of Onex Corporation. It has three segments: Consumer Digital Imaging Group, Film Products Group and Graphic Communications Group. In April 2008, the Company announced the acquisition of Intermate A/S. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - KB Home Corp,Old Customer,,10990 Wilshire Blvd,Los Angeles,CA,90024,United States,,,,,,(310) 231-4000,(310) 231-4222,A-127531,www.kbhome.com,,Real Estate,7.33E+09,3100,Listed,NYSE: KBH,"KB Home is a builder of single-family homes, townhomes and condominiums. The Company operates in Arizona, California, Colorado, Florida, Georgia, Illinois, Maryland, Nevada, New Mexico, North Carolina, South Carolina, Texas and Virginia. It also offers mortgage services through Countrywide KB Home Loans, a joint venture with Countrywide. Through its financial services subsidiary, KB Home Mortgage Company (KBHMC), the Company provides title and insurance services to its homebuyers. The Company operates in four homebuilding segments and one financial services segment. KB Home?s four homebuilding segments offer a variety of homes designed primarily for first-time, first move-up and active adult buyers, including attached and detached single-family homes, townhomes and condominiums. The Company?s financial services segment derives income from mortgage banking, title and insurance services offered to its homebuyers. -(Source: 10-K) Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Stantec,Customer,,10160-112 St.,Edmonton,AB,T5K 2L6,Canada,,,,,,(780) 917-7000,(780) 917-7330,A-127593,www.stantec.com,,Construction,1.01E+09,6500,Unlisted,TSX: STN,"Stantec Inc. provides professional consulting services in planning, engineering, architecture, interior design, landscape architecture, surveying and geomatics, environmental sciences, project management, and project economics for infrastructure and facilities projects. Its services include, or relate to, the development of conceptual plans, zoning approval of design infrastructure, transportation planning, traffic engineering, landscape architecture, urban planning, design construction review and surveying. It provides knowledge-based solutions for infrastructure and facilities projects through professional services principally under fee-for-service agreements with clients. It uses a three-dimensional business model, which is built on geographic diversification, practice area specialization and provision of services in all phases of a project's lifecycle. On January 2, 2008, it acquired R.D. Zande and Rochester Signal, Inc. In March 2008, the Company acquired RHL Design Group Inc. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - State Univ of NY (SUNY),Customer,,State University Plaza,Albany,NY,12246,United States,,,,,,(518) 564-3287,(518) 443-5317,A-127609,www.suny.edu,,Universities,4.37E+09,80974,Listed,,"SUNYAB, with $310,000 in incentives from the New York State Energy Research and Development Authority (NYSERDA), plans to install and operate a new combined heat and power (CHP) system that will use emerging microturbine technology to produce electric power. - Data imported from ZoomInfo",,,,,,,,, -Bulk Account - EMC Corporation,Old Customer,,176 South Street,Hopkinton,MA,1748,United States,,,,,,(508) 435-1000,(508) 435-5222,A-127606,www.emc.com,,Info & Doc Mgmt,1.32E+10,37700,Listed,NYSE: EMC,"EMC Corporation (EMC) and its subsidiaries develops, delivers and supports the information technology (IT) industry's range of information infrastructure technologies and solutions. EMC's Information Infrastructure business supports customers' information lifecycle management (ILM) strategies and helps them build information infrastructures that store, protect, optimize and leverage their vast and growing quantities of information. EMC's Information Infrastructure business consists of three segments: Information Storage, Content Management and Archiving, and RSA Information Security. In December 2007, the Company acquired Dokumentum Services CIS, a distribution and consulting services provider focused on providing marketing, support and maintenance, consulting, training and localization services related to its Content Management software. In March 2008, the Company completed the acquisition of Document Sciences Corporation and Infra Corporation Pty Limited. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - The North Face,Old Customer,,2013 Farallon Drive,San Leandro,CA,94577,United States,,,,,,(510) 618-3500,(510) 618-3547,A-127566,www.thenorthface.com,,Sporting Goods Retail,7.74E+10,517,Unlisted,,"The North Face, a subsidiary of VF Corp., was founded in 1966 and opened its first retail store in 1968. Headquartered in San Leandro, California, the company offers the most technically advanced products on the market to accomplished climbers, mountaineers, extreme skiers and explorers. The company's products are sold in specialty mountaineering, backpacking and skiing retailers, premium-sporting goods retailers and major outdoor specialty retail chains. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - PowerBar,Partner,,25 Sheppard Avenue West,North York,ON,M2N 6S8,Canada,,,,,,1-825-584-8704,(416) 218-2940,A-127580,www.powerbar.com,,Food & Beverages,2.65E+07,300,Listed,,"PowerBar is committed to helping enhance the performance of active individuals by providing cutting edge nutritional products and sound sports nutrition information. Backed by decades of sports nutrition experience, PowerBar's product line includes a full spectrum of great-tasting food and beverage options developed to meet the nutrition and energy needs of all athletic levels from recreational to endurance. PowerBar proudly fuels world-class athletes including Olympic hopefuls Michael Phelps, Meb Keflezighi and Allyson Felix, and sponsors premier organizations and events including a global Ironman partnership, the Leukemia & Lymphoma Society's Team In Training program, and the Chicago, Boston and ING New York City Marathons. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Raytheon,Customer Candidate,,870 Winter Street,Waltham,MA,02451-1449,USA,,,,,,(781) 522-3000,(781) 522-3001,A-127527,www.raytheon.com,,Aerospace,2.24E+10,72100,Unlisted,NYSE: RTN,"Raytheon Company designs, develops, manufactures, integrates, supports and provides a range of technologically advanced products, services and solutions for governmental customers in the United States and worldwide. The Company operates through six business segments: Integrated Defense Systems (IDS), Intelligence and Information Systems (IIS), Missile Systems (MS), Network Centric Systems (NCS), Space and Airborne Systems (SAS) and Technical Services (TS). During the year ended December 31, 2007, the Company completed the sale of Raytheon Aircraft Company (Raytheon Aircraft) and Flight Options LLC (Flight Options), two former operating commercial aviation businesses. In October 2007, the Company acquired Oakley Networks, Inc., a privately held technology company based in Salt Lake City, Utah, which provides cyber security and data leakage prevention systems. In April 2008, the Company acquired SI Government Solutions. In July 2008, the Company acquired Telemus Solutions, Inc. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Boeing Company,Partner,,100 N Riverside Plz,Chicago,IL,60606,United States,,,,,,(312) 544-2000,(312) 544-2078,A-127510,www.boeing.com,,Aerospace,6.64E+10,159300,Listed,NYSE: BA,"The Boeing Company (Boeing) is involved in the design, development, manufacture, sale and support of commercial jetliners, military aircraft, satellites, missile defense, human space flight, and launch systems and services. The Company operates in five principal segments: Commercial Airplanes, Precision Engagement and Mobility Systems (PE&MS), Network and Space Systems (N&SS), Support Systems and Boeing Capital Corporation (BCC). PE&MS, N&SS and Support Systems comprise the Company?s Integrated Defense Systems (IDS) business. The Other segment classification principally includes the activities of Engineering, Operations and Technology, an advanced research and development organization focused on technologies, processes and the creation of new products. In September 2008, the Company launched a division within its Integrated Defense Systems (IDS) business. In November 2008, The Boeing Company announced that it has completed its acquisition of Tapestry Solutions. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - United Air Lines,Customer Candidate,,1200 E. Algonquin Rd.,Elk Grove Township,IL,60007,USA,,,,,,847-700-4000,1-268-162-4482,A-127632,www.united.com,,Airlines,2.01E+10,55000,Unlisted,NASDAQ: UAUA,"United Air Lines, Inc. (together with its subsidiaries, United) is wholly owned by UAL Corporation, which serves as the holding company. The Company operates its businesses through two segments: Mainline and United Express. United transports people and cargo through its Mainline operations, which use full-sized jet aircraft exceeding 70 seats in size. The regional operations use smaller aircraft not exceeding 70 seats in size and are operated under contract by United Express carriers. The Company operates more than 3,300 flights a day on United, United Express and Ted to more than 200 United States and international destinations from its hubs in Los Angeles, San Francisco, Denver, Chicago and Washington, District of Columbia. The most significant source of airline revenues is passenger revenues. However, Mileage Plus, United Cargo and United Services are also significant sources of operating revenues. -(Source: 10-K) Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Pepper Construction,Customer Candidate,,643 North Orleans Street,Chicago,IL,60610,United States,,,,,,(312) 266-4700,(312) 266-2792,A-127637,www.pepperconstruction.com,,Construction,1.24E+09,1100,Listed,,"At Pepper Construction Company, we make Safety our First Priority, and we expect everyone on our team to do the same. We provide a vast array of support, training and special equipment to keep our Teams safe, but we need everyone's help. That's why we ask our employees, subcontractors and vendors to make a personal commitment to work safe. Pepper wants every one who works with us to return safely home each and every day. Together, we can make an accident-free workplace a reality. - -This content requires Adobe Flash. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Pacific Sunwear of California,Customer,,3450 East Miraloma Avenue,Anaheim,CA,92806,United States,,,,,,(714) 414-4000,(714) 414-4260,A-127618,www.pacsun.com,,Apparel Retail,1.45E+09,11000,Listed,NASDAQ: PSUN,"Pacific Sunwear, currently operating under three distinct retail concepts, is a leading specialty retailer of everyday casual apparel, accessories and footwear designed to meet the needs of active teens and young adults. As of January 5, 2008, the Company operated 840 PacSun stores, 120 PacSun Outlet stores, 154 demo stores and 6 One Thousand Steps stores for a total of 1,120 stores in 50 states and Puerto Rico. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Bank of America,Customer,,100 N. Tryon St,Charlotte,NC,28255,United States,,,,,,(704) 386-5681,(704) 386-6699,A-127634,www.bankofamerica.com,,Banking,1.19E+11,210000,Listed,NYSE: BAC,"Bank of America Corporation is a bank holding company. Through its banking subsidiaries (the Banks) and various non-banking subsidiaries throughout the United States and in selected international markets, Bank of America provides a diversified range of banking and non-banking financial services and products through three business segments: Global Consumer and Small Business Banking, Global Corporate and Investment Banking, and Global Wealth and Investment Management. The Company operates in 32 states, the District of Columbia and 30 foreign countries. In the United States, it serves 59 million consumer and small business relationships with 6,100 retail banking offices, 18,500 automated teller machines (ATMs) and 24 million active online users. It offers services in 13 states. In October 2007, it acquired ABN AMRO North America Holding Company. In July 2007, it acquired U.S. Trust Corporation. In July 2008, Bank of America acquired Countrywide Financial Corp. Data imported from ZoomInfo",,,,,,,,, -"Bulk Account - Goldman, Sachs & Co.",Old Customer,,85 Broad Street,New York,NY,10004,United States,,,,,,(212) 902-1000,(212) 902-3000,A-127621,www.gs.com,,Investment Banking,8.80E+10,35094,Listed,NYSE: GS,"Goldman Sachs is a global investment banking, securities and investment management firm. It provides a wide range of services to a substantial and diversified client base that includes corporations, institutional investors, governments, non-profit organisations and high net worth individuals. The firm is headquartered in New York and maintains significant offices in London, Frankfurt, Tokyo, Hong Kong and other financial centres around the world. - Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Amgen Inc,Customer,,One Amgen Center Dr.,Thousand Oaks,CA,91320,United States,,,,,,(805) 447-1000,(805) 447-1010,A-127573,www.amgen.com,,Biotechnology,1.48E+10,17500,Listed,NASDAQ: AMGN,"Amgen Inc. is a biotechnology company that discovers, develops, manufactures and markets human therapeutics-based on advances in cellular and molecular biology. The Company operates in human therapeutics. It markets human therapeutic products in the areas of supportive cancer care, nephrology, inflammation and oncology. Its principal products include Aranesp (darbepoetin alfa), EPOGEN (Epoetin alfa), Neulasta (pegfilgrastim), NEUPOGEN (Filgrastim) and Enbrel (etanercept). Aranesp and EPOGEN stimulate the production of red blood cells to treat anemia and belong to a class of drugs referred to as erythropoiesis-stimulating agents (ESAs). Other marketed products principally consists of Sensipar (cinacalcet HCl) and Vectibix (panitumumab). On July 16, 2007, the Company acquired Alantos Pharmaceuticals Holding, Inc. -(Source: 10-K) Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Saxo Bank,Customer Candidate,,40 Bank Street,Canary Wharf,London,E14 5DA,United Kingdom,,,,,,+45 3977 4000,1-325-952-1629,A-127622,www.saxobank.com,,Banking,4.41E+10,333,Listed,,"Saxo Bank A/S is an EU regulated investment bank specializing in online trading, information delivery and risk management in global capital markets products. Saxo Bank currently employs 285 employees from 37 different countries aggregating FX liquidity from some of the largest banks and providers in the world. - Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Garmin,Customer Candidate,,P.O. Box 10670 Grand Cayman KY1-1006,Camana Bay,MA,54126,Cayman Islands,,,,,,(345) 640-9050,(345) 945-3390,A-127507,www.garmin.com,,Consumer Electronics,3.18E+09,8434,Listed,NASDAQ: GRMN,"Garmin Limited (Garmin) is a global provider of navigation, communications and information devices, which are enabled by global positioning system (GPS) technology. Garmin designs, develops, manufactures and markets a family of hand-held, portable and fixed-mount GPS-enabled products and other navigation, communications and information products for the automotive/mobile, outdoor/fitness, marine and general aviation markets. The segments of the Company are Marine, Automotive/Mobile, Outdoor/Fitness, and Aviation. In May 2008, Garmin completed the acquisition of Formar Electronics N.V./S.A. In June 2008, Garmin acquired NavCor Oy, which will be renamed as Garmin Suomi Oy. In August 2008, Garmin announced that it has completed the acquisition of SatSignal- Equipamentos de Comunicacoes e de Navegacao, S.A., the distributor of Garmin?s consumer products in Portugal. The Company will be renamed Garmin Portugal- Equipamentos de Comunicacao e Navegacao, S. A. and will continue its operations. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Toshiba Corporation,Customer,,"1-1-1, Shibaura",Minato-Ku,TKY,105-0023,Japan,,,,,,+81 3 3457 4511,(949) 609-4581,A-127648,www.toshiba.co.jp,,Consumer Electronics,6.71E+10,198000,Listed,,"TOSHIBA CORPORATION is a Japan-based manufacturer involved in five business segments. The Digital Products segment offers cellular phones, hard disc devices, optical disc devices, liquid crystal televisions, camera systems, digital versatile disc (DVD) players and recorders, personal computers (PCs) and business phones, among others. The Electronic Device segment provides general logic integrated circuits (ICs), optical semiconductors, power devices, large-scale integrated (LSI) circuits for image information systems and liquid crystal displays (LCDs), among others. The Social Infrastructure segment offers various generators, power distribution systems, water and sewer systems, transportation systems and station automation systems, among others. The Home Appliance segment offers refrigerators, drying machines, washing machines, cooking utensils, cleaners and lighting equipment. The Others segment leases and sells real estate. -(Source: ARS) Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Panasonic Corporation,Customer,,One Panasonic Way,Secaucus,NJ,7094,United States,,,,,,(201) 348-7000,(201) 392-4443,A-127524,www.panasonic.com,,Consumer Electronics,2.66E+09,3562,Unlisted,,"Based in Secaucus, N.J., Panasonic Consumer Electronics Company (PCEC), a market and technology leader in high definition television, is a Division of Panasonic Corporation of North America, the principal North American subsidiary of Matsushita Electric Industrial Co. Ltd. (NYSE: MC) and the hub of Panasonic's U.S. marketing, sales, service and R&D operations. Panasonic's exclusive Panasonic VIERA Concierge program is administered through its Virginia-based Call Center, recognized as a Certified ""Center of Excellence"" by the Center for Customer-Driven Quality(TM) at Purdue University. Panasonic is proud to support the Olympic Movement - which is aimed at promoting world peace through sports - as an Official Worldwide Olympic Partner in the Video and Audio Equipment category for more than 20 years. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Genentech,Customer,,1 Dna Way,South San Francisco,CA,94080,United States,,,,,,(650) 225-1000,(650) 225-6000,A-127508,www.gene.com,,Biotechnology,1.17E+10,11174,Listed,NYSE: DNA,"Genentech, Inc. (Genentech) is a biotechnology company that discovers, develops, manufactures and commercializes pharmaceutical products to treat patients with unmet medical needs. It commercializes multiple biotechnology products and also receives royalties from companies that are licensed to market products based on the Company?s technology. Genentech commercializes various products in the United States, including Avastin, Rituxan, Herceptin, Lucentis, Xolair, Tarceva, Nutropin, Activase, TNKase, Cathflo Activase, Pulmozyme and Raptiva. The Company?s licensed products include Trastuzumab, Rituximab, Bevacizumab, Dornase alfa, recombinant, Alteplase and Tenecteplase, Somatropin, Daclizumab, Ranibizumab, Etanercept, Adalimumab and Infliximab. As of July 21, 2008, Roche Holding Ltd. held a 55.9% interest in Genentech, Inc., a biotechnology company. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Pfizer Inc,Partner,,50 East 42Nd Street 19Th Floor,New York City,NY,10017,United States,,,,,,(212) 573-2323,(212) 573-7851,A-127535,www.pfizer.com,,Drug Manufacturing,4.84E+10,86600,Listed,NYSE: PFE,"Pfizer Inc. (Pfizer) is a research-based, global pharmaceutical company. The Company discovers, develops, manufactures and markets prescription medicines for humans and animals. It operates in two business segments: Pharmaceutical and Animal Health. The Company also operates several other businesses, including the manufacture of gelatin capsules, contract manufacturing and bulk pharmaceutical chemicals. In January 2008, the Company completed the acquisition of Coley Pharmaceutical Group, Inc., a company whose area of capability is immunotherapy with emphasis on Toll-like receptor research and development. In January 2008, it completed the acquisition of CovX Research LLC. In June 2008, Pfizer completed the acquisition of all remaining outstanding shares of common stock of Encysive Pharmaceuticals, Inc. through a merger of Pfizer's wholly owned subsidiary, Explorer Acquisition Corp., with and into Encysive. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Big 5 Sporting Goods,Old Customer,,2525 East El Segundo Boulevard,El Segundo,CA,90245,United States,,,,,,(310) 536-0611,(310) 297-7585,A-127536,www.big5sportinggoods.com,,Sporting Goods Retail,8.98E+08,8100,Unlisted,NASDAQ: BGFV,"Big 5 Sporting Goods Corporation is a sporting goods retailer in the United States. The Company provides a full-line product offering in a traditional sporting goods store format that averages approximately 11,000 square feet. The product mix includes athletic shoes, apparel and accessories, as well as selection of outdoor and athletic equipment for team sports, fitness, camping, hunting, fishing, tennis, golf, snowboarding and in-line skating. It conducts its business through Big 5 Corp. It conducts its gift card operations through Big 5 Services Corp., a wholly owned subsidiary of Big 5 Corp. During the year ended December 30, 2007, the Company operated 363 stores in 11 states under the Big 5 Sporting Goods name. The Company carries a range of products from brand name manufacturers, including Nike, Reebok, adidas, New Balance, Wilson, Spalding, Under Armour and Columbia. -(Source: 10-K) Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Forest City Enterprises,Old Customer,,1100 Terminal Tower 50 Public Square,Cleveland,OH,44113,United States,,,,,,(216) 621-6060,(216) 267-3925,A-127551,www.forestcity.net,,Real Estate,1.30E+09,3957,Unlisted,NYSE: FCE.A,"Forest City Enterprises, Inc. (Forest City) is engaged in the ownership, development, management and acquisition of commercial and residential real estate properties in 27 states and the District of Columbia. The Company operates through three business units: Commercial Group, Residential Group and Land Development Group. Commercial Group owns, develops, acquires and operates regional malls, specialty/urban retail centers, office and life-science buildings, hotels and mixed-use projects. Residential Group owns, develops, acquires and operates residential rental properties, including upscale and middle-market apartments, adaptive re-use developments and supported-living communities. It also develops for-sale condominium projects and owns, develops and manages military family housing. Land Development Group acquires and sells both land and developed lots to residential, commercial and industrial customers. -(Source: 10-K) Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Applied Materials,Customer,,3050 Bowers Ave,Santa Clara,CA,95054,United States,,,,,,(408) 727-5555,(408) 748-9943,A-127654,www.appliedmaterials.com,,Semiconductors,9.74E+09,15328,Listed,NASDAQ: AMAT,"Applied Materials, Inc. (Applied)provide Nanomanufacturing Technology solutions for the semiconductor, flat panel display, solar and related industries, with a portfolio of equipment, service and software products. Applied?s customers include manufacturers of semiconductor chips and wafers, flat panel liquid crystal displays (LCDs), photovoltaic (PV) cells and other electronic devices. The Company operates in four segments, which includes Silicon, Fab Solutions, Display, and Adjacent Technologies. During the fiscal year ended October 28, 2007 (fiscal 2007), the Company launched its Applied Centura Mariana Trench Etch and Applied Opus AdvantEdge Metal Etch. In fiscal 2007, the Company introduced the Applied Tetra III Advanced Reticle Etch system, based on Applied?s decoupled plasma source (DPS) wafer etch technology. In January 2008, Applied acquired Baccini S.p.A., which is a supplier of automated metallization and test systems for manufacturing crystalline silicon photovoltaic cells. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - NIXON,Old Customer,,1037 J Street,San Diego,CA,92101,United States,,,,,,1-691-501-1932,1-691-501-1937,A-127636,www.nixonnow.com,,Apparel,3.71E+10,329,Listed,,"Founded in 1997 in Encinitas, CA Nixon is the premium accessories company for the youth lifestyle market. Focused on making the little stuff better, Nixon began with a small line of custom built, team designed watches with focused distribution in specialty surf, skate, snow and fashion stores. Expanding into accessories and limited softgoods in 2000, Nixon has continued its growth into over 25 countries while maintaining its leadership position as the action sports premium accessories brand. Nixon has set the standard for accessories both in and out of the action sports world and continues the push into broader markets with a unique style and flavor of product and branding. - Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Muji,Customer,,81 Spring Street ( At Crosby Street ),New York,NY,10019,United States,,,,,,1-426-178-2236,1-426-178-2241,A-127629,www.muji.net,,Department Stores,4.22E+10,1103,Unlisted,,"In the United States, Muji currently markets its products at such retailers as the MoMA Store. - Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Pacific Bell,Customer,,"2600 Camino Ramon , Room 2W000Ee",San Ramon,CA,94583,United States,,,,,,(800) 310-2355,1-050-655-5371,A-127644,www.pacbell.com,,Telephone Services,3.45E+10,610,Unlisted,,"Pacific Bell is a subsidiary of SBC Communications Inc. (www.sbc.com), a global leader in the telecommunications industry, with more than 37.7 million access lines and 7.2 million wireless customers across the United States, as well as investments in telecommunications businesses in 11 countries. Under the Southwestern Bell, Pacific Bell, SNET, Nevada Bell and Cellular One brands, SBC, through its subsidiaries, offers a wide range of innovative services. SBC offers local and long-distance telephone service, wireless communications, data communications, paging, Internet access, and messaging, as well as telecommunications equipment, and directory advertising and publishing. SBC has more than 130,000 employees and its annual revenues rank it in the top 50 among Fortune 500 companies. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Smith & Wesson,Customer Candidate,,2100 Roosevelt Avenue,Springfield,MA,1104,United States,,,,,,(800) 331-0852,1-963-835-3105,A-127567,www.wallstrip.com,,Sporting Goods,2.35E+08,1457,Listed,NASDAQ: SWHC,"Smith & Wesson Holding Corporation is a manufacturer and exporter of firearms. The Company manufactures an array of pistols, revolvers, tactical rifles, hunting rifles, black powder firearms, handcuffs, and firearm-related products and accessories for sale to a variety of customers, including gun enthusiasts, collectors, hunters, sportsmen, competitive shooters, protection focused individuals, law enforcement agencies and officers, and military agencies in the United States and worldwide. It manufactures these products at its facilities in Springfield, Massachusetts; Houlton, Maine, and Rochester, New Hampshire. The Company also markets shotguns. In addition, the Company pursues opportunities to license its name and trademarks to third parties for use in association with their products and services. -(Source: 10-K) Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Abbott Laboratories,Customer,,100 Abbott Park Road,Abbott Park,IL,60064,United States,,,,,,(847) 937-6100,(847) 937-1511,A-127544,www.abbott.com,,Drug Manufacturing,2.59E+10,68697,Listed,NYSE: ABT,"Abbott Laboratories is engaged in the discovery, development, manufacture and sale of a diversified line of healthcare products. It has four segments. The Pharmaceutical Products segment?s products include adult and pediatric pharmaceuticals. The Diagnostic Products segment?s products include diagnostic systems and tests for blood banks, hospitals, commercial laboratories, physicians? offices, alternate care testing sites, plasma protein therapeutic companies and consumers. The Nutritional Products segment?s products include a line of pediatric and adult nutritional. The Vascular Products segment?s products include a line of coronary, endovascular and vessel closure devices. In February 2008, the United States Food and Drug Administration (FDA) approved the Company's SIMCOR (Niaspan/simvastatin), a medicine for cholesterol management. In January 2008, Abbott?s HUMIRA (adalimumab) received approval from FDA, for moderate to severe chronic plaque psoriasis. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Samsung Corporation,Old Customer,,105 Challenger Road 6 Th Floor,Ridgefield Park,NJ,7660,United States,,,,,,(201) 229-4000,(201) 229-5086,A-127556,www.samsung.com,,Consumer Electronics,2.03E+10,40777,Listed,,"Headquartered in Ridgefield Park, NJ, Samsung Electronics America, Inc. (SEA), a wholly owned subsidiary of Samsung Electronics Co., Ltd., markets a broad range of award-winning, advanced digital consumer electronics and home appliance products, including HDTVs, home theater systems, MP3 players, refrigerators and laundry machines. A recognized innovation leader in consumer electronics design and technology, Samsung is the HDTV market leader in the U.S. and is the only manufacturer that produces all four major digital television technologies. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - IBM,Partner,,North Castle Drive,Armonk,NY,10504,United States,,,,,,(914) 499-1900,(914) 765-6021,A-127565,www.ibm.com,,Software,9.88E+10,386558,Listed,NYSE: IBM,"International Business Machines Corporation (IBM) is an information technology (IT) company. The Company?s major operations include a Global Technology Services (GTS) segment, a Global Business Services (GBS) segment, a Systems and Technology segment, a Software segment and a Global Financing segment. In February 2008, the Company acquired Arsenal Digital Solutions and Net Integration Technologies Inc. In January 2008, IBM announced that it has completed its acquisition of Cognos Incorporated. In January 2008, IBM acquired XIV, a privately held storage technology company based in Tel Aviv, Israel. In September 2007, IBM completed the acquisition of DataMirror Corporation. In August 2007, IBM acquired WebDialogs, Inc. In April 2008, the Company completed the acquisition of Telelogic AB, Diligent Technologies, FilesX and InfoDyne Corporation. In July 2008, the Company acquired Platform Solutions, Inc. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Amtrak,Customer,,"60 Massachusetts Avenue, N.E.",Washington,DC,20002,United States,,,,,,(800) 872-7245,(202) 906-3306,A-127579,www.amtrak.com,,"Rail, Bus & Taxi",2.15E+09,13993,Listed,,"Amtrak provides intercity passenger rail services to more than 500 destinations in 46 states on a 21,000-mile route system. For schedules, fares and information, passengers may call 800-USA-RAIL or visit www.amtrak.com. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Xerox Corporation,Partner,,45 Glover Ave.,Norwalk,CT,6850,United States,,,,,,(203) 968-3000,(203) 968-3218,A-127575,www.xerox.com,,Software,1.72E+10,57400,Unlisted,NYSE: XRX,"Xerox Corporation (Xerox) is a technology and services enterprise. The Company develops, manufactures, markets, services and finances a range of document equipment, software, solutions and services. The Company operates in more than 160 countries worldwide. Xerox markets and supports document management systems, supplies and services through a variety of distribution channels worldwide. Xerox operates in four segments: Production, Office, Developing Markets Operations (DMO) and Other. The Company?s products include high-end printing and publishing systems, digital multifunctional devices (MFDs), digital copiers, laser and solid ink printers, fax machines, document-management software, and supplies. Xerox provides software and workflow solutions, with which businesses can print books, create personalized documents for their customers, and scan and route digital information. In October 2007, Xerox acquired Advectis, Inc. In June 2008, the Company acquired Veenman B.V. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Hewlett-Packard,Old Customer,,3000 Hanover St Ms 1050,Palo Alto,CA,94304,United States,,,,,,(650) 857-1501,(650) 857-5518,A-127576,www.hp.com,,Personal Computers,1.04E+11,172000,Listed,NYSE: HPQ,"Hewlett-Packard Company (HP), is a provider of products, technologies, software, solutions and services to individual consumers, small- and medium-sized businesses (SMBs) and large enterprises, including in the public and education sectors. HP?s offerings span personal computing and other access devices; imaging and printing-related products and services; enterprise information technology infrastructure, including enterprise storage and server technology and software that optimizes business technology investments, and multi-vendor customer services, including technology support and maintenance, consulting and integration and outsourcing services. During the fiscal year ended October 31, 2007 (fiscal 2007), its operations were organized into seven business segments: Enterprise Storage and Servers (ESS), HP Services (HPS), HP Software, the Personal Systems Group (PSG), the Imaging and Printing Group (IPG), HP Financial Services (HPFS) and Corporate Investments. -(Source: 10-K) Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Canon Inc,Old Customer,,3-30-2 Shimomaruko,Tokyo,KY,146-8501,Japan,,,,,,+81 3 3758 2111,1-251-426-7566,A-127541,www.canon.com,,Photo Equipment,3.81E+10,131352,Listed,NYSE: CAJ,"Canon Inc. (Canon) is a manufacturer of digital multifunction devices (MFDs), plain paper copying machines, laser beam printers, inkjet printers, cameras and steppers. Canon?s products are divided into three product groups: business machines, cameras, and optical and other products. The business machines product group is divided into three sub-groups consisting of office imaging products, computer peripherals and business information products. The office imaging products consist mainly of office network digital MFDs, color network digital MFDs, office copying machines and personal-use copying machines. Computer peripherals include laser beam printers, inkjet printers and scanners. It manufactures and markets digital cameras and film cameras. Canon?s optical and other products include semiconductor production equipment, mirror projection mask aligners for liquid crystal display (LCD) panels, broadcasting equipment, medical equipment, large format printers, and electronic components. -(Source: 20-F) Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Salesforce.com,Customer,,Landmark Tower at One Market Suite 300,San Francisco,CA,94105,US,,,,,,(415) 901-7000,(415) 901-7040,A-127639,www.salesforce.com,,Software,7.49E+08,2606,Listed,NYSE: CRM,"salesforce.com, inc. is a provider of software on demand. The Company provides customer relationship management (CRM) service to businesses of all sizes and industries worldwide. Approximately 41,000 customers worldwide use salesforce.com to manage their vital customer, sales and operational data. As of January 31, 2008, its customer base had grown to approximately 41,000 worldwide from approximately 29,800 customers as of January 31, 2007. During the fiscal year ended January 31, 2008 (fiscal 2007), salesforce.com had approximately 1.1 million paying subscriptions. Its on-demand technology platform, Force.com, which was introduced, during fiscal 2007, allows customers and partners to customize and integrate Salesforce CRM applications or build entirely new on-demand applications beyond CRM without having to invest in new software, hardware and related infrastructure. The Company also offers the AppExchange, an online directory for on-demand applications. -(Source: 10-K) Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Amdahl,Customer,,1250 E. Arques Avenue,Sunnyvale,CA,94088,United States,,,,,,(408) 746-6000,(408) 746-3243,A-127559,www.amdahl.com,,Software,8.54E+10,132,Listed,,"Amdahl Corporation, a wholly owned subsidiary of Fujitsu Limited, provides integrated computing solutions that meet the needs of many of the largest users of information technology in the world. Amdahl develops and deploys systems, services and support that meet the needs of the world's most compute-intensive organizations and environments. With more than 28 years of experience delivering large-scale computing and client/server technology, the Amdahl mission is to deliver innovative systems, services and support to lead customers to the most complete and powerful data centers of the 21st century. - Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Microsoft,Customer Candidate,,One Microsoft Way,Redmond,WA,98052,United States,,,,,,(425) 882-8080,(425) 936-7329,A-127642,www.microsoft.com,,Software,5.11E+10,79161,Listed,NASDAQ: MSFT,"Microsoft Corporation develops, manufactures, licenses and supports a range of software products for computing devices. The Company's software products include operating systems for servers, personal computers and intelligent devices, server applications for distributed computing environments, information worker productivity applications, business solution applications, high-performance computing applications and software development tools and video games. It provides consulting and product support services, and trains and certifies computer system integrators and developers. Microsoft Corporation sells the Xbox 360 video game console and games, the Zune digital music and entertainment device, PC games, and peripherals. The Company has five segments: Client, Server and Tools, the Online Services Business, the Microsoft Business Division, and the Entertainment and Devices Division.In June 2008, the Company acquired Navic Networks. In September 2008, it acquired DATAllegro Inc. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Giant Robot,Partner,,2015 Sawtelle Blvd.,Los Angeles,CA,90025,United States,,,,,,(310) 478-1819,1-489-217-1587,A-127515,www.giantrobot.com,,News Services,3.42E+11,151,Unlisted,,The company provides pre-programmed universal wireless control products and audio-video accessories for home entertainment systems. Its products include standard and touch screen remote controls; antennas; and various audio/video accessories.,,,,,,,,, -Bulk Account - Adidas,Customer,,5055 North Greeley Avenue,Portland,OR,97217,United States,,,,,,1-942-932-9300,1-942-932-9305,A-127518,www.adidas.com,,Sporting Goods,1.51E+10,22538,Unlisted,,"Adidas is a global designer, developer and marketer of athleticfootwear, apparel and accessories with the mission to be the leading sports brand in the world. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - ASICS Corporation,Customer,,Po Box 6327,Blacktown,New South Wales,2148,Australia,,,,,,1-496-285-1785,1-496-285-1790,A-127653,www.asics.com,,Sporting Goods,6.07E+08,4908,Unlisted,,"ASICS has been developing sports shoes for more than 50 years. All products are developed on the basis of scientific work with the intense cooperation of male and female athletes. The company's objective is to develop innovative sports shoe solutions and technologies to help athletes achieve their goals. - Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Jack in the Box,Customer Candidate,,9330 Balboa Ave,San Diego,CA,92123,United States,,,,,,(858) 571-2121,(858) 571-2101,A-127532,www.jackinthebox.com,,Restaurants,2.88E+09,42500,Listed,NYSE: JBX,"Jack in the Box Inc. owns, operates, and franchises Jack in the Box quick-service restaurants and Qdoba Mexican Grill (Qdoba) fast-casual restaurants in 42 states. The Company also operates a chain of convenience stores called Quick Stuff, with 60 locations, each built adjacent to a full-size Jack in the Box restaurant and including a fuel station. As of September 30, 2007, the Jack in the Box system included 2,132 restaurants in 17 states, of which 1,436 were company-operated and 696 were franchise-operated. As of September 30, 2007, the Qdoba system included 395 restaurants in 39 states, as well as the District of Columbia, of which 90 were company-operated and 305 were franchise-operated. -(Source: 10-K) Data imported from ZoomInfo",,,,,,,,, -Bulk Account - San Francisco Giants,Customer,,24 Willie Mays Plaza,San Francisco,CA,94107,United States,,,,,,1-622-489-8913,(415) 947-2644,A-127548,www.sf-giants-tickets.com,,Manufacture,9.86E+10,1307,Unlisted,,"Don't miss this year's season and watch the San Francisco Giants make a run for the World Series! - -IMPORTANT: We are not affiliated with the San Francisco Giants, MLB or SBC Park. Since we deal in the secondary market, San Francisco Giants tickets are sold at a price greater than the ""face value"". If you need to speak to a representative please call 877-456-7223. - -When you order tickets from SF-Giants-tickets.com you can feel confident that you are dealing with an industry leader. Our extensive network of contacts gives us access to some of the best seats in nearly every venue nationwide. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - 3M Company,Customer Candidate,,3M Center Bldg. 220-11W-02,St Paul,MN,55144,United States,,,,,,(651) 733-1110,(651) 733-9973,A-127542,www.3m.com,,Chemicals,2.45E+10,77899,Unlisted,NYSE: MMM,"3M Company (3M) is a diversified technology company with a presence in various businesses, including industrial and transportation, healthcare, display and graphics, consumer and office, safety, security and protection services, and electro and communications. The Company is a global manufacturer and marketer of a variety of products. 3M manages its operations in six business segments: Industrial and Transportation; Health Care; Display and Graphics; Consumer and Office; Safety, Security and Protection Services, and Electro and Communications. In September 208, 3M completed its acquisition of Ligacon AG, a Switzerland-based manufacturer and supplier of filtration systems and filter elements for the pharmaceutical, biotech and general industrial markets. In October 2008, 3M announced that it has completed its acquisition of Meguiar?s Inc. In November 2008, 3M acquired Food Diagnostics AS, a provider of food diagnostics products and services for the food safety industry in Norway. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Research In Motion,Customer Candidate,,295 Phillip Street,Waterloo,ON,N2L 3W8,Canada,,,,,,(519) 888-7465,(519) 888-6906,A-127557,www.rim.com,,Software,7.82E+09,8387,Unlisted,NASDAQ: RIMM,"Research In Motion Limited (RIM) is a designer, manufacturer and marketer of wireless solutions for the worldwide mobile communications market. Through the development of integrated hardware, software and services that support multiple wireless network standards, RIM provides platforms and solutions for seamless access to time-sensitive information including email, phone, short message service (SMS) messaging, Internet and intranet-based applications. RIM technology also enables an array of third party developers and manufacturers to enhance their products and services with wireless connectivity to data. RIM?s portfolio of products, services and embedded technologies are used by organizations worldwide and include the BlackBerry wireless solution, software development tools, and other software and hardware. RIM operates offices in North America, Europe and Asia Pacific. -(Source: ARS) Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Verizon Wireless,Customer,,1 Verizon Way,Basking Ridge,NJ,07920-1025,USA,,,,,,(908) 559-7000,(908) 306-6927,A-127558,www.verizonwireless.com,,Telephone Services,3.23E+10,55700,Listed,,"Verizon Wireless operates the nation's most reliable wireless voice and data network, serving 68.7 million customers. Headquartered in Basking Ridge, N.J., with 70,000 employees nationwide, Verizon Wireless is a joint venture of Verizon Communications (NYSE: VZ) and Vodafone (NYSE and LSE: VOD). Data imported from ZoomInfo",,,,,,,,, -Bulk Account - NVIDIA,Customer,,2701 San Tomas Expressway,Santa Clara,CA,95050,United States,,,,,,(408) 486-2000,(408) 615-2800,A-127589,www.nvidia.com,,Semiconductors,4.10E+09,4985,Listed,NASDAQ: NVDA,"NVIDIA Corporation (NVIDIA) is engaged in the provision of programmable graphics processor technologies. The Company?s products are designed to generate realistic, interactive graphics on consumer and professional computing devices. It serves the entertainment and consumer market with its GeForce products, the professional design and visualization market with its Quadro products, and the computing market with its Tesla products. It has four product-line segments: the GPU Business, the professional solutions business (PSB), the media and communications processor (MCP), business, and the consumer products business (CPB). Its GPU business consists of its GeForce products that support desktop and notebook personal computers (PCs), plus memory products. Its PSB consists of its NVIDIA Quadro professional workstation products and other professional graphics products, including its NVIDIA Tesla computing products. -(Source: 10-K) Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Burton Snowboards,Partner,,30 Community Dr Ste 3,South Burlington,VT,5403,United States,,,,,,1-315-538-2900,1-315-538-2905,A-127590,www.burton.com,,Apparel Retail,1.00E+07,402,Unlisted,,"The Burton Corporation and its wholly-owned subsidiaries, including Burton Snowboards, Gravis Footwear, R.E.D. Protection, Anon Optics, and Analog clothing (collectively ""Burton"") provide their services to you subject to the following conditions. Please read the following terms and conditions carefully before using our site. If you do not agree to these terms and conditions, please do not use our site. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Royal Elastics,Customer,,31248 Oak Crest Drive,Westlake Village,CA,91361,United States,,,,,,(818) 706-5300,1-062-379-2474,A-127584,www.royalelastics.com,,Sporting Goods,3000000,8,Unlisted,,"Royal Elastics? is a sneaker company purely focused on the use of innovative and simple elasticated / stretch-fit closure systems to fasten the shoe to the foot. - -Royal Elastics? Stretch-fit Closure Systems? are built for fast slip in and out speed, comfort and support. - -Royal Elastics? and the Fleur Logo trademark have become the symbols of innovation in elasticated footwear. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Nokia,Old Customer,,Keilalahdentie 2-4,Espoo,CO,2150,Finland,,,,,,(972) 894-5000,(972) 894-4831,A-127616,www.nokia.com,,Telecom Equipment,5.43E+10,68483,Listed,,"Nokia Corporation (Nokia) is player in mobile industry. The Company makes a range of mobile devices with services and software that enable people to experience music, navigation, video, television, imaging, games, business mobility and more. From January 1, 2004 through March 31, 2007, Nokia had four business groups: Mobile Phones, Multimedia, Enterprise Solutions and Networks, supported and serviced by two horizontal groups: Customer and Market Operations and Technology Platforms, in addition to various Corporate Functions. In June 2008, Nokia completed the transfer of its Adaptation Software Research and Development (R&D) operations to Sasken Communication Technologies Limited. In June 2008, Nokia completed the acquisition of Trolltech ASA. In July 2008, Nokia Corporation completed the acquisition of NAVTEQ Corporation and Plazes. In November 2008, the Company completed its acquisition of OZ Communications Inc. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Gravis Footwear,Customer Candidate,,431 Pine Street,Burlington,VT,5401,United States,,,,,,(802) 862-2574,(802) 651-0329,A-127592,www.gravisfootwear.com,,Apparel Retail,2.30E+07,80,Listed,,"Since 1998, Gravis has been creating premium footwear and bags that bridge the gap between action sports function and sophisticated style. Gravis derives its creative inspiration from sport, classic design and contemporary music and art, and combines these elements into every product it makes. Working closely with a team of professional surfers, snowboarders, musicians and artists, Gravis develops shoes, bags and accessories for today?s active lifestyle. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Upper Playground,Customer,,220 Fillmore Street,San Francisco,CA,94117,United States,,,,,,(415) 861-1960,1-082-239-4186,A-127608,www.upperplayground.com,,Apparel Retail,5.22E+10,263,Unlisted,,"Based in San Francisco, California, Upper Playground was founded in 1999 and has become a leader in today's progressive fine art movement with its innovative apparel line and art gallery, FIFTY24SF. Recognized as a catalyst for the fusion of fashion with art, Upper Playground produces apparel lines bi-annually and features designs from notable local and international artists. Upper Playground apparel is sold nationally and internationally in over 300 boutiques and online. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - facebook,Customer,,156 University Avenue Suite 300,Palo Alto,CA,94301,United States,,,,,,(650) 543-4800,(650) 543-4801,A-127538,www.facebook.com,,Internet Portals,1.22E+11,534,Listed,,"Founded in February 2004, Facebook is a social utility that helps people communicate more efficiently with their friends, family and coworkers. The company develops technologies that facilitate the sharing of information through the social graph, the digital mapping of people's real-world social connections. Anyone can sign up for Facebook and interact with the people they know in a trusted environment. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Redwood Trust,Customer Candidate,,One Belvedere Place Suite 300,Mill Valley,CA,94941,United States,,,,,,(415) 389-7373,(415) 381-1773,A-127552,www.redwoodtrust.com,,Real Estate,8.68E+08,79,Listed,NYSE: RWT,"Redwood Trust, Inc. (Redwood) is a financial institution. The Company invests in, finances, and manages real estate assets. Redwood invests in residential and commercial real estate loans and in asset-backed securities backed by real estate loans. The Company credit-enhances loans by acquiring and managing the first-loss and other credit-sensitive securities that bear the bulk of the credit risk of securitized loans. Redwood seeks to invest in assets that have the potential to generate long-term cash flow returns. Redwood?s investments are sourced from third party issuers of securitizations, as well as the two securitization programs it sponsors, Sequoia and Acacia. Sequoia primarily acquires prime residential mortgage loans and creates and issues securities backed by these loans (ABS). Acacia is a collateralized debt obligation (CDO) program that acquires diverse residential and commercial mortgage-backed securities and creates and issues CDO ABS. -(Source: 10-K) Data imported from ZoomInfo",,,,,,,,, -Bulk Account - General Electric,Partner,,3135 Easton Turnpike,Fairfield,CT,6828,United States,,,,,,(203) 373-2211,(203) 373-3131,A-127615,www.ge.com,,Aerospace,1.77E+11,328700,Listed,NYSE: GE,"General Electric Company (GE) is a diversified technology, media and financial services company. With products and services ranging from aircraft engines, power generation, water processing and security technology to medical imaging, business and consumer financing, media content and industrial products, it serves customers in more than 100 countries. In July 2008, the Company announced the organization of its business into four segments: GE Technology Infrastructure, GE energy infrastructure, GE Capital and Corporate Treasury and NBC Universal.In April 2008, GE Healthcare completed the acquisition of Whatman plc.In August 2008, GE Capital announced the completion of its acquisition of most of CitiCapital, Citigroup's North American commercial leasing and commercial equipment finance business. In September 2008, the Company sold its Japanese consumer finance business to Shinsei Bank.In October 2008, the Company's GE Healthcare unit acquired Vital Signs, Inc. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - eBay,Old Customer,,2145 Hamilton Avenue,San Jose,CA,95125,USA,,,,,,(408) 376-7400,1-157-557-1983,A-127651,www.ebay.com,,Auctions,7.67E+09,15500,Listed,NASDAQ: EBAY,"eBay Inc. (eBay) provides online marketplaces for the sale of goods and services, as well as other online commerce, or ecommerce, platforms, online payments services and online communications offerings to a diverse community of individuals and businesses. eBay has three business segments: Marketplaces, Payments and Communications. Its Marketplaces segment enables online commerce through a variety of platforms, including the traditional eBay.com platform and eBay?s other online platforms, such as its classifieds Websites, as well as Half.com, Rent.com, Shopping.com and StubHub. eBay?s Payments segment, which consists of PayPal, enables individuals and businesses to send and receive payments online. Its Communications segment, which consists of Skype Technologies S.A. (Skype), enables voice over Internet protocol (VoIP) communications between Skype users and provides low-cost connectivity to traditional fixed-line and mobile telephones. In November 2008, eBay acquired Bill Me Later. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Intuit,Customer,,2700 Coast Avenue,Mountain View,CA,94043,United States,,,,,,(650) 944-6000,(650) 944-3060,A-127519,www.intuit.com,,Software,2.73E+09,8439,Listed,NASDAQ: INTU,"Intuit Inc. (Intuit) is a provider of business, financial management solutions for small and medium sized businesses, financial institutions, consumers and accounting professionals. The Company?s flagship products and services, including QuickBooks, Quicken and TurboTax software, enable small business management and payroll processing, personal finance, and tax preparation and filing. It has six business segments: QuickBooks, Payroll and Payments, Consumer Tax, Accounting Professionals, Financial Institutions and Other Businesses. The Company?s Small Business division consists of two segments: QuickBooks segment, and Payroll and Payments segment. The QuickBooks segment includes QuickBooks financial and business management software and services, technical support, financial supplies, and Website design and hosting services for small businesses. In December 2007, Intuit Inc. acquired Homestead Technologies Inc. In February 2008, it acquired Electronic Clearing House Inc. -(Source: 10-K) Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Sharp Corporation,Customer Candidate,,"22-22, Nagaikecho, Abeno-Ku",Osaka,OSK,545-0013,Japan,,,,,,+81 6 6621 1221,1-244-448-5640,A-127512,www.sharp.co.jp,,Consumer Electronics,2.99E+10,53708,Unlisted,SHCAF.PK,"Sharp is the world's leading solar manufacturer. Since 2002, Sharp has shipped more than 200 MW of solar modules for solar arrays throughout the U.S. The company's longstanding commitment to quality photovoltaic products and performance has made it the global leader in the solar market. Sharp also is the U.S. market leader and maintains solar panel assembly operations at its manufacturing facility in Memphis, Tennessee. The solar manufacturing facility assembles a variety of panels for residential and commercial installations. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Klein Bicycles,Partner,,801 West Madison Street,Waterloo,WI,53594,United States,,,,,,(920) 478-2191,(662) 254-1078,A-127545,www.kleinbikes.com,,Sporting Goods,1.08E+11,516,Unlisted,,"Klein Bikes: Handcrafted Science. Lightweight, High Performance Bicycles. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Children's Hospital of Philadelphia,Partner,,34Th And Civic Center Blvd,Philadelphia,PA,19104,United States,,,,,,(215) 590-1000,(215) 590-3267,A-127610,www.chop.edu,,Hospitals & Clinics,1.75E+09,7000,Listed,,"The Children's Hospital of Philadelphia was founded in 1855 as the nation's first pediatric hospital. Through its long-standing commitment to providing exceptional patient care, training new generations of pediatric healthcare professionals and pioneering major research initiatives, Children's Hospital has fostered many discoveries that have benefited children worldwide. Its pediatric research program is among the largest in the country, ranking third in National Institutes of Health funding. In addition, its unique family-centered care and public service programs have brought the 430-bed hospital recognition as a leading advocate for children and adolescents. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Patagonia,Customer Candidate,,2936 Main St.,Santa Monica,CA,90405,United States,,,,,,(310) 314-1776,(310) 399-8216,A-127617,www.patagonia.com,,Apparel,1.41E+07,165,Unlisted,,"Patagonia, with sales last year of $219M, is known internationally for their commitment to highest quality outdoor apparel as well as environmental responsibility. The company annually commits 1% of net sales, or 10% of pre-tax profits, whichever is greater, to the preservation and restoration of the natural environment. Patagonia distributes their clothing through multiple distribution channels including web sales, company-owned retail stores, an award-winning mail order catalog, wholesale dealers, and international locations. - Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Nexant,Customer,,101 Second Street 11Th F.,San Francisco,CA,94105,United States,,,,,,(415) 369-1000,(415) 369-9700,A-127633,www.nexant.com,,"Electricity, Oil & Gas",1.65E+07,200,Listed,,"Nexant is a major independent global business consulting firm focusing in the energy sector. It includes the largest specialized global petroleum and chemical industry-based consulting practice in the world, with key offices in London, New York, Houston, and Bangkok. We provide expert advisory services to the industry as well as governments and financial institutions. - -As part of an expansion of our Americas-based consulting services, we are seeking to recruit dynamic and experienced staff who demonstrate a strong interest and understanding in the technical and commercial aspects of the industry. The posts include opportunities for travel and training opportunities in Nexant's global offices. - -Successful candidates will be able to demonstrate: - - -Excellent oral and written communications and interpersonal skills -Strong technical degree in chemical engineering or equivalent -High computer literacy -Flexibility including ability to meet tight deadlines, work on multiple engagements, and assist in business development activities -Good intellectual ability with desire to broaden experience into sectors related to their area of specialist knowledge - - -Position Description - - -This consultant position is a member of a global team dedicated to the research, analysis, modeling and forecasting of the petroleum and petrochemical industries. The analysis and forecast reports and databases are marketed under Nexant's ChemSystems brand. The ChemSystems team operates from offices in London, New York and Bangkok producing reports, analysis and planning software on various aspects of the industry that help our clients understand the dynamics and drivers of the industry and from that understanding generate improved profitability. The ChemSystems business is expanding rapidly meeting the demands of a fast growing client base and so we are actively recruiting in all our locations. - -To help our clients improve their profitability and returns from our analysis we require consultants with best in class analysis and forecasting techniques. Understanding of the industry, its dynamics and drivers, and the ability to foresee the important issues and trends for the future direction of the petroleum and petrochemical industry keeps our ChemSystems products at their premium position in the market. - -This exciting position in a dynamic global team entails working with our team of researchers to produce analysis and forecast reports of the industry meeting the needs of clients through the ChemSystems publications. The consultant will conduct research in, and direct others in the research of, petrochemical industry's prices, profitability, production, consumption, and trade. The research data will be analyzed to develop forecasts and produce written and online reports. Analysis of the industry will make use of the ChemSystems Simulator, a proprietary database driven software application, as well as spreadsheets and other tools. The consultant will also have responsibility for a number of key client relationships in the Americas. - -The position is based in Houston, Texas but will require travel to Nexant offices in London and New York and also to client meetings and to present papers at industry conferences, largely in Americas. Training in industry analysis and use of the ChemSystems Simulator will be provided via training assignments in Nexant's London and New York offices during the first twelve months. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Keynote Systems,Customer Candidate,,777 Mariners Island Blvd.,San Mateo,CA,94404,United States,,,,,,(650) 403-2400,(650) 403-5500,A-127587,www.keynote.com,,Info Collection,6.78E+07,285,Unlisted,NASDAQ: KEYN,"Keynote Systems, Inc. (Keynote) develops and sells technology solutions to measure, test, assure and improve the quality of service of the Internet and of mobile communications. The Company offers Internet test and measurement (ITM) services, customer experience test and measurement (CEM) solutions, and mobile test and measurement (MTM) services and solutions. Its ITM category includes all of its geographically distributed on demand Website and application monitoring and measurement services, voice over Internet protocol (VOIP) and streaming measurement services, load testing services and professional services engagements. The CEM category consists of the WebEffective platform whether sold as a technology license or on a subscription basis, or as part of a competitive intelligence study or custom consulting engagement and the Financial Services scorecard services. In April 2008, Keynote announced the acquisition of Zandan, a French-based software company. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Adobe Systems,Old Customer,,345 Park Ave,San Jose,CA,95110,United States,,,,,,(408) 536-6000,(408) 537-6000,A-127571,www.adobe.com,,Software,3.16E+09,6959,Listed,NASDAQ: ADBE,"Adobe Systems Incorporated is a diversified software company. The Company offers a line of business and mobile software and services used by professionals, designers, knowledge workers, high-end consumers, original equipment manufacturer (OEM) partners, developers and enterprises for creating, managing, delivering and engaging with compelling content and experiences across multiple operating systems, devices and media. Adobe distributes its products through a network of distributors and dealers, value-added resellers (VARs), systems integrators, independent software vendors (ISVs) and OEMs, direct to end users and through its own Website at www.adobe.com. The Company also licenses its technology to hardware manufacturers, software developers and service providers, and it offers integrated software solutions to businesses of all sizes. Adobe has operations in the Americas, Europe, Middle East and Africa (EMEA) and Asia. -(Source: 10-K) Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Piper Jaffray,Customer,,"800 Nicollet Mall, Suite 800 Mail Stop J09N02",Minneapolis,MN,55402,United States,,,,,,(612) 303-6000,(612) 303-1331,A-127594,www.piperjaffray.com,,Investment Banking,5.84E+10,239,Listed,,"Piper Jaffray Companies is a middle-market investment bank and institutional securities firm, serving the needs of middle-market corporations, private equity groups, public entities, nonprofit clients and institutional investors. The Company provides a set of products and services, including equity and debt capital markets products; public finance services; mergers and acquisitions advisory services; high-yield and structured products; institutional equity and fixed income sales and trading; equity research, and asset management services. The Company?s operations consist principally of four components: Investment Banking, Equity and Fixed Income Institutional Sales and Trading, Asset Management and Other Income. In October 2007, the Company announced that it has completed its acquisition of Goldbond Capital Holdings Limited, a Hong Kong-based investment bank. Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Kaplan,Old Customer,,6409 Congress Avenue,Boca Raton,FL,33487,United States,,,,,,(866) 523-3473,(561) 994-1119,A-127601,www.kaplan.com,,Education,5.37E+10,200,Listed,,"Kaplan Professional, based in Chicago, provides education, certification and professional development courses for financial services, IT, legal, real estate, architecture, engineering, contracting and home inspection professionals and corporations. In addition, Kaplan Professional provides comprehensive licensing and compliance solutions to top financial institutions around the world. Offering an array of educational tools, from on-site training and classroom instruction to over 600 online courses, Kaplan Professional serves individuals who must maintain licenses and comply with regulatory mandates. Kaplan Professional is a unit of Kaplan, Inc., a wholly owned subsidiary of The Washington Post Company (NYSE: WPO). Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Toyota,Old Customer,,1 Toyota-cho,Toyota,WA,471-8571,Japan,,,,,,+81 565 28 2121,(310) 468-7800,A-127521,www.toyota.co.jp,,Motor Vehicles,2.30E+11,316121,Unlisted,NYSE: TM,"Toyota Motor Credit Corporation (TMCC) provides a range of finance and insurance products to authorized Toyota and Lexus vehicle dealers and, to a lesser extent, other domestic and import franchise dealers and their customers in the United States and Puerto Rico. It also provides finance products to commercial and industrial equipment dealers (industrial equipment dealers) and their customers. TMCC provides a range of finance products, including retail financing, leasing, and dealer financing to vehicle and industrial equipment dealers and their customers. It also provides marketing, underwriting, and claims administration related to covering certain risks of vehicle dealers and their customers. TMCC also provide coverage and related administrative services to its affiliates. The Company is wholly owned by Toyota Financial Services Americas Corporation (TFSA). -(Source: 10-K) Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Ford,Customer Candidate,,One American Road,Dearborn,MI,48126,United States,,,,,,(313) 322-3000,(313) 845-7512,A-127537,www.ford.com,,Motor Vehicles,1.72E+11,283000,Listed,NYSE: F,"Ford Motor Company (Ford) is a producer of cars and trucks. The Company and its subsidiaries also engage in other businesses, including financing vehicles. Ford operates in two sectors: Automotive and Financial Services. The Automotive sector includes the operations of Ford North America, Ford South America, Ford Europe, Premier Automotive Group, and Ford Asia Pacific and Africa/Mazda segments. The Financial Services sector includes the operations of Ford Motor Credit Company (Ford Credit), which is engaged in vehicle-related financing, leasing and insurance. Effective May 31, 2007, Ford Motor Company and its subsidiary, Jaguar Cars Limited, completed the sale of its 100% interest in Aston Martin. In June 2008, the Company completed the sale of its Jaguar and Land Rover operations to Tata Motors Limited (Tata Motors). Data imported from ZoomInfo",,,,,,,,, -Bulk Account - General Motors,Customer,,300 Renaissance Center,Detroit,MI,48265,United States,,,,,,(313) 556-5000,(313) 556-5108,A-127553,www.gm.com,,Motor Vehicles,1.82E+11,266000,Listed,NYSE: GM,"General Motors Corporation (GM) is engaged in the worldwide development, production and marketing of cars, trucks and parts. The Company develops, manufactures and markets vehicles worldwide through its four automotive regions: GM North America (GMNA), GM Europe (GME), GM Latin America/Africa/Mid-East (GMLAAM) and GM Asia Pacific (GMAP). Also, its finance and insurance operations are primarily conducted through GMAC LLC, the successor to General Motors Acceptance Corporation (GMAC LLC and General Motors Acceptance Corporation, or GMAC). GMAC was a wholly owned subsidiary until November 30, 2006, when GM sold a 51% controlling ownership interest in GMAC to a consortium of investors (GMAC Transaction). GMAC provides a range of financial services, including consumer vehicle financing, automotive dealership and other commercial financing, residential mortgage services, automobile service contracts, personal automobile insurance coverage and selected commercial insurance coverage. -(Source: 10-K) Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Walgreens,Partner,,200 Wilmot Rd,Deerfield,IL,60015,United States,,,,,,(847) 914-2500,(847) 914-2804,A-127530,www.walgreens.com,,Drug Stores,5.38E+10,227466,Unlisted,NYSE: WAG,"Walgreen Company (Walgreens) is principally a retail drugstore chain that sells prescription and non-prescription drugs, and general merchandise. General merchandise includes, among other things, beauty care, personal care, household items, candy, photofinishing, greeting cards, convenience foods and seasonal items. Customers can have prescriptions filled at the drugstore counter, as well as through the mail, by telephone and via the Internet. As of August 31, 2008, Walgreens operated 6,934 locations in 49 states, the District of Columbia, Guam and Puerto Rico. Total locations do not include 217 convenient care clinics operated by Take Care Health Systems, Inc. (formerly known as I-Trax, Inc.), a subsidiary of the Company. During the fiscal year ended August 31, 2008 (fiscal 2008), the Company acquired I-trax, Inc.; Whole Health Management; 20 drugstores from Farmacias El Amal, and CuraScript Infusion Pharmacy, Inc. -(Source: 10-K) Data imported from ZoomInfo",,,,,,,,, -Bulk Account - UCSF,Old Customer,,400 Parnassus Ave. Plaza Level,San Francisco,CA,94143,United States,,,,,,(415) 476-1000,(415) 353-2600,A-127546,www.ucsf.edu,,Universities,48000,7000,Listed,,"UCSF is a leading university that consistently defines health care worldwide by conducting advanced biomedical research, educating graduate students in the life sciences, and providing complex patient care. - Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Fujitsu,Customer Candidate,,1-5-2 Higashi-Shimbashi,Tokyo,CO,105-7123,Japan,,,,,,+81 3 6252 2220,1-268-978-1810,A-127562,www.fujitsu.com,,Software,4.67E+10,167374,Listed,FJTSY,"FUJITSU FRONTECH LIMITED is a Japan-based company engaged in the development and manufacture of information technology (IT) products. The Company manufactures and sells automatic teller machine (ATM) units and dies, develops, manufactures and sells ATMs and compact discs (CDs), as well as sells passbook printers and flight information display devices through subsidiaries. In addition, the Company is engaged in the development and sale of middleware and package software, the management of facilities, the installation and maintenance of display systems, the sale of display units as well as the provision of employee welfare services and manpower dispatch services. The Company is a subsidiary of FUJITSU LIMITED. The Company has seven subsidiaries in Japan, the Philippines, Korea and China. -(Source: ARS) Data imported from ZoomInfo",,,,,,,,, -Bulk Account - Autodesk,Customer - Direct,,111 McInnis Pkwy,San Rafael,CA,94903,United States,,,,,,(415) 507-5000,(415) 507-5100,A-127658,www.autodesk.com,,Software,2.17E+09,7300,,NASDAQ: ADSK,"Autodesk, Inc. is a design software and services company. The Company offers products and solutions to customers in the architectural, engineering, construction, manufacturing, geospatial mapping and digital media markets. The Company?s two-dimension horizontal design solutions include AutoCAD and AutoCAD LT. In addition, it offers a range of discipline-specific design and documentation tools, including its 2D vertical design solutions and its three dimensional model-based design solutions. It has two segments: the Design Solutions Segment and the Media and Entertainment Segment. In June 2008, it acquired Moldflow Corporation. In June 2008, the Company completed two acquisitions, all the assets related to the Ecotect software tools for conceptual building performance analysis from Square One Research Ltd, and all the assets of Green Building Studio, Inc. In September 2008, Autodesk, Inc. announced that it had completed the acquisition of substantially all of the assets of 3D Geo GmbH. Data imported from ZoomInfo",,,,,,,,, \ No newline at end of file +NAME,TYPE,PARENTID,BILLINGSTREET,BILLINGCITY,BILLINGSTATE,BILLINGPOSTALCODE,BILLINGCOUNTRY,SHIPPINGSTREET,SHIPPINGCITY,SHIPPINGSTATE,SHIPPINGPOSTALCODE,SHIPPINGCOUNTRY,PHONE,FAX,ACCOUNTNUMBER,WEBSITE,SIC,INDUSTRY,ANNUALREVENUE,NUMBEROFEMPLOYEES,OWNERSHIP,TICKERSYMBOL,DESCRIPTION,RATING,SITE,JIGSAW,JIGSAWCOMPANYID,ACCOUNTSOURCE,SICDESC +Bulk Account from CSV - #1,Customer - Channel,,"345 Shoreline Park +Mountain View, CA 94043 +USA",Mountain View,CA,,,"345 Shoreline Park +Mountain View, CA 94043 +USA",,,,,(650) 867-3450,(650) 867-9895,CC978213,www.genepoint.com,3712,Biotechnology,3.00E+07,265,Private,,"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc nunc erat, molestie et interdum sit amet, lobortis laoreet ante. Cras imperdiet felis sit amet nunc tincidunt laoreet. Maecenas eu semper arcu. Suspendisse eu pretium magna. Nam tincidunt ligula dolor. Cras nec lacus odio, sed accumsan erat. Vivamus sed tellus sit amet nisi condimentum imperdiet at at nibh. Phasellus dignissim, urna sed faucibus porta, nisi felis ullamcorper est, eget sagittis sapien lacus eu dui. Praesent arcu odio, vestibulum a lacinia vitae, condimentum ac metus. Nullam pellentesque, nibh non fringilla iaculis, tortor est convallis libero, id malesuada tortor purus vitae orci",Cold,,,,, +Bulk Account from CSV - #2,Customer - Direct,,"Kings Park, 17th Avenue, Team Valley Trading Estate, +Gateshead, Tyne and Wear NE26 3HS +United Kingdom",,UK,,,"Kings Park, 17th Avenue, Team Valley Trading Estate, +Gateshead, Tyne and Wear NE26 3HS +United Kingdom",,,,,+44 191 4956203,+44 191 4956620,CD355119-A,http://www.uos.com,4437,Energy,,24000,Public,UOS,"Cras facilisis, leo id auctor condimentum, elit quam consectetur ligula, in cursus arcu nulla nec ipsum. Sed id orci quam. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Praesent rutrum, augue at egestas porta, nibh felis dignissim odio, in mattis massa velit nec libero. +Quisque volutpat quam at turpis accumsan a accumsan diam volutpat. Praesent nec nibh a nulla tristique congue. Mauris egestas iaculis ipsum ac suscipit. Donec facilisis accumsan lacus vel porta. Mauris suscipit tempus ipsum, in ornare lacus interdum sed.",,,,,, +Bulk Account from CSV - #3,Customer - Direct,,"9 Tagore Lane +Singapore, Singapore 787472 +Singapore",Singapore,Singapore,,,"9 Tagore Lane +Singapore, Singapore 787472 +Singapore",,,,,(650) 450-8810,(650) 450-8820,CD355120-B,http://www.uos.com,4437,Energy,,3000,Public,UOS,"Curabitur fermentum, mi eu adipiscing tincidunt, justo diam interdum dolor, tempor feugiat turpis erat et justo. Nunc sed nisi et eros tempor porttitor. +Curabitur blandit, tortor volutpat rhoncus gravida, nibh orci posuere purus, nec pellentesque lorem sapien a odio. +Donec semper nunc quis metus fringilla semper. Aliquam dapibus euismod imperdiet. +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. +Etiam gravida, nulla sit amet sollicitudin dictum, diam ante tempor ligula, sed imperdiet turpis urna a augue.",,,,,, +Bulk Account from CSV - #4,Customer - Direct,,"312 Constitution Place +Austin, TX 78767 +USA",Austin,TX,,,"312 Constitution Place +Austin, TX 78767 +USA",,,,,(512) 757-6000,(512) 757-9000,CD451796,http://edgecomm.com,6576,Electronics,1.39E+08,1000,Public,EDGE,"Curabitur eget urna non dolor dapibus faucibus. Nulla posuere, tellus a vestibulum rutrum, enim neque elementum nibh, ac luctus quam urna a nisi. +Phasellus nec ligula non dolor aliquam scelerisque ac id felis. Integer semper pellentesque hendrerit. +Quisque vitae felis nunc. Aliquam eu nisi lacus, scelerisque aliquet leo. Donec elementum mollis tortor id viverra. Curabitur molestie gravida fringilla. Donec pharetra metus nec velit consectetur quis placerat quam euismod.",Hot,,,,, +Bulk Account from CSV - #5,Customer - Direct,,525 S. Lexington Ave,Burlington,NC,27215,USA,,,,,,(336) 222-7000,(336) 222-8000,CD656092,www.burlington.com,546732,Apparel,3.50E+08,9000,Public,BTXT,"Donec orci magna, tristique tempus faucibus id, dignissim at neque. Proin quis ipsum leo. Vivamus vitae libero ut ipsum gravida accumsan. Proin ut massa sapien, ac hendrerit nisi. Nulla commodo enim id turpis varius nec cursus leo dignissim. Mauris laoreet tempor mi, sit amet molestie nisi tincidunt eget. Nulla elit orci, dictum sed tempus id, suscipit at lacus. Sed hendrerit, nisi id pretium ultricies, arcu nibh ornare erat, et venenatis augue ligula aliquam risus.",Warm,,,,, +Bulk Account from CSV - #6,Customer - Channel,,2 Place Jussieu,Paris,,75251,France,2 Place Jussieu,Paris,,75251,France,(014) 427-4427,(014) 427-4428,CC213425,www.pyramid.com,4253,Construction,9.50E+08,2680,Public,PYR,"Suspendisse potenti. Donec tortor libero, facilisis quis mattis in, faucibus sit amet orci. +Curabitur nec turpis vel mi lobortis tincidunt. Sed vulputate diam eu enim vestibulum in porta turpis aliquam. Integer porta mollis scelerisque. Quisque accumsan ultrices nisi, et elementum libero adipiscing et. Pellentesque sem est, bibendum nec iaculis sit amet, tempus ut nibh. In porta laoreet lorem sed rhoncus. +Etiam feugiat turpis non sapien rutrum aliquam. Aenean ac nisl lorem.",,,,,, +Bulk Account from CSV - #7,Customer - Channel,,1301 Hoch Drive,Lawrence,KS,66045,USA,1301 Hoch Drive,Lawrence,KS,66045,USA,(785) 241-6200,(785) 241-6201,CC634267,dickenson-consulting.com,6752,Consulting,5.00E+07,120,Private,,"Nullam nisi turpis, sagittis in malesuada quis, feugiat sed lorem. Donec tortor justo, feugiat in tempor luctus, imperdiet nec sapien. Sed id dui in sapien varius aliquet eget ac mauris. Nullam tincidunt sodales risus nec semper. +Fusce pellentesque porta turpis non iaculis. Vivamus varius, dolor vel vulputate tristique, nunc augue elementum risus, sit amet sodales urna ligula eu risus. Suspendisse iaculis nulla non eros vulputate varius. +Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.",,,,,, +Bulk Account from CSV - #8,Customer - Direct,,"2334 N. Michigan Avenue, Suite 1500 +Chicago, IL 60601, USA",Chicago,IL,,,"2334 N. Michigan Avenue, Suite 1500 +Chicago, IL 60601, USA",,,,,(312) 596-1000,(312) 596-1500,CD439877,www.grandhotels.com,2268,Hospitality,5.00E+08,5600,Public,GHTL,"Morbi mollis pellentesque sem, vitae lobortis diam sollicitudin quis. Donec fermentum mauris vitae odio fringilla eget suscipit dolor fringilla. Nunc id lacus et purus ornare hendrerit in ut velit. Vivamus at tortor nisi. Curabitur lacinia volutpat urna, vel mollis lorem vulputate in. Aliquam erat volutpat. Integer et nibh sed sapien adipiscing sagittis non non nisi. Donec quis urna ac augue suscipit ultrices.",Warm,,,,, +Bulk Account from CSV - #9,Customer - Channel,,"620 SW 5th Avenue Suite 400 +Portland, Oregon 97204 +United States",Portland,OR,,,"620 SW 5th Avenue Suite 400 +Portland, Oregon 97204 +United States",,,,,(503) 421-7800,(503) 421-7801,CC947211,www.expressl&t.net,8742,Transportation,9.50E+08,12300,Public,EXLT,"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc nunc erat, molestie et interdum sit amet, lobortis laoreet ante. Cras imperdiet felis sit amet nunc tincidunt laoreet. Maecenas eu semper arcu. Suspendisse eu pretium magna. Nam tincidunt ligula dolor. Cras nec lacus odio, sed accumsan erat. Vivamus sed tellus sit amet nisi condimentum imperdiet at at nibh. Phasellus dignissim, urna sed faucibus porta, nisi felis ullamcorper est, eget sagittis sapien lacus eu dui. Praesent arcu odio, vestibulum a lacinia vitae, condimentum ac metus. Nullam pellentesque, nibh non fringilla iaculis, tortor est convallis libero, id malesuada tortor purus vitae orci",Cold,,,,, +Bulk Account from CSV - #10,Customer - Direct,,"888 N Euclid +Hallis Center, Room 501 +Tucson, AZ 85721 +United States",Tucson,AZ,,,"888 N Euclid +Hallis Center, Room 501 +Tucson, AZ 85721 +United States",,,,,(520) 773-9050,(520) 773-9060,CD736025,www.universityofarizona.com,7321,Education,,39000,Other,,"Cras facilisis, leo id auctor condimentum, elit quam consectetur ligula, in cursus arcu nulla nec ipsum. Sed id orci quam. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Praesent rutrum, augue at egestas porta, nibh felis dignissim odio, in mattis massa velit nec libero. +Quisque volutpat quam at turpis accumsan a accumsan diam volutpat. Praesent nec nibh a nulla tristique congue. Mauris egestas iaculis ipsum ac suscipit. Donec facilisis accumsan lacus vel porta. Mauris suscipit tempus ipsum, in ornare lacus interdum sed.",Warm,,,,, +Bulk Account from CSV - #11,Customer - Direct,,"1301 Avenue of the Americas +New York, NY 10019 +USA",New York,NY,,,"1301 Avenue of the Americas +New York, NY 10019 +USA",,,,,(212) 842-5500,(212) 842-5501,CD355118,http://www.uos.com,4437,Energy,5.60E+09,145000,Public,UOS,"Curabitur fermentum, mi eu adipiscing tincidunt, justo diam interdum dolor, tempor feugiat turpis erat et justo. Nunc sed nisi et eros tempor porttitor. +Curabitur blandit, tortor volutpat rhoncus gravida, nibh orci posuere purus, nec pellentesque lorem sapien a odio. +Donec semper nunc quis metus fringilla semper. Aliquam dapibus euismod imperdiet. +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. +Etiam gravida, nulla sit amet sollicitudin dictum, diam ante tempor ligula, sed imperdiet turpis urna a augue.",Hot,,,,, +Bulk Account from CSV - #12,Customer - Channel,,"345 Shoreline Park +Mountain View, CA 94043 +USA",Mountain View,CA,,,"345 Shoreline Park +Mountain View, CA 94043 +USA",,,,,(650) 867-3450,(650) 867-9895,CC978213,www.genepoint.com,3712,Biotechnology,3.00E+07,265,Private,,"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc nunc erat, molestie et interdum sit amet, lobortis laoreet ante. Cras imperdiet felis sit amet nunc tincidunt laoreet. Maecenas eu semper arcu. Suspendisse eu pretium magna. Nam tincidunt ligula dolor. Cras nec lacus odio, sed accumsan erat. Vivamus sed tellus sit amet nisi condimentum imperdiet at at nibh. Phasellus dignissim, urna sed faucibus porta, nisi felis ullamcorper est, eget sagittis sapien lacus eu dui. Praesent arcu odio, vestibulum a lacinia vitae, condimentum ac metus. Nullam pellentesque, nibh non fringilla iaculis, tortor est convallis libero, id malesuada tortor purus vitae orci",Cold,,,,, +Bulk Account from CSV - #13,Customer - Direct,,"Kings Park, 17th Avenue, Team Valley Trading Estate, +Gateshead, Tyne and Wear NE26 3HS +United Kingdom",,UK,,,"Kings Park, 17th Avenue, Team Valley Trading Estate, +Gateshead, Tyne and Wear NE26 3HS +United Kingdom",,,,,+44 191 4956203,+44 191 4956620,CD355119-A,http://www.uos.com,4437,Energy,,24000,Public,UOS,"Cras facilisis, leo id auctor condimentum, elit quam consectetur ligula, in cursus arcu nulla nec ipsum. Sed id orci quam. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Praesent rutrum, augue at egestas porta, nibh felis dignissim odio, in mattis massa velit nec libero. +Quisque volutpat quam at turpis accumsan a accumsan diam volutpat. Praesent nec nibh a nulla tristique congue. Mauris egestas iaculis ipsum ac suscipit. Donec facilisis accumsan lacus vel porta. Mauris suscipit tempus ipsum, in ornare lacus interdum sed.",,,,,, +Bulk Account from CSV - #14,Customer - Direct,,"9 Tagore Lane +Singapore, Singapore 787472 +Singapore",Singapore,Singapore,,,"9 Tagore Lane +Singapore, Singapore 787472 +Singapore",,,,,(650) 450-8810,(650) 450-8820,CD355120-B,http://www.uos.com,4437,Energy,,3000,Public,UOS,"Curabitur fermentum, mi eu adipiscing tincidunt, justo diam interdum dolor, tempor feugiat turpis erat et justo. Nunc sed nisi et eros tempor porttitor. +Curabitur blandit, tortor volutpat rhoncus gravida, nibh orci posuere purus, nec pellentesque lorem sapien a odio. +Donec semper nunc quis metus fringilla semper. Aliquam dapibus euismod imperdiet. +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. +Etiam gravida, nulla sit amet sollicitudin dictum, diam ante tempor ligula, sed imperdiet turpis urna a augue.",,,,,, +Bulk Account from CSV - #15,Customer - Direct,,"312 Constitution Place +Austin, TX 78767 +USA",Austin,TX,,,"312 Constitution Place +Austin, TX 78767 +USA",,,,,(512) 757-6000,(512) 757-9000,CD451796,http://edgecomm.com,6576,Electronics,1.39E+08,1000,Public,EDGE,"Curabitur eget urna non dolor dapibus faucibus. Nulla posuere, tellus a vestibulum rutrum, enim neque elementum nibh, ac luctus quam urna a nisi. +Phasellus nec ligula non dolor aliquam scelerisque ac id felis. Integer semper pellentesque hendrerit. +Quisque vitae felis nunc. Aliquam eu nisi lacus, scelerisque aliquet leo. Donec elementum mollis tortor id viverra. Curabitur molestie gravida fringilla. Donec pharetra metus nec velit consectetur quis placerat quam euismod.",Hot,,,,, +Bulk Account from CSV - #16,Customer - Direct,,525 S. Lexington Ave,Burlington,NC,27215,USA,,,,,,(336) 222-7000,(336) 222-8000,CD656092,www.burlington.com,546732,Apparel,3.50E+08,9000,Public,BTXT,"Donec orci magna, tristique tempus faucibus id, dignissim at neque. Proin quis ipsum leo. Vivamus vitae libero ut ipsum gravida accumsan. Proin ut massa sapien, ac hendrerit nisi. Nulla commodo enim id turpis varius nec cursus leo dignissim. Mauris laoreet tempor mi, sit amet molestie nisi tincidunt eget. Nulla elit orci, dictum sed tempus id, suscipit at lacus. Sed hendrerit, nisi id pretium ultricies, arcu nibh ornare erat, et venenatis augue ligula aliquam risus.",Warm,,,,, +Bulk Account from CSV - #17,Customer - Channel,,2 Place Jussieu,Paris,,75251,France,2 Place Jussieu,Paris,,75251,France,(014) 427-4427,(014) 427-4428,CC213425,www.pyramid.com,4253,Construction,9.50E+08,2680,Public,PYR,"Suspendisse potenti. Donec tortor libero, facilisis quis mattis in, faucibus sit amet orci. +Curabitur nec turpis vel mi lobortis tincidunt. Sed vulputate diam eu enim vestibulum in porta turpis aliquam. Integer porta mollis scelerisque. Quisque accumsan ultrices nisi, et elementum libero adipiscing et. Pellentesque sem est, bibendum nec iaculis sit amet, tempus ut nibh. In porta laoreet lorem sed rhoncus. +Etiam feugiat turpis non sapien rutrum aliquam. Aenean ac nisl lorem.",,,,,, +Bulk Account from CSV - #18,Customer - Channel,,1301 Hoch Drive,Lawrence,KS,66045,USA,1301 Hoch Drive,Lawrence,KS,66045,USA,(785) 241-6200,(785) 241-6201,CC634267,dickenson-consulting.com,6752,Consulting,5.00E+07,120,Private,,"Nullam nisi turpis, sagittis in malesuada quis, feugiat sed lorem. Donec tortor justo, feugiat in tempor luctus, imperdiet nec sapien. Sed id dui in sapien varius aliquet eget ac mauris. Nullam tincidunt sodales risus nec semper. +Fusce pellentesque porta turpis non iaculis. Vivamus varius, dolor vel vulputate tristique, nunc augue elementum risus, sit amet sodales urna ligula eu risus. Suspendisse iaculis nulla non eros vulputate varius. +Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.",,,,,, +Bulk Account from CSV - #19,Customer - Direct,,"2334 N. Michigan Avenue, Suite 1500 +Chicago, IL 60601, USA",Chicago,IL,,,"2334 N. Michigan Avenue, Suite 1500 +Chicago, IL 60601, USA",,,,,(312) 596-1000,(312) 596-1500,CD439877,www.grandhotels.com,2268,Hospitality,5.00E+08,5600,Public,GHTL,"Morbi mollis pellentesque sem, vitae lobortis diam sollicitudin quis. Donec fermentum mauris vitae odio fringilla eget suscipit dolor fringilla. Nunc id lacus et purus ornare hendrerit in ut velit. Vivamus at tortor nisi. Curabitur lacinia volutpat urna, vel mollis lorem vulputate in. Aliquam erat volutpat. Integer et nibh sed sapien adipiscing sagittis non non nisi. Donec quis urna ac augue suscipit ultrices.",Warm,,,,, +Bulk Account from CSV - #20,Customer - Channel,,"620 SW 5th Avenue Suite 400 +Portland, Oregon 97204 +United States",Portland,OR,,,"620 SW 5th Avenue Suite 400 +Portland, Oregon 97204 +United States",,,,,(503) 421-7800,(503) 421-7801,CC947211,www.expressl&t.net,8742,Transportation,9.50E+08,12300,Public,EXLT,"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc nunc erat, molestie et interdum sit amet, lobortis laoreet ante. Cras imperdiet felis sit amet nunc tincidunt laoreet. Maecenas eu semper arcu. Suspendisse eu pretium magna. Nam tincidunt ligula dolor. Cras nec lacus odio, sed accumsan erat. Vivamus sed tellus sit amet nisi condimentum imperdiet at at nibh. Phasellus dignissim, urna sed faucibus porta, nisi felis ullamcorper est, eget sagittis sapien lacus eu dui. Praesent arcu odio, vestibulum a lacinia vitae, condimentum ac metus. Nullam pellentesque, nibh non fringilla iaculis, tortor est convallis libero, id malesuada tortor purus vitae orci",Cold,,,,, +Bulk Account from CSV - #21,Customer - Direct,,"888 N Euclid +Hallis Center, Room 501 +Tucson, AZ 85721 +United States",Tucson,AZ,,,"888 N Euclid +Hallis Center, Room 501 +Tucson, AZ 85721 +United States",,,,,(520) 773-9050,(520) 773-9060,CD736025,www.universityofarizona.com,7321,Education,,39000,Other,,"Cras facilisis, leo id auctor condimentum, elit quam consectetur ligula, in cursus arcu nulla nec ipsum. Sed id orci quam. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Praesent rutrum, augue at egestas porta, nibh felis dignissim odio, in mattis massa velit nec libero. +Quisque volutpat quam at turpis accumsan a accumsan diam volutpat. Praesent nec nibh a nulla tristique congue. Mauris egestas iaculis ipsum ac suscipit. Donec facilisis accumsan lacus vel porta. Mauris suscipit tempus ipsum, in ornare lacus interdum sed.",Warm,,,,, +Bulk Account from CSV - #22,Customer - Direct,,"1301 Avenue of the Americas +New York, NY 10019 +USA",New York,NY,,,"1301 Avenue of the Americas +New York, NY 10019 +USA",,,,,(212) 842-5500,(212) 842-5501,CD355118,http://www.uos.com,4437,Energy,5.60E+09,145000,Public,UOS,"Curabitur fermentum, mi eu adipiscing tincidunt, justo diam interdum dolor, tempor feugiat turpis erat et justo. Nunc sed nisi et eros tempor porttitor. +Curabitur blandit, tortor volutpat rhoncus gravida, nibh orci posuere purus, nec pellentesque lorem sapien a odio. +Donec semper nunc quis metus fringilla semper. Aliquam dapibus euismod imperdiet. +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. +Etiam gravida, nulla sit amet sollicitudin dictum, diam ante tempor ligula, sed imperdiet turpis urna a augue.",Hot,,,,, +Bulk Account from CSV - #23,Customer - Channel,,"345 Shoreline Park +Mountain View, CA 94043 +USA",Mountain View,CA,,,"345 Shoreline Park +Mountain View, CA 94043 +USA",,,,,(650) 867-3450,(650) 867-9895,CC978213,www.genepoint.com,3712,Biotechnology,3.00E+07,265,Private,,"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc nunc erat, molestie et interdum sit amet, lobortis laoreet ante. Cras imperdiet felis sit amet nunc tincidunt laoreet. Maecenas eu semper arcu. Suspendisse eu pretium magna. Nam tincidunt ligula dolor. Cras nec lacus odio, sed accumsan erat. Vivamus sed tellus sit amet nisi condimentum imperdiet at at nibh. Phasellus dignissim, urna sed faucibus porta, nisi felis ullamcorper est, eget sagittis sapien lacus eu dui. Praesent arcu odio, vestibulum a lacinia vitae, condimentum ac metus. Nullam pellentesque, nibh non fringilla iaculis, tortor est convallis libero, id malesuada tortor purus vitae orci",Cold,,,,, +Bulk Account from CSV - #24,Customer - Direct,,"Kings Park, 17th Avenue, Team Valley Trading Estate, +Gateshead, Tyne and Wear NE26 3HS +United Kingdom",,UK,,,"Kings Park, 17th Avenue, Team Valley Trading Estate, +Gateshead, Tyne and Wear NE26 3HS +United Kingdom",,,,,+44 191 4956203,+44 191 4956620,CD355119-A,http://www.uos.com,4437,Energy,,24000,Public,UOS,"Cras facilisis, leo id auctor condimentum, elit quam consectetur ligula, in cursus arcu nulla nec ipsum. Sed id orci quam. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Praesent rutrum, augue at egestas porta, nibh felis dignissim odio, in mattis massa velit nec libero. +Quisque volutpat quam at turpis accumsan a accumsan diam volutpat. Praesent nec nibh a nulla tristique congue. Mauris egestas iaculis ipsum ac suscipit. Donec facilisis accumsan lacus vel porta. Mauris suscipit tempus ipsum, in ornare lacus interdum sed.",,,,,, +Bulk Account from CSV - #25,Customer - Direct,,"9 Tagore Lane +Singapore, Singapore 787472 +Singapore",Singapore,Singapore,,,"9 Tagore Lane +Singapore, Singapore 787472 +Singapore",,,,,(650) 450-8810,(650) 450-8820,CD355120-B,http://www.uos.com,4437,Energy,,3000,Public,UOS,"Curabitur fermentum, mi eu adipiscing tincidunt, justo diam interdum dolor, tempor feugiat turpis erat et justo. Nunc sed nisi et eros tempor porttitor. +Curabitur blandit, tortor volutpat rhoncus gravida, nibh orci posuere purus, nec pellentesque lorem sapien a odio. +Donec semper nunc quis metus fringilla semper. Aliquam dapibus euismod imperdiet. +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. +Etiam gravida, nulla sit amet sollicitudin dictum, diam ante tempor ligula, sed imperdiet turpis urna a augue.",,,,,, +Bulk Account from CSV - #26,Customer - Direct,,"312 Constitution Place +Austin, TX 78767 +USA",Austin,TX,,,"312 Constitution Place +Austin, TX 78767 +USA",,,,,(512) 757-6000,(512) 757-9000,CD451796,http://edgecomm.com,6576,Electronics,1.39E+08,1000,Public,EDGE,"Curabitur eget urna non dolor dapibus faucibus. Nulla posuere, tellus a vestibulum rutrum, enim neque elementum nibh, ac luctus quam urna a nisi. +Phasellus nec ligula non dolor aliquam scelerisque ac id felis. Integer semper pellentesque hendrerit. +Quisque vitae felis nunc. Aliquam eu nisi lacus, scelerisque aliquet leo. Donec elementum mollis tortor id viverra. Curabitur molestie gravida fringilla. Donec pharetra metus nec velit consectetur quis placerat quam euismod.",Hot,,,,, +Bulk Account from CSV - #27,Customer - Direct,,525 S. Lexington Ave,Burlington,NC,27215,USA,,,,,,(336) 222-7000,(336) 222-8000,CD656092,www.burlington.com,546732,Apparel,3.50E+08,9000,Public,BTXT,"Donec orci magna, tristique tempus faucibus id, dignissim at neque. Proin quis ipsum leo. Vivamus vitae libero ut ipsum gravida accumsan. Proin ut massa sapien, ac hendrerit nisi. Nulla commodo enim id turpis varius nec cursus leo dignissim. Mauris laoreet tempor mi, sit amet molestie nisi tincidunt eget. Nulla elit orci, dictum sed tempus id, suscipit at lacus. Sed hendrerit, nisi id pretium ultricies, arcu nibh ornare erat, et venenatis augue ligula aliquam risus.",Warm,,,,, +Bulk Account from CSV - #28,Customer - Channel,,2 Place Jussieu,Paris,,75251,France,2 Place Jussieu,Paris,,75251,France,(014) 427-4427,(014) 427-4428,CC213425,www.pyramid.com,4253,Construction,9.50E+08,2680,Public,PYR,"Suspendisse potenti. Donec tortor libero, facilisis quis mattis in, faucibus sit amet orci. +Curabitur nec turpis vel mi lobortis tincidunt. Sed vulputate diam eu enim vestibulum in porta turpis aliquam. Integer porta mollis scelerisque. Quisque accumsan ultrices nisi, et elementum libero adipiscing et. Pellentesque sem est, bibendum nec iaculis sit amet, tempus ut nibh. In porta laoreet lorem sed rhoncus. +Etiam feugiat turpis non sapien rutrum aliquam. Aenean ac nisl lorem.",,,,,, +Bulk Account from CSV - #29,Customer - Channel,,1301 Hoch Drive,Lawrence,KS,66045,USA,1301 Hoch Drive,Lawrence,KS,66045,USA,(785) 241-6200,(785) 241-6201,CC634267,dickenson-consulting.com,6752,Consulting,5.00E+07,120,Private,,"Nullam nisi turpis, sagittis in malesuada quis, feugiat sed lorem. Donec tortor justo, feugiat in tempor luctus, imperdiet nec sapien. Sed id dui in sapien varius aliquet eget ac mauris. Nullam tincidunt sodales risus nec semper. +Fusce pellentesque porta turpis non iaculis. Vivamus varius, dolor vel vulputate tristique, nunc augue elementum risus, sit amet sodales urna ligula eu risus. Suspendisse iaculis nulla non eros vulputate varius. +Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.",,,,,, +Bulk Account from CSV - #30,Customer - Direct,,"2334 N. Michigan Avenue, Suite 1500 +Chicago, IL 60601, USA",Chicago,IL,,,"2334 N. Michigan Avenue, Suite 1500 +Chicago, IL 60601, USA",,,,,(312) 596-1000,(312) 596-1500,CD439877,www.grandhotels.com,2268,Hospitality,5.00E+08,5600,Public,GHTL,"Morbi mollis pellentesque sem, vitae lobortis diam sollicitudin quis. Donec fermentum mauris vitae odio fringilla eget suscipit dolor fringilla. Nunc id lacus et purus ornare hendrerit in ut velit. Vivamus at tortor nisi. Curabitur lacinia volutpat urna, vel mollis lorem vulputate in. Aliquam erat volutpat. Integer et nibh sed sapien adipiscing sagittis non non nisi. Donec quis urna ac augue suscipit ultrices.",Warm,,,,, +Bulk Account from CSV - #31,Customer - Channel,,"620 SW 5th Avenue Suite 400 +Portland, Oregon 97204 +United States",Portland,OR,,,"620 SW 5th Avenue Suite 400 +Portland, Oregon 97204 +United States",,,,,(503) 421-7800,(503) 421-7801,CC947211,www.expressl&t.net,8742,Transportation,9.50E+08,12300,Public,EXLT,"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc nunc erat, molestie et interdum sit amet, lobortis laoreet ante. Cras imperdiet felis sit amet nunc tincidunt laoreet. Maecenas eu semper arcu. Suspendisse eu pretium magna. Nam tincidunt ligula dolor. Cras nec lacus odio, sed accumsan erat. Vivamus sed tellus sit amet nisi condimentum imperdiet at at nibh. Phasellus dignissim, urna sed faucibus porta, nisi felis ullamcorper est, eget sagittis sapien lacus eu dui. Praesent arcu odio, vestibulum a lacinia vitae, condimentum ac metus. Nullam pellentesque, nibh non fringilla iaculis, tortor est convallis libero, id malesuada tortor purus vitae orci",Cold,,,,, +Bulk Account from CSV - #32,Customer - Direct,,"888 N Euclid +Hallis Center, Room 501 +Tucson, AZ 85721 +United States",Tucson,AZ,,,"888 N Euclid +Hallis Center, Room 501 +Tucson, AZ 85721 +United States",,,,,(520) 773-9050,(520) 773-9060,CD736025,www.universityofarizona.com,7321,Education,,39000,Other,,"Cras facilisis, leo id auctor condimentum, elit quam consectetur ligula, in cursus arcu nulla nec ipsum. Sed id orci quam. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Praesent rutrum, augue at egestas porta, nibh felis dignissim odio, in mattis massa velit nec libero. +Quisque volutpat quam at turpis accumsan a accumsan diam volutpat. Praesent nec nibh a nulla tristique congue. Mauris egestas iaculis ipsum ac suscipit. Donec facilisis accumsan lacus vel porta. Mauris suscipit tempus ipsum, in ornare lacus interdum sed.",Warm,,,,, +Bulk Account from CSV - #33,Customer - Direct,,"1301 Avenue of the Americas +New York, NY 10019 +USA",New York,NY,,,"1301 Avenue of the Americas +New York, NY 10019 +USA",,,,,(212) 842-5500,(212) 842-5501,CD355118,http://www.uos.com,4437,Energy,5.60E+09,145000,Public,UOS,"Curabitur fermentum, mi eu adipiscing tincidunt, justo diam interdum dolor, tempor feugiat turpis erat et justo. Nunc sed nisi et eros tempor porttitor. +Curabitur blandit, tortor volutpat rhoncus gravida, nibh orci posuere purus, nec pellentesque lorem sapien a odio. +Donec semper nunc quis metus fringilla semper. Aliquam dapibus euismod imperdiet. +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. +Etiam gravida, nulla sit amet sollicitudin dictum, diam ante tempor ligula, sed imperdiet turpis urna a augue.",Hot,,,,, +Bulk Account from CSV - #34,Customer - Channel,,"345 Shoreline Park +Mountain View, CA 94043 +USA",Mountain View,CA,,,"345 Shoreline Park +Mountain View, CA 94043 +USA",,,,,(650) 867-3450,(650) 867-9895,CC978213,www.genepoint.com,3712,Biotechnology,3.00E+07,265,Private,,"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc nunc erat, molestie et interdum sit amet, lobortis laoreet ante. Cras imperdiet felis sit amet nunc tincidunt laoreet. Maecenas eu semper arcu. Suspendisse eu pretium magna. Nam tincidunt ligula dolor. Cras nec lacus odio, sed accumsan erat. Vivamus sed tellus sit amet nisi condimentum imperdiet at at nibh. Phasellus dignissim, urna sed faucibus porta, nisi felis ullamcorper est, eget sagittis sapien lacus eu dui. Praesent arcu odio, vestibulum a lacinia vitae, condimentum ac metus. Nullam pellentesque, nibh non fringilla iaculis, tortor est convallis libero, id malesuada tortor purus vitae orci",Cold,,,,, +Bulk Account from CSV - #35,Customer - Direct,,"Kings Park, 17th Avenue, Team Valley Trading Estate, +Gateshead, Tyne and Wear NE26 3HS +United Kingdom",,UK,,,"Kings Park, 17th Avenue, Team Valley Trading Estate, +Gateshead, Tyne and Wear NE26 3HS +United Kingdom",,,,,+44 191 4956203,+44 191 4956620,CD355119-A,http://www.uos.com,4437,Energy,,24000,Public,UOS,"Cras facilisis, leo id auctor condimentum, elit quam consectetur ligula, in cursus arcu nulla nec ipsum. Sed id orci quam. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Praesent rutrum, augue at egestas porta, nibh felis dignissim odio, in mattis massa velit nec libero. +Quisque volutpat quam at turpis accumsan a accumsan diam volutpat. Praesent nec nibh a nulla tristique congue. Mauris egestas iaculis ipsum ac suscipit. Donec facilisis accumsan lacus vel porta. Mauris suscipit tempus ipsum, in ornare lacus interdum sed.",,,,,, +Bulk Account from CSV - #36,Customer - Direct,,"9 Tagore Lane +Singapore, Singapore 787472 +Singapore",Singapore,Singapore,,,"9 Tagore Lane +Singapore, Singapore 787472 +Singapore",,,,,(650) 450-8810,(650) 450-8820,CD355120-B,http://www.uos.com,4437,Energy,,3000,Public,UOS,"Curabitur fermentum, mi eu adipiscing tincidunt, justo diam interdum dolor, tempor feugiat turpis erat et justo. Nunc sed nisi et eros tempor porttitor. +Curabitur blandit, tortor volutpat rhoncus gravida, nibh orci posuere purus, nec pellentesque lorem sapien a odio. +Donec semper nunc quis metus fringilla semper. Aliquam dapibus euismod imperdiet. +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. +Etiam gravida, nulla sit amet sollicitudin dictum, diam ante tempor ligula, sed imperdiet turpis urna a augue.",,,,,, +Bulk Account from CSV - #37,Customer - Direct,,"312 Constitution Place +Austin, TX 78767 +USA",Austin,TX,,,"312 Constitution Place +Austin, TX 78767 +USA",,,,,(512) 757-6000,(512) 757-9000,CD451796,http://edgecomm.com,6576,Electronics,1.39E+08,1000,Public,EDGE,"Curabitur eget urna non dolor dapibus faucibus. Nulla posuere, tellus a vestibulum rutrum, enim neque elementum nibh, ac luctus quam urna a nisi. +Phasellus nec ligula non dolor aliquam scelerisque ac id felis. Integer semper pellentesque hendrerit. +Quisque vitae felis nunc. Aliquam eu nisi lacus, scelerisque aliquet leo. Donec elementum mollis tortor id viverra. Curabitur molestie gravida fringilla. Donec pharetra metus nec velit consectetur quis placerat quam euismod.",Hot,,,,, +Bulk Account from CSV - #38,Customer - Direct,,525 S. Lexington Ave,Burlington,NC,27215,USA,,,,,,(336) 222-7000,(336) 222-8000,CD656092,www.burlington.com,546732,Apparel,3.50E+08,9000,Public,BTXT,"Donec orci magna, tristique tempus faucibus id, dignissim at neque. Proin quis ipsum leo. Vivamus vitae libero ut ipsum gravida accumsan. Proin ut massa sapien, ac hendrerit nisi. Nulla commodo enim id turpis varius nec cursus leo dignissim. Mauris laoreet tempor mi, sit amet molestie nisi tincidunt eget. Nulla elit orci, dictum sed tempus id, suscipit at lacus. Sed hendrerit, nisi id pretium ultricies, arcu nibh ornare erat, et venenatis augue ligula aliquam risus.",Warm,,,,, +Bulk Account from CSV - #39,Customer - Channel,,2 Place Jussieu,Paris,,75251,France,2 Place Jussieu,Paris,,75251,France,(014) 427-4427,(014) 427-4428,CC213425,www.pyramid.com,4253,Construction,9.50E+08,2680,Public,PYR,"Suspendisse potenti. Donec tortor libero, facilisis quis mattis in, faucibus sit amet orci. +Curabitur nec turpis vel mi lobortis tincidunt. Sed vulputate diam eu enim vestibulum in porta turpis aliquam. Integer porta mollis scelerisque. Quisque accumsan ultrices nisi, et elementum libero adipiscing et. Pellentesque sem est, bibendum nec iaculis sit amet, tempus ut nibh. In porta laoreet lorem sed rhoncus. +Etiam feugiat turpis non sapien rutrum aliquam. Aenean ac nisl lorem.",,,,,, +Bulk Account from CSV - #40,Customer - Channel,,1301 Hoch Drive,Lawrence,KS,66045,USA,1301 Hoch Drive,Lawrence,KS,66045,USA,(785) 241-6200,(785) 241-6201,CC634267,dickenson-consulting.com,6752,Consulting,5.00E+07,120,Private,,"Nullam nisi turpis, sagittis in malesuada quis, feugiat sed lorem. Donec tortor justo, feugiat in tempor luctus, imperdiet nec sapien. Sed id dui in sapien varius aliquet eget ac mauris. Nullam tincidunt sodales risus nec semper. +Fusce pellentesque porta turpis non iaculis. Vivamus varius, dolor vel vulputate tristique, nunc augue elementum risus, sit amet sodales urna ligula eu risus. Suspendisse iaculis nulla non eros vulputate varius. +Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.",,,,,, +Bulk Account from CSV - #41,Customer - Direct,,"2334 N. Michigan Avenue, Suite 1500 +Chicago, IL 60601, USA",Chicago,IL,,,"2334 N. Michigan Avenue, Suite 1500 +Chicago, IL 60601, USA",,,,,(312) 596-1000,(312) 596-1500,CD439877,www.grandhotels.com,2268,Hospitality,5.00E+08,5600,Public,GHTL,"Morbi mollis pellentesque sem, vitae lobortis diam sollicitudin quis. Donec fermentum mauris vitae odio fringilla eget suscipit dolor fringilla. Nunc id lacus et purus ornare hendrerit in ut velit. Vivamus at tortor nisi. Curabitur lacinia volutpat urna, vel mollis lorem vulputate in. Aliquam erat volutpat. Integer et nibh sed sapien adipiscing sagittis non non nisi. Donec quis urna ac augue suscipit ultrices.",Warm,,,,, +Bulk Account from CSV - #42,Customer - Channel,,"620 SW 5th Avenue Suite 400 +Portland, Oregon 97204 +United States",Portland,OR,,,"620 SW 5th Avenue Suite 400 +Portland, Oregon 97204 +United States",,,,,(503) 421-7800,(503) 421-7801,CC947211,www.expressl&t.net,8742,Transportation,9.50E+08,12300,Public,EXLT,"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc nunc erat, molestie et interdum sit amet, lobortis laoreet ante. Cras imperdiet felis sit amet nunc tincidunt laoreet. Maecenas eu semper arcu. Suspendisse eu pretium magna. Nam tincidunt ligula dolor. Cras nec lacus odio, sed accumsan erat. Vivamus sed tellus sit amet nisi condimentum imperdiet at at nibh. Phasellus dignissim, urna sed faucibus porta, nisi felis ullamcorper est, eget sagittis sapien lacus eu dui. Praesent arcu odio, vestibulum a lacinia vitae, condimentum ac metus. Nullam pellentesque, nibh non fringilla iaculis, tortor est convallis libero, id malesuada tortor purus vitae orci",Cold,,,,, +Bulk Account from CSV - #43,Customer - Direct,,"888 N Euclid +Hallis Center, Room 501 +Tucson, AZ 85721 +United States",Tucson,AZ,,,"888 N Euclid +Hallis Center, Room 501 +Tucson, AZ 85721 +United States",,,,,(520) 773-9050,(520) 773-9060,CD736025,www.universityofarizona.com,7321,Education,,39000,Other,,"Cras facilisis, leo id auctor condimentum, elit quam consectetur ligula, in cursus arcu nulla nec ipsum. Sed id orci quam. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Praesent rutrum, augue at egestas porta, nibh felis dignissim odio, in mattis massa velit nec libero. +Quisque volutpat quam at turpis accumsan a accumsan diam volutpat. Praesent nec nibh a nulla tristique congue. Mauris egestas iaculis ipsum ac suscipit. Donec facilisis accumsan lacus vel porta. Mauris suscipit tempus ipsum, in ornare lacus interdum sed.",Warm,,,,, +Bulk Account from CSV - #44,Customer - Direct,,"1301 Avenue of the Americas +New York, NY 10019 +USA",New York,NY,,,"1301 Avenue of the Americas +New York, NY 10019 +USA",,,,,(212) 842-5500,(212) 842-5501,CD355118,http://www.uos.com,4437,Energy,5.60E+09,145000,Public,UOS,"Curabitur fermentum, mi eu adipiscing tincidunt, justo diam interdum dolor, tempor feugiat turpis erat et justo. Nunc sed nisi et eros tempor porttitor. +Curabitur blandit, tortor volutpat rhoncus gravida, nibh orci posuere purus, nec pellentesque lorem sapien a odio. +Donec semper nunc quis metus fringilla semper. Aliquam dapibus euismod imperdiet. +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. +Etiam gravida, nulla sit amet sollicitudin dictum, diam ante tempor ligula, sed imperdiet turpis urna a augue.",Hot,,,,, +Bulk Account from CSV - #45,Customer - Channel,,"345 Shoreline Park +Mountain View, CA 94043 +USA",Mountain View,CA,,,"345 Shoreline Park +Mountain View, CA 94043 +USA",,,,,(650) 867-3450,(650) 867-9895,CC978213,www.genepoint.com,3712,Biotechnology,3.00E+07,265,Private,,"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc nunc erat, molestie et interdum sit amet, lobortis laoreet ante. Cras imperdiet felis sit amet nunc tincidunt laoreet. Maecenas eu semper arcu. Suspendisse eu pretium magna. Nam tincidunt ligula dolor. Cras nec lacus odio, sed accumsan erat. Vivamus sed tellus sit amet nisi condimentum imperdiet at at nibh. Phasellus dignissim, urna sed faucibus porta, nisi felis ullamcorper est, eget sagittis sapien lacus eu dui. Praesent arcu odio, vestibulum a lacinia vitae, condimentum ac metus. Nullam pellentesque, nibh non fringilla iaculis, tortor est convallis libero, id malesuada tortor purus vitae orci",Cold,,,,, +Bulk Account from CSV - #46,Customer - Direct,,"Kings Park, 17th Avenue, Team Valley Trading Estate, +Gateshead, Tyne and Wear NE26 3HS +United Kingdom",,UK,,,"Kings Park, 17th Avenue, Team Valley Trading Estate, +Gateshead, Tyne and Wear NE26 3HS +United Kingdom",,,,,+44 191 4956203,+44 191 4956620,CD355119-A,http://www.uos.com,4437,Energy,,24000,Public,UOS,"Cras facilisis, leo id auctor condimentum, elit quam consectetur ligula, in cursus arcu nulla nec ipsum. Sed id orci quam. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Praesent rutrum, augue at egestas porta, nibh felis dignissim odio, in mattis massa velit nec libero. +Quisque volutpat quam at turpis accumsan a accumsan diam volutpat. Praesent nec nibh a nulla tristique congue. Mauris egestas iaculis ipsum ac suscipit. Donec facilisis accumsan lacus vel porta. Mauris suscipit tempus ipsum, in ornare lacus interdum sed.",,,,,, +Bulk Account from CSV - #47,Customer - Direct,,"9 Tagore Lane +Singapore, Singapore 787472 +Singapore",Singapore,Singapore,,,"9 Tagore Lane +Singapore, Singapore 787472 +Singapore",,,,,(650) 450-8810,(650) 450-8820,CD355120-B,http://www.uos.com,4437,Energy,,3000,Public,UOS,"Curabitur fermentum, mi eu adipiscing tincidunt, justo diam interdum dolor, tempor feugiat turpis erat et justo. Nunc sed nisi et eros tempor porttitor. +Curabitur blandit, tortor volutpat rhoncus gravida, nibh orci posuere purus, nec pellentesque lorem sapien a odio. +Donec semper nunc quis metus fringilla semper. Aliquam dapibus euismod imperdiet. +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. +Etiam gravida, nulla sit amet sollicitudin dictum, diam ante tempor ligula, sed imperdiet turpis urna a augue.",,,,,, +Bulk Account from CSV - #48,Customer - Direct,,"312 Constitution Place +Austin, TX 78767 +USA",Austin,TX,,,"312 Constitution Place +Austin, TX 78767 +USA",,,,,(512) 757-6000,(512) 757-9000,CD451796,http://edgecomm.com,6576,Electronics,1.39E+08,1000,Public,EDGE,"Curabitur eget urna non dolor dapibus faucibus. Nulla posuere, tellus a vestibulum rutrum, enim neque elementum nibh, ac luctus quam urna a nisi. +Phasellus nec ligula non dolor aliquam scelerisque ac id felis. Integer semper pellentesque hendrerit. +Quisque vitae felis nunc. Aliquam eu nisi lacus, scelerisque aliquet leo. Donec elementum mollis tortor id viverra. Curabitur molestie gravida fringilla. Donec pharetra metus nec velit consectetur quis placerat quam euismod.",Hot,,,,, +Bulk Account from CSV - #49,Customer - Direct,,525 S. Lexington Ave,Burlington,NC,27215,USA,,,,,,(336) 222-7000,(336) 222-8000,CD656092,www.burlington.com,546732,Apparel,3.50E+08,9000,Public,BTXT,"Donec orci magna, tristique tempus faucibus id, dignissim at neque. Proin quis ipsum leo. Vivamus vitae libero ut ipsum gravida accumsan. Proin ut massa sapien, ac hendrerit nisi. Nulla commodo enim id turpis varius nec cursus leo dignissim. Mauris laoreet tempor mi, sit amet molestie nisi tincidunt eget. Nulla elit orci, dictum sed tempus id, suscipit at lacus. Sed hendrerit, nisi id pretium ultricies, arcu nibh ornare erat, et venenatis augue ligula aliquam risus.",Warm,,,,, +Bulk Account from CSV - #50,Customer - Channel,,2 Place Jussieu,Paris,,75251,France,2 Place Jussieu,Paris,,75251,France,(014) 427-4427,(014) 427-4428,CC213425,www.pyramid.com,4253,Construction,9.50E+08,2680,Public,PYR,"Suspendisse potenti. Donec tortor libero, facilisis quis mattis in, faucibus sit amet orci. +Curabitur nec turpis vel mi lobortis tincidunt. Sed vulputate diam eu enim vestibulum in porta turpis aliquam. Integer porta mollis scelerisque. Quisque accumsan ultrices nisi, et elementum libero adipiscing et. Pellentesque sem est, bibendum nec iaculis sit amet, tempus ut nibh. In porta laoreet lorem sed rhoncus. +Etiam feugiat turpis non sapien rutrum aliquam. Aenean ac nisl lorem.",,,,,, +Bulk Account from CSV - #51,Customer - Channel,,1301 Hoch Drive,Lawrence,KS,66045,USA,1301 Hoch Drive,Lawrence,KS,66045,USA,(785) 241-6200,(785) 241-6201,CC634267,dickenson-consulting.com,6752,Consulting,5.00E+07,120,Private,,"Nullam nisi turpis, sagittis in malesuada quis, feugiat sed lorem. Donec tortor justo, feugiat in tempor luctus, imperdiet nec sapien. Sed id dui in sapien varius aliquet eget ac mauris. Nullam tincidunt sodales risus nec semper. +Fusce pellentesque porta turpis non iaculis. Vivamus varius, dolor vel vulputate tristique, nunc augue elementum risus, sit amet sodales urna ligula eu risus. Suspendisse iaculis nulla non eros vulputate varius. +Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.",,,,,, +Bulk Account from CSV - #52,Customer - Direct,,"2334 N. Michigan Avenue, Suite 1500 +Chicago, IL 60601, USA",Chicago,IL,,,"2334 N. Michigan Avenue, Suite 1500 +Chicago, IL 60601, USA",,,,,(312) 596-1000,(312) 596-1500,CD439877,www.grandhotels.com,2268,Hospitality,5.00E+08,5600,Public,GHTL,"Morbi mollis pellentesque sem, vitae lobortis diam sollicitudin quis. Donec fermentum mauris vitae odio fringilla eget suscipit dolor fringilla. Nunc id lacus et purus ornare hendrerit in ut velit. Vivamus at tortor nisi. Curabitur lacinia volutpat urna, vel mollis lorem vulputate in. Aliquam erat volutpat. Integer et nibh sed sapien adipiscing sagittis non non nisi. Donec quis urna ac augue suscipit ultrices.",Warm,,,,, +Bulk Account from CSV - #53,Customer - Channel,,"620 SW 5th Avenue Suite 400 +Portland, Oregon 97204 +United States",Portland,OR,,,"620 SW 5th Avenue Suite 400 +Portland, Oregon 97204 +United States",,,,,(503) 421-7800,(503) 421-7801,CC947211,www.expressl&t.net,8742,Transportation,9.50E+08,12300,Public,EXLT,"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc nunc erat, molestie et interdum sit amet, lobortis laoreet ante. Cras imperdiet felis sit amet nunc tincidunt laoreet. Maecenas eu semper arcu. Suspendisse eu pretium magna. Nam tincidunt ligula dolor. Cras nec lacus odio, sed accumsan erat. Vivamus sed tellus sit amet nisi condimentum imperdiet at at nibh. Phasellus dignissim, urna sed faucibus porta, nisi felis ullamcorper est, eget sagittis sapien lacus eu dui. Praesent arcu odio, vestibulum a lacinia vitae, condimentum ac metus. Nullam pellentesque, nibh non fringilla iaculis, tortor est convallis libero, id malesuada tortor purus vitae orci",Cold,,,,, +Bulk Account from CSV - #54,Customer - Direct,,"888 N Euclid +Hallis Center, Room 501 +Tucson, AZ 85721 +United States",Tucson,AZ,,,"888 N Euclid +Hallis Center, Room 501 +Tucson, AZ 85721 +United States",,,,,(520) 773-9050,(520) 773-9060,CD736025,www.universityofarizona.com,7321,Education,,39000,Other,,"Cras facilisis, leo id auctor condimentum, elit quam consectetur ligula, in cursus arcu nulla nec ipsum. Sed id orci quam. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Praesent rutrum, augue at egestas porta, nibh felis dignissim odio, in mattis massa velit nec libero. +Quisque volutpat quam at turpis accumsan a accumsan diam volutpat. Praesent nec nibh a nulla tristique congue. Mauris egestas iaculis ipsum ac suscipit. Donec facilisis accumsan lacus vel porta. Mauris suscipit tempus ipsum, in ornare lacus interdum sed.",Warm,,,,, +Bulk Account from CSV - #55,Customer - Direct,,"1301 Avenue of the Americas +New York, NY 10019 +USA",New York,NY,,,"1301 Avenue of the Americas +New York, NY 10019 +USA",,,,,(212) 842-5500,(212) 842-5501,CD355118,http://www.uos.com,4437,Energy,5.60E+09,145000,Public,UOS,"Curabitur fermentum, mi eu adipiscing tincidunt, justo diam interdum dolor, tempor feugiat turpis erat et justo. Nunc sed nisi et eros tempor porttitor. +Curabitur blandit, tortor volutpat rhoncus gravida, nibh orci posuere purus, nec pellentesque lorem sapien a odio. +Donec semper nunc quis metus fringilla semper. Aliquam dapibus euismod imperdiet. +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. +Etiam gravida, nulla sit amet sollicitudin dictum, diam ante tempor ligula, sed imperdiet turpis urna a augue.",Hot,,,,, +Bulk Account from CSV - #56,Customer - Channel,,"345 Shoreline Park +Mountain View, CA 94043 +USA",Mountain View,CA,,,"345 Shoreline Park +Mountain View, CA 94043 +USA",,,,,(650) 867-3450,(650) 867-9895,CC978213,www.genepoint.com,3712,Biotechnology,3.00E+07,265,Private,,"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc nunc erat, molestie et interdum sit amet, lobortis laoreet ante. Cras imperdiet felis sit amet nunc tincidunt laoreet. Maecenas eu semper arcu. Suspendisse eu pretium magna. Nam tincidunt ligula dolor. Cras nec lacus odio, sed accumsan erat. Vivamus sed tellus sit amet nisi condimentum imperdiet at at nibh. Phasellus dignissim, urna sed faucibus porta, nisi felis ullamcorper est, eget sagittis sapien lacus eu dui. Praesent arcu odio, vestibulum a lacinia vitae, condimentum ac metus. Nullam pellentesque, nibh non fringilla iaculis, tortor est convallis libero, id malesuada tortor purus vitae orci",Cold,,,,, +Bulk Account from CSV - #57,Customer - Direct,,"Kings Park, 17th Avenue, Team Valley Trading Estate, +Gateshead, Tyne and Wear NE26 3HS +United Kingdom",,UK,,,"Kings Park, 17th Avenue, Team Valley Trading Estate, +Gateshead, Tyne and Wear NE26 3HS +United Kingdom",,,,,+44 191 4956203,+44 191 4956620,CD355119-A,http://www.uos.com,4437,Energy,,24000,Public,UOS,"Cras facilisis, leo id auctor condimentum, elit quam consectetur ligula, in cursus arcu nulla nec ipsum. Sed id orci quam. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Praesent rutrum, augue at egestas porta, nibh felis dignissim odio, in mattis massa velit nec libero. +Quisque volutpat quam at turpis accumsan a accumsan diam volutpat. Praesent nec nibh a nulla tristique congue. Mauris egestas iaculis ipsum ac suscipit. Donec facilisis accumsan lacus vel porta. Mauris suscipit tempus ipsum, in ornare lacus interdum sed.",,,,,, +Bulk Account from CSV - #58,Customer - Direct,,"9 Tagore Lane +Singapore, Singapore 787472 +Singapore",Singapore,Singapore,,,"9 Tagore Lane +Singapore, Singapore 787472 +Singapore",,,,,(650) 450-8810,(650) 450-8820,CD355120-B,http://www.uos.com,4437,Energy,,3000,Public,UOS,"Curabitur fermentum, mi eu adipiscing tincidunt, justo diam interdum dolor, tempor feugiat turpis erat et justo. Nunc sed nisi et eros tempor porttitor. +Curabitur blandit, tortor volutpat rhoncus gravida, nibh orci posuere purus, nec pellentesque lorem sapien a odio. +Donec semper nunc quis metus fringilla semper. Aliquam dapibus euismod imperdiet. +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. +Etiam gravida, nulla sit amet sollicitudin dictum, diam ante tempor ligula, sed imperdiet turpis urna a augue.",,,,,, +Bulk Account from CSV - #59,Customer - Direct,,"312 Constitution Place +Austin, TX 78767 +USA",Austin,TX,,,"312 Constitution Place +Austin, TX 78767 +USA",,,,,(512) 757-6000,(512) 757-9000,CD451796,http://edgecomm.com,6576,Electronics,1.39E+08,1000,Public,EDGE,"Curabitur eget urna non dolor dapibus faucibus. Nulla posuere, tellus a vestibulum rutrum, enim neque elementum nibh, ac luctus quam urna a nisi. +Phasellus nec ligula non dolor aliquam scelerisque ac id felis. Integer semper pellentesque hendrerit. +Quisque vitae felis nunc. Aliquam eu nisi lacus, scelerisque aliquet leo. Donec elementum mollis tortor id viverra. Curabitur molestie gravida fringilla. Donec pharetra metus nec velit consectetur quis placerat quam euismod.",Hot,,,,, +Bulk Account from CSV - #60,Customer - Direct,,525 S. Lexington Ave,Burlington,NC,27215,USA,,,,,,(336) 222-7000,(336) 222-8000,CD656092,www.burlington.com,546732,Apparel,3.50E+08,9000,Public,BTXT,"Donec orci magna, tristique tempus faucibus id, dignissim at neque. Proin quis ipsum leo. Vivamus vitae libero ut ipsum gravida accumsan. Proin ut massa sapien, ac hendrerit nisi. Nulla commodo enim id turpis varius nec cursus leo dignissim. Mauris laoreet tempor mi, sit amet molestie nisi tincidunt eget. Nulla elit orci, dictum sed tempus id, suscipit at lacus. Sed hendrerit, nisi id pretium ultricies, arcu nibh ornare erat, et venenatis augue ligula aliquam risus.",Warm,,,,, +Bulk Account from CSV - #61,Customer - Channel,,2 Place Jussieu,Paris,,75251,France,2 Place Jussieu,Paris,,75251,France,(014) 427-4427,(014) 427-4428,CC213425,www.pyramid.com,4253,Construction,9.50E+08,2680,Public,PYR,"Suspendisse potenti. Donec tortor libero, facilisis quis mattis in, faucibus sit amet orci. +Curabitur nec turpis vel mi lobortis tincidunt. Sed vulputate diam eu enim vestibulum in porta turpis aliquam. Integer porta mollis scelerisque. Quisque accumsan ultrices nisi, et elementum libero adipiscing et. Pellentesque sem est, bibendum nec iaculis sit amet, tempus ut nibh. In porta laoreet lorem sed rhoncus. +Etiam feugiat turpis non sapien rutrum aliquam. Aenean ac nisl lorem.",,,,,, +Bulk Account from CSV - #62,Customer - Channel,,1301 Hoch Drive,Lawrence,KS,66045,USA,1301 Hoch Drive,Lawrence,KS,66045,USA,(785) 241-6200,(785) 241-6201,CC634267,dickenson-consulting.com,6752,Consulting,5.00E+07,120,Private,,"Nullam nisi turpis, sagittis in malesuada quis, feugiat sed lorem. Donec tortor justo, feugiat in tempor luctus, imperdiet nec sapien. Sed id dui in sapien varius aliquet eget ac mauris. Nullam tincidunt sodales risus nec semper. +Fusce pellentesque porta turpis non iaculis. Vivamus varius, dolor vel vulputate tristique, nunc augue elementum risus, sit amet sodales urna ligula eu risus. Suspendisse iaculis nulla non eros vulputate varius. +Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.",,,,,, +Bulk Account from CSV - #63,Customer - Direct,,"2334 N. Michigan Avenue, Suite 1500 +Chicago, IL 60601, USA",Chicago,IL,,,"2334 N. Michigan Avenue, Suite 1500 +Chicago, IL 60601, USA",,,,,(312) 596-1000,(312) 596-1500,CD439877,www.grandhotels.com,2268,Hospitality,5.00E+08,5600,Public,GHTL,"Morbi mollis pellentesque sem, vitae lobortis diam sollicitudin quis. Donec fermentum mauris vitae odio fringilla eget suscipit dolor fringilla. Nunc id lacus et purus ornare hendrerit in ut velit. Vivamus at tortor nisi. Curabitur lacinia volutpat urna, vel mollis lorem vulputate in. Aliquam erat volutpat. Integer et nibh sed sapien adipiscing sagittis non non nisi. Donec quis urna ac augue suscipit ultrices.",Warm,,,,, +Bulk Account from CSV - #64,Customer - Channel,,"620 SW 5th Avenue Suite 400 +Portland, Oregon 97204 +United States",Portland,OR,,,"620 SW 5th Avenue Suite 400 +Portland, Oregon 97204 +United States",,,,,(503) 421-7800,(503) 421-7801,CC947211,www.expressl&t.net,8742,Transportation,9.50E+08,12300,Public,EXLT,"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc nunc erat, molestie et interdum sit amet, lobortis laoreet ante. Cras imperdiet felis sit amet nunc tincidunt laoreet. Maecenas eu semper arcu. Suspendisse eu pretium magna. Nam tincidunt ligula dolor. Cras nec lacus odio, sed accumsan erat. Vivamus sed tellus sit amet nisi condimentum imperdiet at at nibh. Phasellus dignissim, urna sed faucibus porta, nisi felis ullamcorper est, eget sagittis sapien lacus eu dui. Praesent arcu odio, vestibulum a lacinia vitae, condimentum ac metus. Nullam pellentesque, nibh non fringilla iaculis, tortor est convallis libero, id malesuada tortor purus vitae orci",Cold,,,,, +Bulk Account from CSV - #65,Customer - Direct,,"888 N Euclid +Hallis Center, Room 501 +Tucson, AZ 85721 +United States",Tucson,AZ,,,"888 N Euclid +Hallis Center, Room 501 +Tucson, AZ 85721 +United States",,,,,(520) 773-9050,(520) 773-9060,CD736025,www.universityofarizona.com,7321,Education,,39000,Other,,"Cras facilisis, leo id auctor condimentum, elit quam consectetur ligula, in cursus arcu nulla nec ipsum. Sed id orci quam. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Praesent rutrum, augue at egestas porta, nibh felis dignissim odio, in mattis massa velit nec libero. +Quisque volutpat quam at turpis accumsan a accumsan diam volutpat. Praesent nec nibh a nulla tristique congue. Mauris egestas iaculis ipsum ac suscipit. Donec facilisis accumsan lacus vel porta. Mauris suscipit tempus ipsum, in ornare lacus interdum sed.",Warm,,,,, +Bulk Account from CSV - #66,Customer - Direct,,"1301 Avenue of the Americas +New York, NY 10019 +USA",New York,NY,,,"1301 Avenue of the Americas +New York, NY 10019 +USA",,,,,(212) 842-5500,(212) 842-5501,CD355118,http://www.uos.com,4437,Energy,5.60E+09,145000,Public,UOS,"Curabitur fermentum, mi eu adipiscing tincidunt, justo diam interdum dolor, tempor feugiat turpis erat et justo. Nunc sed nisi et eros tempor porttitor. +Curabitur blandit, tortor volutpat rhoncus gravida, nibh orci posuere purus, nec pellentesque lorem sapien a odio. +Donec semper nunc quis metus fringilla semper. Aliquam dapibus euismod imperdiet. +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. +Etiam gravida, nulla sit amet sollicitudin dictum, diam ante tempor ligula, sed imperdiet turpis urna a augue.",Hot,,,,, +Bulk Account from CSV - #67,Customer - Channel,,"345 Shoreline Park +Mountain View, CA 94043 +USA",Mountain View,CA,,,"345 Shoreline Park +Mountain View, CA 94043 +USA",,,,,(650) 867-3450,(650) 867-9895,CC978213,www.genepoint.com,3712,Biotechnology,3.00E+07,265,Private,,"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc nunc erat, molestie et interdum sit amet, lobortis laoreet ante. Cras imperdiet felis sit amet nunc tincidunt laoreet. Maecenas eu semper arcu. Suspendisse eu pretium magna. Nam tincidunt ligula dolor. Cras nec lacus odio, sed accumsan erat. Vivamus sed tellus sit amet nisi condimentum imperdiet at at nibh. Phasellus dignissim, urna sed faucibus porta, nisi felis ullamcorper est, eget sagittis sapien lacus eu dui. Praesent arcu odio, vestibulum a lacinia vitae, condimentum ac metus. Nullam pellentesque, nibh non fringilla iaculis, tortor est convallis libero, id malesuada tortor purus vitae orci",Cold,,,,, +Bulk Account from CSV - #68,Customer - Direct,,"Kings Park, 17th Avenue, Team Valley Trading Estate, +Gateshead, Tyne and Wear NE26 3HS +United Kingdom",,UK,,,"Kings Park, 17th Avenue, Team Valley Trading Estate, +Gateshead, Tyne and Wear NE26 3HS +United Kingdom",,,,,+44 191 4956203,+44 191 4956620,CD355119-A,http://www.uos.com,4437,Energy,,24000,Public,UOS,"Cras facilisis, leo id auctor condimentum, elit quam consectetur ligula, in cursus arcu nulla nec ipsum. Sed id orci quam. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Praesent rutrum, augue at egestas porta, nibh felis dignissim odio, in mattis massa velit nec libero. +Quisque volutpat quam at turpis accumsan a accumsan diam volutpat. Praesent nec nibh a nulla tristique congue. Mauris egestas iaculis ipsum ac suscipit. Donec facilisis accumsan lacus vel porta. Mauris suscipit tempus ipsum, in ornare lacus interdum sed.",,,,,, +Bulk Account from CSV - #69,Customer - Direct,,"9 Tagore Lane +Singapore, Singapore 787472 +Singapore",Singapore,Singapore,,,"9 Tagore Lane +Singapore, Singapore 787472 +Singapore",,,,,(650) 450-8810,(650) 450-8820,CD355120-B,http://www.uos.com,4437,Energy,,3000,Public,UOS,"Curabitur fermentum, mi eu adipiscing tincidunt, justo diam interdum dolor, tempor feugiat turpis erat et justo. Nunc sed nisi et eros tempor porttitor. +Curabitur blandit, tortor volutpat rhoncus gravida, nibh orci posuere purus, nec pellentesque lorem sapien a odio. +Donec semper nunc quis metus fringilla semper. Aliquam dapibus euismod imperdiet. +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. +Etiam gravida, nulla sit amet sollicitudin dictum, diam ante tempor ligula, sed imperdiet turpis urna a augue.",,,,,, +Bulk Account from CSV - #70,Customer - Direct,,"312 Constitution Place +Austin, TX 78767 +USA",Austin,TX,,,"312 Constitution Place +Austin, TX 78767 +USA",,,,,(512) 757-6000,(512) 757-9000,CD451796,http://edgecomm.com,6576,Electronics,1.39E+08,1000,Public,EDGE,"Curabitur eget urna non dolor dapibus faucibus. Nulla posuere, tellus a vestibulum rutrum, enim neque elementum nibh, ac luctus quam urna a nisi. +Phasellus nec ligula non dolor aliquam scelerisque ac id felis. Integer semper pellentesque hendrerit. +Quisque vitae felis nunc. Aliquam eu nisi lacus, scelerisque aliquet leo. Donec elementum mollis tortor id viverra. Curabitur molestie gravida fringilla. Donec pharetra metus nec velit consectetur quis placerat quam euismod.",Hot,,,,, +Bulk Account from CSV - #71,Customer - Direct,,525 S. Lexington Ave,Burlington,NC,27215,USA,,,,,,(336) 222-7000,(336) 222-8000,CD656092,www.burlington.com,546732,Apparel,3.50E+08,9000,Public,BTXT,"Donec orci magna, tristique tempus faucibus id, dignissim at neque. Proin quis ipsum leo. Vivamus vitae libero ut ipsum gravida accumsan. Proin ut massa sapien, ac hendrerit nisi. Nulla commodo enim id turpis varius nec cursus leo dignissim. Mauris laoreet tempor mi, sit amet molestie nisi tincidunt eget. Nulla elit orci, dictum sed tempus id, suscipit at lacus. Sed hendrerit, nisi id pretium ultricies, arcu nibh ornare erat, et venenatis augue ligula aliquam risus.",Warm,,,,, +Bulk Account from CSV - #72,Customer - Channel,,2 Place Jussieu,Paris,,75251,France,2 Place Jussieu,Paris,,75251,France,(014) 427-4427,(014) 427-4428,CC213425,www.pyramid.com,4253,Construction,9.50E+08,2680,Public,PYR,"Suspendisse potenti. Donec tortor libero, facilisis quis mattis in, faucibus sit amet orci. +Curabitur nec turpis vel mi lobortis tincidunt. Sed vulputate diam eu enim vestibulum in porta turpis aliquam. Integer porta mollis scelerisque. Quisque accumsan ultrices nisi, et elementum libero adipiscing et. Pellentesque sem est, bibendum nec iaculis sit amet, tempus ut nibh. In porta laoreet lorem sed rhoncus. +Etiam feugiat turpis non sapien rutrum aliquam. Aenean ac nisl lorem.",,,,,, +Bulk Account from CSV - #73,Customer - Channel,,1301 Hoch Drive,Lawrence,KS,66045,USA,1301 Hoch Drive,Lawrence,KS,66045,USA,(785) 241-6200,(785) 241-6201,CC634267,dickenson-consulting.com,6752,Consulting,5.00E+07,120,Private,,"Nullam nisi turpis, sagittis in malesuada quis, feugiat sed lorem. Donec tortor justo, feugiat in tempor luctus, imperdiet nec sapien. Sed id dui in sapien varius aliquet eget ac mauris. Nullam tincidunt sodales risus nec semper. +Fusce pellentesque porta turpis non iaculis. Vivamus varius, dolor vel vulputate tristique, nunc augue elementum risus, sit amet sodales urna ligula eu risus. Suspendisse iaculis nulla non eros vulputate varius. +Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.",,,,,, +Bulk Account from CSV - #74,Customer - Direct,,"2334 N. Michigan Avenue, Suite 1500 +Chicago, IL 60601, USA",Chicago,IL,,,"2334 N. Michigan Avenue, Suite 1500 +Chicago, IL 60601, USA",,,,,(312) 596-1000,(312) 596-1500,CD439877,www.grandhotels.com,2268,Hospitality,5.00E+08,5600,Public,GHTL,"Morbi mollis pellentesque sem, vitae lobortis diam sollicitudin quis. Donec fermentum mauris vitae odio fringilla eget suscipit dolor fringilla. Nunc id lacus et purus ornare hendrerit in ut velit. Vivamus at tortor nisi. Curabitur lacinia volutpat urna, vel mollis lorem vulputate in. Aliquam erat volutpat. Integer et nibh sed sapien adipiscing sagittis non non nisi. Donec quis urna ac augue suscipit ultrices.",Warm,,,,, +Bulk Account from CSV - #75,Customer - Channel,,"620 SW 5th Avenue Suite 400 +Portland, Oregon 97204 +United States",Portland,OR,,,"620 SW 5th Avenue Suite 400 +Portland, Oregon 97204 +United States",,,,,(503) 421-7800,(503) 421-7801,CC947211,www.expressl&t.net,8742,Transportation,9.50E+08,12300,Public,EXLT,"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc nunc erat, molestie et interdum sit amet, lobortis laoreet ante. Cras imperdiet felis sit amet nunc tincidunt laoreet. Maecenas eu semper arcu. Suspendisse eu pretium magna. Nam tincidunt ligula dolor. Cras nec lacus odio, sed accumsan erat. Vivamus sed tellus sit amet nisi condimentum imperdiet at at nibh. Phasellus dignissim, urna sed faucibus porta, nisi felis ullamcorper est, eget sagittis sapien lacus eu dui. Praesent arcu odio, vestibulum a lacinia vitae, condimentum ac metus. Nullam pellentesque, nibh non fringilla iaculis, tortor est convallis libero, id malesuada tortor purus vitae orci",Cold,,,,, +Bulk Account from CSV - #76,Customer - Direct,,"888 N Euclid +Hallis Center, Room 501 +Tucson, AZ 85721 +United States",Tucson,AZ,,,"888 N Euclid +Hallis Center, Room 501 +Tucson, AZ 85721 +United States",,,,,(520) 773-9050,(520) 773-9060,CD736025,www.universityofarizona.com,7321,Education,,39000,Other,,"Cras facilisis, leo id auctor condimentum, elit quam consectetur ligula, in cursus arcu nulla nec ipsum. Sed id orci quam. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Praesent rutrum, augue at egestas porta, nibh felis dignissim odio, in mattis massa velit nec libero. +Quisque volutpat quam at turpis accumsan a accumsan diam volutpat. Praesent nec nibh a nulla tristique congue. Mauris egestas iaculis ipsum ac suscipit. Donec facilisis accumsan lacus vel porta. Mauris suscipit tempus ipsum, in ornare lacus interdum sed.",Warm,,,,, +Bulk Account from CSV - #77,Customer - Direct,,"1301 Avenue of the Americas +New York, NY 10019 +USA",New York,NY,,,"1301 Avenue of the Americas +New York, NY 10019 +USA",,,,,(212) 842-5500,(212) 842-5501,CD355118,http://www.uos.com,4437,Energy,5.60E+09,145000,Public,UOS,"Curabitur fermentum, mi eu adipiscing tincidunt, justo diam interdum dolor, tempor feugiat turpis erat et justo. Nunc sed nisi et eros tempor porttitor. +Curabitur blandit, tortor volutpat rhoncus gravida, nibh orci posuere purus, nec pellentesque lorem sapien a odio. +Donec semper nunc quis metus fringilla semper. Aliquam dapibus euismod imperdiet. +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. +Etiam gravida, nulla sit amet sollicitudin dictum, diam ante tempor ligula, sed imperdiet turpis urna a augue.",Hot,,,,, +Bulk Account from CSV - #78,Customer - Channel,,"345 Shoreline Park +Mountain View, CA 94043 +USA",Mountain View,CA,,,"345 Shoreline Park +Mountain View, CA 94043 +USA",,,,,(650) 867-3450,(650) 867-9895,CC978213,www.genepoint.com,3712,Biotechnology,3.00E+07,265,Private,,"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc nunc erat, molestie et interdum sit amet, lobortis laoreet ante. Cras imperdiet felis sit amet nunc tincidunt laoreet. Maecenas eu semper arcu. Suspendisse eu pretium magna. Nam tincidunt ligula dolor. Cras nec lacus odio, sed accumsan erat. Vivamus sed tellus sit amet nisi condimentum imperdiet at at nibh. Phasellus dignissim, urna sed faucibus porta, nisi felis ullamcorper est, eget sagittis sapien lacus eu dui. Praesent arcu odio, vestibulum a lacinia vitae, condimentum ac metus. Nullam pellentesque, nibh non fringilla iaculis, tortor est convallis libero, id malesuada tortor purus vitae orci",Cold,,,,, +Bulk Account from CSV - #79,Customer - Direct,,"Kings Park, 17th Avenue, Team Valley Trading Estate, +Gateshead, Tyne and Wear NE26 3HS +United Kingdom",,UK,,,"Kings Park, 17th Avenue, Team Valley Trading Estate, +Gateshead, Tyne and Wear NE26 3HS +United Kingdom",,,,,+44 191 4956203,+44 191 4956620,CD355119-A,http://www.uos.com,4437,Energy,,24000,Public,UOS,"Cras facilisis, leo id auctor condimentum, elit quam consectetur ligula, in cursus arcu nulla nec ipsum. Sed id orci quam. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Praesent rutrum, augue at egestas porta, nibh felis dignissim odio, in mattis massa velit nec libero. +Quisque volutpat quam at turpis accumsan a accumsan diam volutpat. Praesent nec nibh a nulla tristique congue. Mauris egestas iaculis ipsum ac suscipit. Donec facilisis accumsan lacus vel porta. Mauris suscipit tempus ipsum, in ornare lacus interdum sed.",,,,,, +Bulk Account from CSV - #80,Customer - Direct,,"9 Tagore Lane +Singapore, Singapore 787472 +Singapore",Singapore,Singapore,,,"9 Tagore Lane +Singapore, Singapore 787472 +Singapore",,,,,(650) 450-8810,(650) 450-8820,CD355120-B,http://www.uos.com,4437,Energy,,3000,Public,UOS,"Curabitur fermentum, mi eu adipiscing tincidunt, justo diam interdum dolor, tempor feugiat turpis erat et justo. Nunc sed nisi et eros tempor porttitor. +Curabitur blandit, tortor volutpat rhoncus gravida, nibh orci posuere purus, nec pellentesque lorem sapien a odio. +Donec semper nunc quis metus fringilla semper. Aliquam dapibus euismod imperdiet. +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. +Etiam gravida, nulla sit amet sollicitudin dictum, diam ante tempor ligula, sed imperdiet turpis urna a augue.",,,,,, +Bulk Account from CSV - #81,Customer - Direct,,"312 Constitution Place +Austin, TX 78767 +USA",Austin,TX,,,"312 Constitution Place +Austin, TX 78767 +USA",,,,,(512) 757-6000,(512) 757-9000,CD451796,http://edgecomm.com,6576,Electronics,1.39E+08,1000,Public,EDGE,"Curabitur eget urna non dolor dapibus faucibus. Nulla posuere, tellus a vestibulum rutrum, enim neque elementum nibh, ac luctus quam urna a nisi. +Phasellus nec ligula non dolor aliquam scelerisque ac id felis. Integer semper pellentesque hendrerit. +Quisque vitae felis nunc. Aliquam eu nisi lacus, scelerisque aliquet leo. Donec elementum mollis tortor id viverra. Curabitur molestie gravida fringilla. Donec pharetra metus nec velit consectetur quis placerat quam euismod.",Hot,,,,, +Bulk Account from CSV - #82,Customer - Direct,,525 S. Lexington Ave,Burlington,NC,27215,USA,,,,,,(336) 222-7000,(336) 222-8000,CD656092,www.burlington.com,546732,Apparel,3.50E+08,9000,Public,BTXT,"Donec orci magna, tristique tempus faucibus id, dignissim at neque. Proin quis ipsum leo. Vivamus vitae libero ut ipsum gravida accumsan. Proin ut massa sapien, ac hendrerit nisi. Nulla commodo enim id turpis varius nec cursus leo dignissim. Mauris laoreet tempor mi, sit amet molestie nisi tincidunt eget. Nulla elit orci, dictum sed tempus id, suscipit at lacus. Sed hendrerit, nisi id pretium ultricies, arcu nibh ornare erat, et venenatis augue ligula aliquam risus.",Warm,,,,, +Bulk Account from CSV - #83,Customer - Channel,,2 Place Jussieu,Paris,,75251,France,2 Place Jussieu,Paris,,75251,France,(014) 427-4427,(014) 427-4428,CC213425,www.pyramid.com,4253,Construction,9.50E+08,2680,Public,PYR,"Suspendisse potenti. Donec tortor libero, facilisis quis mattis in, faucibus sit amet orci. +Curabitur nec turpis vel mi lobortis tincidunt. Sed vulputate diam eu enim vestibulum in porta turpis aliquam. Integer porta mollis scelerisque. Quisque accumsan ultrices nisi, et elementum libero adipiscing et. Pellentesque sem est, bibendum nec iaculis sit amet, tempus ut nibh. In porta laoreet lorem sed rhoncus. +Etiam feugiat turpis non sapien rutrum aliquam. Aenean ac nisl lorem.",,,,,, +Bulk Account from CSV - #84,Customer - Channel,,1301 Hoch Drive,Lawrence,KS,66045,USA,1301 Hoch Drive,Lawrence,KS,66045,USA,(785) 241-6200,(785) 241-6201,CC634267,dickenson-consulting.com,6752,Consulting,5.00E+07,120,Private,,"Nullam nisi turpis, sagittis in malesuada quis, feugiat sed lorem. Donec tortor justo, feugiat in tempor luctus, imperdiet nec sapien. Sed id dui in sapien varius aliquet eget ac mauris. Nullam tincidunt sodales risus nec semper. +Fusce pellentesque porta turpis non iaculis. Vivamus varius, dolor vel vulputate tristique, nunc augue elementum risus, sit amet sodales urna ligula eu risus. Suspendisse iaculis nulla non eros vulputate varius. +Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.",,,,,, +Bulk Account from CSV - #85,Customer - Direct,,"2334 N. Michigan Avenue, Suite 1500 +Chicago, IL 60601, USA",Chicago,IL,,,"2334 N. Michigan Avenue, Suite 1500 +Chicago, IL 60601, USA",,,,,(312) 596-1000,(312) 596-1500,CD439877,www.grandhotels.com,2268,Hospitality,5.00E+08,5600,Public,GHTL,"Morbi mollis pellentesque sem, vitae lobortis diam sollicitudin quis. Donec fermentum mauris vitae odio fringilla eget suscipit dolor fringilla. Nunc id lacus et purus ornare hendrerit in ut velit. Vivamus at tortor nisi. Curabitur lacinia volutpat urna, vel mollis lorem vulputate in. Aliquam erat volutpat. Integer et nibh sed sapien adipiscing sagittis non non nisi. Donec quis urna ac augue suscipit ultrices.",Warm,,,,, +Bulk Account from CSV - #86,Customer - Channel,,"620 SW 5th Avenue Suite 400 +Portland, Oregon 97204 +United States",Portland,OR,,,"620 SW 5th Avenue Suite 400 +Portland, Oregon 97204 +United States",,,,,(503) 421-7800,(503) 421-7801,CC947211,www.expressl&t.net,8742,Transportation,9.50E+08,12300,Public,EXLT,"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc nunc erat, molestie et interdum sit amet, lobortis laoreet ante. Cras imperdiet felis sit amet nunc tincidunt laoreet. Maecenas eu semper arcu. Suspendisse eu pretium magna. Nam tincidunt ligula dolor. Cras nec lacus odio, sed accumsan erat. Vivamus sed tellus sit amet nisi condimentum imperdiet at at nibh. Phasellus dignissim, urna sed faucibus porta, nisi felis ullamcorper est, eget sagittis sapien lacus eu dui. Praesent arcu odio, vestibulum a lacinia vitae, condimentum ac metus. Nullam pellentesque, nibh non fringilla iaculis, tortor est convallis libero, id malesuada tortor purus vitae orci",Cold,,,,, +Bulk Account from CSV - #87,Customer - Direct,,"888 N Euclid +Hallis Center, Room 501 +Tucson, AZ 85721 +United States",Tucson,AZ,,,"888 N Euclid +Hallis Center, Room 501 +Tucson, AZ 85721 +United States",,,,,(520) 773-9050,(520) 773-9060,CD736025,www.universityofarizona.com,7321,Education,,39000,Other,,"Cras facilisis, leo id auctor condimentum, elit quam consectetur ligula, in cursus arcu nulla nec ipsum. Sed id orci quam. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Praesent rutrum, augue at egestas porta, nibh felis dignissim odio, in mattis massa velit nec libero. +Quisque volutpat quam at turpis accumsan a accumsan diam volutpat. Praesent nec nibh a nulla tristique congue. Mauris egestas iaculis ipsum ac suscipit. Donec facilisis accumsan lacus vel porta. Mauris suscipit tempus ipsum, in ornare lacus interdum sed.",Warm,,,,, +Bulk Account from CSV - #88,Customer - Direct,,"1301 Avenue of the Americas +New York, NY 10019 +USA",New York,NY,,,"1301 Avenue of the Americas +New York, NY 10019 +USA",,,,,(212) 842-5500,(212) 842-5501,CD355118,http://www.uos.com,4437,Energy,5.60E+09,145000,Public,UOS,"Curabitur fermentum, mi eu adipiscing tincidunt, justo diam interdum dolor, tempor feugiat turpis erat et justo. Nunc sed nisi et eros tempor porttitor. +Curabitur blandit, tortor volutpat rhoncus gravida, nibh orci posuere purus, nec pellentesque lorem sapien a odio. +Donec semper nunc quis metus fringilla semper. Aliquam dapibus euismod imperdiet. +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. +Etiam gravida, nulla sit amet sollicitudin dictum, diam ante tempor ligula, sed imperdiet turpis urna a augue.",Hot,,,,, +Bulk Account from CSV - #89,Customer - Channel,,"345 Shoreline Park +Mountain View, CA 94043 +USA",Mountain View,CA,,,"345 Shoreline Park +Mountain View, CA 94043 +USA",,,,,(650) 867-3450,(650) 867-9895,CC978213,www.genepoint.com,3712,Biotechnology,3.00E+07,265,Private,,"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc nunc erat, molestie et interdum sit amet, lobortis laoreet ante. Cras imperdiet felis sit amet nunc tincidunt laoreet. Maecenas eu semper arcu. Suspendisse eu pretium magna. Nam tincidunt ligula dolor. Cras nec lacus odio, sed accumsan erat. Vivamus sed tellus sit amet nisi condimentum imperdiet at at nibh. Phasellus dignissim, urna sed faucibus porta, nisi felis ullamcorper est, eget sagittis sapien lacus eu dui. Praesent arcu odio, vestibulum a lacinia vitae, condimentum ac metus. Nullam pellentesque, nibh non fringilla iaculis, tortor est convallis libero, id malesuada tortor purus vitae orci",Cold,,,,, +Bulk Account from CSV - #90,Customer - Direct,,"Kings Park, 17th Avenue, Team Valley Trading Estate, +Gateshead, Tyne and Wear NE26 3HS +United Kingdom",,UK,,,"Kings Park, 17th Avenue, Team Valley Trading Estate, +Gateshead, Tyne and Wear NE26 3HS +United Kingdom",,,,,+44 191 4956203,+44 191 4956620,CD355119-A,http://www.uos.com,4437,Energy,,24000,Public,UOS,"Cras facilisis, leo id auctor condimentum, elit quam consectetur ligula, in cursus arcu nulla nec ipsum. Sed id orci quam. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Praesent rutrum, augue at egestas porta, nibh felis dignissim odio, in mattis massa velit nec libero. +Quisque volutpat quam at turpis accumsan a accumsan diam volutpat. Praesent nec nibh a nulla tristique congue. Mauris egestas iaculis ipsum ac suscipit. Donec facilisis accumsan lacus vel porta. Mauris suscipit tempus ipsum, in ornare lacus interdum sed.",,,,,, +Bulk Account from CSV - #91,Customer - Direct,,"9 Tagore Lane +Singapore, Singapore 787472 +Singapore",Singapore,Singapore,,,"9 Tagore Lane +Singapore, Singapore 787472 +Singapore",,,,,(650) 450-8810,(650) 450-8820,CD355120-B,http://www.uos.com,4437,Energy,,3000,Public,UOS,"Curabitur fermentum, mi eu adipiscing tincidunt, justo diam interdum dolor, tempor feugiat turpis erat et justo. Nunc sed nisi et eros tempor porttitor. +Curabitur blandit, tortor volutpat rhoncus gravida, nibh orci posuere purus, nec pellentesque lorem sapien a odio. +Donec semper nunc quis metus fringilla semper. Aliquam dapibus euismod imperdiet. +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. +Etiam gravida, nulla sit amet sollicitudin dictum, diam ante tempor ligula, sed imperdiet turpis urna a augue.",,,,,, +Bulk Account from CSV - #92,Customer - Direct,,"312 Constitution Place +Austin, TX 78767 +USA",Austin,TX,,,"312 Constitution Place +Austin, TX 78767 +USA",,,,,(512) 757-6000,(512) 757-9000,CD451796,http://edgecomm.com,6576,Electronics,1.39E+08,1000,Public,EDGE,"Curabitur eget urna non dolor dapibus faucibus. Nulla posuere, tellus a vestibulum rutrum, enim neque elementum nibh, ac luctus quam urna a nisi. +Phasellus nec ligula non dolor aliquam scelerisque ac id felis. Integer semper pellentesque hendrerit. +Quisque vitae felis nunc. Aliquam eu nisi lacus, scelerisque aliquet leo. Donec elementum mollis tortor id viverra. Curabitur molestie gravida fringilla. Donec pharetra metus nec velit consectetur quis placerat quam euismod.",Hot,,,,, +Bulk Account from CSV - #93,Customer - Direct,,525 S. Lexington Ave,Burlington,NC,27215,USA,,,,,,(336) 222-7000,(336) 222-8000,CD656092,www.burlington.com,546732,Apparel,3.50E+08,9000,Public,BTXT,"Donec orci magna, tristique tempus faucibus id, dignissim at neque. Proin quis ipsum leo. Vivamus vitae libero ut ipsum gravida accumsan. Proin ut massa sapien, ac hendrerit nisi. Nulla commodo enim id turpis varius nec cursus leo dignissim. Mauris laoreet tempor mi, sit amet molestie nisi tincidunt eget. Nulla elit orci, dictum sed tempus id, suscipit at lacus. Sed hendrerit, nisi id pretium ultricies, arcu nibh ornare erat, et venenatis augue ligula aliquam risus.",Warm,,,,, +Bulk Account from CSV - #94,Customer - Channel,,2 Place Jussieu,Paris,,75251,France,2 Place Jussieu,Paris,,75251,France,(014) 427-4427,(014) 427-4428,CC213425,www.pyramid.com,4253,Construction,9.50E+08,2680,Public,PYR,"Suspendisse potenti. Donec tortor libero, facilisis quis mattis in, faucibus sit amet orci. +Curabitur nec turpis vel mi lobortis tincidunt. Sed vulputate diam eu enim vestibulum in porta turpis aliquam. Integer porta mollis scelerisque. Quisque accumsan ultrices nisi, et elementum libero adipiscing et. Pellentesque sem est, bibendum nec iaculis sit amet, tempus ut nibh. In porta laoreet lorem sed rhoncus. +Etiam feugiat turpis non sapien rutrum aliquam. Aenean ac nisl lorem.",,,,,, +Bulk Account from CSV - #95,Customer - Channel,,1301 Hoch Drive,Lawrence,KS,66045,USA,1301 Hoch Drive,Lawrence,KS,66045,USA,(785) 241-6200,(785) 241-6201,CC634267,dickenson-consulting.com,6752,Consulting,5.00E+07,120,Private,,"Nullam nisi turpis, sagittis in malesuada quis, feugiat sed lorem. Donec tortor justo, feugiat in tempor luctus, imperdiet nec sapien. Sed id dui in sapien varius aliquet eget ac mauris. Nullam tincidunt sodales risus nec semper. +Fusce pellentesque porta turpis non iaculis. Vivamus varius, dolor vel vulputate tristique, nunc augue elementum risus, sit amet sodales urna ligula eu risus. Suspendisse iaculis nulla non eros vulputate varius. +Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.",,,,,, +Bulk Account from CSV - #96,Customer - Direct,,"2334 N. Michigan Avenue, Suite 1500 +Chicago, IL 60601, USA",Chicago,IL,,,"2334 N. Michigan Avenue, Suite 1500 +Chicago, IL 60601, USA",,,,,(312) 596-1000,(312) 596-1500,CD439877,www.grandhotels.com,2268,Hospitality,5.00E+08,5600,Public,GHTL,"Morbi mollis pellentesque sem, vitae lobortis diam sollicitudin quis. Donec fermentum mauris vitae odio fringilla eget suscipit dolor fringilla. Nunc id lacus et purus ornare hendrerit in ut velit. Vivamus at tortor nisi. Curabitur lacinia volutpat urna, vel mollis lorem vulputate in. Aliquam erat volutpat. Integer et nibh sed sapien adipiscing sagittis non non nisi. Donec quis urna ac augue suscipit ultrices.",Warm,,,,, +Bulk Account from CSV - #97,Customer - Channel,,"620 SW 5th Avenue Suite 400 +Portland, Oregon 97204 +United States",Portland,OR,,,"620 SW 5th Avenue Suite 400 +Portland, Oregon 97204 +United States",,,,,(503) 421-7800,(503) 421-7801,CC947211,www.expressl&t.net,8742,Transportation,9.50E+08,12300,Public,EXLT,"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc nunc erat, molestie et interdum sit amet, lobortis laoreet ante. Cras imperdiet felis sit amet nunc tincidunt laoreet. Maecenas eu semper arcu. Suspendisse eu pretium magna. Nam tincidunt ligula dolor. Cras nec lacus odio, sed accumsan erat. Vivamus sed tellus sit amet nisi condimentum imperdiet at at nibh. Phasellus dignissim, urna sed faucibus porta, nisi felis ullamcorper est, eget sagittis sapien lacus eu dui. Praesent arcu odio, vestibulum a lacinia vitae, condimentum ac metus. Nullam pellentesque, nibh non fringilla iaculis, tortor est convallis libero, id malesuada tortor purus vitae orci",Cold,,,,, +Bulk Account from CSV - #98,Customer - Direct,,"888 N Euclid +Hallis Center, Room 501 +Tucson, AZ 85721 +United States",Tucson,AZ,,,"888 N Euclid +Hallis Center, Room 501 +Tucson, AZ 85721 +United States",,,,,(520) 773-9050,(520) 773-9060,CD736025,www.universityofarizona.com,7321,Education,,39000,Other,,"Cras facilisis, leo id auctor condimentum, elit quam consectetur ligula, in cursus arcu nulla nec ipsum. Sed id orci quam. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Praesent rutrum, augue at egestas porta, nibh felis dignissim odio, in mattis massa velit nec libero. +Quisque volutpat quam at turpis accumsan a accumsan diam volutpat. Praesent nec nibh a nulla tristique congue. Mauris egestas iaculis ipsum ac suscipit. Donec facilisis accumsan lacus vel porta. Mauris suscipit tempus ipsum, in ornare lacus interdum sed.",Warm,,,,, +Bulk Account from CSV - #99,Customer - Direct,,"1301 Avenue of the Americas +New York, NY 10019 +USA",New York,NY,,,"1301 Avenue of the Americas +New York, NY 10019 +USA",,,,,(212) 842-5500,(212) 842-5501,CD355118,http://www.uos.com,4437,Energy,5.60E+09,145000,Public,UOS,"Curabitur fermentum, mi eu adipiscing tincidunt, justo diam interdum dolor, tempor feugiat turpis erat et justo. Nunc sed nisi et eros tempor porttitor. +Curabitur blandit, tortor volutpat rhoncus gravida, nibh orci posuere purus, nec pellentesque lorem sapien a odio. +Donec semper nunc quis metus fringilla semper. Aliquam dapibus euismod imperdiet. +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. +Etiam gravida, nulla sit amet sollicitudin dictum, diam ante tempor ligula, sed imperdiet turpis urna a augue.",Hot,,,,, +Bulk Account from CSV - #100,Customer - Channel,,"345 Shoreline Park +Mountain View, CA 94043 +USA",Mountain View,CA,,,"345 Shoreline Park +Mountain View, CA 94043 +USA",,,,,(650) 867-3450,(650) 867-9895,CC978213,www.genepoint.com,3712,Biotechnology,3.00E+07,265,Private,,"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc nunc erat, molestie et interdum sit amet, lobortis laoreet ante. Cras imperdiet felis sit amet nunc tincidunt laoreet. Maecenas eu semper arcu. Suspendisse eu pretium magna. Nam tincidunt ligula dolor. Cras nec lacus odio, sed accumsan erat. Vivamus sed tellus sit amet nisi condimentum imperdiet at at nibh. Phasellus dignissim, urna sed faucibus porta, nisi felis ullamcorper est, eget sagittis sapien lacus eu dui. Praesent arcu odio, vestibulum a lacinia vitae, condimentum ac metus. Nullam pellentesque, nibh non fringilla iaculis, tortor est convallis libero, id malesuada tortor purus vitae orci",Cold,,,,, \ No newline at end of file From 67e498dd823e25d06f3e4ea0dc5667c7e1dd96e9 Mon Sep 17 00:00:00 2001 From: Shinichi Tomita Date: Fri, 11 Jan 2013 12:45:25 +0900 Subject: [PATCH 13/24] delete unneeded list call --- lib/bulk.js | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/bulk.js b/lib/bulk.js index 8505633..d9561e4 100644 --- a/lib/bulk.js +++ b/lib/bulk.js @@ -87,7 +87,6 @@ Job.prototype.createBatch = function() { var self = this; batch.on('queue', function() { self._batches[batch.id] = batch; - self.list(function() {}); }); return batch; }; From c1e17b4295b78f50937971b76b42938c600e75b0 Mon Sep 17 00:00:00 2001 From: Shinichi Tomita Date: Fri, 11 Jan 2013 14:52:29 +0900 Subject: [PATCH 14/24] enable record stream --- lib/bulk.js | 18 ++++++++---------- lib/query.js | 20 ++++++++++++++------ lib/record-stream.js | 32 +++++++++++++------------------- 3 files changed, 35 insertions(+), 35 deletions(-) diff --git a/lib/bulk.js b/lib/bulk.js index d9561e4..9d5ffbb 100644 --- a/lib/bulk.js +++ b/lib/bulk.js @@ -1,8 +1,10 @@ -var stream = require('stream'), +var util = require('util'), + stream = require('stream'), Stream = stream.Stream, events = require('events'), _ = require('underscore')._, Connection = require('./connection'), + RecordStream = require('./record-stream'), CSV = require('./csv'); /** @@ -139,7 +141,7 @@ Job.prototype.list = function(callback) { }, function(err, res) { var batchInfoList; if (res) { - logger.debug(res.batchInfoList); + logger.debug(res.batchInfoList.batchInfo); batchInfoList = res.batchInfoList; batchInfoList = _.isArray(batchInfoList.batchInfo) ? batchInfoList.batchInfo : [ batchInfoList.batchInfo ]; } @@ -223,10 +225,10 @@ var Batch = function(conn, job, batchId) { this._conn = conn; this.job = job; this.id = batchId; - this.writable = true; + this.sendable = true; }; -Batch.prototype = new events.EventEmitter(); +util.inherits(Batch, RecordStream); /** * @@ -235,11 +237,7 @@ Batch.prototype.run = Batch.prototype.exec = Batch.prototype.execute = function(input, callback) { var self = this; - var jobId = this.job.id; - if (!jobId) { - this.job.on("open", function() { self.execute(input, callback); }); - return; - } + if (this.id) { throw new Error("Batch already executed and has id."); } @@ -378,7 +376,7 @@ Batch.prototype.poll = function(interval, timeout) { if (parseInt(res.numberRecordsProcessed, 10) > 0) { self.retrieve(); } else { - self.emit('error', { message: "Batch request failed." }); + self.emit('error', { message: res.stateMessage }); } } else if (res.state === "Completed") { self.retrieve(); diff --git a/lib/query.js b/lib/query.js index f914fca..be8085c 100644 --- a/lib/query.js +++ b/lib/query.js @@ -231,19 +231,27 @@ Query.prototype.execute = function(options, callback) { }; +/** + * Auto start query when pipe called. + */ +Query.prototype.pipe = function() { + var dist = RecordStream.prototype.pipe.apply(this, arguments); + this.resume(); + return dist; +}; + /** * Create ReadableStream instance for serializing records */ Query.prototype.stream = function(type) { type = type || 'csv'; - var stream; + var recStream; if (type === "csv") { - stream = new RecordStream.CSVStream(); + recStream = new RecordStream.CSVStream(); } - if (!stream) { + if (!recStream) { throw new Error("No stream type defined for '"+type+"'."); } - this.pipe(stream); - this.resume(); - return stream; + this.pipe(recStream); + return recStream.stream(); // get readable stream instance }; \ No newline at end of file diff --git a/lib/record-stream.js b/lib/record-stream.js index 135dd30..d094145 100644 --- a/lib/record-stream.js +++ b/lib/record-stream.js @@ -156,16 +156,17 @@ RecordStream.prototype.pipe = function (dest, options) { /* --------------------------------------------------- */ /** - * CSVStream (extends extends ReadableStream implements OutputRecordStream) + * CSVStream (extends OutputRecordStream) */ var CSVStream = function(headers) { this.sendable = true; this.readable = true; this.headers = headers; this.wroteHeaders = false; + this._stream = new Stream(); }; -util.inherits(CSVStream, Stream); +util.inherits(CSVStream, RecordStream); /** * @@ -173,16 +174,9 @@ util.inherits(CSVStream, Stream); CSVStream.prototype.send = function(record) { if (!this.wroteHeaders) { if (!this.headers) { - var headers = {}; - for (var key in record) { - var value = record[key]; - if (typeof value === 'string' || value === null) { - headers[key] = true; - } - } - this.headers = _.keys(headers); + this.headers = CSV.extractHeaders([ record ]); } - this.emit("data", CSV.arrayToCSV(this.headers) + "\n"); + this._stream.emit("data", CSV.arrayToCSV(this.headers) + "\n"); this.wroteHeaders = true; } var row = []; @@ -193,24 +187,24 @@ CSVStream.prototype.send = function(record) { } row.push(String(value)); }); - this.emit("data", CSV.arrayToCSV(row) + "\n"); + this._stream.emit("data", CSV.arrayToCSV(row) + "\n"); }; /** * */ CSVStream.prototype.end = function(record) { + if (record) { this.send(record); } this.readable = false; this.sendable = false; - if (record) { this.send(record); } - this.emit("end"); + this._stream.emit("end"); }; - -CSVStream.prototype.destroy = -CSVStream.prototype.destroySoon = function() { - this.sendable = false; - this.readable = false; +/** + * Get delegating ReadableStream + */ +CSVStream.prototype.stream = function(record) { + return this._stream; }; From 45622c65bd5c9630994047ff19064b4057159912 Mon Sep 17 00:00:00 2001 From: Shinichi Tomita Date: Fri, 11 Jan 2013 13:46:01 +0900 Subject: [PATCH 15/24] add record stream methods --- lib/bulk.js | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/lib/bulk.js b/lib/bulk.js index 9d5ffbb..509f39a 100644 --- a/lib/bulk.js +++ b/lib/bulk.js @@ -270,6 +270,35 @@ Batch.prototype.execute = function(input, callback) { } }; +/** + * + */ +Batch.prototype.send = function(record) { + if (!this._csvStream) { + var csvStream = new RecordStream.CSVStream(); + csvStream.stream().pipe(this.stream()); + this._csvStream = csvStream; + } + record = _.clone(record); + if (this.job.operation === "insert") { + delete record.Id; + } + delete record.type; + delete record.attributes; + return this._csvStream.send(record); +}; + +/** + * + */ +Batch.prototype.end = function(record) { + if (record) { + this.send(record); + } + this.sendable = false; + this._csvStream.end(); +}; + /** * */ From 7b932fa526ec0ca97b29c1489f984eccda29560a Mon Sep 17 00:00:00 2001 From: Shinichi Tomita Date: Fri, 11 Jan 2013 14:00:20 +0900 Subject: [PATCH 16/24] remove pipe --- lib/bulk.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/bulk.js b/lib/bulk.js index 509f39a..4f86bdf 100644 --- a/lib/bulk.js +++ b/lib/bulk.js @@ -351,10 +351,6 @@ Batch.prototype.stream = function() { requestStream().end(data); }; - bstream.on("pipe", function(istream) { - istream.resume(); - }); - return bstream; }; From 96359816efd6067afb5ecb1dba85d68babf488b7 Mon Sep 17 00:00:00 2001 From: Shinichi Tomita Date: Fri, 11 Jan 2013 14:06:16 +0900 Subject: [PATCH 17/24] create batch stream class --- lib/bulk.js | 136 +++++++++++++++++++++++++++++----------------------- 1 file changed, 77 insertions(+), 59 deletions(-) diff --git a/lib/bulk.js b/lib/bulk.js index 4f86bdf..9cbe874 100644 --- a/lib/bulk.js +++ b/lib/bulk.js @@ -1,11 +1,11 @@ var util = require('util'), stream = require('stream'), - Stream = stream.Stream, - events = require('events'), - _ = require('underscore')._, - Connection = require('./connection'), + Stream = stream.Stream, + events = require('events'), + _ = require('underscore')._, + Connection = require('./connection'), RecordStream = require('./record-stream'), - CSV = require('./csv'); + CSV = require('./csv'); /** * @@ -299,60 +299,6 @@ Batch.prototype.end = function(record) { this._csvStream.end(); }; -/** - * - */ -Batch.prototype.stream = function() { - if (this._stream) { - return this._stream; - } - var batch = this; - var logger = this._conn._logger; - - var reqStream; - var requestStream = function() { - if (!reqStream) { - reqStream = batch._conn._request({ - method : 'POST', - url : batch._conn.urls.bulk.base + "/job/" + batch.job.id + "/batch", - headers: { - "Content-Type": "text/csv" - } - }, function(err, res) { - if (err) { - batch.emit('error', err); - } else { - logger.debug(res.batchInfo); - batch.id = res.batchInfo.id; - batch.emit('queue', res.batchInfo); - } - }, createRequestOption("application/xml")); - } - return reqStream; - }; - - var bstream = this._stream = new Stream(); - bstream.writable = true; - - bstream.write = function(data) { - if (!batch.job.id) { - batch.job.on("open", function() { bstream.write(data); }); - return; - } - requestStream().write(data); - }; - - bstream.end = function(data) { - if (!batch.job.id) { - batch.job.on("open", function() { bstream.end(data); }); - return; - } - bstream.writable = false; - requestStream().end(data); - }; - - return bstream; -}; /** @@ -446,6 +392,78 @@ Batch.prototype.retrieve = function(callback) { }, createRequestOption()); }; +/** + * + */ +Batch.prototype.stream = function() { + if (!this._stream) { + this._stream = new BatchStream(this); + } + return this._stream; +}; + +/*--------------------------------------------*/ + +/** + * Batch uploading stream (extends WritableStream) + */ +var BatchStream = function(batch) { + BatchStream.super_.call(this); + this.batch = batch; + this.writable = true; +}; + +util.inherits(BatchStream, Stream); + +/** + * + */ +BatchStream.prototype._getRequestStream = function() { + var batch = this.batch; + var conn = batch._conn; + var logger = conn._logger; + + if (!this._reqStream) { + this._reqStream = batch._conn._request({ + method : 'POST', + url : conn.urls.bulk.base + "/job/" + batch.job.id + "/batch", + headers: { + "Content-Type": "text/csv" + } + }, function(err, res) { + if (err) { + batch.emit('error', err); + } else { + logger.debug(res.batchInfo); + batch.id = res.batchInfo.id; + batch.emit('queue', res.batchInfo); + } + }, createRequestOption("application/xml")); + } + return this._reqStream; +}; + +BatchStream.prototype.write = function(data) { + var batch = this.batch; + var bstream = this; + if (!batch.job.id) { + batch.job.on("open", function() { bstream.write(data); }); + return; + } + this._getRequestStream().write(data); +}; + +BatchStream.prototype.end = function(data) { + var batch = this.batch; + var bstream = this; + if (!batch.job.id) { + batch.job.on("open", function() { bstream.end(data); }); + return; + } + bstream.writable = false; + this._getRequestStream().end(data); +}; + /*--------------------------------------------*/ /** From 681f3ae46c808948630864ee11a1f8bfef96d53f Mon Sep 17 00:00:00 2001 From: Shinichi Tomita Date: Fri, 11 Jan 2013 14:27:30 +0900 Subject: [PATCH 18/24] create write stream queue --- lib/bulk.js | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/lib/bulk.js b/lib/bulk.js index 9cbe874..d0709d1 100644 --- a/lib/bulk.js +++ b/lib/bulk.js @@ -445,25 +445,44 @@ BatchStream.prototype._getRequestStream = function() { BatchStream.prototype.write = function(data) { var batch = this.batch; - var bstream = this; if (!batch.job.id) { - batch.job.on("open", function() { bstream.write(data); }); + this._queue(data); return; } - this._getRequestStream().write(data); + return this._getRequestStream().write(data); }; BatchStream.prototype.end = function(data) { var batch = this.batch; - var bstream = this; if (!batch.job.id) { - batch.job.on("open", function() { bstream.end(data); }); + this._ending = true; + if (data) { + this._queue(data); + } return; } - bstream.writable = false; + this.writable = false; this._getRequestStream().end(data); }; +BatchStream.prototype._queue = function(data) { + var bstream = this; + var batch = this.batch; + if (!this._buffer) { + this._buffer = []; + batch.job.on("open", function() { + bstream._buffer.forEach(function(data) { + bstream.write(data); + }); + if (bstream._ending) { + bstream.end(); + } + bstream._buffer = []; + }); + } + this._buffer.push(data); +}; + /*--------------------------------------------*/ /** From e6c6dc21ea9f9fb923744bb9f29693d057bc9e06 Mon Sep 17 00:00:00 2001 From: Shinichi Tomita Date: Fri, 11 Jan 2013 16:27:09 +0900 Subject: [PATCH 19/24] add bulk method in sobject resource --- lib/record-stream.js | 29 +++++++++++++++++++++++++++ lib/sobject.js | 47 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 75 insertions(+), 1 deletion(-) diff --git a/lib/record-stream.js b/lib/record-stream.js index d094145..81e6cc8 100644 --- a/lib/record-stream.js +++ b/lib/record-stream.js @@ -153,6 +153,35 @@ RecordStream.prototype.pipe = function (dest, options) { }; +/* --------------------------------------------------- */ + +/** + * Map record and pass to downstream + */ +RecordStream.map = function(fn) { + var rstream = new RecordStream(); + rstream.send = function(record) { + var rec = fn(record) || record; // if not returned record, use same record + this.emit('record', rec); + }; + return rstream; +}; + + +/** + * Filter record to pass to downstream + */ +RecordStream.filter = function(fn) { + var rstream = new RecordStream(); + rstream.send = function(record) { + if (fn(record)) { + this.emit('record', record); + } + }; + return rstream; +}; + + /* --------------------------------------------------- */ /** diff --git a/lib/sobject.js b/lib/sobject.js index 0a56467..1aa98e2 100644 --- a/lib/sobject.js +++ b/lib/sobject.js @@ -13,7 +13,8 @@ var SObject = module.exports = function(conn, type) { /** * Creating records */ -SObject.prototype.create = function(records, callback) { +SObject.prototype.create = +SObject.prototype.insert = function(records, callback) { this._conn.create(this.type, records, callback); }; @@ -130,3 +131,47 @@ SObject.prototype.count = function(conditions, callback) { if (callback) { query.run(callback); } return query; }; + + +/** + * Call Bulk#load() to execute bulkload, returning batch object + */ +SObject.prototype.bulkload = function(operation, input, callback) { + return this._conn.bulk.load(this.type, operation, input, callback); +}; + +/** + * + */ +SObject.prototype.createBulk = +SObject.prototype.insertBulk = function(input, callback) { + return this.bulkload("insert", input, callback); +}; + +/** + * + */ +SObject.prototype.updateBulk = function(input, callback) { + return this.bulkload("update", input, callback); +}; + +/** + * + */ +SObject.prototype.upsertBulk = function(input, callback) { + return this.bulkload("upsert", input, callback); +}; + +/** + * + */ +SObject.prototype.deleteBulk = function(input, callback) { + return this.bulkload("delete", input, callback); +}; + +/** + * + */ +SObject.prototype.deleteHardBulk = function(input, callback) { + return this.bulkload("hardDelete", input, callback); +}; From 98177e464da99fd5e0157f978f3dc3d369d298b4 Mon Sep 17 00:00:00 2001 From: Shinichi Tomita Date: Fri, 11 Jan 2013 17:00:40 +0900 Subject: [PATCH 20/24] remove check in test which cause error in zombie --- test/oauth2.test.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/oauth2.test.js b/test/oauth2.test.js index 580b224..98c6711 100644 --- a/test/oauth2.test.js +++ b/test/oauth2.test.js @@ -32,9 +32,6 @@ vows.describe("oauth2").addBatch({ "should get login page" : function() { assert.ok(browser.success); assert.equal(browser.location.href.indexOf(oauth2.loginUrl), 0); - assert.lengthOf(browser.body.querySelectorAll('input[name=username]'), 1); - assert.lengthOf(browser.body.querySelectorAll('input[name=pw]'), 1); - assert.lengthOf(browser.body.querySelectorAll('input[name=Login]'), 1); }, ", then input username/password" : { From dee97db33cd0b2b14cbb825b996cae0303df5a24 Mon Sep 17 00:00:00 2001 From: Shinichi Tomita Date: Fri, 11 Jan 2013 17:19:56 +0900 Subject: [PATCH 21/24] change query pausing flag default false to true --- lib/query.js | 6 +++++- test/query.test.js | 1 - 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/query.js b/lib/query.js index be8085c..be53207 100644 --- a/lib/query.js +++ b/lib/query.js @@ -20,7 +20,7 @@ var Query = module.exports = function(conn, config, locator) { } this._locator = locator; this._buffer = []; - this._paused = false; + this._paused = true; this._closed = false; Query.super_.apply(this); @@ -116,6 +116,9 @@ Query.prototype.resume = function() { if (this._closed) { throw new Error("resuming already closed stream"); } + if (!this._paused) { + return; + } // do nothing if not paused this._paused = false; while (!this._paused && this._buffer.length > 0) { if (this.totalFetched >= this._maxFetch) { @@ -156,6 +159,7 @@ Query.prototype.execute = function(options, callback) { if (self._closed) { throw new Error("executing already closed query"); } + this._paused = false; // mark pause flag to false options = options || {}; if (typeof options === "function") { diff --git a/test/query.test.js b/test/query.test.js index 14a9cc7..10068b5 100644 --- a/test/query.test.js +++ b/test/query.test.js @@ -115,7 +115,6 @@ vows.describe("query").addBatch({ self.callback(null, { query : query, records : records }); }; query.pipe(outStream); - query.resume(); query.on("error", function(err) { self.callback(err); }); }, From c92061311fc851a51d05a605257a45630dd594b5 Mon Sep 17 00:00:00 2001 From: Shinichi Tomita Date: Fri, 11 Jan 2013 17:46:49 +0900 Subject: [PATCH 22/24] update README.md to include bulk operation and record stream pipeline --- README.md | 164 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 164 insertions(+) diff --git a/README.md b/README.md index 7092e74..9edd64b 100644 --- a/README.md +++ b/README.md @@ -395,6 +395,170 @@ conn.topic("InvoiceStatementUpdates").subscribe(function(message) { ``` +## Bulk Operation + +### Loading records + +```javascript +// Records to insert in bulk. +var accounts = [ +{ Name : 'Account #1', ... }, +{ Name : 'Account #2', ... }, +{ Name : 'Account #3', ... }, +... +]; + +// Create bulkload job and add batch to execute loading, +var job = conn.bulk.createJob("Account", "insert"); +var batch = job.createBatch(); +batch.on("queue", function(batchInfo) { // fired when batch request is queued in server. + batchId = batchInfo.id); + jobId = batchInfo.jobId); + // ... +}); +batch.execute(acconts); + +// and check the status later. +var job = conn.bulk.job(jobId); +var batch = job.batch(batchId); +batch.poll(1000 /* interval(ms) */, 20000 /* timeout(ms) */); // start polling +batch.on("response", function(rets) { // fired when batch finished and result retrieved + if (err) { return console.error(err); } + for (var i=0; i < rets.length; i++) { + if (rets[i].success) { + console.log("#" + (i+1) + " loaded successfully, id = " + rets[i].id); + } else { + console.log("#" + (i+1) + " error occurred, message = " + rets[i].errors.join(', ')); + } + } + // ... +}); + +// or use Bulk#load() method in one call to upload records and fetch results. +conn.bulk.load("Account", "insert", acconts, function(err, rets) { + if (err) { return console.error(err); } + for (var i=0; i < rets.length; i++) { + if (rets[i].success) { + console.log("#" + (i+1) + " loaded successfully, id = " + rets[i].id); + } else { + console.log("#" + (i+1) + " error occurred, message = " + rets[i].errors.join(', ')); + } + } + // ... +}); + +// same as following calls +conn.sobject("Account").insertBulk(acconts, function(err, rets) { + // ... +}); + +// +conn.sobject("Account").bulkload("insert").execute(acconts, function(err, rets) { + // ... +}); +``` + +### Loading CSV file + +```javascript +// CSV file to upload +var csvFileIn = require('fs').createReadStream("path/to/Account.csv"); + +// Create bulkload job and add batch to execute loading, +var job = conn.bulk.createJob("Account", "insert"); +var batch = job.createBatch(); +batch.on("queue", function(batchInfo) { // fired when batch request is queued in server. + batchId = batchInfo.id); + jobId = batchInfo.jobId); + // ... +}); + +// connect any readable stream via pipe method +csvFileIn.pipe(batch.stream()); + + +// or use Bulk#load() method in one call to upload file and fetch results. +conn.bulk.load("Account", "insert", csvFileIn, function(err, rets) { + if (err) { return console.error(err); } + for (var i=0; i < rets.length; i++) { + if (rets[i].success) { + console.log("#" + (i+1) + " loaded successfully, id = " + rets[i].id); + } else { + console.log("#" + (i+1) + " error occurred, message = " + rets[i].errors.join(', ')); + } + } + // ... +}); + + +``` + +## Record Stream Pipeline + +### +```javascript +// DELETE FROM Account WHERE CreatedDate < LAST_YEAR +var Account = conn.sobject('Account'); +Account.find({ CreatedDate: { $lt: sf.Date.LAST_YEAR }}) + .pipe(Account.deleteBulk()) + .on('response', function(rets){ + // ... + }) + .on('error', function(err) { + // ... + }); + +// UPDATE Opportunity SET Name = Accout.Name + ' - ' + Name WHERE Account.Id = :accId +var Opportunity = conn.sobject('Opportunity'); +Opportunity.find({ "Account.Id" : accId }, + { Id: 1, Name: 1, "Account.Name": 1 }) + .pipe(sf.RecordStream.map(function(r) { + r.Name = r.Account.Name + ' - ' + r.Name; + return r; + })) + .pipe(Opportunity.updateBulk()) + .on('response', function(rets) { + // ... + }) + .on('error', function(err) { + // ... + }); + +// Export all account records to CSV file +var csvFileOut = require('fs').createWriteStream('path/to/Account.csv'); +conn.query("SELECT Id, Name, Type, BillingState, BillingCity, BillingStreet FROM Account") + .stream() + .pipe(csvFileOut); + +``` + +### Data migration via bulk stream + +```javascript + +// Connection for org which migrate to +var conn1 = new sf.Connection( + // ... +); + +// Connection for org which migrate to +var conn2 = new sf.Connection( + // ... +); + +var query = conn1.query("SELECT Id, Name, Type, BillingState, BillingCity, BillingStreet FROM Account"); +var job = conn2.bulk.createJob("Account", "insert"); +var batch = job.createBatch(); +query.pipe(batch); +batch.on('queue', function() { + //... + jobId = job.id; + batchId = batch.id; +}) + +``` + + ## Change History v0.4.0 (Nov 05, 2012): From a8cc6b1e6f3817d10e20ad5e13bcf157843e9601 Mon Sep 17 00:00:00 2001 From: Shinichi Tomita Date: Fri, 11 Jan 2013 17:47:57 +0900 Subject: [PATCH 23/24] add change history in README.md --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 9edd64b..8b9066e 100644 --- a/README.md +++ b/README.md @@ -561,6 +561,15 @@ batch.on('queue', function() { ## Change History +v0.5.0 (Jan 11, 2013): + +* Support Bulk API for insert/update/upsert/delete/hardDelete operation (except for 'query'). + +* Refine Query#pipe to pipe to other output record stream (like bulk upload batch). + +* Add Query#stream() method to convert record stream to general node.js readable stream (generates CSV data). + + v0.4.0 (Nov 05, 2012): * Support JSON-style query object to query records other than SOQL, inspired by MongoDB query interface. From d708f581ea1b076da00f509790555fbc34f2684f Mon Sep 17 00:00:00 2001 From: Shinichi Tomita Date: Fri, 11 Jan 2013 17:24:59 +0900 Subject: [PATCH 24/24] change ver to 0.5.0 --- package.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index d851157..186e3e6 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "Salesforce API Connection Library for Node.js Applications", "keywords": [ "salesforce", "salesforce.com", "sfdc", "force.com", "database.com" ], "homepage": "http://github.com/stomita/node-salesforce", - "version": "0.4.0", + "version": "0.5.0", "repository": { "type": "git", "url": "git://github.com/stomita/node-salesforce.git" @@ -21,15 +21,15 @@ "node": ">=0.4.0" }, "dependencies": { - "async": ">= 0.1.12", - "request": ">= 2.1.1", - "underscore": ">= 1.2.1", + "async": "0.1.x", + "request": "2.12.x", + "underscore": "1.4.x", "xml2json": "0.3.2", "faye": "0.8.x" }, "devDependencies": { "express": "2.5.x", - "vows": "0.5.x", - "zombie": "1.4.x" + "vows": "0.7.x", + "zombie": "1.4.1" } }