]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - server/helpers/database-utils.ts
Fix peertube subtitles import
[github/Chocobozzz/PeerTube.git] / server / helpers / database-utils.ts
index 422774022ac549168faca01afa2a3b247c373c5d..b6ba7fd75a846b449cf127ea511f4ef9d31e3946 100644 (file)
@@ -1,6 +1,6 @@
-import * as retry from 'async/retry'
-import * as Bluebird from 'bluebird'
-import { BindOrReplacements, QueryTypes, Transaction } from 'sequelize'
+import retry from 'async/retry'
+import Bluebird from 'bluebird'
+import { Transaction } from 'sequelize'
 import { Model } from 'sequelize-typescript'
 import { sequelizeTypescript } from '@server/initializers/database'
 import { logger } from './logger'
@@ -45,7 +45,7 @@ function retryTransactionWrapper <T> (
         .catch(err => callback(err))
   })
   .catch(err => {
-    logger.error(`Cannot execute ${functionToRetry.name} with many retries.`, { err })
+    logger.warn(`Cannot execute ${functionToRetry.name} with many retries.`, { err })
     throw err
   })
 }
@@ -68,20 +68,18 @@ function transactionRetryer <T> (func: (err: any, data: T) => any) {
   })
 }
 
-// ---------------------------------------------------------------------------
-
-function updateInstanceWithAnother <M, T extends U, U extends Model<M>> (instanceToUpdate: T, baseInstance: U) {
-  const obj = baseInstance.toJSON()
-
-  for (const key of Object.keys(obj)) {
-    instanceToUpdate[key] = obj[key]
-  }
+function saveInTransactionWithRetries <T extends Pick<Model, 'save'>> (model: T) {
+  return retryTransactionWrapper(() => {
+    return sequelizeTypescript.transaction(async transaction => {
+      await model.save({ transaction })
+    })
+  })
 }
 
-function resetSequelizeInstance (instance: Model<any>, savedFields: object) {
-  Object.keys(savedFields).forEach(key => {
-    instance[key] = savedFields[key]
-  })
+// ---------------------------------------------------------------------------
+
+function resetSequelizeInstance <T> (instance: Model<T>) {
+  return instance.reload()
 }
 
 function filterNonExistingModels <T extends { hasSameUniqueKeysThan (other: T): boolean }> (
@@ -95,18 +93,6 @@ function deleteAllModels <T extends Pick<Model, 'destroy'>> (models: T[], transa
   return Promise.all(models.map(f => f.destroy({ transaction })))
 }
 
-// Sequelize always skip the update if we only update updatedAt field
-function setAsUpdated (table: string, id: number, transaction?: Transaction) {
-  return sequelizeTypescript.query(
-    `UPDATE "${table}" SET "updatedAt" = :updatedAt WHERE id = :id`,
-    {
-      replacements: { table, id, updatedAt: new Date() },
-      type: QueryTypes.UPDATE,
-      transaction
-    }
-  )
-}
-
 // ---------------------------------------------------------------------------
 
 function runInReadCommittedTransaction <T> (fn: (t: Transaction) => Promise<T>) {
@@ -123,28 +109,13 @@ function afterCommitIfTransaction (t: Transaction, fn: Function) {
 
 // ---------------------------------------------------------------------------
 
-function doesExist (query: string, bind?: BindOrReplacements) {
-  const options = {
-    type: QueryTypes.SELECT as QueryTypes.SELECT,
-    bind,
-    raw: true
-  }
-
-  return sequelizeTypescript.query(query, options)
-            .then(results => results.length === 1)
-}
-
-// ---------------------------------------------------------------------------
-
 export {
   resetSequelizeInstance,
   retryTransactionWrapper,
   transactionRetryer,
-  updateInstanceWithAnother,
+  saveInTransactionWithRetries,
   afterCommitIfTransaction,
   filterNonExistingModels,
   deleteAllModels,
-  setAsUpdated,
-  runInReadCommittedTransaction,
-  doesExist
+  runInReadCommittedTransaction
 }