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