Skip to content

Commit 8779733

Browse files
committed
started work
1 parent 840a4e0 commit 8779733

File tree

14 files changed

+873
-0
lines changed

14 files changed

+873
-0
lines changed

CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ project(YDB-CPP-SDK VERSION ${YDB_SDK_VERSION} LANGUAGES C CXX ASM)
1010
option(YDB_SDK_INSTALL "Install YDB C++ SDK" Off)
1111
option(YDB_SDK_TESTS "Build YDB C++ SDK tests" Off)
1212
option(YDB_SDK_EXAMPLES "Build YDB C++ SDK examples" On)
13+
option(YDB_SDK_ODBC "Build YDB ODBC driver" On)
1314
set(YDB_SDK_GOOGLE_COMMON_PROTOS_TARGET "" CACHE STRING "Name of cmake target preparing google common proto library")
1415
option(YDB_SDK_USE_RAPID_JSON "Search for rapid json library in system" ON)
1516

@@ -62,6 +63,10 @@ add_subdirectory(util)
6263

6364
#_ydb_sdk_validate_public_headers()
6465

66+
if (YDB_SDK_ODBC)
67+
add_subdirectory(odbc)
68+
endif()
69+
6570
if (YDB_SDK_EXAMPLES)
6671
add_subdirectory(examples)
6772
endif()

odbc/CMakeLists.txt

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
cmake_minimum_required(VERSION 3.14)
2+
project(ydb-odbc VERSION 0.1.0 LANGUAGES C CXX)
3+
4+
set(CMAKE_CXX_STANDARD 20)
5+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
6+
set(CMAKE_CXX_EXTENSIONS OFF)
7+
8+
# Находим зависимости
9+
find_package(ODBC REQUIRED)
10+
11+
# Добавляем исходники
12+
add_library(ydb-odbc SHARED
13+
src/driver.c
14+
src/connection.c
15+
src/statement.c
16+
src/descriptor.c
17+
src/client/driver.cpp
18+
src/client/query.cpp
19+
)
20+
21+
# Добавляем заголовочные файлы
22+
target_include_directories(ydb-odbc
23+
PUBLIC
24+
${CMAKE_CURRENT_SOURCE_DIR}/include
25+
${ODBC_INCLUDE_DIRS}
26+
/usr/include
27+
/usr/local/include
28+
)
29+
30+
# Линкуем с YDB SDK и ODBC
31+
target_link_libraries(ydb-odbc
32+
PUBLIC
33+
YDB-CPP-SDK::Query
34+
YDB-CPP-SDK::Table
35+
YDB-CPP-SDK::Driver
36+
ODBC::ODBC
37+
)
38+
39+
# Устанавливаем драйвер
40+
install(TARGETS ydb-odbc
41+
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
42+
)
43+
44+
# Устанавливаем заголовочные файлы
45+
install(DIRECTORY include/
46+
DESTINATION include/ydb-odbc
47+
)
48+
49+
# Добавляем тесты
50+
# add_subdirectory(tests)
51+
52+
# Правила установки
53+
include(GNUInstallDirs)
54+
55+
install(FILES
56+
odbcinst.ini
57+
DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/odbcinst.d
58+
RENAME ydb-odbc.ini
59+
)
60+
61+
install(FILES
62+
odbc.ini
63+
DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}
64+
)

odbc/README.md

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
# YDB ODBC Driver
2+
3+
ODBC драйвер для YDB.
4+
5+
## Требования
6+
7+
- CMake 3.10 или выше
8+
- Компилятор C/C++ с поддержкой C11 и C++20
9+
- YDB C++ SDK
10+
- unixODBC (для Linux/macOS)
11+
12+
## Сборка
13+
14+
```bash
15+
mkdir build && cd build
16+
cmake ..
17+
make
18+
```
19+
20+
## Установка
21+
22+
```bash
23+
sudo make install
24+
```
25+
26+
Это установит:
27+
- Библиотеку драйвера в `/usr/local/lib/`
28+
- Конфигурацию драйвера в `/etc/odbcinst.d/`
29+
- Конфигурацию источников данных в `/etc/odbc.ini`
30+
31+
## Настройка
32+
33+
1. Убедитесь, что драйвер зарегистрирован:
34+
```bash
35+
odbcinst -q -d
36+
```
37+
38+
2. Проверьте доступные источники данных:
39+
```bash
40+
odbcinst -q -s
41+
```
42+
43+
3. Отредактируйте `/etc/odbc.ini` для настройки подключения:
44+
```ini
45+
[YDB]
46+
Driver=YDB
47+
Description=YDB Database Connection
48+
Server=grpc://your-server:2136
49+
Database=your-database
50+
AuthMode=none # или token для аутентификации по токену
51+
```
52+
53+
## Использование
54+
55+
Пример подключения через isql:
56+
```bash
57+
isql -v YDB
58+
```
59+
60+
Пример использования в C:
61+
```c
62+
SQLHENV env;
63+
SQLHDBC dbc;
64+
SQLHSTMT stmt;
65+
66+
// Инициализация окружения
67+
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
68+
SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
69+
70+
// Подключение
71+
SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);
72+
SQLConnect(dbc, (SQLCHAR*)"YDB", SQL_NTS,
73+
(SQLCHAR*)"", SQL_NTS,
74+
(SQLCHAR*)"", SQL_NTS);
75+
76+
// Выполнение запроса
77+
SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);
78+
SQLExecDirect(stmt, (SQLCHAR*)"SELECT * FROM mytable", SQL_NTS);
79+
80+
// Очистка
81+
SQLFreeHandle(SQL_HANDLE_STMT, stmt);
82+
SQLDisconnect(dbc);
83+
SQLFreeHandle(SQL_HANDLE_DBC, dbc);
84+
SQLFreeHandle(SQL_HANDLE_ENV, env);
85+
```
86+
87+
## Поддерживаемые функции
88+
89+
- SQLAllocHandle
90+
- SQLConnect
91+
- SQLDisconnect
92+
- SQLExecDirect
93+
- SQLFetch
94+
- SQLGetData
95+
- SQLPrepare
96+
- SQLExecute
97+
- SQLCloseCursor
98+
- SQLFreeHandle
99+
- SQLGetInfo
100+
- SQLGetDescField
101+
- SQLSetDescField
102+
103+
## Лицензия
104+
105+
Apache License 2.0

odbc/include/client/driver.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#pragma once
2+
3+
#include <stddef.h> // для size_t
4+
5+
#ifdef __cplusplus
6+
extern "C" {
7+
#endif
8+
9+
// Функции для работы с YDB через C++ SDK
10+
void* YDB_CreateDriver(const char* endpoint, const char* user, const char* password);
11+
void YDB_DestroyDriver(void* driver);
12+
13+
#ifdef __cplusplus
14+
}
15+
#endif

odbc/include/client/query.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#pragma once
2+
3+
#include <stddef.h>
4+
5+
#ifdef __cplusplus
6+
extern "C" {
7+
#endif
8+
9+
void* YDB_CreateQueryClient(void* driver);
10+
void YDB_DestroyQueryClient(void* query_client);
11+
12+
int YDB_ExecuteQuery(void* query_client, const char* query, void** result);
13+
void YDB_FreeExecuteQueryResult(void* result);
14+
15+
#ifdef __cplusplus
16+
}
17+
#endif

odbc/include/ydb_odbc.h

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
#pragma once
2+
3+
#include <sql.h>
4+
#include <sqlext.h>
5+
#include <stddef.h>
6+
7+
#ifdef __cplusplus
8+
extern "C" {
9+
#endif
10+
11+
// Структура для хранения информации о драйвере
12+
typedef struct {
13+
char name[256];
14+
char version[64];
15+
char description[1024];
16+
} YDB_DRIVER_INFO;
17+
18+
// Структура для хранения состояния соединения
19+
typedef struct {
20+
void* ydb_driver;
21+
void* query_client;
22+
int connected;
23+
} YDB_CONNECTION;
24+
25+
// Структура для хранения состояния оператора
26+
typedef struct {
27+
YDB_CONNECTION* connection;
28+
void* query_client;
29+
void* result;
30+
size_t current_row;
31+
} YDB_STATEMENT;
32+
33+
// Структура для хранения дескриптора
34+
typedef struct {
35+
void** descriptors;
36+
size_t descriptors_size;
37+
} YDB_DESCRIPTOR;
38+
39+
// Функции драйвера
40+
SQLRETURN YDB_SQLGetInfo(SQLSMALLINT InfoType, SQLPOINTER InfoValue,
41+
SQLSMALLINT BufferLength, SQLSMALLINT* StringLength);
42+
43+
SQLRETURN YDB_SQLConnect(SQLHDBC ConnectionHandle, SQLCHAR* ServerName,
44+
SQLSMALLINT NameLength1, SQLCHAR* UserName,
45+
SQLSMALLINT NameLength2, SQLCHAR* Authentication,
46+
SQLSMALLINT NameLength3);
47+
48+
SQLRETURN YDB_SQLDriverConnect(SQLHDBC ConnectionHandle, SQLHWND WindowHandle,
49+
SQLCHAR* InConnectionString, SQLSMALLINT StringLength1,
50+
SQLCHAR* OutConnectionString, SQLSMALLINT BufferLength,
51+
SQLSMALLINT* StringLength2, SQLUSMALLINT DriverCompletion);
52+
53+
// Функции соединения
54+
SQLRETURN YDB_SQLDisconnect(SQLHDBC ConnectionHandle);
55+
56+
SQLRETURN YDB_SQLGetConnectionInfo(SQLHDBC ConnectionHandle, SQLSMALLINT InfoType,
57+
SQLPOINTER InfoValue, SQLSMALLINT BufferLength,
58+
SQLSMALLINT* StringLength);
59+
60+
SQLRETURN YDB_SQLAllocHandle(SQLSMALLINT HandleType, SQLHANDLE InputHandle,
61+
SQLHANDLE* OutputHandle);
62+
63+
SQLRETURN YDB_SQLFreeHandle(SQLSMALLINT HandleType, SQLHANDLE Handle);
64+
65+
// Функции оператора
66+
SQLRETURN YDB_SQLExecDirect(SQLHSTMT StatementHandle, SQLCHAR* StatementText,
67+
SQLINTEGER TextLength);
68+
69+
SQLRETURN YDB_SQLPrepare(SQLHSTMT StatementHandle, SQLCHAR* StatementText,
70+
SQLINTEGER TextLength);
71+
72+
SQLRETURN YDB_SQLExecute(SQLHSTMT StatementHandle);
73+
74+
SQLRETURN YDB_SQLFetch(SQLHSTMT StatementHandle);
75+
76+
SQLRETURN YDB_SQLCloseCursor(SQLHSTMT StatementHandle);
77+
78+
// Функции дескриптора
79+
SQLRETURN YDB_SQLGetDescField(SQLHDESC DescriptorHandle, SQLSMALLINT RecNumber,
80+
SQLSMALLINT FieldIdentifier, SQLPOINTER Value,
81+
SQLINTEGER BufferLength, SQLINTEGER* StringLength);
82+
83+
SQLRETURN YDB_SQLSetDescField(SQLHDESC DescriptorHandle, SQLSMALLINT RecNumber,
84+
SQLSMALLINT FieldIdentifier, SQLPOINTER Value,
85+
SQLINTEGER BufferLength);
86+
87+
#ifdef __cplusplus
88+
}
89+
#endif

odbc/odbc.ini

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[ODBC Data Sources]
2+
YDB=YDB ODBC Driver
3+
4+
[YDB]
5+
Driver=YDB
6+
Description=YDB Database Connection
7+
Server=grpc://localhost:2136
8+
Database=local
9+
AuthMode=none

odbc/odbcinst.ini

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
[YDB]
2+
Description=YDB ODBC Driver
3+
Driver=/usr/local/lib/libydb-odbc.so
4+
Setup=/usr/local/lib/libydb-odbc.so
5+
Threading=2
6+
FileUsage=1
7+
UsageCount=1

odbc/src/client/driver.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#include "client/driver.h"
2+
3+
#include <ydb-cpp-sdk/client/driver/driver.h>
4+
5+
extern "C" {
6+
7+
void* YDB_CreateDriver(const char* endpoint, const char* user, const char* password) {
8+
try {
9+
auto config = NYdb::TDriverConfig().SetEndpoint(std::string(endpoint, strlen(endpoint)));
10+
11+
auto* driver = new NYdb::TDriver(config);
12+
return static_cast<void*>(driver);
13+
} catch (...) {
14+
return nullptr;
15+
}
16+
}
17+
18+
void YDB_DestroyDriver(void* driver) {
19+
if (driver) {
20+
auto* ydb_driver = static_cast<NYdb::TDriver*>(driver);
21+
delete ydb_driver;
22+
}
23+
}
24+
25+
}

0 commit comments

Comments
 (0)