| 327 | } |
| 328 | |
| 329 | func mergeNote(tx *database.DB, serverNote client.SyncFragNote, localNote database.Note) error { |
| 330 | var bookDeleted bool |
| 331 | err := tx.QueryRow("SELECT deleted FROM books WHERE uuid = ?", localNote.BookUUID).Scan(&bookDeleted) |
| 332 | if err != nil { |
| 333 | return errors.Wrapf(err, "checking if local book %s is deleted", localNote.BookUUID) |
| 334 | } |
| 335 | |
| 336 | // if the book is deleted, noop |
| 337 | if bookDeleted { |
| 338 | return nil |
| 339 | } |
| 340 | |
| 341 | // if the local copy is deleted, and it was edited on the server, override with server values and mark it not dirty. |
| 342 | if localNote.Deleted { |
| 343 | if _, err := tx.Exec("UPDATE notes SET usn = ?, book_uuid = ?, body = ?, edited_on = ?, deleted = ?, dirty = ? WHERE uuid = ?", |
| 344 | serverNote.USN, serverNote.BookUUID, serverNote.Body, serverNote.EditedOn, serverNote.Deleted, false, serverNote.UUID); err != nil { |
| 345 | return errors.Wrapf(err, "updating local note %s", serverNote.UUID) |
| 346 | } |
| 347 | |
| 348 | return nil |
| 349 | } |
| 350 | |
| 351 | mr, err := mergeNoteFields(tx, localNote, serverNote) |
| 352 | if err != nil { |
| 353 | return errors.Wrapf(err, "reporting note conflict for note %s", localNote.UUID) |
| 354 | } |
| 355 | |
| 356 | if _, err := tx.Exec("UPDATE notes SET usn = ?, book_uuid = ?, body = ?, edited_on = ?, deleted = ? WHERE uuid = ?", |
| 357 | serverNote.USN, mr.bookUUID, mr.body, mr.editedOn, serverNote.Deleted, serverNote.UUID); err != nil { |
| 358 | return errors.Wrapf(err, "updating local note %s", serverNote.UUID) |
| 359 | } |
| 360 | |
| 361 | return nil |
| 362 | } |
| 363 | |
| 364 | func stepSyncNote(tx *database.DB, n client.SyncFragNote) error { |
| 365 | var localNote database.Note |