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: 36424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) static Id root_id(); 37424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Directory* directory() const; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BaseTransaction(); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This should be called when a database corruption is detected and there is 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // no way for us to recover short of wiping the database clean. When this is 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // called we set a bool in the transaction. The caller has to unwind the 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // stack. When the destructor for the transaction is called it acts upon the 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // bool and calls the Directory to handle the unrecoverable error. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnUnrecoverableError(const tracked_objects::Location& location, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& message); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool unrecoverable_error_set() const; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BaseTransaction(const tracked_objects::Location& from_here, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* name, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WriterTag writer, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Directory* directory); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Lock(); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Unlock(); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This should be called before unlocking because it calls the Direcotry's 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OnUnrecoverableError method which is not protected by locks and could 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be called from any thread. Holding the transaction lock ensures only one 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // thread could call the method at a time. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void HandleUnrecoverableErrorIfSet(); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const tracked_objects::Location from_here_; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const name_; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WriterTag writer_; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Directory* const directory_; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Error information. 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool unrecoverable_error_set_; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracked_objects::Location unrecoverable_error_location_; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string unrecoverable_error_msg_; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class Entry; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BaseTransaction); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace syncable 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace syncer 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // SYNC_SYNCABLE_SYNCABLE_BASE_TRANSACTION_H_ 86