// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

library;

import 'dart:collection';
// dart:core is imported explicitly so it is available at top-level without
//   the `core` prefix defined below.
import 'dart:core';
// Importing `dart:core` as `core` to allow access to `String` in `IdType`
//   without conflicts.
import 'dart:core' as core;
import 'dart:mirrors' as mirrors;

import 'package:meta/meta.dart';

import 'common.dart' show StreamFromPages;
import 'datastore.dart' as ds;
import 'service_scope.dart' as ss;

part 'src/db/annotations.dart';
part 'src/db/db.dart';
part 'src/db/exceptions.dart';
part 'src/db/model_db.dart';
part 'src/db/model_db_impl.dart';
part 'src/db/models.dart';

const Symbol _dbKey = #gcloud.db;

/// Access the [DatastoreDB] object available in the current service scope.
///
/// The returned object will be the one which was previously registered with
/// [registerDbService] within the current (or a parent) service scope.
///
/// Accessing this getter outside of a service scope will result in an error.
/// See the `package:gcloud/service_scope.dart` library for more information.
DatastoreDB get dbService => ss.lookup(_dbKey) as DatastoreDB;

/// Registers the [DatastoreDB] object within the current service scope.
///
/// The provided `db` object will be available via the top-level `dbService`
/// getter.
///
/// Calling this function outside of a service scope will result in an error.
/// Calling this function more than once inside the same service scope is not
/// allowed.
void registerDbService(DatastoreDB db) {
  ss.register(_dbKey, db);
}
