/YdbDriver

Primary LanguageC#Apache License 2.0Apache-2.0

YDB.ADO

YDB C# Driver for YDB (Yandex Database). This driver implements YDB protobuf protocol and supports ADO.NET rules.

Installation

[Get it on Nuget][https://www.nuget.org/packages/Yandex.Ydb.ADO/]

PM> Install-Package Yandex.Ydb.Ado

To get hosting extensions

PM> Install-Package Yandex.Ydb.DependencyInjection

Features

  • Sync and Async API
  • Pooling sessions
  • Simple statements
  • Dependency Injection integration
  • Primitives mapping (Int32, Bool, DateTime, Guid etc.)
  • Json type mapping

Basic usage

// injecting YdbDataSource with connection string
builder.Services.AddYdbDataSource("Host=localhost;Port=2136;Pooling=true;MaxSessions=100;");

In controller class or services usage:

    public YdbTaskRepository(YdbDataSource dataSource)
    {
        _source = dataSource;
    }
    ...
    
    public async Task AddTask(TaskToWork entity)
    {
        // Getting connection (it will not open physical connection and will get session from pool by default) 
        await using var connection = await _source.OpenConnectionAsync();

        // Creating command
        var ydbCommand = connection.CreateYdbCommand();
        ydbCommand.AddParameter("$id", Guid.NewGuid().ToString());
        ydbCommand.AddParameter("$task", JsonSerializer.Serialize(entity));
        ydbCommand.AddParameter("$created_at", (ulong)DateTimeOffset.UtcNow.ToUnixTimeMilliseconds());

        ydbCommand.CommandText = @"
            DECLARE $task as String;
            DECLARE $id as String;
            DECLARE $created_at as Uint64;  
            
            UPSERT INTO tasks (`task_id`, `task`, `created_at`) VALUES ($id, $task, $created_at)";

        // Executing command
        await ydbCommand.ExecuteNonQueryAsync();
    }
    
    
    public async Task<QueryResult?> GetNextTask()
    {
        await using var connection = await _source.OpenConnectionAsync();
        var ydbCommand = connection.CreateYdbCommand();
        ydbCommand.CommandText =
            "SELECT task_id, task, created_at, is_processed FROM tasks WHERE processing_at IS NULL ORDER BY created_at LIMIT 1;";

        var reader = await ydbCommand.ExecuteReaderAsync();
        var resultAsync = await reader.NextResultAsync();
        if (!resultAsync)
            return null;

        var first = new QueryResult()
        {
            TaskId = reader.GetString(0),
            Task = reader.GetString(1),
            CreatedAt = reader.GetFieldValue<UInt64>(2),
            IsProcessed = reader.GetFieldValue<Boolean>(3),
        };

        return first ?? null;
    }
    

Planned

  • Prepared statements
  • Batch statements
  • Custom user defined mappers
  • Streaming
  • Flexible retry backoff policies