public void CommandIncludesRequestAndTransactionTag()
        {
            var requestTag1    = "request-tag-1";
            var requestTag2    = "request-tag-2";
            var transactionTag = "transaction-tag-1";
            Mock <SpannerClient> spannerClientMock = SpannerClientHelpers
                                                     .CreateMockClient(Logger.DefaultLogger, MockBehavior.Strict);

            spannerClientMock
            .SetupBatchCreateSessionsAsync()
            .SetupBeginTransactionAsync()
            .SetupExecuteStreamingSql()
            .SetupCommitAsync();
            SpannerConnection  connection  = BuildSpannerConnection(spannerClientMock);
            SpannerTransaction transaction = connection.BeginTransaction();

            transaction.Tag = transactionTag;

            var command1 = connection.CreateSelectCommand("SELECT * FROM FOO");

            command1.Transaction = transaction;
            command1.Tag         = requestTag1;
            using (var reader = command1.ExecuteReader())
            {
                Assert.True(reader.HasRows);
            }

            var command2 = connection.CreateSelectCommand("SELECT * FROM FOO");

            command2.Transaction = transaction;
            command2.Tag         = requestTag2;
            using (var reader = command2.ExecuteReader())
            {
                Assert.True(reader.HasRows);
            }

            // Execute a statement without a request tag on the same transaction.
            var command3 = connection.CreateSelectCommand("SELECT * FROM FOO");

            command3.Transaction = transaction;
            using (var reader = command3.ExecuteReader())
            {
                Assert.True(reader.HasRows);
            }
            transaction.Commit();

            spannerClientMock.Verify(client => client.ExecuteStreamingSql(
                                         It.Is <ExecuteSqlRequest>(request => request.RequestOptions.RequestTag == requestTag1 && request.RequestOptions.TransactionTag == transactionTag),
                                         It.IsAny <CallSettings>()), Times.Once());
            spannerClientMock.Verify(client => client.ExecuteStreamingSql(
                                         It.Is <ExecuteSqlRequest>(request => request.RequestOptions.RequestTag == requestTag2 && request.RequestOptions.TransactionTag == transactionTag),
                                         It.IsAny <CallSettings>()), Times.Once());
            spannerClientMock.Verify(client => client.ExecuteStreamingSql(
                                         It.Is <ExecuteSqlRequest>(request => request.RequestOptions.RequestTag == "" && request.RequestOptions.TransactionTag == transactionTag),
                                         It.IsAny <CallSettings>()), Times.Once());
            spannerClientMock.Verify(client => client.CommitAsync(
                                         It.Is <CommitRequest>(request => request.RequestOptions.RequestTag == "" && request.RequestOptions.TransactionTag == transactionTag),
                                         It.IsAny <CallSettings>()), Times.Once());
        }
예제 #2
0
        public async Task BadDbName()
        {
            string connectionString = $"Data Source=projects/{_testFixture.TestProjectName}/instances/"
                                      + $"{_testFixture.TestInstanceName}/databases/badjuju";
            // ReSharper disable once RedundantAssignment
            int rowsRead        = -1;
            var exceptionCaught = false;

            try
            {
                using (var connection = new SpannerConnection(connectionString))
                {
                    var cmd = connection.CreateSelectCommand(
                        $"SELECT * FROM {_testFixture.TestTable} WHERE Key = 'k1'");
                    using (var reader = await cmd.ExecuteReaderAsync())
                    {
                        rowsRead = 0;
                        while (await reader.ReadAsync())
                        {
                            rowsRead++;
                        }
                    }
                }
            }
            catch (SpannerException e)
            {
                exceptionCaught = true;
                Assert.Equal(ErrorCode.NotFound, e.ErrorCode);
                Assert.False(e.IsTransientSpannerFault());
            }

            Assert.True(exceptionCaught);
            Assert.Equal(-1, rowsRead);
        }
    public async Task <List <Venue> > QueryDataWithNumericParameterAsync(string projectId, string instanceId, string databaseId)
    {
        string connectionString = $"Data Source=projects/{projectId}/instances/{instanceId}/databases/{databaseId}";

        using var connection = new SpannerConnection(connectionString);
        using var cmd        = connection.CreateSelectCommand(
                  "SELECT VenueId, Revenue FROM Venues WHERE Revenue < @maxRevenue",
                  new SpannerParameterCollection
        {
            { "maxRevenue", SpannerDbType.Numeric, SpannerNumeric.Parse("100000") }
        });

        var venues = new List <Venue>();

        using var reader = await cmd.ExecuteReaderAsync();

        while (await reader.ReadAsync())
        {
            venues.Add(new Venue
            {
                VenueId = reader.GetFieldValue <int>("VenueId"),
                Revenue = reader.GetFieldValue <SpannerNumeric>("Revenue")
            });
        }
        return(venues);
    }
예제 #4
0
        public void ClientCreatedWithEmulatorDetection()
        {
            Mock <SpannerClient> spannerClientMock = SetupExecuteStreamingSql();

            var spannerClient      = spannerClientMock.Object;
            var sessionPoolOptions = new SessionPoolOptions
            {
                MaintenanceLoopDelay = TimeSpan.Zero
            };

            var sessionPoolManager = new SessionPoolManager(
                sessionPoolOptions, spannerClient.Settings.Logger,
                (_o, _s, _l) =>
            {
                Assert.True(_o.UsesEmulator);
                return(Task.FromResult(spannerClient));
            });

            SpannerConnectionStringBuilder builder = new SpannerConnectionStringBuilder
            {
                DataSource                  = DatabaseName.Format(SpannerClientHelpers.ProjectId, SpannerClientHelpers.Instance, SpannerClientHelpers.Database),
                SessionPoolManager          = sessionPoolManager,
                EmulatorDetection           = EmulatorDetection.EmulatorOrProduction,
                EnvironmentVariableProvider = key => key == "SPANNER_EMULATOR_HOST" ? "localhost" : null
            };
            var connection = new SpannerConnection(builder);

            var command = connection.CreateSelectCommand("SELECT * FROM FOO");

            using (var reader = command.ExecuteReader())
            {
                // Do nothing.
            }
        }
예제 #5
0
    public async Task <List <Album> > QueryDataWithIndexAsync(string projectId, string instanceId, string databaseId,
                                                              string startTitle, string endTitle)
    {
        string connectionString = $"Data Source=projects/{projectId}/instances/{instanceId}/databases/{databaseId}";

        using var connection = new SpannerConnection(connectionString);
        using var cmd        = connection.CreateSelectCommand(
                  "SELECT AlbumId, AlbumTitle, MarketingBudget FROM Albums@ "
                  + "{FORCE_INDEX=AlbumsByAlbumTitle} "
                  + $"WHERE AlbumTitle >= @startTitle "
                  + $"AND AlbumTitle < @endTitle",
                  new SpannerParameterCollection
        {
            { "startTitle", SpannerDbType.String, startTitle },
            { "endTitle", SpannerDbType.String, endTitle }
        });

        var albums = new List <Album>();

        using var reader = await cmd.ExecuteReaderAsync();

        while (await reader.ReadAsync())
        {
            albums.Add(new Album
            {
                AlbumId         = reader.GetFieldValue <int>("AlbumId"),
                AlbumTitle      = reader.GetFieldValue <string>("AlbumTitle"),
                MarketingBudget = reader.IsDBNull(reader.GetOrdinal("MarketingBudget")) ? 0 : reader.GetFieldValue <long>("MarketingBudget")
            });
        }
        return(albums);
    }
예제 #6
0
    public async Task <List <Venue> > QueryWithTimestampAsync(string projectId, string instanceId, string databaseId)
    {
        string connectionString = $"Data Source=projects/{projectId}/instances/{instanceId}/databases/{databaseId}";
        // Initialize a DateTime timestamp variable to use for querying.
        DateTime exampleTimestamp = DateTime.UtcNow;

        using var connection = new SpannerConnection(connectionString);
        var cmd = connection.CreateSelectCommand("SELECT VenueId, VenueName, LastUpdateTime FROM Venues WHERE LastUpdateTime < @ExampleTimestamp");

        cmd.Parameters.Add("ExampleTimestamp", SpannerDbType.Timestamp, exampleTimestamp);

        var venues = new List <Venue>();

        using var reader = await cmd.ExecuteReaderAsync();

        while (await reader.ReadAsync())
        {
            venues.Add(new Venue
            {
                VenueId        = reader.GetFieldValue <int>("VenueId"),
                VenueName      = reader.GetFieldValue <string>("VenueName"),
                LastUpdateTime = reader["LastUpdateTime"] != DBNull.Value ? reader.GetFieldValue <DateTime?>("LastUpdateTime") : null
            });
        }
        return(venues);
    }
        public void RunWithRetryableTransactionWithTransactionTag()
        {
            var transactionTag = "retryable-tx-tag";
            Mock <SpannerClient> spannerClientMock = SpannerClientHelpers
                                                     .CreateMockClient(Logger.DefaultLogger, MockBehavior.Strict);

            spannerClientMock
            .SetupBatchCreateSessionsAsync()
            .SetupBeginTransactionAsync()
            .SetupExecuteStreamingSql()
            .SetupCommitAsync_Fails(1, StatusCode.Aborted, exceptionRetryDelay: TimeSpan.FromMilliseconds(0))
            .SetupRollbackAsync();
            SpannerConnection connection = BuildSpannerConnection(spannerClientMock);

            connection.Builder.SessionPoolManager.SpannerSettings.Scheduler = new NoOpScheduler();

            connection.RunWithRetriableTransaction(tx =>
            {
                tx.Tag              = transactionTag;
                var command         = connection.CreateSelectCommand("SELECT * FROM FOO");
                command.Transaction = tx;
                command.Tag         = null;
                using (var reader = command.ExecuteReader())
                {
                    Assert.True(reader.HasRows);
                }
            });
            spannerClientMock.Verify(client => client.ExecuteStreamingSql(
                                         It.Is <ExecuteSqlRequest>(request => request.RequestOptions.TransactionTag == transactionTag),
                                         It.IsAny <CallSettings>()), Times.Exactly(2));
            spannerClientMock.Verify(client => client.CommitAsync(
                                         It.Is <CommitRequest>(request => request.RequestOptions.TransactionTag == transactionTag),
                                         It.IsAny <CallSettings>()), Times.Exactly(2));
        }
        public void TransactionTagCannotBeSetAfterCommandExecution()
        {
            var transactionTag = "transaction-tag-1";
            Mock <SpannerClient> spannerClientMock = SpannerClientHelpers
                                                     .CreateMockClient(Logger.DefaultLogger, MockBehavior.Strict);

            spannerClientMock
            .SetupBatchCreateSessionsAsync()
            .SetupBeginTransactionAsync()
            .SetupExecuteStreamingSql()
            .SetupCommitAsync();
            SpannerConnection  connection  = BuildSpannerConnection(spannerClientMock);
            SpannerTransaction transaction = connection.BeginTransaction();

            // Execute a command on the transaction without a transaction tag.
            var command1 = connection.CreateSelectCommand("SELECT * FROM FOO");

            command1.Transaction = transaction;
            using (var reader = command1.ExecuteReader())
            {
                Assert.True(reader.HasRows);
            }
            Assert.Throws <InvalidOperationException>(() => transaction.Tag = transactionTag);

            transaction.Commit();

            spannerClientMock.Verify(client => client.ExecuteStreamingSql(
                                         It.Is <ExecuteSqlRequest>(request => request.RequestOptions.RequestTag == "" && request.RequestOptions.TransactionTag == ""),
                                         It.IsAny <CallSettings>()), Times.Once());
            spannerClientMock.Verify(client => client.CommitAsync(
                                         It.Is <CommitRequest>(request => request.RequestOptions.RequestTag == "" && request.RequestOptions.TransactionTag == ""),
                                         It.IsAny <CallSettings>()), Times.Once());
        }
    public async Task <List <int> > QueryDataWithStructAsync(string projectId, string instanceId, string databaseId)
    {
        // [START spanner_create_struct_with_data]
        var nameStruct = new SpannerStruct
        {
            { "FirstName", SpannerDbType.String, "Elena" },
            { "LastName", SpannerDbType.String, "Campbell" },
        };
        // [END spanner_create_struct_with_data]

        string connectionString = $"Data Source=projects/{projectId}/instances/{instanceId}/databases/{databaseId}";

        var singerIds = new List <int>();

        using var connection = new SpannerConnection(connectionString);
        using var cmd        = connection.CreateSelectCommand(
                  "SELECT SingerId FROM Singers "
                  + "WHERE STRUCT<FirstName STRING, LastName STRING>"
                  + "(FirstName, LastName) = @name");

        cmd.Parameters.Add("name", nameStruct.GetSpannerDbType(), nameStruct);
        using var reader = await cmd.ExecuteReaderAsync();

        while (await reader.ReadAsync())
        {
            singerIds.Add(reader.GetFieldValue <int>("SingerId"));
        }
        return(singerIds);
    }
        public void CommandHasOptimizerVersionSetOnCommand()
        {
            Mock<SpannerClient> spannerClientMock = SpannerClientHelpers
                .CreateMockClient(Logger.DefaultLogger, MockBehavior.Strict);
            spannerClientMock
                .SetupBatchCreateSessionsAsync()
                .SetupExecuteStreamingSql();

            var cmdOptimizerVersion = "3";
            // Optimizer version set at a command level has higher precedence
            // than version set through the connection or the environment
            // variable.
            const string envOptimizerVersion = "2";
            RunActionWithEnvOptimizerVersion(() =>
            {
                const string connOptimizerVersion = "1";
                SpannerConnection connection = BuildSpannerConnection(spannerClientMock);
                var queryOptions = QueryOptions.Empty.WithOptimizerVersion(connOptimizerVersion);
                connection.QueryOptions = queryOptions;

                var command = connection.CreateSelectCommand("SELECT * FROM FOO");
                command.QueryOptions = QueryOptions.Empty.WithOptimizerVersion(cmdOptimizerVersion);
                using (var reader = command.ExecuteReader())
                {
                    Assert.True(reader.HasRows);
                }
            }, envOptimizerVersion);

            spannerClientMock.Verify(client => client.ExecuteStreamingSql(
                It.Is<ExecuteSqlRequest>(request => request.QueryOptions.OptimizerVersion == cmdOptimizerVersion),
                It.IsAny<CallSettings>()), Times.Once());
        }
예제 #11
0
    public async Task <string> GetDatabaseDefaultLeaderFromInformationSchemaAsync(string projectId, string instanceId, string databaseId)
    {
        string connectionString = $"Data Source=projects/{projectId}/instances/{instanceId}/databases/{databaseId}";

        using var connection = new SpannerConnection(connectionString);
        var cmd =
            connection.CreateSelectCommand(
                @"SELECT 
                s.OPTION_NAME,
                s.OPTION_VALUE
            FROM
                INFORMATION_SCHEMA.DATABASE_OPTIONS s
            WHERE
                s.OPTION_NAME = 'default_leader'");

        var defaultLeader = string.Empty;

        Console.WriteLine($"Default leader for {databaseId}:");
        using var reader = await cmd.ExecuteReaderAsync();

        while (await reader.ReadAsync())
        {
            defaultLeader = reader.GetFieldValue <string>("OPTION_VALUE");
            Console.WriteLine(defaultLeader);
        }

        return(defaultLeader);
    }
예제 #12
0
    public async Task <List <Venue> > QueryWithIntAsync(string projectId, string instanceId, string databaseId)
    {
        string connectionString = $"Data Source=projects/{projectId}/instances/{instanceId}/databases/{databaseId}";
        // Initialize a long variable to use for querying.
        long exampleValue = 3000;

        using var connection = new SpannerConnection(connectionString);
        var cmd = connection.CreateSelectCommand("SELECT VenueId, VenueName, Capacity FROM Venues WHERE Capacity >= @ExampleValue");

        cmd.Parameters.Add("ExampleValue", SpannerDbType.Int64, exampleValue);

        var venues = new List <Venue>();

        using var reader = await cmd.ExecuteReaderAsync();

        while (await reader.ReadAsync())
        {
            venues.Add(new Venue
            {
                VenueId   = reader.GetFieldValue <int>("VenueId"),
                VenueName = reader.GetFieldValue <string>("VenueName"),
                Capacity  = reader.GetFieldValue <int>("Capacity")
            });
        }
        return(venues);
    }
    public async Task <List <Venue> > QueryWithArrayAsync(string projectId, string instanceId, string databaseId)
    {
        string connectionString = $"Data Source=projects/{projectId}/instances/{instanceId}/databases/{databaseId}";
        // Initialize a list of dates to use for querying.
        var exampleList = new List <DateTime>
        {
            DateTime.Parse("2020-10-01"),
            DateTime.Parse("2020-11-01")
        };

        using var connection = new SpannerConnection(connectionString);
        var cmd = connection.CreateSelectCommand(
            "SELECT VenueId, VenueName, AvailableDate FROM Venues v, "
            + "UNNEST(v.AvailableDates) as AvailableDate "
            + "WHERE AvailableDate in UNNEST(@ExampleArray)");

        cmd.Parameters.Add("ExampleArray", SpannerDbType.ArrayOf(SpannerDbType.Date), exampleList);

        var venues = new List <Venue>();

        using var reader = await cmd.ExecuteReaderAsync();

        while (await reader.ReadAsync())
        {
            venues.Add(new Venue
            {
                VenueId        = reader.GetFieldValue <int>("VenueId"),
                VenueName      = reader.GetFieldValue <string>("VenueName"),
                AvailableDates = new List <DateTime> {
                    reader.GetFieldValue <DateTime>("AvailableDate")
                }
            });
        }
        return(venues);
    }
예제 #14
0
    public async Task <List <Venue> > QueryWithFloatAsync(string projectId, string instanceId, string databaseId)
    {
        string connectionString = $"Data Source=projects/{projectId}/instances/{instanceId}/databases/{databaseId}";
        // Initialize a float variable to use for querying.
        float exampleFloat = 0.8f;

        using var connection = new SpannerConnection(connectionString);
        var cmd = connection.CreateSelectCommand("SELECT VenueId, VenueName, PopularityScore FROM Venues WHERE PopularityScore > @ExampleFloat");

        cmd.Parameters.Add("ExampleFloat", SpannerDbType.Float64, exampleFloat);

        var venues = new List <Venue>();

        using var reader = await cmd.ExecuteReaderAsync();

        while (await reader.ReadAsync())
        {
            venues.Add(new Venue
            {
                VenueId         = reader.GetFieldValue <int>("VenueId"),
                VenueName       = reader.GetFieldValue <string>("VenueName"),
                PopularityScore = reader.GetFieldValue <float>("PopularityScore")
            });
        }
        return(venues);
    }
    public async Task <List <Album> > CreateConnectionWithQueryOptionsAsync(string projectId, string instanceId, string databaseId)
    {
        string connectionString = $"Data Source=projects/{projectId}/instances/{instanceId}/databases/{databaseId}";

        using var connection = new SpannerConnection(connectionString)
              {
                  // Set query options on the connection.
                  QueryOptions = QueryOptions.Empty
                                 .WithOptimizerVersion("1")
                                 // The list of available statistics packages for the database can
                                 // be found by querying the "INFORMATION_SCHEMA.SPANNER_STATISTICS"
                                 // table.
                                 .WithOptimizerStatisticsPackage("latest")
              };

        var albums = new List <Album>();
        var cmd    = connection.CreateSelectCommand("SELECT SingerId, AlbumId, AlbumTitle FROM Albums");

        using var reader = await cmd.ExecuteReaderAsync();

        while (await reader.ReadAsync())
        {
            albums.Add(new Album
            {
                SingerId   = reader.GetFieldValue <int>("SingerId"),
                AlbumId    = reader.GetFieldValue <int>("AlbumId"),
                AlbumTitle = reader.GetFieldValue <string>("AlbumTitle")
            });
        }
        return(albums);
    }
        public void CommitPriorityCanBeSetAfterCommandExecution()
        {
            var priority = Priority.Medium;
            Mock <SpannerClient> spannerClientMock = SpannerClientHelpers
                                                     .CreateMockClient(Logger.DefaultLogger, MockBehavior.Strict);

            spannerClientMock
            .SetupBatchCreateSessionsAsync()
            .SetupBeginTransactionAsync()
            .SetupExecuteStreamingSql()
            .SetupCommitAsync();
            SpannerConnection  connection  = BuildSpannerConnection(spannerClientMock);
            SpannerTransaction transaction = connection.BeginTransaction();

            // Execute a command on the transaction.
            var command = connection.CreateSelectCommand("SELECT * FROM FOO");

            command.Transaction = transaction;
            using (var reader = command.ExecuteReader())
            {
                Assert.True(reader.HasRows);
            }
            // Verify that we can set the commit priority after a command has been executed.
            transaction.CommitPriority = priority;
            transaction.Commit();

            spannerClientMock.Verify(client => client.CommitAsync(
                                         It.Is <CommitRequest>(request => request.RequestOptions.Priority == PriorityConverter.ToProto(priority)),
                                         It.IsAny <CallSettings>()), Times.Once());
        }
    public async Task <List <Album> > CreateConnectionWithQueryOptionsAsync(string projectId, string instanceId, string databaseId)
    {
        string connectionString = $"Data Source=projects/{projectId}/instances/{instanceId}/databases/{databaseId}";

        using var connection = new SpannerConnection(connectionString)
              {
                  // Set query options on the connection.
                  QueryOptions = QueryOptions.Empty
                                 .WithOptimizerVersion("1")
                                 .WithOptimizerStatisticsPackage("auto_20191128_14_47_22UTC")
              };

        var albums = new List <Album>();
        var cmd    = connection.CreateSelectCommand("SELECT SingerId, AlbumId, AlbumTitle FROM Albums");

        using var reader = await cmd.ExecuteReaderAsync();

        while (await reader.ReadAsync())
        {
            albums.Add(new Album
            {
                SingerId   = reader.GetFieldValue <int>("SingerId"),
                AlbumId    = reader.GetFieldValue <int>("AlbumId"),
                AlbumTitle = reader.GetFieldValue <string>("AlbumTitle")
            });
        }
        return(albums);
    }
예제 #18
0
    public async Task <List <Venue> > QueryWithBoolAsync(string projectId, string instanceId, string databaseId)
    {
        string connectionString = $"Data Source=projects/{projectId}/instances/{instanceId}/databases/{databaseId}";
        bool   exampleBool      = true;

        using var connection = new SpannerConnection(connectionString);
        var cmd = connection.CreateSelectCommand(
            "SELECT VenueId, VenueName, OutdoorVenue FROM Venues "
            + "WHERE OutdoorVenue = @ExampleBool");

        cmd.Parameters.Add("ExampleBool", SpannerDbType.Bool, exampleBool);

        var venues = new List <Venue>();

        using var reader = await cmd.ExecuteReaderAsync();

        while (await reader.ReadAsync())
        {
            venues.Add(new Venue
            {
                VenueId      = reader.GetFieldValue <int>("VenueId"),
                VenueName    = reader.GetFieldValue <string>("VenueName"),
                OutdoorVenue = reader.GetFieldValue <bool>("OutdoorVenue")
            });
        }
        return(venues);
    }
        public void TagsCanBeSetToNull()
        {
            Mock <SpannerClient> spannerClientMock = SpannerClientHelpers
                                                     .CreateMockClient(Logger.DefaultLogger, MockBehavior.Strict);

            spannerClientMock
            .SetupBatchCreateSessionsAsync()
            .SetupBeginTransactionAsync()
            .SetupExecuteStreamingSql()
            .SetupCommitAsync();
            SpannerConnection  connection  = BuildSpannerConnection(spannerClientMock);
            SpannerTransaction transaction = connection.BeginTransaction();

            transaction.Tag = null;

            var command = connection.CreateSelectCommand("SELECT * FROM FOO");

            command.Transaction = transaction;
            command.Tag         = null;
            using (var reader = command.ExecuteReader())
            {
                Assert.True(reader.HasRows);
            }
            transaction.Commit();

            spannerClientMock.Verify(client => client.ExecuteStreamingSql(
                                         It.Is <ExecuteSqlRequest>(request => request.RequestOptions.RequestTag == "" && request.RequestOptions.TransactionTag == ""),
                                         It.IsAny <CallSettings>()), Times.Once());
            spannerClientMock.Verify(client => client.CommitAsync(
                                         It.Is <CommitRequest>(request => request.RequestOptions.RequestTag == "" && request.RequestOptions.TransactionTag == ""),
                                         It.IsAny <CallSettings>()), Times.Once());
        }
    public async Task <List <Venue> > QueryDataWithJsonParameterAsync(string projectId, string instanceId, string databaseId)
    {
        string connectionString = $"Data Source=projects/{projectId}/instances/{instanceId}/databases/{databaseId}";

        using var connection = new SpannerConnection(connectionString);

        // If you are using .NET Core 3.1 or later, you can use System.Text.Json for serialization instead.
        var jsonValue = JsonConvert.SerializeObject(new { rating = 9 });

        // Get all venues with rating 9.
        using var cmd = connection.CreateSelectCommand(
                  @"SELECT VenueId, VenueDetails
              FROM Venues
              WHERE JSON_VALUE(VenueDetails, '$.rating') = JSON_VALUE(@details, '$.rating')",
                  new SpannerParameterCollection
        {
            { "details", SpannerDbType.Json, jsonValue }
        });

        var venues = new List <Venue>();

        using var reader = await cmd.ExecuteReaderAsync();

        while (await reader.ReadAsync())
        {
            venues.Add(new Venue
            {
                VenueId      = reader.GetFieldValue <int>("VenueId"),
                VenueDetails = reader.GetFieldValue <string>("VenueDetails")
            });
        }
        return(venues);
    }
예제 #21
0
        public static async Task InsertPlayersAsync(string projectId,
                                                    string instanceId, string databaseId)
        {
            string connectionString =
                $"Data Source=projects/{projectId}/instances/{instanceId}"
                + $"/databases/{databaseId}";
            Int64 numberOfPlayers = 0;

            using (var connection = new SpannerConnection(connectionString))
            {
                await connection.OpenAsync();

                using (var tx = await connection.BeginTransactionAsync())
                {
                    // Execute a SQL statement to get current number of records
                    // in the Players table.
                    var cmd = connection.CreateSelectCommand(
                        @"SELECT Count(PlayerId) as PlayerCount FROM Players");
                    cmd.Transaction = tx;
                    using (var reader = await cmd.ExecuteReaderAsync())
                    {
                        while (await reader.ReadAsync())
                        {
                            long parsedValue;
                            if (reader["PlayerCount"] != DBNull.Value)
                            {
                                bool result = Int64.TryParse(
                                    reader.GetFieldValue <string>("PlayerCount"),
                                    out parsedValue);
                                if (result)
                                {
                                    numberOfPlayers = parsedValue;
                                }
                            }
                        }
                    }
                    // Insert 100 player records into the Players table.
                    using (cmd = connection.CreateInsertCommand(
                               "Players", new SpannerParameterCollection
                    {
                        { "PlayerId", SpannerDbType.String },
                        { "PlayerName", SpannerDbType.String }
                    }))
                    {
                        cmd.Transaction = tx;
                        for (var x = 1; x <= 100; x++)
                        {
                            numberOfPlayers++;
                            cmd.Parameters["PlayerId"].Value =
                                Math.Abs(Guid.NewGuid().GetHashCode());
                            cmd.Parameters["PlayerName"].Value =
                                $"Player {numberOfPlayers}";
                            cmd.ExecuteNonQuery();
                        }
                    }
                    await tx.CommitAsync();
                }
            }
            Console.WriteLine("Done inserting player records...");
        }
        static async Task MainAsync()
        {
            string projectId        = "YOUR-GOOGLE-PROJECT-ID";
            string instanceId       = "my-instance";
            string databaseId       = "my-database";
            string connectionString =
                $"Data Source=projects/{projectId}/instances/{instanceId}/"
                + $"databases/{databaseId}";

            // Create connection to Cloud Spanner.
            using (var connection = new SpannerConnection(connectionString))
            {
                // Execute a simple SQL statement.
                var cmd = connection.CreateSelectCommand(
                    @"SELECT ""Hello World"" as test");
                using (var reader = await cmd.ExecuteReaderAsync())
                {
                    while (await reader.ReadAsync())
                    {
                        Console.WriteLine(
                            reader.GetFieldValue <string>("test"));
                    }
                }
            }
        }
    public async Task <List <Album> > RequestTagAsync(string projectId, string instanceId, string databaseId)
    {
        string connectionString = $"Data Source=projects/{projectId}/instances/{instanceId}/databases/{databaseId}";

        using var connection = new SpannerConnection(connectionString);
        using var cmd        = connection.CreateSelectCommand(
                  $"SELECT SingerId, AlbumId, AlbumTitle FROM Albums");
        // Sets the request tag to "app=concert,env=dev,action=select".
        // This request tag will only be set on this request.
        cmd.Tag = "app=concert,env=dev,action=select";

        var albums = new List <Album>();

        using var reader = await cmd.ExecuteReaderAsync();

        while (await reader.ReadAsync())
        {
            var album = new Album
            {
                SingerId   = reader.GetFieldValue <int>("SingerId"),
                AlbumId    = reader.GetFieldValue <int>("AlbumId"),
                AlbumTitle = reader.GetFieldValue <string>("AlbumTitle")
            };
            albums.Add(album);
            Console.WriteLine($"SingerId: {album.SingerId}, AlbumId: {album.AlbumId}, AlbumTitle: {album.AlbumTitle}");
        }
        return(albums);
    }
        public void CommandHasConnectionQueryOptions()
        {
            const string         connOptimizerVersion           = "1";
            const string         connOptimizerStatisticsPackage = "stats_package_1";
            Mock <SpannerClient> spannerClientMock = SpannerClientHelpers
                                                     .CreateMockClient(Logger.DefaultLogger, MockBehavior.Strict);

            spannerClientMock
            .SetupBatchCreateSessionsAsync()
            .SetupExecuteStreamingSql();

            SpannerConnection connection = BuildSpannerConnection(spannerClientMock);

            connection.QueryOptions = QueryOptions.Empty
                                      .WithOptimizerVersion(connOptimizerVersion)
                                      .WithOptimizerStatisticsPackage(connOptimizerStatisticsPackage);

            var command = connection.CreateSelectCommand("SELECT * FROM FOO");

            using (var reader = command.ExecuteReader())
            {
                Assert.True(reader.HasRows);
            }

            spannerClientMock.Verify(client => client.ExecuteStreamingSql(
                                         It.Is <ExecuteSqlRequest>(request =>
                                                                   request.QueryOptions.OptimizerVersion == connOptimizerVersion &&
                                                                   request.QueryOptions.OptimizerStatisticsPackage == connOptimizerStatisticsPackage),
                                         It.IsAny <CallSettings>()), Times.Once());
        }
예제 #25
0
        public void CommandHasOptimizerVersionSetOnCommand()
        {
            const string envOptimizerVersion = "2";

            RunActionWithEnvOptimizerVersion(() =>
            {
                var cmdOptimizerVersion = "3";
                // Optimizer version set at a command level has higher precedence
                // than version set through the connection or the environment
                // variable.
                Mock <SpannerClient> spannerClientMock = SetupExecuteStreamingSql(cmdOptimizerVersion);

                const string connOptimizerVersion = "1";
                SpannerConnection connection      = BuildSpannerConnection(spannerClientMock);
                var queryOptions        = QueryOptions.Empty.WithOptimizerVersion(connOptimizerVersion);
                connection.QueryOptions = queryOptions;

                var command          = connection.CreateSelectCommand("SELECT * FROM FOO");
                command.QueryOptions = QueryOptions.Empty.WithOptimizerVersion(cmdOptimizerVersion);
                using (var reader = command.ExecuteReader())
                {
                    // Do nothing.
                }
            }, envOptimizerVersion);
        }
        public void CommandPriorityDefaultsToUnspecified()
        {
            var connection = new SpannerConnection("Data Source=projects/p/instances/i/databases/d");
            var command    = connection.CreateSelectCommand("SELECT * FROM FOO");

            Assert.Equal(Priority.Unspecified, command.Priority);
        }
예제 #27
0
        public async Task DistributedReadAsync()
        {
            int numRows;

            using (var connection = await _testFixture.GetTestDatabaseConnectionAsync())
                using (var cmd = connection.CreateSelectCommand("SELECT COUNT(*) FROM Orders"))
                {
                    numRows = await cmd.ExecuteScalarAsync <int>();
                }

            using (var connection = new SpannerConnection(_testFixture.ConnectionString))
            {
                await connection.OpenAsync();

                using (var transaction = await connection.BeginReadOnlyTransactionAsync())
                    using (var cmd = connection.CreateSelectCommand("SELECT * FROM Orders"))
                    {
                        transaction.DisposeBehavior = DisposeBehavior.CloseResources;
                        cmd.Transaction             = transaction;
                        var partitions = await cmd.GetReaderPartitionsAsync(1000);

                        var transactionId = transaction.TransactionId;

                        //we simulate a serialization/deserialization step in the call to the subtask.
                        await Task.WhenAll(partitions.Select(
                                               x => DistributedReadWorkerAsync(CommandPartition.FromBase64String(x.ToBase64String()),
                                                                               TransactionId.FromBase64String(transactionId.ToBase64String()))))
                        .ConfigureAwait(false);
                    }

                Assert.Equal(numRows, _rowsRead);
            }
        }
        public void CommitIncludesPriority()
        {
            var commitPriority  = Priority.Medium;
            var commandPriority = Priority.High;
            Mock <SpannerClient> spannerClientMock = SpannerClientHelpers
                                                     .CreateMockClient(Logger.DefaultLogger, MockBehavior.Strict);

            spannerClientMock
            .SetupBatchCreateSessionsAsync()
            .SetupBeginTransactionAsync()
            .SetupExecuteStreamingSql()
            .SetupCommitAsync();
            SpannerConnection  connection  = BuildSpannerConnection(spannerClientMock);
            SpannerTransaction transaction = connection.BeginTransaction();

            transaction.CommitPriority = commitPriority;

            var command = connection.CreateSelectCommand("SELECT * FROM FOO");

            command.Transaction = transaction;
            command.Priority    = commandPriority;
            using (var reader = command.ExecuteReader())
            {
                Assert.True(reader.HasRows);
            }
            transaction.Commit();

            spannerClientMock.Verify(client => client.ExecuteStreamingSql(
                                         It.Is <ExecuteSqlRequest>(request => request.RequestOptions.Priority == PriorityConverter.ToProto(commandPriority)),
                                         It.IsAny <CallSettings>()), Times.Once());
            spannerClientMock.Verify(client => client.CommitAsync(
                                         It.Is <CommitRequest>(request => request.RequestOptions.Priority == PriorityConverter.ToProto(commitPriority)),
                                         It.IsAny <CallSettings>()), Times.Once());
        }
예제 #29
0
    public async Task <List <Album> > ReadStaleDataAsync(string projectId, string instanceId, string databaseId)
    {
        string connectionString = $"Data Source=projects/{projectId}/instances/{instanceId}/databases/{databaseId}";

        using var connection = new SpannerConnection(connectionString);
        await connection.OpenAsync();

        var staleness = TimestampBound.OfExactStaleness(TimeSpan.FromSeconds(15));

        using var transaction = await connection.BeginReadOnlyTransactionAsync(staleness);

        using var cmd   = connection.CreateSelectCommand("SELECT SingerId, AlbumId, MarketingBudget FROM Albums");
        cmd.Transaction = transaction;

        var albums = new List <Album>();

        using var reader = await cmd.ExecuteReaderAsync();

        while (await reader.ReadAsync())
        {
            albums.Add(new Album
            {
                SingerId        = reader.GetFieldValue <int>("SingerId"),
                AlbumId         = reader.GetFieldValue <int>("AlbumId"),
                MarketingBudget = reader.IsDBNull(reader.GetOrdinal("MarketingBudget")) ? 0 : reader.GetFieldValue <long>("MarketingBudget")
            });
        }
        return(albums);
    }
    public async Task <List <Venue> > QueryWithDateAsync(string projectId, string instanceId, string databaseId)
    {
        string connectionString = $"Data Source=projects/{projectId}/instances/{instanceId}/databases/{databaseId}";
        // Initialize a Date variable to use for querying.
        DateTime exampleDate = new DateTime(2019, 01, 01);

        using var connection = new SpannerConnection(connectionString);
        var cmd = connection.CreateSelectCommand("SELECT VenueId, VenueName, LastContactDate FROM Venues WHERE LastContactDate < @ExampleDate");

        cmd.Parameters.Add("ExampleDate", SpannerDbType.Date, exampleDate);

        var venues = new List <Venue>();

        using var reader = await cmd.ExecuteReaderAsync();

        while (await reader.ReadAsync())
        {
            venues.Add(new Venue
            {
                VenueId         = reader.GetFieldValue <int>("VenueId"),
                VenueName       = reader.GetFieldValue <string>("VenueName"),
                LastContactDate = reader.GetFieldValue <DateTime>("LastContactDate")
            });
        }
        return(venues);
    }