mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2025-02-24 00:21:12 +01:00
Merge pull request #4005 from mikiher/fix-triggers-for-new-databases
Add title triggers in new databases
This commit is contained in:
commit
bb5e16157c
@ -190,6 +190,8 @@ class Database {
|
|||||||
await this.buildModels(force)
|
await this.buildModels(force)
|
||||||
Logger.info(`[Database] Db initialized with models:`, Object.keys(this.sequelize.models).join(', '))
|
Logger.info(`[Database] Db initialized with models:`, Object.keys(this.sequelize.models).join(', '))
|
||||||
|
|
||||||
|
await this.addTriggers()
|
||||||
|
|
||||||
await this.loadData()
|
await this.loadData()
|
||||||
|
|
||||||
Logger.info(`[Database] running ANALYZE`)
|
Logger.info(`[Database] running ANALYZE`)
|
||||||
@ -771,6 +773,43 @@ class Database {
|
|||||||
return textQuery
|
return textQuery
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is used to create necessary triggers for new databases.
|
||||||
|
* It adds triggers to update libraryItems.title[IgnorePrefix] when (books|podcasts).title[IgnorePrefix] is updated
|
||||||
|
*/
|
||||||
|
async addTriggers() {
|
||||||
|
await this.addTriggerIfNotExists('books', 'title', 'id', 'libraryItems', 'title', 'mediaId')
|
||||||
|
await this.addTriggerIfNotExists('books', 'titleIgnorePrefix', 'id', 'libraryItems', 'titleIgnorePrefix', 'mediaId')
|
||||||
|
await this.addTriggerIfNotExists('podcasts', 'title', 'id', 'libraryItems', 'title', 'mediaId')
|
||||||
|
await this.addTriggerIfNotExists('podcasts', 'titleIgnorePrefix', 'id', 'libraryItems', 'titleIgnorePrefix', 'mediaId')
|
||||||
|
}
|
||||||
|
|
||||||
|
async addTriggerIfNotExists(sourceTable, sourceColumn, sourceIdColumn, targetTable, targetColumn, targetIdColumn) {
|
||||||
|
const action = `update_${targetTable}_${targetColumn}`
|
||||||
|
const fromSource = sourceTable === 'books' ? '' : `_from_${sourceTable}_${sourceColumn}`
|
||||||
|
const triggerName = this.convertToSnakeCase(`${action}${fromSource}`)
|
||||||
|
|
||||||
|
const [[{ count }]] = await this.sequelize.query(`SELECT COUNT(*) as count FROM sqlite_master WHERE type='trigger' AND name='${triggerName}'`)
|
||||||
|
if (count > 0) return // Trigger already exists
|
||||||
|
|
||||||
|
Logger.info(`[Database] Adding trigger ${triggerName}`)
|
||||||
|
|
||||||
|
await this.sequelize.query(`
|
||||||
|
CREATE TRIGGER ${triggerName}
|
||||||
|
AFTER UPDATE OF ${sourceColumn} ON ${sourceTable}
|
||||||
|
FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
UPDATE ${targetTable}
|
||||||
|
SET ${targetColumn} = NEW.${sourceColumn}
|
||||||
|
WHERE ${targetTable}.${targetIdColumn} = NEW.${sourceIdColumn};
|
||||||
|
END;
|
||||||
|
`)
|
||||||
|
}
|
||||||
|
|
||||||
|
convertToSnakeCase(str) {
|
||||||
|
return str.replace(/([A-Z])/g, '_$1').toLowerCase()
|
||||||
|
}
|
||||||
|
|
||||||
TextSearchQuery = class {
|
TextSearchQuery = class {
|
||||||
constructor(sequelize, supportsUnaccent, query) {
|
constructor(sequelize, supportsUnaccent, query) {
|
||||||
this.sequelize = sequelize
|
this.sequelize = sequelize
|
||||||
|
Loading…
Reference in New Issue
Block a user