]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/helpers/database-utils.ts
First typescript iteration
[github/Chocobozzz/PeerTube.git] / server / helpers / database-utils.ts
1 // TODO: import from ES6 when retry typing file will include errorFilter function
2 import retry = require('async/retry')
3
4 const db = require('../initializers/database')
5 import { logger } from './logger'
6
7 function commitTransaction (t, callback) {
8 return t.commit().asCallback(callback)
9 }
10
11 function rollbackTransaction (err, t, callback) {
12 // Try to rollback transaction
13 if (t) {
14 // Do not catch err, report the original one
15 t.rollback().asCallback(function () {
16 return callback(err)
17 })
18 } else {
19 return callback(err)
20 }
21 }
22
23 // { arguments, errorMessage }
24 function retryTransactionWrapper (functionToRetry, options, finalCallback) {
25 const args = options.arguments ? options.arguments : []
26
27 transactionRetryer(
28 function (callback) {
29 return functionToRetry.apply(this, args.concat([ callback ]))
30 },
31 function (err) {
32 if (err) {
33 logger.error(options.errorMessage, { error: err })
34 }
35
36 // Do not return the error, continue the process
37 return finalCallback(null)
38 }
39 )
40 }
41
42 function transactionRetryer (func, callback) {
43 retry({
44 times: 5,
45
46 errorFilter: function (err) {
47 const willRetry = (err.name === 'SequelizeDatabaseError')
48 logger.debug('Maybe retrying the transaction function.', { willRetry })
49 return willRetry
50 }
51 }, func, callback)
52 }
53
54 function startSerializableTransaction (callback) {
55 db.sequelize.transaction({ isolationLevel: 'SERIALIZABLE' }).asCallback(function (err, t) {
56 // We force to return only two parameters
57 return callback(err, t)
58 })
59 }
60
61 // ---------------------------------------------------------------------------
62
63 export {
64 commitTransaction,
65 retryTransactionWrapper,
66 rollbackTransaction,
67 startSerializableTransaction,
68 transactionRetryer
69 }