// Copyright 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "sync/internal_api/public/read_transaction.h"

#include <stdint.h>

#include "sync/syncable/directory.h"
#include "sync/syncable/syncable_read_transaction.h"

namespace syncer {

//////////////////////////////////////////////////////////////////////////
// ReadTransaction member definitions
ReadTransaction::ReadTransaction(const tracked_objects::Location& from_here,
                                 UserShare* share)
    : BaseTransaction(share),
      transaction_(NULL),
      close_transaction_(true) {
  transaction_ = new syncable::ReadTransaction(from_here,
                                               share->directory.get());
}

ReadTransaction::ReadTransaction(UserShare* share,
                                 syncable::BaseTransaction* trans)
    : BaseTransaction(share),
      transaction_(trans),
      close_transaction_(false) {}

ReadTransaction::~ReadTransaction() {
  if (close_transaction_) {
    delete transaction_;
  }
}

syncable::BaseTransaction* ReadTransaction::GetWrappedTrans() const {
  return transaction_;
}

int64_t ReadTransaction::GetModelVersion(ModelType type) const {
  return transaction_->directory()->GetTransactionVersion(type);
}

void ReadTransaction::GetDataTypeContext(
    ModelType type,
    sync_pb::DataTypeContext* context) const {
  return transaction_->directory()->GetDataTypeContext(
      transaction_, type, context);
}

void ReadTransaction::GetAttachmentIdsToUpload(ModelType type,
                                               AttachmentIdList* ids) const {
  DCHECK(ids);
  transaction_->directory()->GetAttachmentIdsToUpload(transaction_, type, ids);
}

std::string ReadTransaction::GetStoreBirthday() const {
  return transaction_->directory()->store_birthday();
}

}  // namespace syncer
