@Before public void setUp() { initMocks(this); client = new SpannerImpl.DatabaseAdminClientImpl(PROJECT_ID, rpc); }
@Test public void createDatabase() throws Exception { OperationFuture<Database, CreateDatabaseMetadata> rawOperationFuture = OperationFutureUtil.immediateOperationFuture( "createDatabase", getDatabaseProto(), CreateDatabaseMetadata.getDefaultInstance()); when(rpc.createDatabase( INSTANCE_NAME, "CREATE DATABASE `" + DB_ID + "`", Collections.<String>emptyList())) .thenReturn(rawOperationFuture); OperationFuture<com.google.cloud.spanner.Database, CreateDatabaseMetadata> op = client.createDatabase(INSTANCE_ID, DB_ID, Collections.<String>emptyList()); assertThat(op.isDone()).isTrue(); assertThat(op.get().getId().getName()).isEqualTo(DB_NAME); }
@Test public void dropDatabase() { client.dropDatabase(INSTANCE_ID, DB_ID); verify(rpc).dropDatabase(DB_NAME); }
@Override public OperationFuture<Void, UpdateDatabaseDdlMetadata> updateDatabaseDdl( final String instanceId, final String databaseId, final Iterable<String> statements, @Nullable String operationId) throws SpannerException { final String dbName = getDatabaseName(instanceId, databaseId); final String opId = operationId != null ? operationId : randomOperationId(); OperationFuture<Empty, UpdateDatabaseDdlMetadata> rawOperationFuture = rpc.updateDatabaseDdl(dbName, statements, opId); return new OperationFutureImpl<Void, UpdateDatabaseDdlMetadata>( rawOperationFuture.getPollingFuture(), rawOperationFuture.getInitialFuture(), new ApiFunction<OperationSnapshot, Void>() { @Override public Void apply(OperationSnapshot snapshot) { ProtoOperationTransformers.ResponseTransformer.create(Empty.class).apply(snapshot); return null; } }, ProtoOperationTransformers.MetadataTransformer.create(UpdateDatabaseDdlMetadata.class), new ApiFunction<Exception, Void>() { @Override public Void apply(Exception e) { throw SpannerExceptionFactory.newSpannerException(e); } }); }
@Override public OperationFuture<Database, CreateDatabaseMetadata> createDatabase( String instanceId, String databaseId, Iterable<String> statements) throws SpannerException { // CreateDatabase() is not idempotent, so we're not retrying this request. String instanceName = getInstanceName(instanceId); String createStatement = "CREATE DATABASE `" + databaseId + "`"; OperationFuture<com.google.spanner.admin.database.v1.Database, CreateDatabaseMetadata> rawOperationFuture = rpc.createDatabase(instanceName, createStatement, statements); return new OperationFutureImpl<Database, CreateDatabaseMetadata>( rawOperationFuture.getPollingFuture(), rawOperationFuture.getInitialFuture(), new ApiFunction<OperationSnapshot, Database>() { @Override public Database apply(OperationSnapshot snapshot) { return Database.fromProto( ProtoOperationTransformers.ResponseTransformer.create( com.google.spanner.admin.database.v1.Database.class) .apply(snapshot), DatabaseAdminClientImpl.this); } }, ProtoOperationTransformers.MetadataTransformer.create(CreateDatabaseMetadata.class), new ApiFunction<Exception, Database>() { @Override public Database apply(Exception e) { throw SpannerExceptionFactory.newSpannerException(e); } }); }
@Override public Page<Database> listDatabases(String instanceId, ListOption... options) { final String instanceName = getInstanceName(instanceId); final Options listOptions = Options.fromListOptions(options); Preconditions.checkArgument( !listOptions.hasFilter(), "Filter option is not support by" + "listDatabases"); final int pageSize = listOptions.hasPageSize() ? listOptions.pageSize() : 0; PageFetcher<Database, com.google.spanner.admin.database.v1.Database> pageFetcher = new PageFetcher<Database, com.google.spanner.admin.database.v1.Database>() { @Override public Paginated<com.google.spanner.admin.database.v1.Database> getNextPage( String nextPageToken) { return rpc.listDatabases(instanceName, pageSize, nextPageToken); } @Override public Database fromProto(com.google.spanner.admin.database.v1.Database proto) { return Database.fromProto(proto, DatabaseAdminClientImpl.this); } }; if (listOptions.hasPageToken()) { pageFetcher.nextPageToken = listOptions.pageToken(); } return pageFetcher.getNextPage(); }
@Override public Database getDatabase(String instanceId, String databaseId) throws SpannerException { final String dbName = getDatabaseName(instanceId, databaseId); Callable<Database> callable = new Callable<Database>() { @Override public Database call() throws Exception { return Database.fromProto(rpc.getDatabase(dbName), DatabaseAdminClientImpl.this); } }; return runWithRetries(callable); }
@Override public void dropDatabase(String instanceId, String databaseId) throws SpannerException { final String dbName = getDatabaseName(instanceId, databaseId); Callable<Void> callable = new Callable<Void>() { @Override public Void call() throws Exception { rpc.dropDatabase(dbName); return null; } }; runWithRetries(callable); }
SpannerImpl(SpannerRpc gapicRpc, int defaultPrefetchChunks, SpannerOptions options) { super(options); this.gapicRpc = gapicRpc; this.defaultPrefetchChunks = defaultPrefetchChunks; this.dbAdminClient = new DatabaseAdminClientImpl(options.getProjectId(), gapicRpc); this.instanceClient = new InstanceAdminClientImpl(options.getProjectId(), gapicRpc, dbAdminClient); }
@Override public List<String> getDatabaseDdl(String instanceId, String databaseId) { final String dbName = getDatabaseName(instanceId, databaseId); Callable<List<String>> callable = new Callable<List<String>>() { @Override public List<String> call() throws Exception { return rpc.getDatabaseDdl(dbName); } }; return runWithRetries(callable); }
@Override public OperationFuture<Void, UpdateDatabaseDdlMetadata> updateDatabaseDdl( final String instanceId, final String databaseId, final Iterable<String> statements, @Nullable String operationId) throws SpannerException { final String dbName = getDatabaseName(instanceId, databaseId); final String opId = operationId != null ? operationId : randomOperationId(); OperationFuture<Empty, UpdateDatabaseDdlMetadata> rawOperationFuture = rpc.updateDatabaseDdl(dbName, statements, opId); return new OperationFutureImpl<Void, UpdateDatabaseDdlMetadata>( rawOperationFuture.getPollingFuture(), rawOperationFuture.getInitialFuture(), new ApiFunction<OperationSnapshot, Void>() { @Override public Void apply(OperationSnapshot snapshot) { ProtoOperationTransformers.ResponseTransformer.create(Empty.class).apply(snapshot); return null; } }, ProtoOperationTransformers.MetadataTransformer.create(UpdateDatabaseDdlMetadata.class), new ApiFunction<Exception, Void>() { @Override public Void apply(Exception e) { throw SpannerExceptionFactory.newSpannerException(e); } }); }
@Override public OperationFuture<Database, CreateDatabaseMetadata> createDatabase( String instanceId, String databaseId, Iterable<String> statements) throws SpannerException { // CreateDatabase() is not idempotent, so we're not retrying this request. String instanceName = getInstanceName(instanceId); String createStatement = "CREATE DATABASE `" + databaseId + "`"; OperationFuture<com.google.spanner.admin.database.v1.Database, CreateDatabaseMetadata> rawOperationFuture = rpc.createDatabase(instanceName, createStatement, statements); return new OperationFutureImpl<Database, CreateDatabaseMetadata>( rawOperationFuture.getPollingFuture(), rawOperationFuture.getInitialFuture(), new ApiFunction<OperationSnapshot, Database>() { @Override public Database apply(OperationSnapshot snapshot) { return Database.fromProto( ProtoOperationTransformers.ResponseTransformer.create( com.google.spanner.admin.database.v1.Database.class) .apply(snapshot), DatabaseAdminClientImpl.this); } }, ProtoOperationTransformers.MetadataTransformer.create(CreateDatabaseMetadata.class), new ApiFunction<Exception, Database>() { @Override public Database apply(Exception e) { throw SpannerExceptionFactory.newSpannerException(e); } }); }
@Override public Page<Database> listDatabases(String instanceId, ListOption... options) { final String instanceName = getInstanceName(instanceId); final Options listOptions = Options.fromListOptions(options); Preconditions.checkArgument( !listOptions.hasFilter(), "Filter option is not support by" + "listDatabases"); final int pageSize = listOptions.hasPageSize() ? listOptions.pageSize() : 0; PageFetcher<Database, com.google.spanner.admin.database.v1.Database> pageFetcher = new PageFetcher<Database, com.google.spanner.admin.database.v1.Database>() { @Override public Paginated<com.google.spanner.admin.database.v1.Database> getNextPage( String nextPageToken) { return rpc.listDatabases(instanceName, pageSize, nextPageToken); } @Override public Database fromProto(com.google.spanner.admin.database.v1.Database proto) { return Database.fromProto(proto, DatabaseAdminClientImpl.this); } }; if (listOptions.hasPageToken()) { pageFetcher.nextPageToken = listOptions.pageToken(); } return pageFetcher.getNextPage(); }
@Test public void updateDatabaseDdlOpAlreadyExists() throws Exception { String originalOpName = DB_NAME + "/operations/originalop"; List<String> ddl = ImmutableList.of(); OperationFuture<Empty, UpdateDatabaseDdlMetadata> originalOp = OperationFutureUtil.immediateOperationFuture( originalOpName, Empty.getDefaultInstance(), UpdateDatabaseDdlMetadata.getDefaultInstance()); String newOpName = DB_NAME + "/operations/newop"; String newOpId = "newop"; OperationFuture<Empty, UpdateDatabaseDdlMetadata> newop = OperationFutureUtil.immediateOperationFuture( newOpName, Empty.getDefaultInstance(), UpdateDatabaseDdlMetadata.getDefaultInstance()); when(rpc.updateDatabaseDdl(DB_NAME, ddl, newOpId)).thenReturn(originalOp); OperationFuture<Void, UpdateDatabaseDdlMetadata> op = client.updateDatabaseDdl(INSTANCE_ID, DB_ID, ddl, newOpId); assertThat(op.getName()).isEqualTo(originalOpName); }
@Test public void listDatabases() { String pageToken = "token"; when(rpc.listDatabases(INSTANCE_NAME, 1, null)) .thenReturn(new Paginated<>(ImmutableList.<Database>of(getDatabaseProto()), pageToken)); when(rpc.listDatabases(INSTANCE_NAME, 1, pageToken)) .thenReturn(new Paginated<>(ImmutableList.<Database>of(getAnotherDatabaseProto()), "")); List<com.google.cloud.spanner.Database> dbs = Lists.newArrayList(client.listDatabases(INSTANCE_ID, Options.pageSize(1)).iterateAll()); assertThat(dbs.get(0).getId().getName()).isEqualTo(DB_NAME); assertThat(dbs.get(1).getId().getName()).isEqualTo(DB_NAME2); assertThat(dbs.size()).isEqualTo(2); } }
@Test public void updateDatabaseDdl() throws Exception { String opName = DB_NAME + "/operations/myop"; String opId = "myop"; List<String> ddl = ImmutableList.of(); OperationFuture<Empty, UpdateDatabaseDdlMetadata> rawOperationFuture = OperationFutureUtil.immediateOperationFuture( opName, Empty.getDefaultInstance(), UpdateDatabaseDdlMetadata.getDefaultInstance()); when(rpc.updateDatabaseDdl(DB_NAME, ddl, opId)).thenReturn(rawOperationFuture); OperationFuture<Void, UpdateDatabaseDdlMetadata> op = client.updateDatabaseDdl(INSTANCE_ID, DB_ID, ddl, opId); assertThat(op.isDone()).isTrue(); assertThat(op.getName()).isEqualTo(opName); }
@Override public Database getDatabase(String instanceId, String databaseId) throws SpannerException { final String dbName = getDatabaseName(instanceId, databaseId); Callable<Database> callable = new Callable<Database>() { @Override public Database call() throws Exception { return Database.fromProto(rpc.getDatabase(dbName), DatabaseAdminClientImpl.this); } }; return runWithRetries(callable); }
@Test public void getDatabaseDdl() { List<String> ddl = ImmutableList.of("CREATE TABLE mytable()"); when(rpc.getDatabaseDdl(DB_NAME)).thenReturn(ddl); assertThat(client.getDatabaseDdl(INSTANCE_ID, DB_ID)).isEqualTo(ddl); }
@Override public void dropDatabase(String instanceId, String databaseId) throws SpannerException { final String dbName = getDatabaseName(instanceId, databaseId); Callable<Void> callable = new Callable<Void>() { @Override public Void call() throws Exception { rpc.dropDatabase(dbName); return null; } }; runWithRetries(callable); }
SpannerImpl(SpannerRpc gapicRpc, int defaultPrefetchChunks, SpannerOptions options) { super(options); this.gapicRpc = gapicRpc; this.defaultPrefetchChunks = defaultPrefetchChunks; this.dbAdminClient = new DatabaseAdminClientImpl(options.getProjectId(), gapicRpc); this.instanceClient = new InstanceAdminClientImpl(options.getProjectId(), gapicRpc, dbAdminClient); }