//===- BuildDB.h ------------------------------------------------*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2015 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See http://swift.org/LICENSE.txt for license information
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//

#ifndef LLBUILD_CORE_BUILDDB_H
#define LLBUILD_CORE_BUILDDB_H

#include "llbuild/Basic/LLVM.h"
#include "llvm/ADT/StringRef.h"

#include "llbuild/Core/BuildEngine.h"

#include <cstdint>
#include <memory>
#include <string>

namespace llbuild {
namespace core {

struct Result;
class Rule;

class BuildDB {
public:
  virtual ~BuildDB();

  /// Get a unique ID for the given key.
  ///
  /// This method is thread safe, and cannot fail.
  virtual KeyID getKeyID(const KeyType& key) = 0;

  /// Get the key corresponding to a key ID.
  ///
  /// This method is thread safe, and cannot fail.
  virtual KeyType getKeyForID(KeyID key) = 0;
  
  /// Get the current build iteration.
  ///
  /// \param success_out [out] Whether or not the query succeeded.
  /// \param error_out [out] Error string if success_out is false.
  virtual uint64_t getCurrentIteration(bool* success_out, std::string* error_out) = 0;

  /// Set the current build iteration.
  ///
  /// \param error_out [out] Error string if return value is false.
  virtual bool setCurrentIteration(uint64_t value, std::string* error_out) = 0;

  /// Look up the result for a rule.
  ///
  /// \param keyID The keyID for the rule.
  /// \param rule The rule to look up the result for.
  /// \param result_out [out] The result, if found.
  /// \param error_out [out] Error string if an error occurred.
  /// \returns True if the database had a stored result for the rule.
  //
  // FIXME: This might be more efficient if it returns Result.
  //
  // FIXME: Figure out if we want a more lazy approach where we make the
  // database cache result objects and we query them only when needed. This may
  // scale better to very large build graphs.
  virtual bool lookupRuleResult(KeyID keyID, const Rule& rule, Result* result_out, std::string* error_out) = 0;

  /// Update the stored result for a rule.
  ///
  /// The BuildEngine does not enforce that the dependencies for a Rule are
  /// unique. However, duplicate dependencies have no semantic meaning for the
  /// engine, and the database may elect to discard them from storage.
  ///
  /// The database *MUST*, however, correctly maintain the order of the
  /// dependencies.
  ///
  /// \param keyID The keyID for the rule.
  /// \param error_out [out] Error string if return value is false.
  virtual bool setRuleResult(KeyID keyID, const Rule& rule, const Result& result, std::string* error_out) = 0;

  /// Called by the build engine to indicate that a build has started.
  ///
  /// The engine guarantees that all mutation operations (e.g., \see
  /// setCurrentIteration() and \see setRuleResult()) are only called between
  /// build paired \see buildStarted() and \see buildComplete() calls.
  ///
  /// \param error_out [out] Error string if return value is false.
  virtual bool buildStarted(std::string* error_out) = 0;

  /// Called by the build engine to indicate a build has finished, and results
  /// should be written.
  ///
  /// The expected behavior of the database when \see buildStarted() is called,
  /// but \see buildComplete() is never called (e.g., due to a crash) is not
  /// prescribed. The database implementation may choose to put all
  /// modifications within the scope of a single build in a single transaction,
  /// or it may choose to eagerly commit partial results from the build.
  virtual void buildComplete() = 0;
};

/// Create a BuildDB instance backed by a SQLite3 database.
///
/// \param clientSchemaVersion An uninterpreted version number for use by the
/// client to allow batch changes to the stored build results; if the stored
/// schema does not match the provided version the database will be cleared upon
/// opening.
std::unique_ptr<BuildDB> createSQLiteBuildDB(StringRef path,
                                             uint32_t clientSchemaVersion,
                                             std::string* error_out);

}
}

#endif
