Files
NodeBB/src/database/postgres/helpers.js

140 lines
3.0 KiB
JavaScript
Raw Normal View History

'use strict';
var helpers = {};
helpers.valueToString = function (value) {
if (value === null || value === undefined) {
return value;
}
return value.toString();
};
helpers.removeDuplicateValues = function (values) {
var others = Array.prototype.slice.call(arguments, 1);
for (var i = 0; i < values.length; i++) {
if (values.lastIndexOf(values[i]) !== i) {
values.splice(i, 1);
for (var j = 0; j < others.length; j++) {
others[j].splice(i, 1);
}
i -= 1;
}
}
};
helpers.ensureLegacyObjectType = function (db, key, type, callback) {
db.query({
name: 'ensureLegacyObjectTypeBefore',
text: `
DELETE FROM "legacy_object"
WHERE "expireAt" IS NOT NULL
AND "expireAt" <= CURRENT_TIMESTAMP`,
}, function (err) {
if (err) {
return callback(err);
}
db.query({
name: 'ensureLegacyObjectType1',
text: `
INSERT INTO "legacy_object" ("_key", "type")
VALUES ($1::TEXT, $2::TEXT::LEGACY_OBJECT_TYPE)
ON CONFLICT
DO NOTHING`,
values: [key, type],
}, function (err) {
if (err) {
return callback(err);
}
db.query({
name: 'ensureLegacyObjectType2',
text: `
SELECT "type"
FROM "legacy_object_live"
WHERE "_key" = $1::TEXT`,
values: [key],
}, function (err, res) {
if (err) {
return callback(err);
}
if (res.rows[0].type !== type) {
return callback(new Error('database: cannot insert ' + JSON.stringify(key) + ' as ' + type + ' because it already exists as ' + res.rows[0].type));
}
callback(null);
});
});
});
};
helpers.ensureLegacyObjectsType = function (db, keys, type, callback) {
db.query({
name: 'ensureLegacyObjectTypeBefore',
text: `
DELETE FROM "legacy_object"
WHERE "expireAt" IS NOT NULL
AND "expireAt" <= CURRENT_TIMESTAMP`,
}, function (err) {
if (err) {
return callback(err);
}
db.query({
name: 'ensureLegacyObjectsType1',
text: `
INSERT INTO "legacy_object" ("_key", "type")
SELECT k, $2::TEXT::LEGACY_OBJECT_TYPE
FROM UNNEST($1::TEXT[]) k
ON CONFLICT
DO NOTHING`,
values: [keys, type],
}, function (err) {
if (err) {
return callback(err);
}
db.query({
name: 'ensureLegacyObjectsType2',
text: `
SELECT "_key", "type"
FROM "legacy_object_live"
WHERE "_key" = ANY($1::TEXT[])`,
values: [keys],
}, function (err, res) {
if (err) {
return callback(err);
}
var invalid = res.rows.filter(function (r) {
return r.type !== type;
});
if (invalid.length) {
return callback(new Error('database: cannot insert multiple objects as ' + type + ' because they already exist: ' + invalid.map(function (r) {
return JSON.stringify(r._key) + ' is ' + r.type;
}).join(', ')));
}
var missing = keys.filter(function (k) {
return !res.rows.some(function (r) {
return r._key === k;
});
});
if (missing.length) {
return callback(new Error('database: failed to insert keys for objects: ' + JSON.stringify(missing)));
}
callback(null);
});
});
});
};
helpers.noop = function () {};
module.exports = helpers;