Fix an ogr2ogr export issue when the temporal name is too big
If the final name is going to be too big, use the hash over the proposed path to create an unique name that fits the requirements of path length under Linux
This commit is contained in:
parent
c529ac41ff
commit
25f15dfc61
1
NEWS.md
1
NEWS.md
@ -4,6 +4,7 @@
|
||||
Released 2020-mm-dd
|
||||
|
||||
- Updated allowed list of custom headers with the ones for metrics
|
||||
- Fix an ogr2ogr export issue when the temporal name is too big [`653`](https://github.com/CartoDB/CartoDB-SQL-API/issues/653).
|
||||
|
||||
|
||||
## 5.0.1
|
||||
|
@ -45,6 +45,11 @@ OgrFormat.prototype = {
|
||||
var hash = crypto.createHash('md5');
|
||||
hash.update(data);
|
||||
return hash.digest('hex');
|
||||
},
|
||||
|
||||
limitPathname: function (pathname) {
|
||||
if (pathname.length < 128) { return pathname; }
|
||||
return crypto.createHash('sha256').update(pathname).digest('hex');
|
||||
}
|
||||
|
||||
};
|
||||
@ -230,14 +235,14 @@ OgrFormat.prototype.toOGR_SingleFile = function (options, fmt, callback) {
|
||||
var layername = options.filename;
|
||||
|
||||
var tmpdir = global.settings.tmpDir || '/tmp';
|
||||
var reqKey = [
|
||||
var reqKey = this.limitPathname([
|
||||
fmt,
|
||||
dbname,
|
||||
userId,
|
||||
gcol,
|
||||
this.generateMD5(layername),
|
||||
this.generateMD5(sql)
|
||||
].concat(skipfields).join(':');
|
||||
].concat(skipfields).join(':'));
|
||||
var outdirpath = tmpdir + '/sqlapi-' + process.pid + '-' + reqKey;
|
||||
var dumpfile = outdirpath + ':cartodb-query.' + ext;
|
||||
|
||||
|
@ -37,7 +37,7 @@ ShpFormat.prototype.toSHP = function (options, callback) {
|
||||
var zip = global.settings.zipCommand || 'zip';
|
||||
var zipOptions = '-qrj';
|
||||
var tmpdir = global.settings.tmpDir || '/tmp';
|
||||
var reqKey = ['shp', dbname, userId, gcol, this.generateMD5(sql)].concat(skipfields).join(':');
|
||||
var reqKey = this.limitPathname(['shp', dbname, userId, gcol, this.generateMD5(sql)].concat(skipfields).join(':'));
|
||||
var outdirpath = tmpdir + '/sqlapi-' + process.pid + '-' + reqKey;
|
||||
var zipfile = outdirpath + '.zip';
|
||||
var shapefile = outdirpath + '/' + filename + '.shp';
|
||||
|
@ -31,6 +31,26 @@ describe('geopackage query', function () {
|
||||
});
|
||||
});
|
||||
|
||||
it('works with a long list of skipfields', function (done) {
|
||||
const longUrl = baseUrl + `&skipfields=the_geom_webmercator,${'a'.repeat(300)}`;
|
||||
assert.response(server, {
|
||||
url: longUrl,
|
||||
headers: { host: 'vizzuality.cartodb.com' },
|
||||
method: 'GET'
|
||||
}, { }, function (err, res) {
|
||||
assert.ifError(err);
|
||||
assert.strictEqual(res.statusCode, 200, res.body);
|
||||
assert.strictEqual(res.headers['content-type'], 'application/x-sqlite3; charset=utf-8');
|
||||
assert.notEqual(res.headers['content-disposition'].indexOf(tableName + '.gpkg'), -1);
|
||||
var db = new sqlite.Database(':memory:', res.body);
|
||||
var qr = db.get('PRAGMA database_list', function (err) {
|
||||
assert.strictEqual(err, null);
|
||||
done();
|
||||
});
|
||||
assert.notEqual(qr, undefined);
|
||||
});
|
||||
});
|
||||
|
||||
it('gets database and geopackage schema', function (done) {
|
||||
assert.response(server, {
|
||||
url: baseUrl,
|
||||
|
Loading…
Reference in New Issue
Block a user