diff --git a/jdbc/src/main/java/tech/ydb/jdbc/context/YdbContext.java b/jdbc/src/main/java/tech/ydb/jdbc/context/YdbContext.java index e5b94d1..be5da35 100644 --- a/jdbc/src/main/java/tech/ydb/jdbc/context/YdbContext.java +++ b/jdbc/src/main/java/tech/ydb/jdbc/context/YdbContext.java @@ -1,5 +1,6 @@ package tech.ydb.jdbc.context; +import java.nio.charset.StandardCharsets; import java.sql.SQLDataException; import java.sql.SQLException; import java.time.Duration; @@ -10,10 +11,13 @@ import java.util.List; import java.util.Map; import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; +import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; @@ -50,12 +54,15 @@ import tech.ydb.table.description.TableDescription; import tech.ydb.table.impl.PooledTableClient; import tech.ydb.table.query.DataQuery; +import tech.ydb.table.query.DataQueryResult; import tech.ydb.table.query.ExplainDataQueryResult; +import tech.ydb.table.result.ResultSetReader; import tech.ydb.table.rpc.grpc.GrpcTableRpc; import tech.ydb.table.settings.DescribeTableSettings; import tech.ydb.table.settings.ExplainDataQuerySettings; import tech.ydb.table.settings.PrepareDataQuerySettings; import tech.ydb.table.settings.RequestSettings; +import tech.ydb.table.transaction.TxControl; import tech.ydb.table.values.Type; /** @@ -87,6 +94,7 @@ public class YdbContext implements AutoCloseable { private final Cache statsCache; private final Cache> queryParamsCache; private final Cache tableDescribeCache; + private final Supplier version = Suppliers.memoizeWithExpiration(this::readVersion, 1, TimeUnit.HOURS); private final boolean autoResizeSessionPool; private final AtomicInteger connectionsCount = new AtomicInteger(); @@ -144,15 +152,14 @@ public YdbTypes getTypes() { return types; } - /** - * Grpc Transport for other API YDB server clients - * - * @return grpcTransport for YDB - */ public GrpcTransport getGrpcTransport() { return grpcTransport; } + public String getDatabaseVersion() { + return version.get(); + } + public YdbTracer getTracer() { return config.isTxTracedEnabled() ? YdbTracer.current() : YdbTracerNone.DISABLED; } @@ -338,6 +345,21 @@ public static YdbContext createContext(YdbConfig config) throws SQLException { } } + private String readVersion() { + Result res = retryCtx.supplyResult( + s -> s.executeDataQuery("SELECT version();", TxControl.snapshotRo()) + ).join(); + + if (res.isSuccess()) { + ResultSetReader rs = res.getValue().getResultSet(0); + if (rs.next()) { + return rs.getColumn(0).getBytesAsString(StandardCharsets.UTF_8); + } + } + return "unknown"; + } + + public > T withDefaultTimeout(T settings) { Duration operation = operationOptions.getDeadlineTimeout(); if (!operation.isZero() && !operation.isNegative()) { diff --git a/jdbc/src/main/java/tech/ydb/jdbc/impl/YdbDatabaseMetaDataImpl.java b/jdbc/src/main/java/tech/ydb/jdbc/impl/YdbDatabaseMetaDataImpl.java index 967ff70..42cbede 100644 --- a/jdbc/src/main/java/tech/ydb/jdbc/impl/YdbDatabaseMetaDataImpl.java +++ b/jdbc/src/main/java/tech/ydb/jdbc/impl/YdbDatabaseMetaDataImpl.java @@ -114,7 +114,17 @@ public String getDatabaseProductName() { @Override public String getDatabaseProductVersion() { - return "unspecified"; // TODO: don't know how to get YDB version + return connection.getCtx().getDatabaseVersion(); + } + + @Override + public int getDatabaseMajorVersion() { + return 0; // unknown + } + + @Override + public int getDatabaseMinorVersion() { + return 0; // unknown } @Override @@ -1233,16 +1243,6 @@ public int getResultSetHoldability() throws SQLException { return connection.getHoldability(); } - @Override - public int getDatabaseMajorVersion() { - return 0; // unknown - } - - @Override - public int getDatabaseMinorVersion() { - return 0; // unknown - } - @Override public int getJDBCMajorVersion() { return YdbDriverInfo.JDBC_MAJOR_VERSION; diff --git a/jdbc/src/test/java/tech/ydb/jdbc/impl/YdbDatabaseMetaDataImplTest.java b/jdbc/src/test/java/tech/ydb/jdbc/impl/YdbDatabaseMetaDataImplTest.java index 7f5d105..28c94ca 100644 --- a/jdbc/src/test/java/tech/ydb/jdbc/impl/YdbDatabaseMetaDataImplTest.java +++ b/jdbc/src/test/java/tech/ydb/jdbc/impl/YdbDatabaseMetaDataImplTest.java @@ -126,7 +126,7 @@ public void metaDataValuesTest() throws SQLException { Assertions.assertFalse(metaData.nullsAreSortedAtStart()); Assertions.assertFalse(metaData.nullsAreSortedAtEnd()); Assertions.assertEquals("YDB", metaData.getDatabaseProductName()); - Assertions.assertEquals("unspecified", metaData.getDatabaseProductVersion()); + Assertions.assertFalse(metaData.getDatabaseProductVersion().isEmpty()); Assertions.assertEquals(YdbDriverInfo.DRIVER_NAME, metaData.getDriverName()); Assertions.assertEquals(YdbDriverInfo.DRIVER_VERSION, metaData.getDriverVersion());