syncable_base_transaction.h revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef SYNC_SYNCABLE_SYNCABLE_BASE_TRANSACTION_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SYNC_SYNCABLE_SYNCABLE_BASE_TRANSACTION_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/location.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "sync/base/sync_export.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/syncable/syncable_id.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncable {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Directory;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A WriteTransaction has a writer tag describing which body of code is doing
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the write. This is defined up here since WriteTransactionInfo also contains
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// one.
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum WriterTag {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  INVALID,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SYNCER,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AUTHWATCHER,
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UNITTEST,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VACUUM_AFTER_SAVE,
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HANDLE_SAVE_FAILURE,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PURGE_ENTRIES,
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SYNCAPI,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure to update this if you update WriterTag.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string WriterTagToString(WriterTag writer_tag);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SYNC_EXPORT BaseTransaction {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Directory* directory() const;
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Id root_id() const;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~BaseTransaction();
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This should be called when a database corruption is detected and there is
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // no way for us to recover short of wiping the database clean. When this is
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // called we set a bool in the transaction. The caller has to unwind the
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // stack. When the destructor for the transaction is called it acts upon the
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // bool and calls the Directory to handle the unrecoverable error.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnUnrecoverableError(const tracked_objects::Location& location,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const std::string& message);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool unrecoverable_error_set() const;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BaseTransaction(const tracked_objects::Location& from_here,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const char* name,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  WriterTag writer,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  Directory* directory);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Lock();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Unlock();
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This should be called before unlocking because it calls the Direcotry's
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OnUnrecoverableError method which is not protected by locks and could
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be called from any thread. Holding the transaction lock ensures only one
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // thread could call the method at a time.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleUnrecoverableErrorIfSet();
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const tracked_objects::Location from_here_;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* const name_;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriterTag writer_;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Directory* const directory_;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Error information.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool unrecoverable_error_set_;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tracked_objects::Location unrecoverable_error_location_;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string unrecoverable_error_msg_;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class Entry;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BaseTransaction);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace syncable
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace syncer
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // SYNC_SYNCABLE_SYNCABLE_BASE_TRANSACTION_H_
85