@@ -233,7 +233,7 @@ func (k *Kobo) UpdateIfExists(cID string, len int) error {
233233 }
234234 if err = tx .Commit (); err != nil {
235235 return fmt .Errorf ("UpdateIfExists: Error committing transaction: %w" , err )
236- }
236+ }
237237 }
238238 return nil
239239}
@@ -594,7 +594,7 @@ func (k *Kobo) UpdateNickelDB() (bool, error) {
594594 var seriesNumFloat * float64
595595 tx , err := k .nickelDB .Begin ()
596596 if err != nil {
597- return rerun , fmt .Errorf ("UpdateNickelDB: Error beginning transaction: %w" , err )
597+ return rerun , fmt .Errorf ("UpdateNickelDB: Error beginning SeriesID transaction: %w" , err )
598598 }
599599 // Get Series and SeriesID from the DB for non-sideloaded books
600600 getSeriesQ := `
@@ -630,18 +630,30 @@ func (k *Kobo) UpdateNickelDB() (bool, error) {
630630 }
631631 for s , sID := range k .SeriesIDMap {
632632 if _ , err = seriesIDstmt .Exec (sID , s ); err != nil {
633- updateErr = fmt .Errorf ("UpdateNickelDB: %w" , err )
633+ tx .Rollback ()
634+ return rerun , fmt .Errorf ("UpdateNickelDB: %w" , err )
634635 }
635636 }
637+ if err = tx .Commit (); err != nil {
638+ return rerun , fmt .Errorf ("UpdateNickelDB: Error committing SeriesID transaction: %w" , err )
639+ }
640+
636641 // Once we've done that, also check if there are still empty SeriesID columns that have Series set,
637642 // and update if required. This shouldn't have much, if any, effect if KU has been run before, or
638643 // the device has been connected to calibre
639644 seriesIDQuery = `
640645 UPDATE content SET SeriesID=Series
641646 WHERE ContentType == 6 AND (Series IS NOT NULL OR Series != '') AND (SeriesID IS NULL OR SeriesID == '');`
642- if _ , err = tx .Exec (seriesIDQuery ); err != nil {
643- updateErr = fmt .Errorf ("UpdateNickelDB: %w" , err )
647+ if _ , err = k . nickelDB .Exec (seriesIDQuery ); err != nil {
648+ return rerun , fmt .Errorf ("UpdateNickelDB: %w" , err )
644649 }
650+
651+ // Begin a new transaction for updating metadata
652+ tx , err = k .nickelDB .Begin ()
653+ if err != nil {
654+ return rerun , fmt .Errorf ("UpdateNickelDB: Error beginning update transaction: %w" , err )
655+ }
656+
645657 // Prepare database with some statements
646658 // Insert prepared statement if using triggers
647659 var insertStmt * sql.Stmt
@@ -687,20 +699,21 @@ func (k *Kobo) UpdateNickelDB() (bool, error) {
687699 seriesNum = & sn
688700 seriesNumFloat = k .MetadataMap [cid ].SeriesIndex
689701 }
690- // Note, not rolling back transaction on error. Is this allowed?
691- // Don't want one bad update to derail the whole thing, hence avoiding rollback
702+ // We rollback on any sort of error, to lessen any chance of database corruption
692703 if _ , ok := k .BooksInDB [cid ]; ok {
693704 _ , err = updateStmt .Exec (desc , series , seriesNum , seriesNumFloat , seriesID , cid )
694705 if err != nil {
695- updateErr = fmt .Errorf ("UpdateNickelDB: %w" , err )
706+ tx .Rollback ()
707+ return rerun , fmt .Errorf ("UpdateNickelDB: %w" , err )
696708 }
697709 delete (k .UpdatedMetadata , cid )
698710 } else {
699711 rerun = true
700712 if k .KuConfig .AddMetadataByTrigger {
701713 _ , err = insertStmt .Exec (cid , desc , series , seriesNum , seriesNumFloat , seriesID )
702714 if err != nil {
703- updateErr = fmt .Errorf ("UpdateNickelDB: %w" , err )
715+ tx .Rollback ()
716+ return rerun , fmt .Errorf ("UpdateNickelDB: %w" , err )
704717 }
705718 delete (k .UpdatedMetadata , cid )
706719 }
0 commit comments