b842ab9ece3d5eed0085cf2a426c67d7644c00ac
[oweals/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 }