From ca2e86c650c6c75238d199090197af40d074a32c Mon Sep 17 00:00:00 2001
From: Egor Bitochkin <bigcubecat@yandex.ru>
Date: Thu, 6 Feb 2025 17:03:24 +0000
Subject: [PATCH 1/5] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?=
 =?UTF-8?q?=D0=BD=D0=BD=D0=B0=20=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6?=
 =?UTF-8?q?=D0=BA=D0=B0=20=D0=B8=D0=BD=D0=B4=D0=B5=D0=BA=D1=81=D0=BE=D0=B2?=
 =?UTF-8?q?.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 clouddb/src/clouddb/CMakeLists.txt            |  49 ++--
 clouddb/src/clouddb/clouddb--1.0.sql          | 140 +++++++++
 clouddb/src/clouddb/clouddb.c                 |   2 +-
 clouddb/src/clouddb/cpp.cpp                   |   2 +-
 .../cas_transaction_command.cpp               | 181 ++++++++++--
 .../cas_transaction_command.h                 |  21 +-
 .../src/clouddb/facade/command/command.cpp    |  35 ++-
 clouddb/src/clouddb/facade/command/command.h  |  18 +-
 .../facade/command/itransaction_command.h     |  15 +-
 .../cassandra_driver/cassandra_driver.cpp     | 276 +++++++++++++-----
 .../cassandra_driver/cassandra_driver.h       |  17 +-
 clouddb/src/clouddb/facade/drivers/idriver.h  |   4 +-
 clouddb/src/clouddb/facade/query_builder.cpp  | 136 ++++++++-
 clouddb/src/clouddb/facade/query_builder.h    |  11 +-
 clouddb/src/clouddb/facade/session.cpp        |   5 +-
 clouddb/src/clouddb/facade/utils/metadata.h   |   1 +
 clouddb/src/clouddb/facade/utils/utils.cpp    |  10 +
 clouddb/src/clouddb/facade/utils/utils.h      |   9 +
 clouddb/src/clouddb/iam/iam.c                 |  47 +++
 clouddb/src/clouddb/iam/iam.h                 |  53 ++++
 clouddb/src/clouddb/tam/all_tam.h             | 110 ++++++-
 .../src/clouddb/tam/include/index_scan_tam.h  |   1 +
 clouddb/src/clouddb/tam/src/index_scan_tam.c  |  48 ++-
 clouddb/src/clouddb/tam/src/mod_tuple_tam.c   |  79 ++++-
 .../src/clouddb/tam/src/non_mod_tuple_tam.c   |   5 +-
 clouddb/src/clouddb/tam/src/scan_func_tam.c   |   5 +-
 clouddb/src/clouddb/utils/utils.c             |  11 +-
 clouddb/src/clouddb/utils/utils.h             |   1 +
 clouddb/test.sql                              |  13 +-
 test/test.sql                                 | 157 +++++++++-
 30 files changed, 1280 insertions(+), 182 deletions(-)
 create mode 100644 clouddb/src/clouddb/facade/utils/utils.cpp
 create mode 100644 clouddb/src/clouddb/facade/utils/utils.h
 create mode 100644 clouddb/src/clouddb/iam/iam.c
 create mode 100644 clouddb/src/clouddb/iam/iam.h

diff --git a/clouddb/src/clouddb/CMakeLists.txt b/clouddb/src/clouddb/CMakeLists.txt
index 550a492057f..a92292c4226 100644
--- a/clouddb/src/clouddb/CMakeLists.txt
+++ b/clouddb/src/clouddb/CMakeLists.txt
@@ -1,30 +1,39 @@
-set(target_source  facade/query_builder.cpp
-                   utils/utils.c
-                   facade/drivers/cassandra_driver/cassandra_driver.cpp
-                   facade/session.cpp
-                   facade/command/cassandra_command/cas_transaction_command.cpp
-                   facade/command/command.cpp
-                   tam/src/ddl_func_tam.c
-                   tam/src/index_scan_tam.c
-                   tam/src/misc_func_tam.c
-                   tam/src/mod_tuple_tam.c
-                   tam/src/non_mod_tuple_tam.c
-                   tam/src/parallel_scan_tam.c
-                   tam/src/scan_func_tam.c
-                   tam/src/slot_func_tam.c
-                   tam/tam.c
-                   cpp.cpp
-                   hooks/src/hook.c
-                   clouddb.c)
+set(cpp_sources
+    facade/query_builder.cpp
+    facade/drivers/cassandra_driver/cassandra_driver.cpp
+    facade/session.cpp
+    facade/command/cassandra_command/cas_transaction_command.cpp
+    facade/command/command.cpp
+    facade/utils/utils.cpp
+    cpp.cpp
+)
+
+set(c_sources
+    utils/utils.c
+    tam/src/ddl_func_tam.c
+    tam/src/index_scan_tam.c
+    tam/src/misc_func_tam.c
+    tam/src/mod_tuple_tam.c
+    tam/src/non_mod_tuple_tam.c
+    tam/src/parallel_scan_tam.c
+    tam/src/scan_func_tam.c
+    tam/src/slot_func_tam.c
+    tam/tam.c
+    iam/iam.c
+    iam/src/scan_func_iam.c
+    iam/src/mod_func_iam.c
+    hooks/src/hook.c
+    clouddb.c
+)
 
 add_postgresql_extension(
   clouddb
   VERSION 1.0
-  SOURCES ${target_source}
+  SOURCES ${cpp_sources} ${c_sources}
   SCRIPTS clouddb--1.0.sql
   REGRESS basic
 )
 
 link_directories("/usr/local/pgsql/lib/")
-target_link_libraries(clouddb cassandra)
 
+target_link_libraries(clouddb cassandra pq)
\ No newline at end of file
diff --git a/clouddb/src/clouddb/clouddb--1.0.sql b/clouddb/src/clouddb/clouddb--1.0.sql
index 49e5f785e4f..44186934c38 100644
--- a/clouddb/src/clouddb/clouddb--1.0.sql
+++ b/clouddb/src/clouddb/clouddb--1.0.sql
@@ -15,3 +15,143 @@ LANGUAGE C STRICT;
 -- Register access method
 CREATE ACCESS METHOD clouddb TYPE TABLE HANDLER clouddb_table_handler;
 
+
+-- Create the SQL function
+CREATE OR REPLACE FUNCTION clouddb_index_handler(internal)
+RETURNS index_am_handler AS '$libdir/clouddb'
+LANGUAGE C STRICT;
+
+-- Register access method
+CREATE ACCESS METHOD clouddb_index TYPE INDEX HANDLER clouddb_index_handler;
+
+
+-- Создаем операторный класс для типа данных integer
+CREATE OPERATOR CLASS clouddb_integer_ops
+    DEFAULT FOR TYPE integer USING clouddb_index AS
+    OPERATOR 1 < (integer, integer),
+    OPERATOR 2 <= (integer, integer),
+    OPERATOR 3 = (integer, integer),
+    OPERATOR 4 >= (integer, integer),
+    OPERATOR 5 > (integer, integer);
+
+-- Создаем операторный класс для типа данных text
+CREATE OPERATOR CLASS clouddb_text_ops
+    DEFAULT FOR TYPE text USING clouddb_index AS
+    OPERATOR 1 < (text, text),
+    OPERATOR 2 <= (text, text),
+    OPERATOR 3 = (text, text),
+    OPERATOR 4 >= (text, text),
+    OPERATOR 5 > (text, text);
+
+-- Создаем операторный класс для типа данных smallint
+CREATE OPERATOR CLASS clouddb_smallint_ops
+    DEFAULT FOR TYPE smallint USING clouddb_index AS
+    OPERATOR 1 < (smallint, smallint),
+    OPERATOR 2 <= (smallint, smallint),
+    OPERATOR 3 = (smallint, smallint),
+    OPERATOR 4 >= (smallint, smallint),
+    OPERATOR 5 > (smallint, smallint);
+
+-- Создаем операторный класс для типа данных bigint
+CREATE OPERATOR CLASS clouddb_bigint_ops
+    DEFAULT FOR TYPE bigint USING clouddb_index AS
+    OPERATOR 1 < (bigint, bigint),
+    OPERATOR 2 <= (bigint, bigint),
+    OPERATOR 3 = (bigint, bigint),
+    OPERATOR 4 >= (bigint, bigint),
+    OPERATOR 5 > (bigint, bigint);
+
+-- Создаем операторный класс для типа данных real
+CREATE OPERATOR CLASS clouddb_real_ops
+    DEFAULT FOR TYPE real USING clouddb_index AS
+    OPERATOR 1 < (real, real),
+    OPERATOR 2 <= (real, real),
+    OPERATOR 3 = (real, real),
+    OPERATOR 4 >= (real, real),
+    OPERATOR 5 > (real, real);
+
+-- Создаем операторный класс для типа данных double precision
+CREATE OPERATOR CLASS clouddb_double_precision_ops
+    DEFAULT FOR TYPE double precision USING clouddb_index AS
+    OPERATOR 1 < (double precision, double precision),
+    OPERATOR 2 <= (double precision, double precision),
+    OPERATOR 3 = (double precision, double precision),
+    OPERATOR 4 >= (double precision, double precision),
+    OPERATOR 5 > (double precision, double precision);
+
+-- Создаем операторный класс для типа данных date
+CREATE OPERATOR CLASS clouddb_date_ops
+    DEFAULT FOR TYPE date USING clouddb_index AS
+    OPERATOR 1 < (date, date),
+    OPERATOR 2 <= (date, date),
+    OPERATOR 3 = (date, date),
+    OPERATOR 4 >= (date, date),
+    OPERATOR 5 > (date, date);
+
+-- Создаем операторный класс для типа данных date
+CREATE OPERATOR CLASS clouddb_boolean_ops
+    DEFAULT FOR TYPE boolean USING clouddb_index AS
+    OPERATOR 1 = (boolean, boolean);
+
+-- Создаем операторный класс для типа данных timestamp
+CREATE OPERATOR CLASS clouddb_timestamp_ops
+    DEFAULT FOR TYPE timestamp USING clouddb_index AS
+    OPERATOR 1 < (timestamp, timestamp),
+    OPERATOR 2 <= (timestamp, timestamp),
+    OPERATOR 3 = (timestamp, timestamp),
+    OPERATOR 4 >= (timestamp, timestamp),
+    OPERATOR 5 > (timestamp, timestamp);
+
+-- Создаем операторный класс для типа данных char
+CREATE OPERATOR CLASS clouddb_char_ops
+    DEFAULT FOR TYPE char USING clouddb_index AS
+    OPERATOR 1 < (char, char),
+    OPERATOR 2 <= (char, char),
+    OPERATOR 3 = (char, char),
+    OPERATOR 4 >= (char, char),
+    OPERATOR 5 > (char, char);
+
+-- Создаем операторный класс для типа данных bytea
+CREATE OPERATOR CLASS clouddb_bytea_ops
+    DEFAULT FOR TYPE bytea USING clouddb_index AS
+    OPERATOR 1 < (bytea, bytea),
+    OPERATOR 2 <= (bytea, bytea),
+    OPERATOR 3 = (bytea, bytea),
+    OPERATOR 4 >= (bytea, bytea),
+    OPERATOR 5 > (bytea, bytea);
+
+-- Создаем операторный класс для типа данных bit
+CREATE OPERATOR CLASS bit_ops
+    DEFAULT FOR TYPE bit USING clouddb_index AS
+    OPERATOR 1 < (bit, bit),
+    OPERATOR 2 <= (bit, bit),
+    OPERATOR 3 = (bit, bit),
+    OPERATOR 4 >= (bit, bit),
+    OPERATOR 5 > (bit, bit);
+
+-- Создаем операторный класс для типа данных bit varying
+CREATE OPERATOR CLASS bit_varying_ops
+    DEFAULT FOR TYPE bit varying USING clouddb_index AS
+    OPERATOR 1 < (bit varying, bit varying),
+    OPERATOR 2 <= (bit varying, bit varying),
+    OPERATOR 3 = (bit varying, bit varying),
+    OPERATOR 4 >= (bit varying, bit varying),
+    OPERATOR 5 > (bit varying, bit varying);
+
+-- Создаем операторный класс для типа данных numeric
+CREATE OPERATOR CLASS numeric_ops
+    DEFAULT FOR TYPE numeric USING clouddb_index AS
+    OPERATOR 1 < (numeric, numeric),
+    OPERATOR 2 <= (numeric, numeric),
+    OPERATOR 3 = (numeric, numeric),
+    OPERATOR 4 >= (numeric, numeric),
+    OPERATOR 5 > (numeric, numeric);
+
+-- Создаем операторный класс для типа данных time
+CREATE OPERATOR CLASS time_ops
+    DEFAULT FOR TYPE time USING clouddb_index AS
+    OPERATOR 1 < (time, time),
+    OPERATOR 2 <= (time, time),
+    OPERATOR 3 = (time, time),
+    OPERATOR 4 >= (time, time),
+    OPERATOR 5 > (time, time);
\ No newline at end of file
diff --git a/clouddb/src/clouddb/clouddb.c b/clouddb/src/clouddb/clouddb.c
index 338d3f7f8b4..e0627b75b50 100644
--- a/clouddb/src/clouddb/clouddb.c
+++ b/clouddb/src/clouddb/clouddb.c
@@ -14,7 +14,7 @@ void _PG_init() {
   char *m = "hello";
   some *some2 = &(some){.message = 6};
   some2 = create_class(some2);
-  printf("%d\n", getInClass(some2));
+  // printf("%d\n", getInClass(some2));
 
   hook_init();
 }
diff --git a/clouddb/src/clouddb/cpp.cpp b/clouddb/src/clouddb/cpp.cpp
index 202641f15c8..37703b5295e 100644
--- a/clouddb/src/clouddb/cpp.cpp
+++ b/clouddb/src/clouddb/cpp.cpp
@@ -11,7 +11,7 @@ char *some::getMessa() { return this->messa; }
 
 EXPORT_C some *create_class(some *some2) {
   some some1;
-  std::cout << ((struct some_copy *)(some2))->message << "\n";
+  // std::cout << ((struct some_copy *)(some2))->message << "\n";
   some2 = &some1;
   return some2;
 }
diff --git a/clouddb/src/clouddb/facade/command/cassandra_command/cas_transaction_command.cpp b/clouddb/src/clouddb/facade/command/cassandra_command/cas_transaction_command.cpp
index 18c2e2554cf..a5e3aee27ec 100644
--- a/clouddb/src/clouddb/facade/command/cassandra_command/cas_transaction_command.cpp
+++ b/clouddb/src/clouddb/facade/command/cassandra_command/cas_transaction_command.cpp
@@ -1,4 +1,7 @@
 #include "cas_transaction_command.h"
+#include "../command.h"
+
+#include "../../../utils/utils.h"
 
 #include <access/xact.h>
 #include <utils/rel.h>
@@ -7,6 +10,7 @@
 #include <iostream>
 #include <memory>
 
+
 namespace {
 std::vector<std::string> convertToVector(char **charArray, int size) {
   std::vector<std::string> result;
@@ -38,7 +42,12 @@ int CasTransactionCommand::execute() {
   if (this->operation == CREATE_TABLE) {
     driver->execCqlQuery(this->builder.buildCreateTable(
         this->tableName, this->fieldName, this->driver->getKeyspace()));
-  } else if (this->operation == INSERT_VALUE) {
+  }
+  else if (this->operation == CREATE_TABLE_INDEX) {
+    driver->execCqlQuery(this->builder.buildCreateTableIndex(
+        this->tableName, this->fieldName, this->driver->getKeyspace()));
+  }
+  else if (this->operation == INSERT_VALUE) {
     // 9 всего полей для заполнения метаданными, 8 поля tuple + метаданные без
     // key_name
     driver->execCqlQuery(
@@ -46,17 +55,30 @@ int CasTransactionCommand::execute() {
                                   this->fieldName, this->fieldName.size() + 8),
         this->fieldData, this->fieldSize, this->metadata,
         this->fieldName.size() + 9);
-  } else if (this->operation == BEGIN_SCAN) {
+  } 
+  else if (this->operation == INSERT_INDEX_VALUE) {
+    // 9 всего полей для заполнения метаданными, 8 поля tuple + метаданные без
+    // key_name
+    driver->execCqlQueryIndex(
+        this->builder.buildInsertIndex(driver->getKeyspace(), this->tableName,
+                                  this->fieldName, this->fieldName.size() + 9),
+        this->fieldData, this->fieldSize, this->metadata,
+        this->fieldName.size() + 10);
+  } 
+  else if (this->operation == BEGIN_SCAN) {
     driver->beginScan(relation, snapshot, nkeys, key, parallel_scan, flags, id);
-  } else if (this->operation == SELECT_DATA) {
-    return driver->selectData(snapshot);
-  } else if (this->operation == DELETE_SLOT) {
+  } 
+  else if (this->operation == SELECT_DATA) {
+    return driver->selectData(snapshot, this->metadataCount);
+  } 
+  else if (this->operation == DELETE_SLOT) {
     driver->execCqlQuery(
-        this->builder.buildDeleteSlot(driver->getKeyspace(), this->tableName),
+        this->builder.buildDeleteSlot(driver->getKeyspace(), this->tableName, this->isIndex),
         this->metadata, 4);
-  } else if (this->operation == UPDATE_SLOT) {
+  } 
+  else if (this->operation == UPDATE_SLOT) {
     driver->execCqlQuery(
-        this->builder.buildDeleteSlot(driver->getKeyspace(), this->tableName),
+        this->builder.buildDeleteSlot(driver->getKeyspace(), this->tableName, this->isIndex),
         this->metadata, 4);
     this->metadata.xmax = 0;
     this->metadata.xmax_commited = false;
@@ -66,15 +88,18 @@ int CasTransactionCommand::execute() {
                                   this->fieldName, this->fieldName.size() + 8),
         this->fieldData, this->fieldSize, this->metadata,
         this->fieldName.size() + 9);
-  } else if (this->operation == VACUUM_TABLE) {
+  } 
+  else if (this->operation == VACUUM_TABLE) {
     CassFuture *future =
         driver->execCqlQueryWithRes(this->builder.buildSelectVacuum(
             driver->getKeyspace(), this->tableName, this->id));
     driver->vacuum(this->tableName, future, this->tableName, this->id);
-  } else if (this->operation == DROP_TABLE) {
+  } 
+  else if (this->operation == DROP_TABLE) {
     driver->execCqlQuery(
         this->builder.buildDropTable(driver->getKeyspace(), this->tableName));
-  } else if (this->operation == TRUNCATE_TABLE) {
+  } 
+  else if (this->operation == TRUNCATE_TABLE) {
     driver->execCqlQuery(this->builder.buildTruncateTable(driver->getKeyspace(),
                                                           this->tableName));
   }
@@ -101,6 +126,18 @@ ITransactionCommand *CasTransactionCommand::createCreateTableCommand(
   return this;
 }
 
+ITransactionCommand *CasTransactionCommand::createCreateTableIndexCommand(
+    Session *session, Relation rel) {
+  this->operation = CREATE_TABLE_INDEX;
+  
+  this->tableName = std::string(RelationGetRelationName(rel));
+  for (int i = 0; i < RelationGetNumberOfAttributes(rel); i++) {
+    Form_pg_attribute attr = TupleDescAttr(rel->rd_att, i);
+    this->fieldName.push_back(strdup(NameStr(attr->attname)));
+  }
+  return this;
+}
+
 ITransactionCommand *CasTransactionCommand::createInsertCommand(
     Session *session, Relation relation, TupleTableSlot *slot, CommandId cid,
     int options, BulkInsertState bistate) {
@@ -111,7 +148,6 @@ ITransactionCommand *CasTransactionCommand::createInsertCommand(
       (char **)malloc(sizeof(char *) * RelationGetNumberOfAttributes(relation));
   int *fieldSize =
       (int *)malloc(sizeof(int) * RelationGetNumberOfAttributes(relation));
-  // std::cout << "size: " << RelationGetNumberOfAttributes(relation) << std::endl;
 
   TupleDesc desc = slot->tts_tupleDescriptor;
   for (int i = 0; i < desc->natts; i++) {
@@ -134,7 +170,6 @@ ITransactionCommand *CasTransactionCommand::createInsertCommand(
   this->operation = INSERT_VALUE;
 
   this->tableName = RelationGetRelationName(relation);
-  // std::cout << this->tableName << " tableName" << std::endl;
   this->fieldData =
       convertToVector(fieldData, RelationGetNumberOfAttributes(relation));
   free(fieldData);
@@ -149,8 +184,6 @@ ITransactionCommand *CasTransactionCommand::createInsertCommand(
   auto driver = std::static_pointer_cast<CassandraDriver>(session->getDriver());
   slot->tts_tid = driver->getNewPointer(
       std::string(RelationGetRelationName(relation)), driver->getKeyspace());
-  // std::cout << slot->tts_tid.ip_blkid.bi_hi << slot->tts_tid.ip_blkid.bi_lo
-  //           << slot->tts_tid.ip_posid << std::endl;
 
   this->metadata.xmin = GetCurrentTransactionId();
   this->metadata.xmin_commited = true;
@@ -159,6 +192,66 @@ ITransactionCommand *CasTransactionCommand::createInsertCommand(
   return this;
 }
 
+ITransactionCommand *CasTransactionCommand::createInsertIndexCommand(Session *session,
+                                                  Relation index, 
+                                                  Datum *values, 
+                                                  bool *isnull, 
+                                                  ItemPointer ht_ctid, 
+                                                  Relation heapRel, 
+                                                  struct IndexInfo *indexInfo) {
+  TupleDesc tupdesc = RelationGetDescr(index);
+  int len = tupdesc->natts;
+
+  char **fieldData =
+    (char **)malloc(sizeof(char *) * RelationGetNumberOfAttributes(index));
+  int *fieldSize =
+    (int *)malloc(sizeof(int) * RelationGetNumberOfAttributes(index));
+
+  for (int i = 0; i < len; i++) {
+      if (isnull[i]) {
+          fieldData[i] = NULL;
+          fieldSize[i] = -1;
+          continue;
+      }
+      Oid outFunc;
+      bool typIsVarlena;
+      Form_pg_attribute attr = TupleDescAttr(index->rd_att, i);
+      // Получаем функцию вывода для типа данных
+      getTypeOutputInfo(attr->atttypid, &outFunc, &typIsVarlena);
+      // Преобразуем значение в строку
+      fieldData[i] =
+          OidOutputFunctionCall(outFunc, values[i]);
+      fieldSize[i] = strlen(fieldData[i]);
+      this->fieldName.push_back(strdup(NameStr(attr->attname)));
+  }
+  this->operation = INSERT_INDEX_VALUE;
+
+  this->tableName = RelationGetRelationName(index);
+  this->fieldData =
+      convertToVector(fieldData, RelationGetNumberOfAttributes(index));
+  free(fieldData);
+  this->fieldSize =
+      convertToVector(fieldSize, RelationGetNumberOfAttributes(index));
+  free(fieldSize);
+
+  // for (int i = 0; i < RelationGetNumberOfAttributes(index); i++) {
+  //     Form_pg_attribute attr = TupleDescAttr(index->rd_att, i);
+  //     this->fieldName.push_back(strdup(NameStr(attr->attname)));
+  // }
+
+  auto driver = std::static_pointer_cast<CassandraDriver>(session->getDriver());
+  auto ctid = driver->getNewPointer(
+      std::string(RelationGetRelationName(index)), driver->getKeyspace());
+
+  this->metadata.xmin = GetCurrentTransactionId();
+  this->metadata.xmin_commited = true;
+  this->metadata.ctid = ctid;
+  this->metadata.t_ctid = ctid;
+  this->metadata.ref_tid = *ht_ctid;
+
+  return this;
+}
+
 ITransactionCommand *CasTransactionCommand::beginScanCommand(
     Session *session, Relation relation, Snapshot snapshot, int nkeys,
     struct ScanKeyData *key, ParallelTableScanDesc parallel_scan, uint32 flags,
@@ -175,8 +268,9 @@ ITransactionCommand *CasTransactionCommand::beginScanCommand(
 }
 
 ITransactionCommand *CasTransactionCommand::selectDataCommand(
-    Session *session, Snapshot snapshot) {
+    Session *session, Snapshot snapshot, size_t metadataCount) {
   this->snapshot = snapshot;
+  this->metadataCount = metadataCount;
   this->operation = SELECT_DATA;
   return this;
 }
@@ -184,7 +278,7 @@ ITransactionCommand *CasTransactionCommand::selectDataCommand(
 ITransactionCommand *CasTransactionCommand::createDeleteSlotCommand(
     Session *session, TransactionId id, ItemPointer newtid, Relation relation,
     ItemPointer tid, CommandId cid, Snapshot snapshot, Snapshot crosscheck,
-    bool wait, TM_FailureData *tmfd, bool changingPart) {
+    bool wait, TM_FailureData *tmfd, bool changingPart, bool isIndex) {
   this->operation = DELETE_SLOT;
   this->metadata.xmax = id;
   this->metadata.mask.set(5);
@@ -195,6 +289,54 @@ ITransactionCommand *CasTransactionCommand::createDeleteSlotCommand(
   this->metadata.mask.set(6);
 
   this->tableName = RelationGetRelationName(relation);
+  this->isIndex = isIndex;
+  return this;
+}
+
+ITransactionCommand *CasTransactionCommand::update_tuple_to_index(Session *session, TupleTableSlot *slot, IndexInfo *indexInfo, Relation indexRelation, 
+                        Relation heapRelation) {
+  size_t len = indexInfo->ii_NumIndexAttrs;
+  char **fieldData =
+      (char **)malloc(sizeof(char *) * len);
+  int *fieldSize =
+      (int *)malloc(sizeof(int) * len);
+
+  for (int i = 0; i < len; i++) {
+      if (slot->tts_isnull[i]) {
+          fieldData[i] = NULL;
+          fieldSize[i] = -1;
+          continue;
+      }
+      Oid outFunc;
+      bool typIsVarlena;
+      Form_pg_attribute attr = TupleDescAttr(heapRelation->rd_att, (indexInfo->ii_IndexAttrNumbers)[i] - 1);
+      // Получаем функцию вывода для типа данных
+      getTypeOutputInfo(attr->atttypid, &outFunc, &typIsVarlena);
+      // Преобразуем значение в строку
+      fieldData[i] = OidOutputFunctionCall(outFunc, slot->tts_values[(indexInfo->ii_IndexAttrNumbers)[i] - 1]);
+      fieldSize[i] = strlen(fieldData[i]);
+      this->fieldName.push_back(strdup(NameStr(attr->attname)));
+  }
+
+  this->operation = INSERT_INDEX_VALUE;
+  this->tableName = RelationGetRelationName(indexRelation);
+  this->fieldData =
+      convertToVector(fieldData, len);
+  free(fieldData);
+  this->fieldSize =
+      convertToVector(fieldSize, len);
+  free(fieldSize);
+
+  auto driver = std::static_pointer_cast<CassandraDriver>(session->getDriver());
+  auto ctid = driver->getNewPointer(
+      std::string(RelationGetRelationName(indexRelation)), driver->getKeyspace());
+
+  this->metadata.xmin = GetCurrentTransactionId();
+  this->metadata.xmin_commited = true;
+  this->metadata.ctid = ctid;
+  this->metadata.t_ctid = ctid;
+  this->metadata.ref_tid = slot->tts_tid;
+
   return this;
 }
 
@@ -207,7 +349,6 @@ ITransactionCommand *CasTransactionCommand::createUpdateSlotCommand(
       (char **)malloc(sizeof(char *) * RelationGetNumberOfAttributes(relation));
   int *fieldSize =
       (int *)malloc(sizeof(int) * RelationGetNumberOfAttributes(relation));
-  // std::cout << "size: " << RelationGetNumberOfAttributes(relation) << std::endl;
 
   TupleDesc desc = slot->tts_tupleDescriptor;
   for (int i = 0; i < desc->natts; i++) {
@@ -247,11 +388,13 @@ ITransactionCommand *CasTransactionCommand::createUpdateSlotCommand(
   auto driver = std::static_pointer_cast<CassandraDriver>(session->getDriver());
   this->metadata.t_ctid = driver->getNewPointer(
       std::string(RelationGetRelationName(relation)), driver->getKeyspace());
+  slot->tts_tid = this->metadata.t_ctid;
   this->metadata.mask.set(1);
   this->metadata.xmax_commited = true;
   this->metadata.mask.set(6);
 
   this->tableName = RelationGetRelationName(relation);
+
   return this;
 }
 
@@ -276,4 +419,4 @@ ITransactionCommand *CasTransactionCommand::createTruncateTable(
   this->operation = TRUNCATE_TABLE;
   this->tableName = std::string(relName);
   return this;
-}
+}
\ No newline at end of file
diff --git a/clouddb/src/clouddb/facade/command/cassandra_command/cas_transaction_command.h b/clouddb/src/clouddb/facade/command/cassandra_command/cas_transaction_command.h
index cf1658d867b..1873e273fcb 100644
--- a/clouddb/src/clouddb/facade/command/cassandra_command/cas_transaction_command.h
+++ b/clouddb/src/clouddb/facade/command/cassandra_command/cas_transaction_command.h
@@ -18,7 +18,9 @@ enum TransactionOperation {
   UPDATE_SLOT,
   VACUUM_TABLE,
   TRUNCATE_TABLE,
-  DROP_TABLE
+  DROP_TABLE,
+  INSERT_INDEX_VALUE,
+  CREATE_TABLE_INDEX
 };
 
 class CasTransactionCommand : public ITransactionCommand {
@@ -31,6 +33,8 @@ class CasTransactionCommand : public ITransactionCommand {
   TransactionOperation operation;
   std::shared_ptr<CassandraDriver> driver;
   Metadata metadata;
+  size_t metadataCount;
+  bool isIndex = false;
 
   // scan data
   Relation relation;
@@ -47,10 +51,19 @@ class CasTransactionCommand : public ITransactionCommand {
   int execute() override;
   ITransactionCommand *createCreateTableCommand(Session *session,
                                                 Relation rel) override;
+    ITransactionCommand *createCreateTableIndexCommand(Session *session,
+                                                Relation rel) override;
   ITransactionCommand *createInsertCommand(Session *session, Relation relation,
                                            TupleTableSlot *slot, CommandId cid,
                                            int options,
                                            BulkInsertState bistate) override;
+    ITransactionCommand *createInsertIndexCommand(Session *session,
+                                                  Relation index, 
+                                                  Datum *values, 
+                                                  bool *isnull, 
+                                                  ItemPointer ht_ctid, 
+                                                  Relation heapRel, 
+                                                  struct IndexInfo *indexInfo) override;
   ITransactionCommand *beginScanCommand(Session *session, Relation relation,
                                         Snapshot snapshot, int nkeys,
                                         struct ScanKeyData *key,
@@ -58,12 +71,12 @@ class CasTransactionCommand : public ITransactionCommand {
                                         uint32 flags,
                                         TransactionId id) override;
   ITransactionCommand *selectDataCommand(Session *session,
-                                         Snapshot snapshot) override;
+                                         Snapshot snapshot, size_t metadataCount) override;
 
   ITransactionCommand *createDeleteSlotCommand(
       Session *session, TransactionId id, ItemPointer newtid, Relation relation,
       ItemPointer tid, CommandId cid, Snapshot snapshot, Snapshot crosscheck,
-      bool wait, TM_FailureData *tmfd, bool changingPart) override;
+      bool wait, TM_FailureData *tmfd, bool changingPart, bool isIndex) override;
 
   ITransactionCommand *createUpdateSlotCommand(
       Session *session, TransactionId id, Relation relation, ItemPointer otid,
@@ -80,6 +93,8 @@ class CasTransactionCommand : public ITransactionCommand {
 
   ITransactionCommand *createTruncateTable(Session *session,
                                            char *relName) override;
+    ITransactionCommand *update_tuple_to_index(Session *session, TupleTableSlot *slot, IndexInfo *indexInfo, Relation indexRelation, 
+                        Relation heapRelation) override;
 };
 
 #endif  // !__cplusplus
diff --git a/clouddb/src/clouddb/facade/command/command.cpp b/clouddb/src/clouddb/facade/command/command.cpp
index 8292d556057..4f2a1095e94 100644
--- a/clouddb/src/clouddb/facade/command/command.cpp
+++ b/clouddb/src/clouddb/facade/command/command.cpp
@@ -9,7 +9,6 @@ ITransactionCommand *createTransactionCommand(std::shared_ptr<IDriver> driver) {
   //   return YDBTransactionCommand(
   //       std::dynamic_pointer_cast<YDBDriver>(driver));
   // }
-
   return nullptr;
 }
 
@@ -20,6 +19,13 @@ EXPORT_C ITransactionCommand *createCreateTableCommand(Session *session,
   return command;
 }
 
+EXPORT_C ITransactionCommand *createCreateTableIndexCommand(Session *session,
+                                                       Relation rel) {
+  ITransactionCommand *command = createTransactionCommand(session->getDriver());
+  command = command->createCreateTableIndexCommand(session, rel);
+  return command;
+}
+
 EXPORT_C ITransactionCommand *createInsertCommand(Session *session,
                                                   Relation relation,
                                                   TupleTableSlot *slot,
@@ -31,6 +37,18 @@ EXPORT_C ITransactionCommand *createInsertCommand(Session *session,
   return command;
 }
 
+EXPORT_C ITransactionCommand *createInsertIndexCommand(Session *session,
+                                                  Relation index, 
+                                                  Datum *values, 
+                                                  bool *isnull, 
+                                                  ItemPointer ht_ctid, 
+                                                  Relation heapRel, 
+                                                  struct IndexInfo *indexInfo) {
+  ITransactionCommand *command = createTransactionCommand(session->getDriver());
+  command = command->createInsertIndexCommand(session, index, values, isnull, ht_ctid, heapRel, indexInfo);
+  return command;
+}
+
 EXPORT_C ITransactionCommand *beginScanCommand(
     Session *session, Relation relation, Snapshot snapshot, int nkeys,
     struct ScanKeyData *key, ParallelTableScanDesc parallel_scan, uint32 flags,
@@ -42,20 +60,20 @@ EXPORT_C ITransactionCommand *beginScanCommand(
 }
 
 EXPORT_C ITransactionCommand *selectDataCommand(Session *session,
-                                                Snapshot snapshot) {
+                                                Snapshot snapshot, size_t metadataCount) {
   ITransactionCommand *command = createTransactionCommand(session->getDriver());
-  command = command->selectDataCommand(session, snapshot);
+  command = command->selectDataCommand(session, snapshot, metadataCount);
   return command;
 }
 
 EXPORT_C ITransactionCommand *createDeleteSlotCommand(
     Session *session, TransactionId id, ItemPointer newtid, Relation relation,
     ItemPointer tid, CommandId cid, Snapshot snapshot, Snapshot crosscheck,
-    bool wait, TM_FailureData *tmfd, bool changingPart) {
+    bool wait, TM_FailureData *tmfd, bool changingPart, bool isIndex) {
   ITransactionCommand *command = createTransactionCommand(session->getDriver());
   command = command->createDeleteSlotCommand(session, id, newtid, relation, tid,
                                              cid, snapshot, crosscheck, wait,
-                                             tmfd, changingPart);
+                                             tmfd, changingPart, isIndex);
   return command;
 }
 
@@ -92,3 +110,10 @@ EXPORT_C ITransactionCommand *createTruncateTable(Session *session,
   command = command->createTruncateTable(session, relName);
   return command;
 }
+
+EXPORT_C ITransactionCommand *update_tuple_to_index(Session *session, TupleTableSlot *slot, IndexInfo *indexInfo, Relation indexRelation, 
+                        Relation heapRelation) {
+  ITransactionCommand *command = createTransactionCommand(session->getDriver());
+  command = command->update_tuple_to_index(session, slot, indexInfo, indexRelation, heapRelation);
+  return command;  
+}
\ No newline at end of file
diff --git a/clouddb/src/clouddb/facade/command/command.h b/clouddb/src/clouddb/facade/command/command.h
index 0cf2c840db8..4e9a8d2c28c 100644
--- a/clouddb/src/clouddb/facade/command/command.h
+++ b/clouddb/src/clouddb/facade/command/command.h
@@ -20,11 +20,21 @@ ITransactionCommand *createTransactionCommand(std::shared_ptr<IDriver> driver);
 EXPORT_C ITransactionCommand *createCreateTableCommand(Session *session,
                                                        Relation rel);
 
+EXPORT_C ITransactionCommand *createCreateTableIndexCommand(Session *session,
+                                                       Relation rel);
+
 EXPORT_C ITransactionCommand *createInsertCommand(Session *session,
                                                   Relation relation,
                                                   TupleTableSlot *slot,
                                                   CommandId cid, int options,
                                                   BulkInsertState bistate);
+EXPORT_C ITransactionCommand *createInsertIndexCommand(Session *session,
+                                                  Relation index, 
+                                                  Datum *values, 
+                                                  bool *isnull, 
+                                                  ItemPointer ht_ctid, 
+                                                  Relation heapRel, 
+                                                  struct IndexInfo *indexInfo);
 
 EXPORT_C ITransactionCommand *beginScanCommand(
     Session *session, Relation relation, Snapshot snapshot, int nkeys,
@@ -32,12 +42,12 @@ EXPORT_C ITransactionCommand *beginScanCommand(
     TransactionId id);
 
 EXPORT_C ITransactionCommand *selectDataCommand(Session *session,
-                                                Snapshot snapshot);
+                                                Snapshot snapshot, size_t metadataCount);
 
 EXPORT_C ITransactionCommand *createDeleteSlotCommand(
     Session *session, TransactionId id, ItemPointer newtid, Relation relation,
     ItemPointer tid, CommandId cid, Snapshot snapshot, Snapshot crosscheck,
-    bool wait, TM_FailureData *tmfd, bool changingPart);
+    bool wait, TM_FailureData *tmfd, bool changingPart, bool isIndex);
 
 EXPORT_C ITransactionCommand *createUpdateSlotCommand(
     Session *session, TransactionId id, Relation relation, ItemPointer otid,
@@ -53,5 +63,7 @@ EXPORT_C ITransactionCommand *createDropTable(Session *session, char *relName);
 
 EXPORT_C ITransactionCommand *createTruncateTable(Session *session,
                                                   char *relName);
+EXPORT_C ITransactionCommand *update_tuple_to_index(Session *session, TupleTableSlot *slot, IndexInfo *indexInfo, Relation indexRelation, 
+                        Relation heapRelation);
 
-#endif
+#endif
\ No newline at end of file
diff --git a/clouddb/src/clouddb/facade/command/itransaction_command.h b/clouddb/src/clouddb/facade/command/itransaction_command.h
index 43770ecba27..4c3a01fa452 100644
--- a/clouddb/src/clouddb/facade/command/itransaction_command.h
+++ b/clouddb/src/clouddb/facade/command/itransaction_command.h
@@ -24,23 +24,32 @@ class ITransactionCommand : public ICommand {
   //                                       field fil) = 0;
   virtual ITransactionCommand *createCreateTableCommand(Session *session,
                                                         Relation rel) = 0;
+    virtual ITransactionCommand *createCreateTableIndexCommand(Session *session,
+                                                        Relation rel) = 0;
   virtual ITransactionCommand *createInsertCommand(Session *session,
                                                    Relation relation,
                                                    TupleTableSlot *slot,
                                                    CommandId cid, int options,
                                                    BulkInsertState bistate) = 0;
+    virtual ITransactionCommand *createInsertIndexCommand(Session *session,
+                                                  Relation index, 
+                                                  Datum *values, 
+                                                  bool *isnull, 
+                                                  ItemPointer ht_ctid, 
+                                                  Relation heapRel, 
+                                                  struct IndexInfo *indexInfo) = 0;
   virtual ITransactionCommand *beginScanCommand(
       Session *session, Relation relation, Snapshot snapshot, int nkeys,
       struct ScanKeyData *key, ParallelTableScanDesc parallel_scan,
       uint32 flags, TransactionId id) = 0;
 
   virtual ITransactionCommand *selectDataCommand(Session *session,
-                                                 Snapshot snapshot) = 0;
+                                                 Snapshot snapshot, size_t metadataCount) = 0;
 
   virtual ITransactionCommand *createDeleteSlotCommand(
       Session *session, TransactionId id, ItemPointer newtid, Relation relation,
       ItemPointer tid, CommandId cid, Snapshot snapshot, Snapshot crosscheck,
-      bool wait, TM_FailureData *tmfd, bool changingPart) = 0;
+      bool wait, TM_FailureData *tmfd, bool changingPart, bool isIndex) = 0;
 
   virtual ITransactionCommand *createUpdateSlotCommand(
       Session *session, TransactionId id, Relation relation, ItemPointer otid,
@@ -57,6 +66,8 @@ class ITransactionCommand : public ICommand {
 
   virtual ITransactionCommand *createTruncateTable(Session *session,
                                                    char *relName) = 0;
+    virtual ITransactionCommand *update_tuple_to_index(Session *session, TupleTableSlot *slot, IndexInfo *indexInfo, Relation indexRelation, 
+                        Relation heapRelation) = 0;
 };
 
 #else
diff --git a/clouddb/src/clouddb/facade/drivers/cassandra_driver/cassandra_driver.cpp b/clouddb/src/clouddb/facade/drivers/cassandra_driver/cassandra_driver.cpp
index 3f602931171..acfbbc26379 100644
--- a/clouddb/src/clouddb/facade/drivers/cassandra_driver/cassandra_driver.cpp
+++ b/clouddb/src/clouddb/facade/drivers/cassandra_driver/cassandra_driver.cpp
@@ -8,6 +8,7 @@
 #include <cstring>
 #include <iostream>
 #include <unordered_map>
+#include <cstdio>
 
 namespace {
 union convert {
@@ -20,26 +21,48 @@ void bindMetadataInStatement(CassStatement *statement, Metadata metadata,
   convert data = {.data = metadata.t_ctid};
   cass_statement_bind_bytes(statement, 0, (cass_byte_t *)data.a, 6);
   cass_statement_bind_uint32(statement, start, metadata.state);
-  // cass_statement_bind_uint32(statement, start, 10);
 
   cass_statement_bind_uint32(statement, start + 1, metadata.xmin);
-  // cass_statement_bind_uint32(statement, start + 1, 11);
 
   cass_statement_bind_bool(statement, start + 2,
                            (cass_bool_t)metadata.xmin_commited);
-  // cass_statement_bind_bool(statement, start + 2, (cass_bool_t)1);
   cass_statement_bind_bool(statement, start + 3,
                            (cass_bool_t)metadata.xmin_aborted);
-  // cass_statement_bind_bool(statement, start + 3, (cass_bool_t)1);
   cass_statement_bind_uint32(statement, start + 4, metadata.xmax);
-  // cass_statement_bind_uint32(statement, start + 4, 12);
 
   cass_statement_bind_bool(statement, start + 5,
                            (cass_bool_t)metadata.xmax_commited);
-  // cass_statement_bind_bool(statement, start + 5, (cass_bool_t)1);
   cass_statement_bind_bool(statement, start + 6,
                            (cass_bool_t)metadata.xmax_aborted);
-  // cass_statement_bind_bool(statement, start + 6, (cass_bool_t)1);
+
+  cass_statement_bind_bytes(
+      statement, start + 7,
+      (cass_byte_t *)data.a,  // TODO: Это ТОЧНО будет работать?
+      6);
+}
+
+void bindMetadataInStatementWithIndex(CassStatement *statement, Metadata metadata,
+                             int start) {
+  convert data = {.data = metadata.t_ctid};
+  cass_statement_bind_bytes(statement, 0, (cass_byte_t *)data.a, 6);
+
+  convert data_ref = {.data = metadata.ref_tid};
+  cass_statement_bind_bytes(statement, 1, (cass_byte_t *)data_ref.a, 6);
+
+  cass_statement_bind_uint32(statement, start, metadata.state);
+
+  cass_statement_bind_uint32(statement, start + 1, metadata.xmin);
+
+  cass_statement_bind_bool(statement, start + 2,
+                           (cass_bool_t)metadata.xmin_commited);
+  cass_statement_bind_bool(statement, start + 3,
+                           (cass_bool_t)metadata.xmin_aborted);
+  cass_statement_bind_uint32(statement, start + 4, metadata.xmax);
+
+  cass_statement_bind_bool(statement, start + 5,
+                           (cass_bool_t)metadata.xmax_commited);
+  cass_statement_bind_bool(statement, start + 6,
+                           (cass_bool_t)metadata.xmax_aborted);
 
   cass_statement_bind_bytes(
       statement, start + 7,
@@ -58,39 +81,32 @@ void bindPartMetadataInStatement(CassStatement *statement, Metadata metadata) {
     cass_statement_bind_bytes(statement, i, (cass_byte_t *)data.a, 6);
     i++;
   }
-  // cass_statement_bind_uint32(statement, start, 10);
 
   if (metadata.mask.test(2)) {
     cass_statement_bind_uint32(statement, i, metadata.xmin);
     i++;
   }
-  // cass_statement_bind_uint32(statement, start + 1, 11);
   if (metadata.mask.test(3)) {
     cass_statement_bind_bool(statement, i, (cass_bool_t)metadata.xmin_commited);
     i++;
   }
-  // cass_statement_bind_bool(statement, start + 2, (cass_bool_t)1);
   if (metadata.mask.test(4)) {
     cass_statement_bind_bool(statement, i, (cass_bool_t)metadata.xmin_aborted);
     i++;
   }
-  // cass_statement_bind_bool(statement, start + 3, (cass_bool_t)1);
   if (metadata.mask.test(5)) {
     cass_statement_bind_uint32(statement, i, metadata.xmax);
     i++;
   }
-  // cass_statement_bind_uint32(statement, start + 4, 12);
   if (metadata.mask.test(6)) {
     cass_statement_bind_bool(statement, i, (cass_bool_t)metadata.xmax_commited);
     i++;
   }
-  // cass_statement_bind_bool(statement, start + 5, (cass_bool_t)1);
 
   if (metadata.mask.test(7)) {
     cass_statement_bind_bool(statement, i, (cass_bool_t)metadata.xmax_aborted);
     i++;
   }
-  // cass_statement_bind_bool(statement, start + 6, (cass_bool_t)1);
 
   if (metadata.mask.test(8)) {
     cass_statement_bind_bytes(
@@ -135,7 +151,6 @@ CassandraDriver::CassandraDriver(
 
   std::string query =
       this->builder.buildKeyspace(this->keyspace, this->replicationFactor);
-  // std::cout << query << std::endl;
   execCqlQuery(query);
 }
 
@@ -163,14 +178,9 @@ void CassandraDriver::execCqlQuery(std::string query, Metadata metadata,
                                    int var) {
   CassError rc = CASS_OK;
   CassFuture *future = NULL;
-  // std::cout << query << std::endl;
-  // std::cout << metadata.mask << std::endl;
   CassStatement *statement = cass_statement_new(query.data(), var);
   convert data = {.data = metadata.ctid};
-  // std::cout << metadata.t_ctid.ip_blkid.bi_hi << " "
-  //           << metadata.t_ctid.ip_blkid.bi_lo << " " <<
-  //           metadata.t_ctid.ip_posid
-  //           << std::endl;
+
   cass_statement_bind_bytes(statement, var - 1, (cass_byte_t *)data.a, 6);
   bindPartMetadataInStatement(statement, metadata);
 
@@ -194,13 +204,10 @@ void CassandraDriver::execCqlQuery(std::string query,
   CassError rc = CASS_OK;
   CassFuture *future = NULL;
   CassStatement *statement = cass_statement_new(query.data(), var);
-  // std::cout << "\n\n\n";
   for (int i = 0; i < fields.size(); ++i) {
     char *a = const_cast<char *>(fields[i].c_str());
     convert b;
     strncpy(b.a, a, 6);
-    // std::cout << b.data.ip_blkid.bi_hi << " " << b.data.ip_blkid.bi_lo << " "
-    //           << b.data.ip_posid << " vlaue" << std::endl;
 
     cass_statement_bind_bytes(statement, i,
                               (const cass_byte_t *)fields[i].c_str(), 6);
@@ -228,11 +235,8 @@ void CassandraDriver::execCqlQuery(std::string query,
   CassError rc = CASS_OK;
   CassFuture *future = NULL;
   CassStatement *statement = cass_statement_new(query.data(), var);
-  // std::cout << query << std::endl;
-  // std::cout << fieldData.size() << std::endl;
 
   for (int i = 0; i < fieldData.size(); ++i) {
-    // std::cout << fieldData[i] << " vlaue" << std::endl;
     if (fieldData[i] == "") {
       cass_statement_bind_null(statement, i + 1);
       continue;
@@ -259,6 +263,41 @@ void CassandraDriver::execCqlQuery(std::string query,
   cass_statement_free(statement);
 }
 
+void CassandraDriver::execCqlQueryIndex(std::string query,
+                                   std::vector<std::string> fieldData,
+                                   std::vector<size_t> fieldSize,
+                                   Metadata metadata, int var) {
+  CassError rc = CASS_OK;
+  CassFuture *future = NULL;
+  CassStatement *statement = cass_statement_new(query.data(), var);
+
+  for (int i = 0; i < fieldData.size(); ++i) {
+    if (fieldData[i] == "") {
+      cass_statement_bind_null(statement, i + 2);
+      continue;
+    }
+
+    cass_statement_bind_bytes(statement, i + 2,
+                              (const cass_byte_t *)fieldData[i].c_str(),
+                              fieldSize[i]);
+  }
+  bindMetadataInStatementWithIndex(statement, metadata, fieldData.size() + 2);
+
+  future = cass_session_execute(this->sessionPtr, statement);
+  // cass_future_wait(future);
+
+  // rc = cass_future_error_code(future);
+  // if (rc != CASS_OK) {
+  //   const char *message;
+  //   size_t message_length;
+  //   cass_future_error_message(future, &message, &message_length);
+  //   std::cerr << "Connection error: " << std::string(message, message_length)
+  //             << std::endl;
+  // }
+  cass_future_free(future);
+  cass_statement_free(statement);
+}
+
 CassFuture *CassandraDriver::execCqlQueryWithRes(std::string query) {
   CassError rc = CASS_OK;
   CassFuture *future = NULL;
@@ -286,7 +325,7 @@ ItemPointerData CassandraDriver::getNewPointer(std::string tableName,
   if (data.ip_posid < UINT16_MAX) {
     data.ip_posid++;
   } else {
-    data.ip_posid = 1;
+    // data.ip_posid = 0;
     if (data.ip_blkid.bi_lo < UINT16_MAX) {
       data.ip_blkid.bi_lo++;
     } else {
@@ -310,7 +349,6 @@ ItemPointerData CassandraDriver::getLastPointer(const std::string &tableName,
   }
 
   std::string query = builder.buildGetLastPointer(key, tableName);
-  // std::cout << "query last pointer: " << query << std::endl;
   CassFuture *future = execCqlQueryWithRes(query);
   ItemPointerData last = {};
 
@@ -346,13 +384,11 @@ void CassandraDriver::beginScan(Relation relation, Snapshot snapshot, int nkeys,
                                 ParallelTableScanDesc parallel_scan,
                                 uint32 flags, TransactionId id) {
   this->iterator.current.fieldNames.clear();
-  // this->iterator.current.fieldNames;
+
   for (int i = 0; i < RelationGetNumberOfAttributes(relation); i++) {
     Form_pg_attribute attr = TupleDescAttr(relation->rd_att, i);
     this->iterator.current.fieldNames.push_back(NameStr(attr->attname));
   }
-  // std::cout << "begin scan: " << this->iterator.current.fieldNames.size()
-  //           << std::endl;
 
   std::string query = builder.buildSelectAll(
       keyspace, std::string(RelationGetRelationName(relation)), id);
@@ -376,14 +412,13 @@ int inVisibilityArea(Metadata metadata, Snapshot snapshot, int64_t id) {
   return true;
 }
 
-CassError loadMetadata(CassRow *row, Metadata &metadata) {
+CassError loadMetadata(const CassRow *row, Metadata &metadata) {
   CassError error = CASS_OK;
   cass_bool_t tmpBool;
 
   error = cass_value_get_bool(cass_row_get_column_by_name(row, "xmax_aborted"),
                               &tmpBool);
   if (error != CASS_OK) {
-    // pgLog(WARNING, "cannot read xmax_aborted");
   } else {
     metadata.xmax_aborted = tmpBool;
   }
@@ -391,7 +426,6 @@ CassError loadMetadata(CassRow *row, Metadata &metadata) {
   error = cass_value_get_bool(cass_row_get_column_by_name(row, "xmin_aborted"),
                               &tmpBool);
   if (error != CASS_OK) {
-    // pgLog(WARNING, "cannot read xmin_aborted");
   } else {
     metadata.xmin_aborted = tmpBool;
   }
@@ -399,7 +433,6 @@ CassError loadMetadata(CassRow *row, Metadata &metadata) {
   error = cass_value_get_bool(cass_row_get_column_by_name(row, "xmin_commited"),
                               &tmpBool);
   if (error != CASS_OK) {
-    // pgLog(WARNING, "cannot read xmin_commited");
   } else {
     metadata.xmin_commited = tmpBool;
   }
@@ -407,7 +440,6 @@ CassError loadMetadata(CassRow *row, Metadata &metadata) {
   error = cass_value_get_bool(cass_row_get_column_by_name(row, "xmax_commited"),
                               &tmpBool);
   if (error != CASS_OK) {
-    // pgLog(WARNING, "cannot read xmax_commited");
   } else {
     metadata.xmax_commited = tmpBool;
   }
@@ -416,7 +448,6 @@ CassError loadMetadata(CassRow *row, Metadata &metadata) {
   error =
       cass_value_get_int32(cass_row_get_column_by_name(row, "state"), &tmpInt);
   if (error != CASS_OK) {
-    // pgLog(WARNING, "cannot read state %d", error);
   } else {
     metadata.state = tmpInt;
   }
@@ -424,7 +455,6 @@ CassError loadMetadata(CassRow *row, Metadata &metadata) {
   error =
       cass_value_get_int32(cass_row_get_column_by_name(row, "xmin"), &tmpInt);
   if (error != CASS_OK) {
-    // pgLog(WARNING, "cannot read xmin %d", error);
   } else {
     metadata.xmin = tmpInt;
   }
@@ -432,57 +462,59 @@ CassError loadMetadata(CassRow *row, Metadata &metadata) {
   error =
       cass_value_get_int32(cass_row_get_column_by_name(row, "xmax"), &tmpInt);
   if (error != CASS_OK) {
-    // pgLog(WARNING, "cannot read xmax %d", error);
   } else {
     metadata.xmax = tmpInt;
   }
 
   const cass_byte_t *bytes;
   size_t size;
-  error = cass_value_get_bytes(cass_row_get_column_by_name(row, "key_name"),
+  error = cass_value_get_bytes(cass_row_get_column_by_name(row, KEY_NAME),
                                &bytes, &size);
   if (error != CASS_OK) {
-    // pgLog(WARNING, "cannot read ItemPointerData");
   } else {
     convert data;
     memcpy(&data, bytes, sizeof(data));
     metadata.ctid = data.data;
   }
 
+  error = cass_value_get_bytes(cass_row_get_column_by_name(row, REF_NAME),
+                               &bytes, &size);
+  if (error != CASS_OK) {
+  } else {
+    convert data;
+    memcpy(&data, bytes, sizeof(data));
+    metadata.ref_tid = data.data;
+  }
+
   error = cass_value_get_bytes(cass_row_get_column_by_name(row, "t_ctid"),
                                &bytes, &size);
   if (error != CASS_OK) {
-    // pgLog(WARNING, "cannot read ItemPointerData");
   } else {
     convert data;
     memcpy(&data, bytes, sizeof(data));
     metadata.t_ctid = data.data;
   }
-  // if (size != KEY_SIZE) {
-  //   // pgLog(WARNING, "invalid key size: %ld", size);
-  // }
   return CASS_OK;
 }
 
-int CassandraDriver::selectData(Snapshot snapshot) {
+int CassandraDriver::selectData(Snapshot snapshot, size_t metadataCount) {
   if (cass_iterator_next(this->iterator.iter)) {
     CassRow *row =
         const_cast<CassRow *>(cass_iterator_get_row(this->iterator.iter));
     CassError error = loadMetadata(row, metadata);
-    // std::cout << metadata.xmin << " " << metadata.xmax << " select"
-    //           << std::endl;
-    if (!inVisibilityArea(metadata, snapshot, ReadNextTransactionId() - 1)) {
-      return selectData(snapshot);  // надо пофиксить
-    }
+
     this->iterator.row.value.clear();
     this->iterator.row.size.clear();
 
+    if (!inVisibilityArea(metadata, snapshot, ReadNextTransactionId() - 1) || row == NULL) {
+      return selectData(snapshot, metadataCount);  // надо пофиксить
+    }
+
     size_t size;
-    for (int i = 0; i < this->iterator.columnCount - 9; i++) {
-      const cass_byte_t *bytes;
-      const CassValue *casValue = cass_row_get_column_by_name(
-          row, this->iterator.current.fieldNames[i].data());
-      if (cass_value_is_null(casValue)) {
+    for (int i = 0; i + metadataCount < this->iterator.columnCount; i++) {
+      const cass_byte_t *bytes; 
+      const CassValue *casValue = cass_row_get_column_by_name(row, this->iterator.current.fieldNames[i].data());
+      if (cass_value_is_null(casValue)) {  
         this->iterator.row.value.push_back(NULL);
         this->iterator.row.size.push_back(-1);
         continue;
@@ -491,12 +523,7 @@ int CassandraDriver::selectData(Snapshot snapshot) {
       cass_value_get_bytes(casValue, &bytes, &size);
       this->iterator.row.value.push_back(bytes);
       this->iterator.row.size.push_back(size);
-    }
-    const cass_byte_t *bytes;
-    cass_value_get_bytes(cass_row_get_column_by_name(row, "key_name"), &bytes,
-                         &size);
-    // std::cout << "select data: " << this->iterator.row.value[0] << " "
-    //           << this->iterator.row.size.size() << std::endl;
+    } 
     return 1;
   }
   return 0;
@@ -506,11 +533,16 @@ char **CassandraDriver::getValue() {
   char **res =
       (char **)malloc(sizeof(char *) * this->iterator.row.value.size());
   for (int i = 0; i < this->iterator.row.value.size(); i++) {
-    res[i] = const_cast<char *>(
+    if (this->iterator.row.value[i] == NULL) {
+      res[i] = NULL;
+    }
+    else {
+      res[i] = const_cast<char *>(
         reinterpret_cast<const char *>(this->iterator.row.value[i]));
+    }
   }
-  this->iterator.row.value.clear();
-  this->iterator.row.size.clear();
+  // this->iterator.row.value.clear();
+  // this->iterator.row.size.clear();
   return res;
 }
 
@@ -522,10 +554,18 @@ ItemPointerData CassandraDriver::getTid() {
   return metadata.t_ctid;
 }
 
+ItemPointerData CassandraDriver::getRefTid() {
+  return metadata.ref_tid;
+}
+
 ItemPointerData getTidForScan(IDriver *driver) {
   return driver->getTid();
 }
 
+ItemPointerData getRefTidForScan(IDriver* driver) {
+  return driver->getRefTid();
+}
+
 void CassandraDriver::vacuum(std::string query, CassFuture *future,
                              std::string tableName, TransactionId id) {
   this->iterator.res = cass_future_get_result(future);
@@ -542,10 +582,9 @@ void CassandraDriver::vacuum(std::string query, CassFuture *future,
     CassRow *row =
         const_cast<CassRow *>(cass_iterator_get_row(this->iterator.iter));
     loadMetadata(row, metadata);
-    cass_value_get_bytes(cass_row_get_column_by_name(row, "key_name"), &bytes,
+    cass_value_get_bytes(cass_row_get_column_by_name(row, KEY_NAME), &bytes,
                          &size);
-    // std::cout << metadata.xmax << " xmax metadata  and id - " << id
-    //           << std::endl;
+
     if (metadata.xmax == 0) {
       continue;
     }
@@ -568,20 +607,105 @@ void CassandraDriver::vacuum(std::string query, CassFuture *future,
   if (keysInBatch > 0) {
     std::vector<std::string> keysV;
     for (int i = 0; i < keysInBatch; i++) {
-      // std::cout << keys[i].data.ip_blkid.bi_hi << " "
-      //           << keys[i].data.ip_blkid.bi_lo << " " <<
-      //           keys[i].data.ip_posid
-      //           << std::endl;
 
       keysV.emplace_back(keys[i].a, 6);
       char *a = const_cast<char *>(keysV[i].c_str());
       convert b;
       memcpy(b.a, a, 6);
-      // std::cout << b.data.ip_blkid.bi_hi << " " << b.data.ip_blkid.bi_lo << "
-      // "
-      //           << b.data.ip_posid << std::endl;
     }
     execCqlQuery(builder.buildDropTuple(keyspace, tableName, keysInBatch),
                  keysV, keysInBatch);
   }
 }
+
+
+const CassRow* CassandraDriver::getRow(const char *tableName, ItemPointer tid) {
+  convert utid = {.data = *tid};
+  std::string query = this->builder.buildGetRow(this->getKeyspace(), tableName);
+
+  CassStatement* statement = cass_statement_new(query.data(), 1);
+
+  cass_statement_bind_bytes(statement, 0, (cass_byte_t*)utid.a, 6);
+
+  CassFuture *future = cass_session_execute(this->sessionPtr, statement);
+  cass_future_wait(future);
+  // Проверяем успешность выполнения запроса
+  CassError rc = cass_future_error_code(future);
+  if (rc != CASS_OK) {
+    const char *message;
+    size_t message_length;
+    cass_future_error_message(future, &message, &message_length);
+    std::cerr << "Connection error: " << std::string(message, message_length)
+              << std::endl;
+      return NULL;
+  }
+
+  if (cass_future_error_code(future) == CASS_OK) {
+      // Получение результата
+    const CassResult* result = cass_future_get_result(future);
+    const CassRow* row = cass_result_first_row(result);
+    return row;
+  }
+  cass_future_free(future);
+  cass_statement_free(statement);
+  return NULL;
+}
+
+bool CassandraDriver::getVisibleValueRowArray(ItemPointer tid, const char *tableName, TupleDesc tupdesc, unsigned char** values, 
+                            unsigned char* nulls, Snapshot snapshot, TransactionId transactionId) {
+    unsigned char** values_d = (unsigned char**)this->getValue();
+    
+    if (values_d == NULL) return false;
+    
+    int index = 0;
+
+    for (int i = 0; i < tupdesc->natts; i++) {
+        char *column_name = NameStr(tupdesc->attrs[i].attname);
+
+        if (index < this->iterator.current.fieldNames.size() && strcmp(this->iterator.current.fieldNames[index].data(), column_name) == 0) {
+          auto c = values_d[index];
+          values[i] = (unsigned char*)malloc(this->iterator.current.fieldNames[index].length() + 1);
+          strcpy((char*)values[i], (char*)c);
+          index++;
+          nulls[i] = 0;
+        }
+        else {
+          values[i] = NULL;
+          nulls[i] = 1;
+        }
+
+        // const CassRow *row = getRow(tableName, tid);
+        // if (row == NULL) return false;
+
+        // Metadata metadata;
+        // CassError error = loadMetadata(row, metadata);
+        // if (!inVisibilityArea(metadata, snapshot, transactionId)) {
+        //     return false;
+        // }
+
+        // for (int i = 0; i < tupdesc->natts; i++) {
+        //     char *column_name = NameStr(tupdesc->attrs[i].attname);
+
+        //     size_t size;
+        //     const cass_byte_t *bytes;
+        //     const CassValue *casValue = cass_row_get_column_by_name(row, column_name);
+            
+        //     if (cass_value_is_null(casValue)) {
+        //         values[i] = NULL;
+        //         nulls[i] = 1;
+        //         continue;
+        //     }
+            
+        //     cass_value_get_bytes(casValue, &bytes, &size);
+
+        //     values[i] = (unsigned char*)malloc(size + 1);
+        //     memcpy(values[i], bytes, size);
+        //     values[i][size] = '\0';
+        //     nulls[i] = 0;
+        // }
+        // return true;
+
+    }
+    return true;
+}
+
diff --git a/clouddb/src/clouddb/facade/drivers/cassandra_driver/cassandra_driver.h b/clouddb/src/clouddb/facade/drivers/cassandra_driver/cassandra_driver.h
index 3ec434775bb..315e2a623cd 100644
--- a/clouddb/src/clouddb/facade/drivers/cassandra_driver/cassandra_driver.h
+++ b/clouddb/src/clouddb/facade/drivers/cassandra_driver/cassandra_driver.h
@@ -65,25 +65,40 @@ class CassandraDriver : public IDriver {
   ~CassandraDriver() override = default;
   CassandraDriver(std::unordered_map<std::string, std::string> config);
   void execCqlQuery(std::string query);
+
   void execCqlQuery(std::string query, Metadata metadata, int var);
+
   void execCqlQuery(std::string query, std::vector<std::string> fields,
                     int var);
+
   void execCqlQuery(std::string query, std::vector<std::string> fieldData,
                     std::vector<size_t> fieldSize, Metadata metadata, int var);
+
+  void execCqlQueryIndex(std::string query, std::vector<std::string> fieldData,
+                    std::vector<size_t> fieldSize, Metadata metadata, int var);
+                    
   CassFuture *execCqlQueryWithRes(std::string query);
+
   std::string getKeyspace() { return this->keyspace; }
+
   ItemPointerData getNewPointer(std::string tableName, std::string key);
 
   void beginScan(Relation relation, Snapshot snapshot, int nkeys,
                  struct ScanKeyData *key, ParallelTableScanDesc parallel_scan,
                  uint32 flags, TransactionId id) override;
-  int selectData(Snapshot snapshot) override;
+  int selectData(Snapshot snapshot, size_t metadataCount) override;
+
   char **getValue() override;
   ItemPointerData getTid() override;
+  ItemPointerData getRefTid() override;
+  
   void vacuum(std::string query, CassFuture *future, std::string tableName,
               TransactionId id);
   friend char **getValueForScan(IDriver *driver);
   friend ItemPointerData getTidForScan(IDriver *driver);
+  const CassRow* getRow(const char *tableName, ItemPointer tid);
+  bool getVisibleValueRowArray(ItemPointer tid, const char *tableName, TupleDesc tupdesc, unsigned char** values, 
+                            unsigned char* nulls, Snapshot snapshot, TransactionId transactionId);
 };
 
 #endif  //
diff --git a/clouddb/src/clouddb/facade/drivers/idriver.h b/clouddb/src/clouddb/facade/drivers/idriver.h
index 78eb3b56314..e5a2b85270f 100644
--- a/clouddb/src/clouddb/facade/drivers/idriver.h
+++ b/clouddb/src/clouddb/facade/drivers/idriver.h
@@ -27,9 +27,10 @@ class IDriver {
                          struct ScanKeyData* key,
                          ParallelTableScanDesc parallel_scan, uint32 flags,
                          TransactionId id) = 0;
-  virtual int selectData(Snapshot snapshot) = 0;
+  virtual int selectData(Snapshot snapshot, size_t metadataCount) = 0;
   virtual char** getValue() = 0;
   virtual ItemPointerData getTid() = 0;
+  virtual ItemPointerData getRefTid() = 0;
 };
 #else
 typedef struct IDriver IDriver;
@@ -37,5 +38,6 @@ typedef struct IDriver IDriver;
 
 EXPORT_C char** getValueForScan(IDriver* driver);
 EXPORT_C ItemPointerData getTidForScan(IDriver* driver);
+EXPORT_C ItemPointerData getRefTidForScan(IDriver* driver);
 
 #endif  // !IDRIVER_H
diff --git a/clouddb/src/clouddb/facade/query_builder.cpp b/clouddb/src/clouddb/facade/query_builder.cpp
index 51674489527..d969304ef4a 100644
--- a/clouddb/src/clouddb/facade/query_builder.cpp
+++ b/clouddb/src/clouddb/facade/query_builder.cpp
@@ -12,8 +12,6 @@ std::string CassandraBuilder::buildKeyspace(std::string keyspace,
   dest += "'replication_factor': '";
   dest += std::to_string(replication_factor);
   dest += "' };";
-
-  // std::cout << dest << std::endl;
   return dest;
 }
 
@@ -26,7 +24,7 @@ std::string CassandraBuilder::buildCreateTable(
   query += ".";
   query += tableName;
   query += " (";
-  query += "key_name";
+  query += KEY_NAME;
   query += " blob, ";
   for (auto &field : fieldName) {
     query += field;
@@ -50,10 +48,49 @@ std::string CassandraBuilder::buildCreateTable(
   query += " blob, ";
 
   query += " PRIMARY KEY (";
-  query += "key_name";
+  query += KEY_NAME;
   query += ") );";
 
-  // std::cout << query << std::endl;
+  return query;
+}
+
+std::string CassandraBuilder::buildCreateTableIndex(
+    std::string tableName, std::vector<std::string> fieldName,
+    std::string keyspace) {
+  std::string query = "";
+  query += "CREATE TABLE ";
+  query += keyspace;
+  query += ".";
+  query += tableName;
+  query += " (";
+  query += KEY_NAME;
+  query += " blob, ";
+  query += REF_NAME;
+  query += " blob, ";
+  for (auto &field : fieldName) {
+    query += field;
+    query += " blob, ";
+  }
+  query += "state";
+  query += " int, ";
+  query += "xmin";
+  query += " int, ";
+  query += "xmin_commited";
+  query += " boolean, ";
+  query += "xmin_aborted";
+  query += " boolean, ";
+  query += "xmax";
+  query += " int, ";
+  query += "xmax_commited";
+  query += " boolean, ";
+  query += "xmax_aborted";
+  query += " boolean, ";
+  query += "t_ctid";
+  query += " blob, ";
+
+  query += " PRIMARY KEY (";
+  query += REF_NAME;
+  query += ") );";
   return query;
 }
 
@@ -61,12 +98,13 @@ std::string CassandraBuilder::buildGetLastPointer(std::string key,
                                                   std::string tableName) {
   std::string query = "";
   query += "SELECT MAX(";
-  query += "key_name";
+  query += KEY_NAME;
   query += ") FROM ";
   query += key;
   query += ".";
   query += tableName;
   query += ";";
+
   // std::cout << query << std::endl;
   return query;
 }
@@ -74,10 +112,11 @@ std::string CassandraBuilder::buildGetLastPointer(std::string key,
 std::string CassandraBuilder::buildMaxKey() {
   std::string query = "";
   query += "system.max(";
-  query += "key_name";
+  query += KEY_NAME;
   query += ")";
 
   // std::cout << query << std::endl;
+
   return query;
 }
 
@@ -91,7 +130,52 @@ std::string CassandraBuilder::buildInsert(std::string keyspace,
   query += ".";
   query += tableName;
   query += " (";
-  query += "key_name";
+  query += KEY_NAME;
+  query += ", ";
+  for (auto field : fieldNames) {
+    query += field;
+    query += ", ";
+  }
+  query += "state";
+  query += ", ";
+  query += "xmin";
+  query += ", ";
+  query += "xmin_commited";
+  query += ", ";
+  query += "xmin_aborted";
+  query += ", ";
+  query += "xmax";
+  query += ", ";
+  query += "xmax_commited";
+  query += ", ";
+  query += "xmax_aborted";
+  query += ", ";
+  query += "t_ctid";
+  query += " ) VALUES (";
+  for (int i = 0; i < var; i++) {
+    query += "?, ";
+  }
+  query += "?);";
+
+  // std::cout << query << std::endl;
+
+  return query;
+}
+
+
+std::string CassandraBuilder::buildInsertIndex(std::string keyspace,
+                                          std::string tableName,
+                                          std::vector<std::string> fieldNames,
+                                          int var) {
+  std::string query = "";
+  query += "INSERT INTO ";
+  query += keyspace;
+  query += ".";
+  query += tableName;
+  query += " (";
+  query += KEY_NAME;
+  query += ", ";
+  query += REF_NAME;
   query += ", ";
   for (auto field : fieldNames) {
     query += field;
@@ -119,6 +203,7 @@ std::string CassandraBuilder::buildInsert(std::string keyspace,
   query += "?);";
 
   // std::cout << query << std::endl;
+
   return query;
 }
 
@@ -135,12 +220,14 @@ std::string CassandraBuilder::buildSelectAll(std::string keyspace,
   query += " <= ";
   query += std::to_string(id);
   query += "  ALLOW FILTERING;";
-  std::cout << query << std::endl;
+
+  // std::cout << query << std::endl;
+
   return query;
 }
 
 std::string CassandraBuilder::buildDeleteSlot(std::string keyspace,
-                                              std::string tableName) {
+                                              std::string tableName, bool isIndex) {
   std::string query = "";
   query += "UPDATE ";
   query += keyspace;
@@ -154,8 +241,12 @@ std::string CassandraBuilder::buildDeleteSlot(std::string keyspace,
   query += "xmax_commited";
   query += " = ? ";
   query += " WHERE ";
-  query += "key_name";
+  if (isIndex) query += REF_NAME;
+  else query += KEY_NAME;
   query += " = ?;";
+
+  // std::cout << query << std::endl;
+
   return query;
 }
 
@@ -163,7 +254,7 @@ std::string CassandraBuilder::buildSelectVacuum(std::string keyspace,
                                                 std::string tableName, int id) {
   std::string query = "";
   query += "SELECT ";
-  query += "key_name";
+  query += KEY_NAME;
   query += ", ";
   query += "xmax";
   query += " FROM ";
@@ -177,6 +268,9 @@ std::string CassandraBuilder::buildSelectVacuum(std::string keyspace,
   query += " AND ";
   query += "xmax";
   query += " > 0 ALLOW FILTERING;";
+
+  // std::cout << query << std::endl;
+
   return query;
 }
 
@@ -187,11 +281,15 @@ std::string CassandraBuilder::buildDropTuple(std::string keyspace,
   query += keyspace;
   query += ".";
   query += tableName;
-  query += " WHERE key_name IN (";
+  query += " WHERE ";
+  query += KEY_NAME;
+  query += " IN (";
   for (int i = 0; i < count - 1; i++) {
     query += "?, ";
   }
   query += "? );";
+
+  // std::cout << query << std::endl;
   return query;
 }
 
@@ -203,6 +301,18 @@ std::string CassandraBuilder::buildDropTable(std::string keyspace,
   query += ".";
   query += tableName;
   query += ";";
+  // std::cout << query << std::endl;
+  return query;
+}
+
+std::string CassandraBuilder::buildGetRow(std::string keyspace, std::string tableName) {
+  std::string query = "SELECT * FROM ";
+  query += keyspace;
+  query += ".";
+  query += tableName;
+  query += " WHERE ";
+  query += KEY_NAME;
+  query += " = ?;";
   return query;
 }
 
diff --git a/clouddb/src/clouddb/facade/query_builder.h b/clouddb/src/clouddb/facade/query_builder.h
index c8a8d699c42..d0b9181f09d 100644
--- a/clouddb/src/clouddb/facade/query_builder.h
+++ b/clouddb/src/clouddb/facade/query_builder.h
@@ -5,6 +5,9 @@
 #include <string>
 #include <vector>
 
+#define KEY_NAME "key_name"
+#define REF_NAME "ref_name"
+
 class IQueryBuilder {
  public:
   // necessary crud
@@ -33,14 +36,19 @@ class CassandraBuilder {
   std::string buildCreateTable(std::string tableName,
                                std::vector<std::string> fieldName,
                                std::string keyspace);
+  std::string buildCreateTableIndex(std::string tableName,
+                               std::vector<std::string> fieldName,
+                               std::string keyspace);
   std::string buildGetLastPointer(std::string key, std::string tableName);
   std::string buildMaxKey();
   std::string buildInsert(std::string keyspace, std::string tableName,
                           std::vector<std::string> fieldNames, int var);
+  std::string buildInsertIndex(std::string keyspace, std::string tableName,
+                          std::vector<std::string> fieldNames, int var);
   std::string buildSelectAll(std::string keyspace, std::string tableName,
                              unsigned int id);
 
-  std::string buildDeleteSlot(std::string keyspace, std::string tableName);
+  std::string buildDeleteSlot(std::string keyspace, std::string tableName, bool isIndex);
 
   std::string buildSelectVacuum(std::string keyspace, std::string tableName,
                                 int id);
@@ -49,6 +57,7 @@ class CassandraBuilder {
 
   std::string buildDropTable(std::string keyspace, std::string tableName);
   std::string buildTruncateTable(std::string keyspace, std::string tableName);
+  std::string buildGetRow(std::string keyspace, std::string tableName);
 };
 #endif
 
diff --git a/clouddb/src/clouddb/facade/session.cpp b/clouddb/src/clouddb/facade/session.cpp
index 5938c8dac63..6216efe3d40 100644
--- a/clouddb/src/clouddb/facade/session.cpp
+++ b/clouddb/src/clouddb/facade/session.cpp
@@ -13,7 +13,8 @@ std::unordered_map<std::string, std::string> parseConfig(char **config) {
   map["driver"] = config[0];
   return map;
 }
-}  // namespace
+}
+// namespace
 
 Session::Session(std::unordered_map<std::string, std::string> config) {
   if (config["driver"] == "cassandra") {
@@ -51,4 +52,4 @@ EXPORT_C int executeCommand(Session *session, ICommand *command) {
 
 EXPORT_C IDriver *getDriver(Session *session) {
   return session->getDriver().get();
-}
+}
\ No newline at end of file
diff --git a/clouddb/src/clouddb/facade/utils/metadata.h b/clouddb/src/clouddb/facade/utils/metadata.h
index e7b427c169b..4ae018cae0c 100644
--- a/clouddb/src/clouddb/facade/utils/metadata.h
+++ b/clouddb/src/clouddb/facade/utils/metadata.h
@@ -28,6 +28,7 @@ class Metadata {
   bool xmax_commited;
   bool xmax_aborted;
   ItemPointerData ctid;
+  ItemPointerData ref_tid;
   std::bitset<9> mask;
 };
 
diff --git a/clouddb/src/clouddb/facade/utils/utils.cpp b/clouddb/src/clouddb/facade/utils/utils.cpp
new file mode 100644
index 00000000000..29bf7df889a
--- /dev/null
+++ b/clouddb/src/clouddb/facade/utils/utils.cpp
@@ -0,0 +1,10 @@
+#include "utils.h"
+
+EXPORT_C bool getVisibleValueRows(ItemPointer tid, const char *tableName, TupleDesc tupdesc, unsigned char** values, 
+                            unsigned char* nulls, Snapshot snapshot, TransactionId transactionId) {
+    Session *session = getSessionInstance(NULL);
+    auto driver = std::dynamic_pointer_cast<CassandraDriver>(session->getDriver());
+
+    return driver->getVisibleValueRowArray(tid, tableName, tupdesc, values, 
+                            nulls, snapshot, transactionId);
+}
\ No newline at end of file
diff --git a/clouddb/src/clouddb/facade/utils/utils.h b/clouddb/src/clouddb/facade/utils/utils.h
new file mode 100644
index 00000000000..d2e647d45f4
--- /dev/null
+++ b/clouddb/src/clouddb/facade/utils/utils.h
@@ -0,0 +1,9 @@
+#ifndef UTILSCPP_H
+#define UTILSCPP_H
+
+#include "../../tam/all_tam.h"
+
+EXPORT_C bool getVisibleValueRows(ItemPointer tid, const char *tableName, TupleDesc tupdesc, unsigned char** values, 
+                            unsigned char* nulls, Snapshot snapshot, TransactionId transactionId);
+
+#endif
\ No newline at end of file
diff --git a/clouddb/src/clouddb/iam/iam.c b/clouddb/src/clouddb/iam/iam.c
new file mode 100644
index 00000000000..a67098309c4
--- /dev/null
+++ b/clouddb/src/clouddb/iam/iam.c
@@ -0,0 +1,47 @@
+#include "include/scan_func_iam.h"
+#include "include/mod_func_iam.h"
+
+PG_FUNCTION_INFO_V1(clouddb_index_handler);
+
+Datum clouddb_index_handler(PG_FUNCTION_ARGS) {
+    IndexAmRoutine *clouddb_methods_index = makeNode(IndexAmRoutine);
+    clouddb_methods_index->type = T_IndexAmRoutine;
+
+    clouddb_methods_index->amcanorder = false;
+    clouddb_methods_index->amcanorderbyop = false;
+    clouddb_methods_index->amcanbackward = false;
+    clouddb_methods_index->amcanmulticol = true;
+
+    clouddb_methods_index->ambuild = clouddb_ambuild;
+    clouddb_methods_index->ambuildempty = clouddb_ambuildempty;
+    clouddb_methods_index->aminsert = clouddb_aminsert;
+    clouddb_methods_index->ambeginscan = clouddb_ambeginscan;
+    clouddb_methods_index->amrescan = clouddb_amrescan;
+    clouddb_methods_index->amgettuple = clouddb_amgettuple;
+    clouddb_methods_index->amgetbitmap = clouddb_amgetbitmap;
+    clouddb_methods_index->amendscan = clouddb_amendscan;
+    clouddb_methods_index->ammarkpos = clouddb_ammarkpos;
+    clouddb_methods_index->amrestrpos = clouddb_amrestrpos;
+    clouddb_methods_index->ambulkdelete = clouddb_ambulkdelete;
+    clouddb_methods_index->amvacuumcleanup = clouddb_amvacuumcleanup_v2;
+    clouddb_methods_index->amcanreturn = clouddb_amcanreturn;
+    clouddb_methods_index->amcostestimate = clouddb_amcostestimate;
+    clouddb_methods_index->amoptions = clouddb_amoptions;
+
+    char *host = GetConfigOption("cassandra.host", false, false);
+    char *keyspace = GetConfigOption("cassandra.keyspace", false, false);
+    char *replicationFactor =
+        GetConfigOption("cassandra.replication_factor", false, false);
+
+    char **config = (char **)malloc(sizeof(char *) * 7);
+    config[0] = "cassandra";
+    config[1] = "cassandra.host";
+    config[2] = host;
+    config[3] = "cassandra.keyspace";
+    config[4] = keyspace;
+    config[5] = "cassandra.replication_factor";
+    config[6] = replicationFactor;
+    Session *session = getSessionInstance(config);
+
+    PG_RETURN_POINTER(clouddb_methods_index);
+}
diff --git a/clouddb/src/clouddb/iam/iam.h b/clouddb/src/clouddb/iam/iam.h
new file mode 100644
index 00000000000..28c90f81d7c
--- /dev/null
+++ b/clouddb/src/clouddb/iam/iam.h
@@ -0,0 +1,53 @@
+#ifndef IAM_H
+#define IAM_H
+
+#include "../tam/include/scan_func_tam.h"
+
+#include <postgres.h>
+
+#include "access/amapi.h"
+#include "access/genam.h"
+#include "access/relscan.h"
+#include "catalog/index.h"
+#include "catalog/pg_type.h"
+#include "commands/vacuum.h"
+#include "miscadmin.h"
+#include "storage/bufmgr.h"
+#include "utils/memutils.h"
+#include "nodes/pathnodes.h"
+
+#include <access/heapam.h>
+#include <access/htup_details.h>
+#include <access/relation.h>
+#include <access/tableam.h>
+#include <cassandra.h>
+#include <catalog/index.h>
+#include <commands/vacuum.h>
+#include <executor/executor.h>
+#include <executor/spi.h>
+#include <executor/tuptable.h>
+#include <fmgr.h>
+#include <miscadmin.h>
+#include <nodes/execnodes.h>
+#include <postmaster/bgworker.h>
+#include <postmaster/interrupt.h>
+#include <stdlib.h>
+#include <storage/ipc.h>
+#include <storage/lwlock.h>
+#include <storage/shmem.h>
+#include <string.h>
+#include <tcop/tcopprot.h>
+#include <utils/builtins.h>
+#include <utils/guc.h>
+#include <utils/lsyscache.h>
+#include <utils/rel.h> /* ... and relations */
+#include <utils/snapmgr.h>
+#include "access/amapi.h"
+
+/*!
+ * Структура, содержащая ссылки на access methods для clouddb
+ */
+// static IndexAmRoutine clouddb_methods_index;
+extern const IndexAmRoutine clouddb_methods_index;
+
+#endif
diff --git a/clouddb/src/clouddb/tam/all_tam.h b/clouddb/src/clouddb/tam/all_tam.h
index 33b466c366b..43134944a91 100644
--- a/clouddb/src/clouddb/tam/all_tam.h
+++ b/clouddb/src/clouddb/tam/all_tam.h
@@ -16,6 +16,114 @@
 #include "../facade/command/command.h"
 #include "../utils/utils.h"
 
+#include "access/hio.h"
+#include "access/multixact.h"
+#include "access/relscan.h"
+#include "access/sysattr.h"
+#include "access/transam.h"
+#include "access/valid.h"
+#include "access/visibilitymap.h"
+#include "access/xact.h"
+#include "access/xlogutils.h"
+#include "catalog/catalog.h"
+#include "catalog/namespace.h"
+#include "miscadmin.h"
+#include "pgstat.h"
+#include "storage/bufmgr.h"
+#include "storage/freespace.h"
+#include "storage/lmgr.h"
+#include "storage/procarray.h"
+#include "storage/smgr.h"
+#include "storage/standby.h"
+#include "utils/datum.h"
+#include "utils/inval.h"
+#include "utils/snapmgr.h"
+#include "utils/syscache.h"
+
+
+#include "access/genam.h"
+#include "access/table.h"
+#include "catalog/indexing.h"
+#include "catalog/objectaddress.h"
+#include "catalog/pg_description.h"
+#include "catalog/pg_shdescription.h"
+#include "commands/comment.h"
+#include "commands/dbcommands.h"
+#include "utils/fmgroids.h"
+#include "catalog/pg_index.h"
+#include "catalog/pg_class.h"
+#include "catalog/pg_namespace.h"
+#include "utils/relcache.h"
+#include "utils/varbit.h"
+#include "commands/sequence.h"
+
+
+#include <access/heapam.h>
+#include <access/htup_details.h>
+#include <access/relation.h>
+#include <access/tableam.h>
+#include <cassandra.h>
+#include <catalog/index.h>
+#include <commands/vacuum.h>
+#include <executor/executor.h>
+#include <executor/spi.h>
+#include <executor/tuptable.h>
+#include <fmgr.h>
+#include <miscadmin.h>
+#include <nodes/execnodes.h>
+#include <postmaster/bgworker.h>
+#include <postmaster/interrupt.h>
+#include <stdlib.h>
+#include <storage/ipc.h>
+#include <storage/lwlock.h>
+#include <storage/shmem.h>
+#include <string.h>
+#include <tcop/tcopprot.h>
+#include <utils/builtins.h>
+#include <utils/guc.h>
+#include <utils/lsyscache.h>
+#include <utils/rel.h> /* ... and relations */
+#include <utils/snapmgr.h>
+
+#include "access/amapi.h"
+#include "access/genam.h"
+#include "access/relscan.h"
+#include "catalog/index.h"
+#include "catalog/pg_type.h"
+#include "commands/vacuum.h"
+#include "miscadmin.h"
+#include "storage/bufmgr.h"
+#include "utils/memutils.h"
+#include "nodes/pathnodes.h"
+
+#include <access/heapam.h>
+#include <access/htup_details.h>
+#include <access/relation.h>
+#include <access/tableam.h>
+#include <cassandra.h>
+#include <catalog/index.h>
+#include <commands/vacuum.h>
+#include <executor/executor.h>
+#include <executor/spi.h>
+#include <executor/tuptable.h>
+#include <fmgr.h>
+#include <miscadmin.h>
+#include <nodes/execnodes.h>
+#include <postmaster/bgworker.h>
+#include <postmaster/interrupt.h>
+#include <stdlib.h>
+#include <storage/ipc.h>
+#include <storage/lwlock.h>
+#include <storage/shmem.h>
+#include <string.h>
+#include <tcop/tcopprot.h>
+#include <utils/builtins.h>
+#include <utils/guc.h>
+#include <utils/lsyscache.h>
+#include <utils/rel.h> /* ... and relations */
+#include <utils/snapmgr.h>
+#include "access/amapi.h"
+
 extern const TableAmRoutine clouddb_methods;
 
-#endif  // ALL_TAM_H
+#endif
diff --git a/clouddb/src/clouddb/tam/include/index_scan_tam.h b/clouddb/src/clouddb/tam/include/index_scan_tam.h
index 9e1f2d4f070..ee9fafc9395 100644
--- a/clouddb/src/clouddb/tam/include/index_scan_tam.h
+++ b/clouddb/src/clouddb/tam/include/index_scan_tam.h
@@ -2,6 +2,7 @@
 #define INDEX_SCAN_TAM_H
 
 #include "../all_tam.h"
+#include "../../facade/utils/utils.h"
 
 IndexFetchTableData *clouddb_index_fetch_begin(Relation rel);
 void clouddb_index_fetch_reset(IndexFetchTableData *scan);
diff --git a/clouddb/src/clouddb/tam/src/index_scan_tam.c b/clouddb/src/clouddb/tam/src/index_scan_tam.c
index 71b6bf2e397..419e155888c 100644
--- a/clouddb/src/clouddb/tam/src/index_scan_tam.c
+++ b/clouddb/src/clouddb/tam/src/index_scan_tam.c
@@ -1,7 +1,9 @@
 #include "../include/index_scan_tam.h"
 
 IndexFetchTableData *clouddb_index_fetch_begin(Relation rel) {
-  return NULL;
+    IndexFetchTableData* scan = (IndexFetchTableData*)malloc(sizeof(IndexFetchTableData));
+    scan->rel = rel;
+    return scan;
 }
 
 void clouddb_index_fetch_reset(IndexFetchTableData *scan) {}
@@ -12,5 +14,47 @@ bool clouddb_index_fetch_tuple(struct IndexFetchTableData *scan,
                                ItemPointer tid, Snapshot snapshot,
                                TupleTableSlot *slot, bool *call_again,
                                bool *all_dead) {
-  return false;
+    ExecClearTuple(slot);
+
+    TupleDesc tupdesc = RelationGetDescr(scan->rel);
+
+    unsigned char** values = malloc(sizeof(unsigned char*) * tupdesc->natts);
+    unsigned char* nulls = malloc(tupdesc->natts);
+
+    /*
+
+    Важно допущение! 
+
+    Учитывая особенности работы с кассандрой, возвращаются только значения столбцов, являющихся индексируемыми.
+    Это сделано из соображений, что при переходе из одной таблицы в другую для проверки видимости(это нужно, когда запрашиваем данные
+    не имеются в индексной таблице), тратится время, значительно больше, чем при последовательном сканировании.
+    В таком сценарии использование индексов не имеет смысл.
+
+    При работе с кассандрой для оптимальной работы нужно создавать другой индекс с нужными столбцами или использовать последовательное сканирование.
+
+    При работе с другим хранилищем, реализация должна отличаться - нужна другая структура хранения индексов(не таблица).
+
+    */
+
+    if(!getVisibleValueRows(tid, NameStr(scan->rel->rd_rel->relname), tupdesc, values, nulls, snapshot, GetCurrentTransactionId())) {
+        return false;
+    }
+
+    for (int i = 0; i < tupdesc->natts; i++) {
+        if (values[i] == NULL) {
+            slot->tts_values[i] = (Datum)0;
+            slot->tts_isnull[i] = true;
+            continue;
+        }
+        Oid func;
+        Oid typioparam;
+        Form_pg_attribute attr = TupleDescAttr(tupdesc, i);
+        getTypeInputInfo(attr->atttypid, &func, &typioparam);
+        slot->tts_values[i] =
+            OidInputFunctionCall(func, values[i], typioparam, 0);
+        slot->tts_isnull[i] = false;
+    }
+
+    ExecStoreVirtualTuple(slot);
+    return true;
 }
diff --git a/clouddb/src/clouddb/tam/src/mod_tuple_tam.c b/clouddb/src/clouddb/tam/src/mod_tuple_tam.c
index 3659f505b82..4a7c40cf7a8 100644
--- a/clouddb/src/clouddb/tam/src/mod_tuple_tam.c
+++ b/clouddb/src/clouddb/tam/src/mod_tuple_tam.c
@@ -7,8 +7,6 @@ void clouddb_tuple_insert(Relation relation, TupleTableSlot *slot,
   Session *session = getSessionInstance(NULL);
   executeCommand(session, createInsertCommand(session, relation, slot, cid,
                                               options, bistate));
-  // printf("%d %d %d\n", slot->tts_tid.ip_posid, slot->tts_tid.ip_blkid.bi_lo,
-  //        slot->tts_tid.ip_blkid.bi_hi);
 }
 
 void clouddb_tuple_insert_speculative(Relation relation, TupleTableSlot *slot,
@@ -22,7 +20,6 @@ void clouddb_tuple_complete_speculative(Relation relation, TupleTableSlot *slot,
 void clouddb_multi_insert(Relation relation, TupleTableSlot **slots,
                           int ntuples, CommandId cid, int options,
                           BulkInsertState bistate) {
-  printf("multi_insert\n");
 }
 
 TM_Result clouddb_tuple_delete(Relation relation, ItemPointer tid,
@@ -34,11 +31,84 @@ TM_Result clouddb_tuple_delete(Relation relation, ItemPointer tid,
   int status = executeCommand(
       session,
       createDeleteSlotCommand(session, id, NULL, relation, tid, cid, snapshot,
-                              crosscheck, wait, tmfd, changingPart));
+                              crosscheck, wait, tmfd, changingPart, false));
+
+  /////////////////////////////////
+  Oid relid = RelationGetRelid(relation);
+    
+  // Получаем кортежи индексов для данной таблицы
+  HeapTuple indexTuple;
+  Relation pg_index_rel = table_open(IndexRelationId, AccessShareLock);
+  char* tt = RelationGetRelationName(pg_index_rel);
+
+  ScanKeyData key;
+  SysScanDesc scan;
+  int numIndexes = 0;
+
+  // // Устанавливаем сканирующий ключ
+
+  ScanKeyInit(&key, Anum_pg_index_indrelid, BTEqualStrategyNumber, F_OIDEQ, ObjectIdGetDatum(relid));
+  scan = systable_beginscan(pg_index_rel, IndexIndrelidIndexId, true, NULL, 1, &key);
+
+  // Обходим индексы
+
+  while (HeapTupleIsValid(indexTuple = systable_getnext(scan))) {
+      Form_pg_index pgIndexForm = (Form_pg_index) GETSTRUCT(indexTuple);
+      Oid indexOid = pgIndexForm->indexrelid;
+
+      Relation indexRel = index_open(indexOid, AccessShareLock);
+
+      int status = executeCommand(
+      session,
+      createDeleteSlotCommand(session, id, NULL, indexRel, tid, cid, snapshot,
+                              crosscheck, wait, tmfd, changingPart, true));
+      
+      index_close(indexRel, AccessShareLock);
+      numIndexes++;
+  }
+
+  systable_endscan(scan);
+  table_close(pg_index_rel, AccessShareLock);
 
   return (TM_Result)status;
 }
 
+void clouddb_index_update(Relation table_rel, TupleTableSlot *slot, ItemPointer otid) {
+  List *index_list;
+  ListCell *lc;
+
+  // Получаем список индексов, связанных с таблицей
+  index_list = RelationGetIndexList(table_rel);
+
+  // Проходим по списку индексов
+  foreach(lc, index_list)
+  {  
+      Oid index_oid = lfirst_oid(lc);
+      Relation index_rel = index_open(index_oid, AccessShareLock);
+      IndexInfo *index_info = BuildIndexInfo(index_rel);
+
+      EState *estate = CreateExecutorState(); 
+      ExprContext *econtext = GetPerTupleExprContext(estate);
+      econtext->ecxt_scantuple = slot;
+      ExprState *predicate = ExecPrepareQual(index_info->ii_Predicate, estate);
+        
+      MemoryContextReset(econtext->ecxt_per_tuple_memory);
+
+      if (predicate != NULL && !ExecQual(predicate, econtext))
+      {
+        continue;
+      }
+
+      Session *session = getSessionInstance(NULL);
+      executeCommand(session, update_tuple_to_index(session, slot, index_info, index_rel, table_rel));
+
+      executeCommand(session, createDeleteSlotCommand(session, GetCurrentTransactionId(), NULL, index_rel, otid, 0, NULL,
+                              NULL, false, NULL, false, true));
+
+      index_close(index_rel, AccessShareLock);
+  }                
+}
+
 TM_Result clouddb_tuple_update(Relation relation, ItemPointer otid,
                                TupleTableSlot *slot, CommandId cid,
                                Snapshot snapshot, Snapshot crosscheck,
@@ -53,6 +123,7 @@ TM_Result clouddb_tuple_update(Relation relation, ItemPointer otid,
       session, createUpdateSlotCommand(session, id, relation, otid, slot, cid,
                                        snapshot, crosscheck, wait, tmfd,
                                        lockmode, update_indexes));
+  clouddb_index_update(relation, slot, otid);
 
   return (TM_Result)(status);
 }
diff --git a/clouddb/src/clouddb/tam/src/non_mod_tuple_tam.c b/clouddb/src/clouddb/tam/src/non_mod_tuple_tam.c
index fd93d99b6ef..45bcacf3aee 100644
--- a/clouddb/src/clouddb/tam/src/non_mod_tuple_tam.c
+++ b/clouddb/src/clouddb/tam/src/non_mod_tuple_tam.c
@@ -10,7 +10,7 @@ bool clouddb_fetch_row_version(Relation relation, ItemPointer tid,
   bool found = false;
   IDriver *driver = getDriver(session);
   ItemPointerData foundtiddata;
-  while (executeCommand(session, selectDataCommand(session, snapshot)) != 0) {
+  while (executeCommand(session, selectDataCommand(session, snapshot, 9)) != 0) {
     foundtiddata = getTidForScan(driver);
     ItemPointer foundtid = &foundtiddata;
     bool is = ItemPointerEquals(tid, foundtid);
@@ -26,11 +26,8 @@ bool clouddb_fetch_row_version(Relation relation, ItemPointer tid,
   char **values = getValueForScan(driver);
 
   slot->tts_tid = foundtiddata;
-  printf("%d %d %d\n", slot->tts_tid.ip_posid, slot->tts_tid.ip_blkid.bi_lo,
-         slot->tts_tid.ip_blkid.bi_hi);
 
   TupleDesc desc = RelationGetDescr(relation);
-  printf("%s\n", values[0]);
 
   for (int i = 0; i < desc->natts; ++i) {
     char *curValue = values[i];
diff --git a/clouddb/src/clouddb/tam/src/scan_func_tam.c b/clouddb/src/clouddb/tam/src/scan_func_tam.c
index ada234a135f..b7a9878899a 100644
--- a/clouddb/src/clouddb/tam/src/scan_func_tam.c
+++ b/clouddb/src/clouddb/tam/src/scan_func_tam.c
@@ -35,7 +35,7 @@ bool clouddb_getnextslot(TableScanDesc sscan, ScanDirection direction,
   ExecClearTuple(slot);
   Session *session = getSessionInstance(NULL);
 
-  if (executeCommand(session, selectDataCommand(session, sscan->rs_snapshot)) ==
+  if (executeCommand(session, selectDataCommand(session, sscan->rs_snapshot, 9)) ==
       0) {
     return false;
   }
@@ -43,11 +43,8 @@ bool clouddb_getnextslot(TableScanDesc sscan, ScanDirection direction,
   char **values = getValueForScan(driver);
 
   slot->tts_tid = getTidForScan(driver);
-  printf("%d %d %d\n", slot->tts_tid.ip_posid, slot->tts_tid.ip_blkid.bi_lo,
-         slot->tts_tid.ip_blkid.bi_hi);
 
   TupleDesc desc = RelationGetDescr(sscan->rs_rd);
-  printf("%s\n", values[0]);
 
   for (int i = 0; i < desc->natts; ++i) {
     char *curValue = values[i];
diff --git a/clouddb/src/clouddb/utils/utils.c b/clouddb/src/clouddb/utils/utils.c
index 8f6f7e67f4a..b4d4f54c321 100644
--- a/clouddb/src/clouddb/utils/utils.c
+++ b/clouddb/src/clouddb/utils/utils.c
@@ -1,21 +1,22 @@
 #include "utils.h"
+#include "../facade/session.h"
 
 uint32 get_event_horizont_xmin() {
   uint32 xmin = 0;
   char query[256];
-  snprintf(query, sizeof(query),
-           "SELECT backend_xmin FROM pg_stat_activity WHERE pid = "
-           "pg_backend_pid();");
+  // snprintf(query, sizeof(query),
+  //          "SELECT backend_xmin FROM pg_stat_activity WHERE pid = "
+  //          "pg_backend_pid();");
 
   int ret = SPI_connect();
   if (ret != SPI_OK_CONNECT) {
-    elog(ERROR, "SPI_connect failed: error code %d", ret);
+    // elog(ERROR, "SPI_connect failed: error code %d", ret);
   }
 
   // Выполняем запрос
   ret = SPI_execute(query, true, 0);
   if (ret != SPI_OK_SELECT) {
-    elog(ERROR, "SPI_execute failed: error code %d", ret);
+    // elog(ERROR, "SPI_execute failed: error code %d", ret);
   }
 
   // Проверка результатов
diff --git a/clouddb/src/clouddb/utils/utils.h b/clouddb/src/clouddb/utils/utils.h
index 843ef602ae8..92105310125 100644
--- a/clouddb/src/clouddb/utils/utils.h
+++ b/clouddb/src/clouddb/utils/utils.h
@@ -2,6 +2,7 @@
 #define UTILS_H
 
 #include "postgres.h"
+
 //
 #include "executor/spi.h"
 
diff --git a/clouddb/test.sql b/clouddb/test.sql
index 0a697587778..9e47b3a4102 100644
--- a/clouddb/test.sql
+++ b/clouddb/test.sql
@@ -1,9 +1,14 @@
-DROP EXTENSION IF EXISTS clouddb CASCADE;
+DROP EXTENSION IF EXISTS clouddb;
 CREATE EXTENSION clouddb;
+
 CREATE TABLE x(a INT) USING clouddb;
+
 CREATE TABLE y(b INT) USING clouddb;
+
 INSERT INTO x VALUES (23), (101);
-SELECT a FROM x;
-SELECT a + 100 FROM x WHERE a = 23;
-SELECT a, COUNT(1) FROM x GROUP BY a ORDER BY COUNT(1) DESC;
+
+INSERT INTO y VALUES (23), (101);
+
 SELECT b FROM y;
+
+SELECT a FROM x;
\ No newline at end of file
diff --git a/test/test.sql b/test/test.sql
index af6bdfd057c..0d8e9bd3fbe 100644
--- a/test/test.sql
+++ b/test/test.sql
@@ -1,17 +1,154 @@
-drop extension clouddb cascade;
-create extension clouddb;
+-- drop extension clouddb cascade;
+-- create extension clouddb;
 
-CREATE TABLE users(id serial PRIMARY KEY, name text, password text) USING clouddb;
+-- DROP INDEX IF EXISTS pkey_pg;
 
-INSERT INTO users (name, password) VALUES ('egor', '123');
-INSERT INTO users (name, password) VALUES ('dima', '_');
+-- DROP TABLE test_table_pg22222222;
 
-UPDATE users SET password = 'qwerty' WHERE id = 2;
-UPDATE users SET password = 'qwer' WHERE id = 1;
+-- DROP TABLE IF EXISTS test_table_pg2222222;
+-- DROP TABLE IF EXISTS test_table_pg222222;
+-- DROP TABLE IF EXISTS test_table_pg22222;
+-- DROP TABLE IF EXISTS test_table_pg2222;
+-- DROP TABLE IF EXISTS test_table_pg222;
+-- DROP TABLE IF EXISTS test_table_pg22;
+-- DROP TABLE IF EXISTS test_table_pg2;
+-- DROP TABLE IF EXISTS test_table_pg222222222 CASCADE;
 
-SELECT * FROM users; -- Чтобы горизонт событий сдвинулся
 
-VACUUM;
+-- CREATE TABLE test_table(id int, author text, book text) USING clouddb;
 
-SELECT * FROM users;
+-- CREATE INDEX pkey ON test_table USING clouddb_index (id);
 
+-- -- INSERT INTO test_table (id, author, book) VALUES (1, 'author', 'book');
+-- -- INSERT INTO test_table (id, author, book) VALUES (2, 'author2', 'book2');
+-- -- INSERT INTO test_table (id, author, book) VALUES (3, 'author3', 'book3');
+-- -- INSERT INTO test_table (id, author, book) VALUES (4, 'author4', 'book4');
+
+-- -- DELETE FROM test_table WHERE id = 2;
+-- -- UPDATE test_table SET id = 9 WHERE id = 3;
+
+-- -- INSERT INTO test_table (id, author, book) VALUES (5, 'author5', 'book5');
+
+-- -- UPDATE test_table SET id = 10 WHERE id = 5;
+
+-- -- SET enable_seqscan TO off;
+-- -- SET enable_indexscan = on;
+
+-- -- EXPLAIN ANALYZE SELECT book FROM test_table WHERE id > 1;
+-- -- SELECT book FROM test_table WHERE id > 1;
+
+-- -- SET enable_indexscan = off;
+-- -- SET enable_seqscan TO on;
+
+
+
+CREATE TABLE test_table_pg222222222(id int, author text, book text);
+
+CREATE INDEX pkey_pg ON test_table_pg222222222 (id);
+
+
+
+-- DO $$
+-- DECLARE
+--     i INT;
+--     start_time TIMESTAMP;
+--     end_time TIMESTAMP;
+--     elapsed_time INTERVAL;
+-- BEGIN
+--     start_time := clock_timestamp();
+
+--     -- INSERT INTO test_table (id, author, book)
+--     -- SELECT random() * 1000, md5(random()::text), md5(random()::text)
+--     -- FROM generate_series(1, 50000);
+
+--     FOR i IN 1..400000 LOOP
+--         INSERT INTO test_table (id, author, book) VALUES (i, 'book', 'author');
+--     END LOOP;
+
+--     end_time := clock_timestamp();
+--     elapsed_time := end_time - start_time;
+
+--     RAISE NOTICE 'Время выполнения INSERT: %', elapsed_time;
+-- END $$;
+
+-- -- DO $$
+-- -- DECLARE
+-- --     start_time TIMESTAMP;
+-- --     end_time TIMESTAMP;
+-- --     elapsed_time INTERVAL;
+-- -- BEGIN
+-- --     start_time := clock_timestamp();
+
+-- --     SET enable_seqscan TO off;
+-- --     SET enable_indexscan = on;
+
+-- --     EXECUTE 'SELECT id FROM test_table WHERE id > 37 AND id <= 990';
+
+-- --     SET enable_indexscan = off;
+-- --     SET enable_seqscan TO on;
+
+-- --     end_time := clock_timestamp();
+-- --     elapsed_time := end_time - start_time;
+
+-- --     RAISE NOTICE 'Время выполнения SELECT: %', elapsed_time;
+-- -- END $$;
+
+
+-- -- SET enable_seqscan TO off;
+-- -- SET enable_indexscan = on;
+-- -- EXPLAIN ANALYZE SELECT id FROM test_table WHERE id > 37 AND id <= 990;
+-- -- SET enable_indexscan = off;
+-- -- SET enable_seqscan TO on;
+
+
+-- -- pg
+
+DO $$
+DECLARE
+    i INT;
+    start_time TIMESTAMP;
+    end_time TIMESTAMP;
+    elapsed_time INTERVAL;
+BEGIN
+    start_time := clock_timestamp();
+    
+    INSERT INTO test_table_pg222222222 (id, author, book)
+    SELECT random() * 1000, md5(random()::text), md5(random()::text)
+    FROM generate_series(1, 500000);
+
+    end_time := clock_timestamp();
+    elapsed_time := end_time - start_time;
+
+    RAISE NOTICE 'Время выполнения INSERT (postgres): %', elapsed_time;
+END $$;
+
+
+DO $$
+DECLARE
+    start_time TIMESTAMP;
+    end_time TIMESTAMP;
+    elapsed_time INTERVAL;
+BEGIN
+    start_time := clock_timestamp();
+
+    SET enable_seqscan TO off;
+    SET enable_indexscan = on;
+
+    EXECUTE 'SELECT id FROM test_table_pg222222222 WHERE id > 37 AND id <= 990';
+
+    SET enable_indexscan = off;
+    SET enable_seqscan TO on;
+
+    end_time := clock_timestamp();
+    elapsed_time := end_time - start_time;
+
+    RAISE NOTICE 'Время выполнения SELECT (postgres): %', elapsed_time;
+END $$;
+
+SET enable_seqscan TO off;
+SET enable_indexscan = on;
+
+EXPLAIN ANALYZE SELECT id FROM test_table_pg222222222 WHERE id > 37 AND id <= 990;
+
+SET enable_indexscan = off;
+SET enable_seqscan TO on;
-- 
GitLab


From 73f17712463d8e9b7d3f1619a00d018f8d7285cc Mon Sep 17 00:00:00 2001
From: Dmitrii Shabanov <d.shabanov1@g.nsu.ru>
Date: Sun, 16 Feb 2025 02:49:34 +0000
Subject: [PATCH 2/5] Rocksdb

---
 clouddb/CMakeLists.txt                        |   4 +-
 clouddb/src/clouddb/CMakeLists.txt            | 167 ++++++++++++---
 clouddb/src/clouddb/clouddb.c                 |   6 +-
 .../cas_transaction_command.cpp               |  10 +-
 .../src/clouddb/facade/command/command.cpp    |  11 +-
 clouddb/src/clouddb/facade/command/command.h  |   2 +
 .../roc_transaction_command.cpp               | 150 +++++++++++++
 .../rocksdb_command/roc_transaction_command.h |  89 ++++++++
 .../cassandra_driver/cassandra_driver.cpp     | 121 +++++++----
 .../drivers/rocksdb_driver/rocksdb_driver.cpp | 200 ++++++++++++++++++
 .../drivers/rocksdb_driver/rocksdb_driver.h   |  77 +++++++
 clouddb/src/clouddb/facade/query_builder.cpp  |   2 -
 clouddb/src/clouddb/facade/session.cpp        |   2 +
 clouddb/src/clouddb/facade/session.h          |   6 +-
 clouddb/src/clouddb/tam/all_tam.h             | 109 +---------
 clouddb/src/clouddb/tam/src/mod_tuple_tam.c   |   6 +
 clouddb/src/clouddb/tam/src/scan_func_tam.c   |   4 +
 clouddb/src/clouddb/tam/tam.c                 |  19 +-
 18 files changed, 780 insertions(+), 205 deletions(-)
 create mode 100644 clouddb/src/clouddb/facade/command/rocksdb_command/roc_transaction_command.cpp
 create mode 100644 clouddb/src/clouddb/facade/command/rocksdb_command/roc_transaction_command.h
 create mode 100644 clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.cpp
 create mode 100644 clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.h

diff --git a/clouddb/CMakeLists.txt b/clouddb/CMakeLists.txt
index 2d4742869cb..ed3ddfec540 100644
--- a/clouddb/CMakeLists.txt
+++ b/clouddb/CMakeLists.txt
@@ -5,7 +5,9 @@ list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
 
 find_package(PostgreSQL REQUIRED)
 
-set(CMAKE_CXX_STANDARD 14)
+# set(CMAKE_BUILD_TYPE Debug)
+
+set(CMAKE_CXX_STANDARD 17)
 
 include_directories(${PostgreSQL_INCLUDE_DIRS}
                     ${PostgreSQL_SERVER_INCLUDE_DIRS})
diff --git a/clouddb/src/clouddb/CMakeLists.txt b/clouddb/src/clouddb/CMakeLists.txt
index a92292c4226..0b11d0ba4f5 100644
--- a/clouddb/src/clouddb/CMakeLists.txt
+++ b/clouddb/src/clouddb/CMakeLists.txt
@@ -1,31 +1,139 @@
-set(cpp_sources
-    facade/query_builder.cpp
-    facade/drivers/cassandra_driver/cassandra_driver.cpp
-    facade/session.cpp
-    facade/command/cassandra_command/cas_transaction_command.cpp
-    facade/command/command.cpp
-    facade/utils/utils.cpp
-    cpp.cpp
+
+set(USE_AWS 1) #(?)
+
+# Платформа (?)
+set(PLATFORM "OS_LINUX")
+
+# Флаги линковки для платформы (need)
+set(PLATFORM_LDFLAGS 
+    "-laws-cpp-sdk-s3"
+    "-laws-cpp-sdk-kinesis"
+    "-laws-cpp-sdk-core"
+    "-laws-cpp-sdk-transfer"
+    "-lpthread"
+    "-lrt"
+    "-ldl"
+    "-fPIC"
+    "-lsnappy"
+    "-lgflags"
+    "-lz"
+    "-lbz2"
+    "-llz4"
+    "-lzstd"
+    "-lnuma"
+    "-ltbb"
+    "-luring"
+    "-ldl"
 )
 
-set(c_sources
-    utils/utils.c
-    tam/src/ddl_func_tam.c
-    tam/src/index_scan_tam.c
-    tam/src/misc_func_tam.c
-    tam/src/mod_tuple_tam.c
-    tam/src/non_mod_tuple_tam.c
-    tam/src/parallel_scan_tam.c
-    tam/src/scan_func_tam.c
-    tam/src/slot_func_tam.c
-    tam/tam.c
-    iam/iam.c
-    iam/src/scan_func_iam.c
-    iam/src/mod_func_iam.c
-    hooks/src/hook.c
-    clouddb.c
+# Флаги компиляции для платформы (?)
+set(PLATFORM_CCFLAGS 
+    "-DROCKSDB_PLATFORM_POSIX"
+    "-DROCKSDB_LIB_IO_POSIX"
+    "-DOS_LINUX"
+    "-fno-builtin-memcmp"
+    "-DROCKSDB_FALLOCATE_PRESENT"
+    "-DSNAPPY"
+    "-DGFLAGS=1"
+    "-DZLIB"
+    "-DBZIP2"
+    "-DLZ4"
+    "-DZSTD"
+    "-DNUMA"
+    "-DTBB"
+    "-DROCKSDB_MALLOC_USABLE_SIZE"
+    "-DROCKSDB_PTHREAD_ADAPTIVE_MUTEX"
+    "-DROCKSDB_BACKTRACE"
+    "-DROCKSDB_RANGESYNC_PRESENT"
+    "-DROCKSDB_SCHED_GETCPU_PRESENT"
+    "-DROCKSDB_AUXV_GETAUXVAL_PRESENT"
+    "-DROCKSDB_IOURING_PRESENT"
+    "-I/usr/local/include/"
+    "-DUSE_AWS"
+    "-march=native"
+    "-DHAVE_UINT128_EXTENSION"
 )
 
+set(PLATFORM_CXXFLAGS #(?)
+    "-std=c++17"  
+    "-faligned-new"
+    "-DHAVE_ALIGNED_NEW"
+    "-DROCKSDB_PLATFORM_POSIX"
+    "-DROCKSDB_LIB_IO_POSIX"
+    "-DOS_LINUX"
+    "-fno-builtin-memcmp"
+    "-DROCKSDB_FALLOCATE_PRESENT"
+    "-DSNAPPY"
+    "-DGFLAGS=1"
+    "-DZLIB"
+    "-DBZIP2"
+    "-DLZ4"
+    "-DZSTD"
+    "-DNUMA"
+    "-DTBB"
+    "-DROCKSDB_MALLOC_USABLE_SIZE"
+    "-DROCKSDB_PTHREAD_ADAPTIVE_MUTEX"
+    "-DROCKSDB_BACKTRACE"
+    "-DROCKSDB_RANGESYNC_PRESENT"
+    "-DROCKSDB_SCHED_GETCPU_PRESENT"
+    "-DROCKSDB_AUXV_GETAUXVAL_PRESENT"
+    "-DROCKSDB_IOURING_PRESENT"
+    "-I/usr/local/include/"
+    "-DUSE_AWS"
+    "-march=native"
+    "-DHAVE_UINT128_EXTENSION"
+)
+
+# Флаги для создания общих библиотек (?)
+set(PLATFORM_SHARED_CFLAGS "-fPIC")
+set(PLATFORM_SHARED_EXT "so")
+set(PLATFORM_SHARED_LDFLAGS "-Wl,--no-as-needed -shared -Wl,-soname -Wl,")
+set(PLATFORM_SHARED_VERSIONED true)
+
+# Флаги линковки для исполняемых файлов (?)
+set(EXEC_LDFLAGS "-ldl")
+
+# JEMALLOC (?)
+set(JEMALLOC_INCLUDE "")
+set(JEMALLOC_LIB "")
+set(JEMALLOC 1)
+set(WITH_JEMALLOC_FLAG 1)
+
+# Версии RocksDB (?)
+set(ROCKSDB_MAJOR 9)
+set(ROCKSDB_MINOR 1)
+set(ROCKSDB_PATCH 1)
+
+# Другие переменные (?)
+set(CLANG_SCAN_BUILD "scan-build")
+set(CLANG_ANALYZER "/usr/bin/clang++")
+set(PROFILING_FLAGS "-pg")
+set(FIND "find")
+set(WATCH "watch")
+set(FOLLY_PATH "")
+set(LUA_PATH "")
+
+set(target_source  facade/query_builder.cpp
+                   utils/utils.c
+                   facade/drivers/cassandra_driver/cassandra_driver.cpp
+                   facade/drivers/rocksdb_driver/rocksdb_driver.cpp
+                   facade/session.cpp
+                   facade/command/cassandra_command/cas_transaction_command.cpp
+                   facade/command/rocksdb_command/roc_transaction_command.cpp
+                   facade/command/command.cpp
+                   tam/src/ddl_func_tam.c
+                   tam/src/index_scan_tam.c
+                   tam/src/misc_func_tam.c
+                   tam/src/mod_tuple_tam.c
+                   tam/src/non_mod_tuple_tam.c
+                   tam/src/parallel_scan_tam.c
+                   tam/src/scan_func_tam.c
+                   tam/src/slot_func_tam.c
+                   tam/tam.c
+                   cpp.cpp
+                   hooks/src/hook.c
+                   clouddb.c)
+
 add_postgresql_extension(
   clouddb
   VERSION 1.0
@@ -34,6 +142,15 @@ add_postgresql_extension(
   REGRESS basic
 )
 
+link_directories("/home/user/rocksdb-cloud/")
 link_directories("/usr/local/pgsql/lib/")
+include_directories("/home/user/rocksdb-cloud/include/")
+
+# Установка флагов компиляции
+target_compile_options(clouddb PRIVATE ${PLATFORM_CXXFLAGS} ${PLATFORM_CCFLAGS})
+
+# Установка флагов линковки
+target_link_libraries(clouddb PRIVATE rocksdb cassandra ${PLATFORM_LDFLAGS})
+
 
-target_link_libraries(clouddb cassandra pq)
\ No newline at end of file
+target_link_libraries(clouddb cassandra pq)
diff --git a/clouddb/src/clouddb/clouddb.c b/clouddb/src/clouddb/clouddb.c
index e0627b75b50..068a66aa78c 100644
--- a/clouddb/src/clouddb/clouddb.c
+++ b/clouddb/src/clouddb/clouddb.c
@@ -9,12 +9,8 @@
 #include "hooks/include/hook.h"
 
 PG_MODULE_MAGIC;
-
 void _PG_init() {
-  char *m = "hello";
-  some *some2 = &(some){.message = 6};
-  some2 = create_class(some2);
-  // printf("%d\n", getInClass(some2));
+
 
   hook_init();
 }
diff --git a/clouddb/src/clouddb/facade/command/cassandra_command/cas_transaction_command.cpp b/clouddb/src/clouddb/facade/command/cassandra_command/cas_transaction_command.cpp
index a5e3aee27ec..b7f9726559a 100644
--- a/clouddb/src/clouddb/facade/command/cassandra_command/cas_transaction_command.cpp
+++ b/clouddb/src/clouddb/facade/command/cassandra_command/cas_transaction_command.cpp
@@ -148,6 +148,8 @@ ITransactionCommand *CasTransactionCommand::createInsertCommand(
       (char **)malloc(sizeof(char *) * RelationGetNumberOfAttributes(relation));
   int *fieldSize =
       (int *)malloc(sizeof(int) * RelationGetNumberOfAttributes(relation));
+  // std::cout << "size: " << RelationGetNumberOfAttributes(relation) <<
+  // std::endl;
 
   TupleDesc desc = slot->tts_tupleDescriptor;
   for (int i = 0; i < desc->natts; i++) {
@@ -170,6 +172,7 @@ ITransactionCommand *CasTransactionCommand::createInsertCommand(
   this->operation = INSERT_VALUE;
 
   this->tableName = RelationGetRelationName(relation);
+  // std::cout << this->tableName << " tableName" << std::endl;
   this->fieldData =
       convertToVector(fieldData, RelationGetNumberOfAttributes(relation));
   free(fieldData);
@@ -181,9 +184,10 @@ ITransactionCommand *CasTransactionCommand::createInsertCommand(
     this->fieldName.push_back(strdup(NameStr(attr->attname)));
   }
 
-  auto driver = std::static_pointer_cast<CassandraDriver>(session->getDriver());
   slot->tts_tid = driver->getNewPointer(
       std::string(RelationGetRelationName(relation)), driver->getKeyspace());
+  // std::cout << slot->tts_tid.ip_blkid.bi_hi << slot->tts_tid.ip_blkid.bi_lo
+  //           << slot->tts_tid.ip_posid << std::endl;
 
   this->metadata.xmin = GetCurrentTransactionId();
   this->metadata.xmin_commited = true;
@@ -349,6 +353,8 @@ ITransactionCommand *CasTransactionCommand::createUpdateSlotCommand(
       (char **)malloc(sizeof(char *) * RelationGetNumberOfAttributes(relation));
   int *fieldSize =
       (int *)malloc(sizeof(int) * RelationGetNumberOfAttributes(relation));
+  // std::cout << "size: " << RelationGetNumberOfAttributes(relation) <<
+  // std::endl;
 
   TupleDesc desc = slot->tts_tupleDescriptor;
   for (int i = 0; i < desc->natts; i++) {
@@ -419,4 +425,4 @@ ITransactionCommand *CasTransactionCommand::createTruncateTable(
   this->operation = TRUNCATE_TABLE;
   this->tableName = std::string(relName);
   return this;
-}
\ No newline at end of file
+}
diff --git a/clouddb/src/clouddb/facade/command/command.cpp b/clouddb/src/clouddb/facade/command/command.cpp
index 4f2a1095e94..aa05b91fbf4 100644
--- a/clouddb/src/clouddb/facade/command/command.cpp
+++ b/clouddb/src/clouddb/facade/command/command.cpp
@@ -5,10 +5,11 @@ ITransactionCommand *createTransactionCommand(std::shared_ptr<IDriver> driver) {
     return new CasTransactionCommand(
         std::dynamic_pointer_cast<CassandraDriver>(driver));
   }
-  // else if (std::dynamic_pointer_cast<YDBDriver>(driver)) {
-  //   return YDBTransactionCommand(
-  //       std::dynamic_pointer_cast<YDBDriver>(driver));
-  // }
+  else if (std::dynamic_pointer_cast<RocksDBDriver>(driver)) {
+    return new RocTransactionCommand(
+        std::dynamic_pointer_cast<RocksDBDriver>(driver));
+  }
+
   return nullptr;
 }
 
@@ -116,4 +117,4 @@ EXPORT_C ITransactionCommand *update_tuple_to_index(Session *session, TupleTable
   ITransactionCommand *command = createTransactionCommand(session->getDriver());
   command = command->update_tuple_to_index(session, slot, indexInfo, indexRelation, heapRelation);
   return command;  
-}
\ No newline at end of file
+}
diff --git a/clouddb/src/clouddb/facade/command/command.h b/clouddb/src/clouddb/facade/command/command.h
index 4e9a8d2c28c..6b696365181 100644
--- a/clouddb/src/clouddb/facade/command/command.h
+++ b/clouddb/src/clouddb/facade/command/command.h
@@ -5,6 +5,8 @@
 
 // команды каждого драйвера
 #include "cassandra_command/cas_transaction_command.h"
+#include "rocksdb_command/roc_transaction_command.h"
+
 
 #ifdef __cplusplus
 
diff --git a/clouddb/src/clouddb/facade/command/rocksdb_command/roc_transaction_command.cpp b/clouddb/src/clouddb/facade/command/rocksdb_command/roc_transaction_command.cpp
new file mode 100644
index 00000000000..fdcfe28b5bc
--- /dev/null
+++ b/clouddb/src/clouddb/facade/command/rocksdb_command/roc_transaction_command.cpp
@@ -0,0 +1,150 @@
+#include "roc_transaction_command.h"
+#include <iostream>
+
+namespace {
+std::vector<std::string> convertToVector(char **charArray, int size) {
+  std::vector<std::string> result;
+  if (charArray == nullptr) {
+    return result;  // Если входной указатель null, возвращаем пустой вектор
+  }
+
+  // Перебираем каждый элемент массива charArray
+  for (size_t i = 0; i < size; ++i) {
+    if (charArray[i] != nullptr) {
+      result.emplace_back(charArray[i]);  // Добавляем строку в вектор
+    } else {
+      result.emplace_back("");  // Добавляем пустую строку для nullptr
+    }
+  }
+  return result;
+}
+
+std::vector<size_t> convertToVector(int *intArray, int size) {
+  std::vector<size_t> result;
+  for (int i = 0; i < size; i++) {
+    result.push_back(intArray[i]);
+  }
+  return result;
+}
+}  // namespace
+
+
+int RocTransactionCommand::execute() {
+    if (this->operation == RCREATE_TABLE) {
+      driver->createTable(tableName);
+    }else if(this->operation == RINSERT_VALUE) {
+      driver->insertData(tableName, fieldName, fieldData, fieldSize, pointer);
+    }
+  return 0;
+}
+
+RocTransactionCommand::RocTransactionCommand(std::shared_ptr<RocksDBDriver> driver) {
+  this->driver = std::dynamic_pointer_cast<RocksDBDriver>(driver);
+}
+
+ITransactionCommand *RocTransactionCommand::createCreateTableCommand(
+    Session *session, Relation rel) {
+  this->operation = RCREATE_TABLE;
+
+  // забавно, но здесь нет ни одной функции, а следовательно они безопасны для
+  // c++
+  this->tableName = std::string(RelationGetRelationName(rel));
+  for (int i = 0; i < RelationGetNumberOfAttributes(rel); i++) {
+    Form_pg_attribute attr = TupleDescAttr(rel->rd_att, i);
+    this->fieldName.push_back(strdup(NameStr(attr->attname)));
+  }
+  return this;
+}
+
+ITransactionCommand *RocTransactionCommand::createInsertCommand(
+    Session *session, Relation relation, TupleTableSlot *slot, CommandId cid,
+    int options, BulkInsertState bistate) {
+  char **fieldData =
+      (char **)malloc(sizeof(char *) * RelationGetNumberOfAttributes(relation));
+  int *fieldSize =
+      (int *)malloc(sizeof(int) * RelationGetNumberOfAttributes(relation));
+
+  TupleDesc desc = slot->tts_tupleDescriptor;
+  for (int i = 0; i < desc->natts; i++) {
+    if (slot->tts_isnull[i]) {
+      fieldData[i] = NULL;
+      fieldSize[i] = -1;
+      continue;
+    }
+    Oid outFunc;
+    bool typIsVarlena;
+    Form_pg_attribute attr = TupleDescAttr(desc, i);
+    getTypeOutputInfo(attr->atttypid, &outFunc, &typIsVarlena);
+    fieldData[i] = OidOutputFunctionCall(outFunc, slot->tts_values[i]);
+    fieldSize[i] = strlen(fieldData[i]);
+  }
+
+  this->operation = RINSERT_VALUE;
+
+  this->tableName = RelationGetRelationName(relation);
+  this->fieldData =
+      convertToVector(fieldData, RelationGetNumberOfAttributes(relation));
+  free(fieldData);
+  this->fieldSize =
+      convertToVector(fieldSize, RelationGetNumberOfAttributes(relation));
+  free(fieldSize);
+  for (int i = 0; i < RelationGetNumberOfAttributes(relation); i++) {
+    Form_pg_attribute attr = TupleDescAttr(relation->rd_att, i);
+    this->fieldName.push_back(strdup(NameStr(attr->attname)));
+  }
+
+  slot->tts_tid = driver->getNewPointer(
+      std::string(RelationGetRelationName(relation)));
+  pointer = slot->tts_tid;
+  return this;
+}
+
+ITransactionCommand *RocTransactionCommand::beginScanCommand(
+    Session *session, Relation relation, Snapshot snapshot, int nkeys,
+    struct ScanKeyData *key, ParallelTableScanDesc parallel_scan, uint32 flags,
+    TransactionId id) {
+
+  return this;
+}
+
+ITransactionCommand *RocTransactionCommand::selectDataCommand(
+    Session *session, Snapshot snapshot) {
+
+  return this;
+}
+
+ITransactionCommand *RocTransactionCommand::createDeleteSlotCommand(
+    Session *session, TransactionId id, ItemPointer newtid, Relation relation,
+    ItemPointer tid, CommandId cid, Snapshot snapshot, Snapshot crosscheck,
+    bool wait, TM_FailureData *tmfd, bool changingPart) {
+
+  return this;
+}
+
+ITransactionCommand *RocTransactionCommand::createUpdateSlotCommand(
+    Session *session, TransactionId id, Relation relation, ItemPointer otid,
+    TupleTableSlot *slot, CommandId cid, Snapshot snapshot, Snapshot crosscheck,
+    bool wait, TM_FailureData *tmfd, LockTupleMode *lockmode,
+    TU_UpdateIndexes *update_indexes) {
+
+  return this;
+}
+
+ITransactionCommand *RocTransactionCommand::createVacuumCommand(
+    Session *session, TransactionId id, Relation rel, VacuumParams *params,
+    BufferAccessStrategy bstrategy) {
+
+  return this;
+}
+
+ITransactionCommand *RocTransactionCommand::createDropTable(Session *session,
+                                                            char *relName) {
+
+  return this;
+}
+
+ITransactionCommand *RocTransactionCommand::createTruncateTable(
+    Session *session, char *relName) {
+
+  return this;
+}
diff --git a/clouddb/src/clouddb/facade/command/rocksdb_command/roc_transaction_command.h b/clouddb/src/clouddb/facade/command/rocksdb_command/roc_transaction_command.h
new file mode 100644
index 00000000000..9ea6c2c3fd0
--- /dev/null
+++ b/clouddb/src/clouddb/facade/command/rocksdb_command/roc_transaction_command.h
@@ -0,0 +1,89 @@
+#ifndef ROC_TRANSACTION_COMMAND_H
+#define ROC_TRANSACTION_COMMAND_H
+
+#include "../../query_builder.h"
+#include "../itransaction_command.h"
+
+#ifdef __cplusplus
+#include <vector>
+
+#include "../../utils/metadata.h"
+
+enum RocTransactionOperation {
+  RCREATE_TABLE,
+  RINSERT_VALUE,
+  RBEGIN_SCAN,
+  RSELECT_DATA,
+  RDELETE_SLOT,
+  RUPDATE_SLOT,
+  RVACUUM_TABLE,
+  RTRUNCATE_TABLE,
+  RDROP_TABLE
+};
+
+class RocTransactionCommand : public ITransactionCommand {
+ private:
+   std::string tableName;
+  std::vector<std::string> fieldName;
+  std::vector<std::string> fieldData;
+  std::vector<size_t> fieldSize;
+//   RocksDBBuilder builder;
+  RocTransactionOperation operation;
+  ItemPointerData pointer;
+  Metadata metadata;
+
+  // scan data
+  Relation relation;
+  Snapshot snapshot;
+  int nkeys;
+  struct ScanKeyData *key;
+  ParallelTableScanDesc parallel_scan;
+  uint32 flags;
+  TransactionId id;
+
+  std::shared_ptr<RocksDBDriver> driver;
+
+ public:
+  RocTransactionCommand() {};
+  RocTransactionCommand(std::shared_ptr<RocksDBDriver> driver);
+  int execute() override;
+  ITransactionCommand *createCreateTableCommand(Session *session,
+                                                Relation rel) override;
+  ITransactionCommand *createInsertCommand(Session *session, Relation relation,
+                                           TupleTableSlot *slot, CommandId cid,
+                                           int options,
+                                           BulkInsertState bistate) override;
+  ITransactionCommand *beginScanCommand(Session *session, Relation relation,
+                                        Snapshot snapshot, int nkeys,
+                                        struct ScanKeyData *key,
+                                        ParallelTableScanDesc parallel_scan,
+                                        uint32 flags,
+                                        TransactionId id) override;
+  ITransactionCommand *selectDataCommand(Session *session,
+                                         Snapshot snapshot) override;
+
+  ITransactionCommand *createDeleteSlotCommand(
+      Session *session, TransactionId id, ItemPointer newtid, Relation relation,
+      ItemPointer tid, CommandId cid, Snapshot snapshot, Snapshot crosscheck,
+      bool wait, TM_FailureData *tmfd, bool changingPart) override;
+
+  ITransactionCommand *createUpdateSlotCommand(
+      Session *session, TransactionId id, Relation relation, ItemPointer otid,
+      TupleTableSlot *slot, CommandId cid, Snapshot snapshot,
+      Snapshot crosscheck, bool wait, TM_FailureData *tmfd,
+      LockTupleMode *lockmode, TU_UpdateIndexes *update_indexes) override;
+
+  ITransactionCommand *createVacuumCommand(
+      Session *session, TransactionId id, Relation rel, VacuumParams *params,
+      BufferAccessStrategy bstrategy) override;
+
+  ITransactionCommand *createDropTable(Session *session,
+                                       char *relName) override;
+
+  ITransactionCommand *createTruncateTable(Session *session,
+                                           char *relName) override;
+};
+
+#endif  // !__cplusplus
+
+#endif  // !CAS_TRANSACTION_COMMAND_H
diff --git a/clouddb/src/clouddb/facade/drivers/cassandra_driver/cassandra_driver.cpp b/clouddb/src/clouddb/facade/drivers/cassandra_driver/cassandra_driver.cpp
index acfbbc26379..a705bc3dfc1 100644
--- a/clouddb/src/clouddb/facade/drivers/cassandra_driver/cassandra_driver.cpp
+++ b/clouddb/src/clouddb/facade/drivers/cassandra_driver/cassandra_driver.cpp
@@ -5,6 +5,7 @@
 #include <storage/itemptr.h>
 
 #include <cassandra.h>
+#include <chrono>
 #include <cstring>
 #include <iostream>
 #include <unordered_map>
@@ -124,11 +125,12 @@ CassandraDriver::CassandraDriver(
     : mapPointers() {
   builder = CassandraBuilder();
 
-  hostname = config["cassandra.host"];
-  keyspace = config["cassandra.keyspace"];
-  replicationFactor = std::atoi(config["cassandra.replication_factor"].c_str());
-  std::cout << this->hostname << " " << this->keyspace << " "
-            << this->replicationFactor << '\n';
+  this->hostname = config["cassandra.host"];
+  this->keyspace = config["cassandra.keyspace"];
+  this->replicationFactor =
+      std::atoi(config["cassandra.replication_factor"].c_str());
+  // std::cout << this->hostname << " " << this->keyspace << " "
+  //           << this->replicationFactor << std::endl;
 
   clusterPtr = cass_cluster_new();
   cass_cluster_set_contact_points(clusterPtr, hostname.data());
@@ -151,6 +153,7 @@ CassandraDriver::CassandraDriver(
 
   std::string query =
       this->builder.buildKeyspace(this->keyspace, this->replicationFactor);
+  // std::cout << query << std::endl;
   execCqlQuery(query);
 }
 
@@ -178,9 +181,14 @@ void CassandraDriver::execCqlQuery(std::string query, Metadata metadata,
                                    int var) {
   CassError rc = CASS_OK;
   CassFuture *future = NULL;
+  // std::cout << query << std::endl;
+  // std::cout << metadata.mask << std::endl;
   CassStatement *statement = cass_statement_new(query.data(), var);
   convert data = {.data = metadata.ctid};
-
+  // std::cout << metadata.t_ctid.ip_blkid.bi_hi << " "
+  //           << metadata.t_ctid.ip_blkid.bi_lo << " " <<
+  //           metadata.t_ctid.ip_posid
+  //           << std::endl;
   cass_statement_bind_bytes(statement, var - 1, (cass_byte_t *)data.a, 6);
   bindPartMetadataInStatement(statement, metadata);
 
@@ -204,6 +212,7 @@ void CassandraDriver::execCqlQuery(std::string query,
   CassError rc = CASS_OK;
   CassFuture *future = NULL;
   CassStatement *statement = cass_statement_new(query.data(), var);
+  // std::cout << "\n\n\n";
   for (int i = 0; i < fields.size(); ++i) {
     char *a = const_cast<char *>(fields[i].c_str());
     convert b;
@@ -232,11 +241,20 @@ void CassandraDriver::execCqlQuery(std::string query,
                                    std::vector<std::string> fieldData,
                                    std::vector<size_t> fieldSize,
                                    Metadata metadata, int var) {
+  // auto start = std::chrono::high_resolution_clock::now();
   CassError rc = CASS_OK;
   CassFuture *future = NULL;
+  static int i = 0;
+  i++;
   CassStatement *statement = cass_statement_new(query.data(), var);
+  static CassBatch *batch = NULL;
+  if (batch == NULL)
+    batch = cass_batch_new(CASS_BATCH_TYPE_UNLOGGED);  // Создаем пакет
+  // std::cout << query << std::endl;
+  // std::cout << fieldData.size() << std::endl;
 
   for (int i = 0; i < fieldData.size(); ++i) {
+    // std::cout << fieldData[i] << " vlaue" << std::endl;
     if (fieldData[i] == "") {
       cass_statement_bind_null(statement, i + 1);
       continue;
@@ -247,43 +265,35 @@ void CassandraDriver::execCqlQuery(std::string query,
                               fieldSize[i]);
   }
   bindMetadataInStatement(statement, metadata, fieldData.size() + 1);
-
-  future = cass_session_execute(this->sessionPtr, statement);
-  // cass_future_wait(future);
-
-  // rc = cass_future_error_code(future);
-  // if (rc != CASS_OK) {
-  //   const char *message;
-  //   size_t message_length;
-  //   cass_future_error_message(future, &message, &message_length);
-  //   std::cerr << "Connection error: " << std::string(message, message_length)
-  //             << std::endl;
-  // }
-  cass_future_free(future);
+  cass_batch_add_statement(batch, statement);
   cass_statement_free(statement);
-}
-
-void CassandraDriver::execCqlQueryIndex(std::string query,
-                                   std::vector<std::string> fieldData,
-                                   std::vector<size_t> fieldSize,
-                                   Metadata metadata, int var) {
-  CassError rc = CASS_OK;
-  CassFuture *future = NULL;
-  CassStatement *statement = cass_statement_new(query.data(), var);
-
-  for (int i = 0; i < fieldData.size(); ++i) {
-    if (fieldData[i] == "") {
-      cass_statement_bind_null(statement, i + 2);
-      continue;
-    }
-
-    cass_statement_bind_bytes(statement, i + 2,
-                              (const cass_byte_t *)fieldData[i].c_str(),
-                              fieldSize[i]);
-  }
-  bindMetadataInStatementWithIndex(statement, metadata, fieldData.size() + 2);
 
-  future = cass_session_execute(this->sessionPtr, statement);
+  if (i == 10) {
+    // std::cout << "yee " << batch << " " << &batch << std::endl;
+    i = 0;
+
+    future = cass_session_execute_batch(this->sessionPtr, batch);
+    cass_batch_free(batch);  // Освобождаем пакет
+    batch = NULL;
+    // cass_future_wait(future);
+
+    // rc = cass_future_error_code(future);
+    //
+    // if (rc != CASS_OK) {
+    //   const char *message;
+    //   size_t message_length;
+    //   cass_future_error_message(future, &message, &message_length);
+    //   std::cout << "Connection error: " << std::string(message,
+    //   message_length)
+    //             << std::endl;
+    // }
+  }
+  // auto end = std::chrono::high_resolution_clock::now();
+  // std::chrono::duration<double> duration = end - start;
+  // std::cout << "Время выполнения функции: " << duration.count() << " секунд."
+  //           << std::endl;
+
+  // future = cass_session_execute(this->sessionPtr, statement);
   // cass_future_wait(future);
 
   // rc = cass_future_error_code(future);
@@ -294,8 +304,7 @@ void CassandraDriver::execCqlQueryIndex(std::string query,
   //   std::cerr << "Connection error: " << std::string(message, message_length)
   //             << std::endl;
   // }
-  cass_future_free(future);
-  cass_statement_free(statement);
+  // cass_future_free(future);
 }
 
 CassFuture *CassandraDriver::execCqlQueryWithRes(std::string query) {
@@ -349,6 +358,7 @@ ItemPointerData CassandraDriver::getLastPointer(const std::string &tableName,
   }
 
   std::string query = builder.buildGetLastPointer(key, tableName);
+  // std::cout << "query last pointer: " << query << std::endl;
   CassFuture *future = execCqlQueryWithRes(query);
   ItemPointerData last = {};
 
@@ -502,7 +512,11 @@ int CassandraDriver::selectData(Snapshot snapshot, size_t metadataCount) {
     CassRow *row =
         const_cast<CassRow *>(cass_iterator_get_row(this->iterator.iter));
     CassError error = loadMetadata(row, metadata);
-
+    // std::cout << metadata.xmin << " " << metadata.xmax << " select"
+    //           << std::endl;
+    if (!inVisibilityArea(metadata, snapshot, ReadNextTransactionId() - 1)) {
+      return selectData(snapshot);  // надо пофиксить
+    }
     this->iterator.row.value.clear();
     this->iterator.row.size.clear();
 
@@ -523,7 +537,12 @@ int CassandraDriver::selectData(Snapshot snapshot, size_t metadataCount) {
       cass_value_get_bytes(casValue, &bytes, &size);
       this->iterator.row.value.push_back(bytes);
       this->iterator.row.size.push_back(size);
-    } 
+    }
+    const cass_byte_t *bytes;
+    cass_value_get_bytes(cass_row_get_column_by_name(row, "key_name"), &bytes,
+                         &size);
+    // std::cout << "select data: " << this->iterator.row.value[0] << " "
+    //           << this->iterator.row.size.size() << std::endl;
     return 1;
   }
   return 0;
@@ -584,7 +603,8 @@ void CassandraDriver::vacuum(std::string query, CassFuture *future,
     loadMetadata(row, metadata);
     cass_value_get_bytes(cass_row_get_column_by_name(row, KEY_NAME), &bytes,
                          &size);
-
+    // std::cout << metadata.xmax << " xmax metadata  and id - " << id
+    //           << std::endl;
     if (metadata.xmax == 0) {
       continue;
     }
@@ -607,11 +627,18 @@ void CassandraDriver::vacuum(std::string query, CassFuture *future,
   if (keysInBatch > 0) {
     std::vector<std::string> keysV;
     for (int i = 0; i < keysInBatch; i++) {
-
+      // std::cout << keys[i].data.ip_blkid.bi_hi << " "
+      //           << keys[i].data.ip_blkid.bi_lo << " " <<
+      //           keys[i].data.ip_posid
+      //           << std::endl;
+      //
       keysV.emplace_back(keys[i].a, 6);
       char *a = const_cast<char *>(keysV[i].c_str());
       convert b;
       memcpy(b.a, a, 6);
+      // std::cout << b.data.ip_blkid.bi_hi << " " << b.data.ip_blkid.bi_lo << "
+      // "
+      //           << b.data.ip_posid << std::endl;
     }
     execCqlQuery(builder.buildDropTuple(keyspace, tableName, keysInBatch),
                  keysV, keysInBatch);
diff --git a/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.cpp b/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.cpp
new file mode 100644
index 00000000000..ac3be46eb23
--- /dev/null
+++ b/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.cpp
@@ -0,0 +1,200 @@
+#include "rocksdb_driver.h"
+#include <bits/this_thread_sleep.h>
+
+#include <iostream>
+
+using namespace ROCKSDB_NAMESPACE;
+
+std::string kDBPath = "/tmp/rocksdb_cloud_durable";
+
+std::string kBucketSuffix = "cloud.durable.example.";
+std::string kRegion = "us-west-2";
+
+static const bool flushAtEnd = true;
+static const bool disableWAL = false;
+
+
+RocksDBDriver::RocksDBDriver(std::unordered_map<std::string, std::string> config) : mapPointers() {
+  std::cout << "Construct" << std::endl;
+  cloud_fs_options.aws_options.endpoint_override = "127.0.0.1:9000";
+
+  // Store a reference to a cloud file system. A new cloud env object should be
+  // associated with every new cloud-db.
+
+  cloud_fs_options.credentials.InitializeSimple(
+      getenv("AWS_ACCESS_KEY_ID"), getenv("AWS_SECRET_ACCESS_KEY"));
+  if (!cloud_fs_options.credentials.HasValid().ok()) {
+    fprintf(
+        stderr,
+        "Please set env variables "
+        "AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY with cloud credentials");
+  }
+
+  // Append the user name to the bucket name in an attempt to make it
+  // globally unique. S3 bucket-names need to be globally unique.
+  // If you want to rerun this example, then unique user-name suffix here.
+  char* user = getenv("USER");
+  kBucketSuffix.append(user);
+
+  // "rockset." is the default bucket prefix
+  const std::string bucketPrefix = "";
+  cloud_fs_options.src_bucket.SetBucketName(kBucketSuffix, bucketPrefix);
+  cloud_fs_options.dest_bucket.SetBucketName(kBucketSuffix, bucketPrefix);
+
+  // create a bucket name for debugging purposes
+  const std::string bucketName = bucketPrefix + kBucketSuffix;
+
+  // Create a new AWS cloud env Status
+  Status s = CloudFileSystemEnv::NewAwsFileSystem(
+      FileSystem::Default(), kBucketSuffix, kDBPath, kRegion, kBucketSuffix,
+      kDBPath, kRegion, cloud_fs_options, nullptr, &cfs);
+  if (!s.ok()) {
+    fprintf(stderr, "Unable to create cloud env in bucket %s. %s\n",
+            bucketName.c_str(), s.ToString().c_str());
+  }
+  cloud_fs.reset(cfs);
+
+  // Create options and use the AWS file system that we created earlier
+  cloud_env = NewCompositeEnv(cloud_fs);
+  options.env = cloud_env.get();
+  options.create_if_missing = true;
+
+  // No persistent read-cache
+  std::string persistent_cache = "";
+
+  // options for each write
+  wopt.disableWAL = disableWAL;
+
+  // open DB
+  s = DBCloud::Open(options, kDBPath, persistent_cache, 0, &db);
+  if (!s.ok()) {
+    throw std::runtime_error("Unable to open db at path1 " + 
+                              kDBPath + 
+                              " with bucket " + 
+                              bucketName + 
+                              ". " + 
+                              s.ToString() + "\n");
+  }
+
+
+    /***********************
+   *                       *
+   *          Test         *
+   *                       *
+   ************************/
+
+  // s = db->Put(wopt, "key1", "value");
+
+  // db->Flush(FlushOptions());
+
+  // std::cout << "Test succes" << std::endl;
+}
+
+void RocksDBDriver::createTable(std::string tableName){
+  std::cout << "Create" << std::endl;
+  // ROCKSDB_NAMESPACE::ColumnFamilyOptions cfOptions;
+  // // Здесь можно настроить параметры семейства колонок, если необходимо
+  // ROCKSDB_NAMESPACE::ColumnFamilyHandle* cfHandle;
+  // auto status = db->CreateColumnFamily(cfOptions, tableName, &cfHandle);
+  // if (!status.ok()) {
+  //     throw std::runtime_error("Unable to create column family: " + status.ToString());
+  // }
+
+  // // Сохраняем дескриптор семейства колонок в мапу
+  // columnFamilies[tableName] = cfHandle;
+}
+
+void RocksDBDriver::insertData(std::string tableName, std::vector<std::string> fieldName, std::vector<std::string> fieldData, std::vector<size_t> sizes, ItemPointerData pointer) {
+  static int countOperation = 0;
+  
+  std::string key = std::to_string(pointer.ip_blkid.bi_hi) + "_" + 
+                    std::to_string(pointer.ip_blkid.bi_lo) + "_" + 
+                    std::to_string(pointer.ip_posid);
+
+  std::string value;
+  for (size_t i = 0; i < fieldData.size(); ++i) {
+    value += fieldData[i];
+    if (i < fieldData.size() - 1) {
+      value += "|";  // Use a delimiter to separate fields
+    }
+  }
+
+  // auto batch = rocksdb::WriteBatch();
+  auto status = db->Put(this->wopt, key, value);
+
+  if (!status.ok()) {
+    throw std::runtime_error("Failed to insert data: " + status.ToString());
+  }
+
+  countOperation++;
+  if(countOperation % 50000 == 0){
+    db->Flush(FlushOptions());
+  }
+}
+
+ItemPointerData RocksDBDriver::getNewPointer(std::string tableName) {
+  ItemPointerData data = getLastPointer(tableName);
+  if (data.ip_posid < UINT16_MAX) {
+    data.ip_posid++;
+  } else {
+    data.ip_posid = 1;
+    if (data.ip_blkid.bi_lo < UINT16_MAX) {
+      data.ip_blkid.bi_lo++;
+    } else {
+      data.ip_blkid.bi_lo = 0;
+      if (data.ip_blkid.bi_hi < UINT16_MAX) {
+        data.ip_blkid.bi_hi++;
+      } else {
+        data.ip_blkid.bi_hi = 0;
+      }
+    }
+  }
+  mapPointers[tableName] = data;
+  return data;
+}
+
+ItemPointerData RocksDBDriver::getLastPointer(const std::string &tableName) {
+  auto it = this->mapPointers.find(tableName);
+  if (it != this->mapPointers.end()) {
+    return it->second;
+  }
+
+  ItemPointerData last = {};
+  ROCKSDB_NAMESPACE::ReadOptions readOptions;
+  ROCKSDB_NAMESPACE::Iterator* itr = db->NewIterator(readOptions);
+
+  itr->SeekToLast();
+  if (itr->Valid()) {
+    std::string lastKey = itr->key().ToString();
+    std::istringstream iss(lastKey);
+    std::string token;
+    std::vector<uint16_t> parts;
+
+    while (std::getline(iss, token, '_')) {
+      parts.push_back(static_cast<uint16_t>(std::stoi(token)));
+    }
+
+    if (parts.size() == 3) {
+      last.ip_blkid.bi_hi = parts[0];
+      last.ip_blkid.bi_lo = parts[1];
+      last.ip_posid = parts[2];
+    }
+  }else{
+    last.ip_blkid.bi_hi = 1;
+    last.ip_blkid.bi_lo = 1;
+    last.ip_posid = 1;
+    return last;
+  }
+
+  delete itr;
+
+  mapPointers[tableName] = last;
+  return last;
+  // last.ip_blkid.bi_hi = 1;
+  // last.ip_blkid.bi_lo = 1;
+  // last.ip_posid = 1;
+  // return last;
+
+}
+
+
diff --git a/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.h b/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.h
new file mode 100644
index 00000000000..5c150f57090
--- /dev/null
+++ b/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.h
@@ -0,0 +1,77 @@
+#ifndef ROCKSDB_DRIVER_H
+#define ROCKSDB_DRIVER_H
+
+#include "../idriver.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include <postgres.h>
+#include <fmgr.h>
+
+#include <access/transam.h>
+#ifdef __cplusplus
+}
+#endif
+
+#ifdef __cplusplus
+
+#include <string>
+#include <unordered_map>
+#include <sstream>
+
+#include "../../../utils/utils.h"
+#include "../../utils/metadata.h"
+
+#include <rocksdb/listener.h>
+#include <rocksdb/options.h>
+#include <rocksdb/db.h>
+#include <rocksdb/slice.h>
+#include <rocksdb/iterator.h>
+
+#include <bits/std_thread.h>
+
+#include <rocksdb/cloud/db_cloud.h>
+#include <rocksdb/options.h>
+
+
+class RocksDBDriver: public IDriver {
+private:
+  ROCKSDB_NAMESPACE::DBCloud* db;
+  std::unordered_map<std::string, ROCKSDB_NAMESPACE::ColumnFamilyHandle*> columnFamilies;
+
+  //require live for correct work
+  std::unordered_map<std::string, ItemPointerData> mapPointers;
+  ROCKSDB_NAMESPACE::WriteOptions wopt;
+  std::shared_ptr<ROCKSDB_NAMESPACE::FileSystem> cloud_fs;
+  ROCKSDB_NAMESPACE::Options options;
+  std::unique_ptr<ROCKSDB_NAMESPACE::Env> cloud_env;
+  ROCKSDB_NAMESPACE::CloudFileSystemOptions cloud_fs_options;
+  ROCKSDB_NAMESPACE::CloudFileSystem* cfs;
+public:
+  ~RocksDBDriver() = default;
+  RocksDBDriver(std::unordered_map<std::string, std::string> config);
+
+  void createTable(std::string tableName);
+
+  void insertData(std::string tableName, std::vector<std::string> fieldName, std::vector<std::string> fieldData, std::vector<size_t> sizes, ItemPointerData pointer) ;
+
+  void beginScan(Relation relation, Snapshot snapshot, int nkeys,
+                         struct ScanKeyData* key,
+                         ParallelTableScanDesc parallel_scan, uint32 flags,
+                         TransactionId id) { return; };
+  int selectData(Snapshot snapshot) { return 0; };
+  char** getValue() { return 0; };
+  ItemPointerData getTid() { return ItemPointerData(); };
+
+  ItemPointerData getNewPointer(std::string tableName);
+  ItemPointerData getLastPointer(const std::string &tableName);
+
+  void startFlushThread();
+  void stopFlushThread();
+};
+
+#endif
+
+
+#endif
\ No newline at end of file
diff --git a/clouddb/src/clouddb/facade/query_builder.cpp b/clouddb/src/clouddb/facade/query_builder.cpp
index d969304ef4a..4ab0dbebd8f 100644
--- a/clouddb/src/clouddb/facade/query_builder.cpp
+++ b/clouddb/src/clouddb/facade/query_builder.cpp
@@ -220,9 +220,7 @@ std::string CassandraBuilder::buildSelectAll(std::string keyspace,
   query += " <= ";
   query += std::to_string(id);
   query += "  ALLOW FILTERING;";
-
   // std::cout << query << std::endl;
-
   return query;
 }
 
diff --git a/clouddb/src/clouddb/facade/session.cpp b/clouddb/src/clouddb/facade/session.cpp
index 6216efe3d40..f9f8f6f704d 100644
--- a/clouddb/src/clouddb/facade/session.cpp
+++ b/clouddb/src/clouddb/facade/session.cpp
@@ -19,6 +19,8 @@ std::unordered_map<std::string, std::string> parseConfig(char **config) {
 Session::Session(std::unordered_map<std::string, std::string> config) {
   if (config["driver"] == "cassandra") {
     this->driver = std::make_shared<CassandraDriver>(config);
+  }else if(config["driver"] == "rocksdb") {
+    this->driver = std::make_shared<RocksDBDriver>(config);
   }
 }
 
diff --git a/clouddb/src/clouddb/facade/session.h b/clouddb/src/clouddb/facade/session.h
index dd0cdccbbbc..38d6e541014 100644
--- a/clouddb/src/clouddb/facade/session.h
+++ b/clouddb/src/clouddb/facade/session.h
@@ -4,14 +4,16 @@
 #include "../utils/c_export.h"
 #include "command/icommand.h"
 #include "drivers/cassandra_driver/cassandra_driver.h"
+#include "drivers/rocksdb_driver/rocksdb_driver.h"
 //
 
 #ifdef __cplusplus
 #include <memory>
 #include <string>
 #include <unordered_map>
+#include <iostream>
 
-enum DRIVERS { Cassandra };
+enum DRIVERS { Cassandra, RocksDb };
 
 class Session {
  public:
@@ -27,7 +29,7 @@ class Session {
   std::weak_ptr<ICommand> command;
   Session(std::unordered_map<std::string, std::string> config);
   Session();
-  ~Session() = default;
+  ~Session() {std::cout << "~Session" << std::endl;};
 
   // delete all
   Session(const Session &) = delete;
diff --git a/clouddb/src/clouddb/tam/all_tam.h b/clouddb/src/clouddb/tam/all_tam.h
index 43134944a91..d00e11646c9 100644
--- a/clouddb/src/clouddb/tam/all_tam.h
+++ b/clouddb/src/clouddb/tam/all_tam.h
@@ -16,114 +16,7 @@
 #include "../facade/command/command.h"
 #include "../utils/utils.h"
 
-#include "access/hio.h"
-#include "access/multixact.h"
-#include "access/relscan.h"
-#include "access/sysattr.h"
-#include "access/transam.h"
-#include "access/valid.h"
-#include "access/visibilitymap.h"
-#include "access/xact.h"
-#include "access/xlogutils.h"
-#include "catalog/catalog.h"
-#include "catalog/namespace.h"
-#include "miscadmin.h"
-#include "pgstat.h"
-#include "storage/bufmgr.h"
-#include "storage/freespace.h"
-#include "storage/lmgr.h"
-#include "storage/procarray.h"
-#include "storage/smgr.h"
-#include "storage/standby.h"
-#include "utils/datum.h"
-#include "utils/inval.h"
-#include "utils/snapmgr.h"
-#include "utils/syscache.h"
-
-
-#include "access/genam.h"
-#include "access/table.h"
-#include "catalog/indexing.h"
-#include "catalog/objectaddress.h"
-#include "catalog/pg_description.h"
-#include "catalog/pg_shdescription.h"
-#include "commands/comment.h"
-#include "commands/dbcommands.h"
-#include "utils/fmgroids.h"
-#include "catalog/pg_index.h"
-#include "catalog/pg_class.h"
-#include "catalog/pg_namespace.h"
-#include "utils/relcache.h"
-#include "utils/varbit.h"
-#include "commands/sequence.h"
-
-
-#include <access/heapam.h>
-#include <access/htup_details.h>
-#include <access/relation.h>
-#include <access/tableam.h>
-#include <cassandra.h>
-#include <catalog/index.h>
-#include <commands/vacuum.h>
-#include <executor/executor.h>
-#include <executor/spi.h>
-#include <executor/tuptable.h>
-#include <fmgr.h>
-#include <miscadmin.h>
-#include <nodes/execnodes.h>
-#include <postmaster/bgworker.h>
-#include <postmaster/interrupt.h>
-#include <stdlib.h>
-#include <storage/ipc.h>
-#include <storage/lwlock.h>
-#include <storage/shmem.h>
-#include <string.h>
-#include <tcop/tcopprot.h>
-#include <utils/builtins.h>
-#include <utils/guc.h>
-#include <utils/lsyscache.h>
-#include <utils/rel.h> /* ... and relations */
-#include <utils/snapmgr.h>
-
-#include "access/amapi.h"
-#include "access/genam.h"
-#include "access/relscan.h"
-#include "catalog/index.h"
-#include "catalog/pg_type.h"
-#include "commands/vacuum.h"
-#include "miscadmin.h"
-#include "storage/bufmgr.h"
-#include "utils/memutils.h"
-#include "nodes/pathnodes.h"
-
-#include <access/heapam.h>
-#include <access/htup_details.h>
-#include <access/relation.h>
-#include <access/tableam.h>
-#include <cassandra.h>
-#include <catalog/index.h>
-#include <commands/vacuum.h>
-#include <executor/executor.h>
-#include <executor/spi.h>
-#include <executor/tuptable.h>
-#include <fmgr.h>
-#include <miscadmin.h>
-#include <nodes/execnodes.h>
-#include <postmaster/bgworker.h>
-#include <postmaster/interrupt.h>
-#include <stdlib.h>
-#include <storage/ipc.h>
-#include <storage/lwlock.h>
-#include <storage/shmem.h>
-#include <string.h>
-#include <tcop/tcopprot.h>
-#include <utils/builtins.h>
-#include <utils/guc.h>
-#include <utils/lsyscache.h>
-#include <utils/rel.h> /* ... and relations */
-#include <utils/snapmgr.h>
-#include "access/amapi.h"
-
+extern Session* session;
 extern const TableAmRoutine clouddb_methods;
 
 #endif
diff --git a/clouddb/src/clouddb/tam/src/mod_tuple_tam.c b/clouddb/src/clouddb/tam/src/mod_tuple_tam.c
index 4a7c40cf7a8..9ddd5e479ee 100644
--- a/clouddb/src/clouddb/tam/src/mod_tuple_tam.c
+++ b/clouddb/src/clouddb/tam/src/mod_tuple_tam.c
@@ -4,9 +4,14 @@
 
 void clouddb_tuple_insert(Relation relation, TupleTableSlot *slot,
                           CommandId cid, int options, BulkInsertState bistate) {
+  // Вычисляем разницу
+  /* clock_t start = clock(); */
   Session *session = getSessionInstance(NULL);
   executeCommand(session, createInsertCommand(session, relation, slot, cid,
                                               options, bistate));
+  /* clock_t end = clock(); */
+  /* double time_spent = (double)(end - start) / CLOCKS_PER_SEC * 1000; */
+  /* printf("Время выполнения функции: %.3f milliseconds\n", time_spent); */
 }
 
 void clouddb_tuple_insert_speculative(Relation relation, TupleTableSlot *slot,
@@ -136,3 +141,4 @@ TM_Result clouddb_tuple_lock(Relation relation, ItemPointer tid,
   TM_Result result = 0;
   return result;
 }
+
diff --git a/clouddb/src/clouddb/tam/src/scan_func_tam.c b/clouddb/src/clouddb/tam/src/scan_func_tam.c
index b7a9878899a..489bef859d4 100644
--- a/clouddb/src/clouddb/tam/src/scan_func_tam.c
+++ b/clouddb/src/clouddb/tam/src/scan_func_tam.c
@@ -43,8 +43,12 @@ bool clouddb_getnextslot(TableScanDesc sscan, ScanDirection direction,
   char **values = getValueForScan(driver);
 
   slot->tts_tid = getTidForScan(driver);
+  /* printf("%d %d %d\n", slot->tts_tid.ip_posid, slot->tts_tid.ip_blkid.bi_lo,
+   */
+  /*        slot->tts_tid.ip_blkid.bi_hi); */
 
   TupleDesc desc = RelationGetDescr(sscan->rs_rd);
+  /* printf("%s\n", values[0]); */
 
   for (int i = 0; i < desc->natts; ++i) {
     char *curValue = values[i];
diff --git a/clouddb/src/clouddb/tam/tam.c b/clouddb/src/clouddb/tam/tam.c
index 3d2059d2987..dbd294918d2 100644
--- a/clouddb/src/clouddb/tam/tam.c
+++ b/clouddb/src/clouddb/tam/tam.c
@@ -7,6 +7,8 @@
 #include "include/scan_func_tam.h"
 #include "include/slot_func_tam.h"
 
+Session* session;
+
 const TableAmRoutine clouddb_methods = {
     .type = T_TableAmRoutine,
 
@@ -71,20 +73,21 @@ const TableAmRoutine clouddb_methods = {
 
 PG_FUNCTION_INFO_V1(clouddb_table_handler);
 Datum clouddb_table_handler(PG_FUNCTION_ARGS) {
-  char *keyspace = (char *)GetConfigOption("cassandra.keyspace", false, false);
-  char *host = (char *)GetConfigOption("cassandra.host", false, false);
+    printf("Init\n");
+  char *host = GetConfigOption("cassandra.host", false, false);
+  char *keyspace = GetConfigOption("cassandra.keyspace", false, false);
   char *replicationFactor =
       (char *)GetConfigOption("cassandra.replication_factor", false, false);
 
-  char **config = (char **)malloc(sizeof(char *) * 7);
-  config[0] = "cassandra";
+    char **config = (char **)malloc(sizeof(char *) * 7);
+  config[0] = "rocksdb";
   config[1] = "cassandra.host";
-  config[2] = host;
+  config[2] = "host";
   config[3] = "cassandra.keyspace";
-  config[4] = keyspace;
+  config[4] = "keyspace";
   config[5] = "cassandra.replication_factor";
-  config[6] = replicationFactor;
-  Session *session = getSessionInstance((void *)config);
+  config[6] = "replicationFactor";
+  session = getSessionInstance(config);
 
   PG_RETURN_POINTER(&clouddb_methods);
 }
-- 
GitLab


From 11c51afe8a88108424b479d02521433b7d5afc83 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=91=D0=B8=D1=82=D0=BE=D1=87=D0=BA=D0=B8=D0=BD=20=D0=95?=
 =?UTF-8?q?=D0=B3=D0=BE=D1=80?= <e.bitochkin@g.nsu.ru>
Date: Sun, 16 Feb 2025 19:54:08 +0700
Subject: [PATCH 3/5] feat: Dockerfile

---
 .gitmodules                                   |   6 +
 clouddb/Dockerfile                            |  26 ++-
 clouddb/external/aws                          |   1 +
 clouddb/external/rocksdb                      |   1 +
 clouddb/src/clouddb/CMakeLists.txt            | 149 +-----------------
 clouddb/src/clouddb/clouddb.c                 |   3 -
 clouddb/src/clouddb/clouddb.h                 |   6 +-
 clouddb/src/clouddb/cpp.cpp                   |  43 -----
 clouddb/src/clouddb/cpp.h                     |  53 -------
 .../drivers/rocksdb_driver/rocksdb_driver.h   |  49 +++---
 clouddb/src/clouddb/utils/utils.c             |   1 -
 test/main.py                                  |  51 ++++++
 12 files changed, 111 insertions(+), 278 deletions(-)
 create mode 160000 clouddb/external/aws
 create mode 160000 clouddb/external/rocksdb
 delete mode 100644 clouddb/src/clouddb/cpp.cpp
 delete mode 100644 clouddb/src/clouddb/cpp.h
 create mode 100644 test/main.py

diff --git a/.gitmodules b/.gitmodules
index a03f69df67a..53bfa81d11b 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -5,3 +5,9 @@
 [submodule "clouddb/external/cassandra_driver"]
 	path = clouddb/external/cassandra_driver
 	url = https://github.com/datastax/cpp-driver.git
+[submodule "clouddb/external/aws"]
+	path = clouddb/external/aws
+	url = https://github.com/aws/aws-sdk-cpp.git
+[submodule "clouddb/external/rocksdb"]
+	path = clouddb/external/rocksdb
+	url = https://github.com/undy11203/rocksdb-cloud.git
diff --git a/clouddb/Dockerfile b/clouddb/Dockerfile
index 6a3e9b5fc8c..5ef9b36f975 100644
--- a/clouddb/Dockerfile
+++ b/clouddb/Dockerfile
@@ -21,10 +21,7 @@ RUN apt-get update && apt-get install -y \
     libpq-dev \
     icu-devtools \ 
     libicu-dev \
-    git
-
-# Устанавливаем зависимости для сборки расширения и Cassandra драйвера
-RUN apt-get update && apt-get install -y \
+    git \
     libpq-dev \
     libuv1-dev \
     libssl-dev \
@@ -33,6 +30,7 @@ RUN apt-get update && apt-get install -y \
 
 WORKDIR /usr/src
 
+# Сборка драйвера Cassandra
 COPY external/cassandra_driver /usr/src/cassandra_driver
 RUN cd /usr/src/cassandra_driver && \
     mkdir /usr/src/cassandra_driver/build && cd /usr/src/cassandra_driver/build && \
@@ -41,6 +39,24 @@ RUN cd /usr/src/cassandra_driver && \
     make install && \
     ldconfig
 
+# Сборка AWS SDK, зависимости для RocksDB-Cloud
+COPY external/aws /usr/src/aws_sdk
+RUN cd /usr/src/aws_sdk &&\
+    cmake -DCMAKE_BUILD_TYPE=Release '-DBUILD_ONLY=kinesis;core;s3;transfer' -S . -B build && cd build && \
+    make -j8 && \
+    make install && \
+    ldconfig
+
+COPY external/rocksdb /usr/src/rocksdb
+ENV USE_AWS=1
+ENV USE_RTTI=1
+ENV DISABLE_WARNING_AS_ERROR=1
+RUN cd /usr/src/rocksdb &&\
+    make -j8 static_lib &&\
+    ldconfig
+
+
+# Сборка постгреса
 COPY external/postgres /usr/src/postgres
 RUN /usr/src/postgres/configure --prefix=/usr/local/pgsql --without-icu --without-perl && \
     make -j8 && \
@@ -50,6 +66,8 @@ RUN useradd -m -U -r -d /home/postgres -s /bin/bash postgres && \
     mkdir -p /var/lib/postgresql && \
     chown -R postgres:postgres /var/lib/postgresql /home/postgres
 
+
+
 ##############################################
 # Stage 1: РЎР±РѕСЂРєР° CloudDB
 ##############################################
diff --git a/clouddb/external/aws b/clouddb/external/aws
new file mode 160000
index 00000000000..00fb461a3ca
--- /dev/null
+++ b/clouddb/external/aws
@@ -0,0 +1 @@
+Subproject commit 00fb461a3cac85baf4a1ffc98fb4fc2f9cf3a1bd
diff --git a/clouddb/external/rocksdb b/clouddb/external/rocksdb
new file mode 160000
index 00000000000..5d44ac66b33
--- /dev/null
+++ b/clouddb/external/rocksdb
@@ -0,0 +1 @@
+Subproject commit 5d44ac66b337b0dd79675d5761c7b6887c8c79a4
diff --git a/clouddb/src/clouddb/CMakeLists.txt b/clouddb/src/clouddb/CMakeLists.txt
index 0b11d0ba4f5..61ef58193f7 100644
--- a/clouddb/src/clouddb/CMakeLists.txt
+++ b/clouddb/src/clouddb/CMakeLists.txt
@@ -1,156 +1,17 @@
-
-set(USE_AWS 1) #(?)
-
-# Платформа (?)
-set(PLATFORM "OS_LINUX")
-
-# Флаги линковки для платформы (need)
-set(PLATFORM_LDFLAGS 
-    "-laws-cpp-sdk-s3"
-    "-laws-cpp-sdk-kinesis"
-    "-laws-cpp-sdk-core"
-    "-laws-cpp-sdk-transfer"
-    "-lpthread"
-    "-lrt"
-    "-ldl"
-    "-fPIC"
-    "-lsnappy"
-    "-lgflags"
-    "-lz"
-    "-lbz2"
-    "-llz4"
-    "-lzstd"
-    "-lnuma"
-    "-ltbb"
-    "-luring"
-    "-ldl"
-)
-
-# Флаги компиляции для платформы (?)
-set(PLATFORM_CCFLAGS 
-    "-DROCKSDB_PLATFORM_POSIX"
-    "-DROCKSDB_LIB_IO_POSIX"
-    "-DOS_LINUX"
-    "-fno-builtin-memcmp"
-    "-DROCKSDB_FALLOCATE_PRESENT"
-    "-DSNAPPY"
-    "-DGFLAGS=1"
-    "-DZLIB"
-    "-DBZIP2"
-    "-DLZ4"
-    "-DZSTD"
-    "-DNUMA"
-    "-DTBB"
-    "-DROCKSDB_MALLOC_USABLE_SIZE"
-    "-DROCKSDB_PTHREAD_ADAPTIVE_MUTEX"
-    "-DROCKSDB_BACKTRACE"
-    "-DROCKSDB_RANGESYNC_PRESENT"
-    "-DROCKSDB_SCHED_GETCPU_PRESENT"
-    "-DROCKSDB_AUXV_GETAUXVAL_PRESENT"
-    "-DROCKSDB_IOURING_PRESENT"
-    "-I/usr/local/include/"
-    "-DUSE_AWS"
-    "-march=native"
-    "-DHAVE_UINT128_EXTENSION"
-)
-
-set(PLATFORM_CXXFLAGS #(?)
-    "-std=c++17"  
-    "-faligned-new"
-    "-DHAVE_ALIGNED_NEW"
-    "-DROCKSDB_PLATFORM_POSIX"
-    "-DROCKSDB_LIB_IO_POSIX"
-    "-DOS_LINUX"
-    "-fno-builtin-memcmp"
-    "-DROCKSDB_FALLOCATE_PRESENT"
-    "-DSNAPPY"
-    "-DGFLAGS=1"
-    "-DZLIB"
-    "-DBZIP2"
-    "-DLZ4"
-    "-DZSTD"
-    "-DNUMA"
-    "-DTBB"
-    "-DROCKSDB_MALLOC_USABLE_SIZE"
-    "-DROCKSDB_PTHREAD_ADAPTIVE_MUTEX"
-    "-DROCKSDB_BACKTRACE"
-    "-DROCKSDB_RANGESYNC_PRESENT"
-    "-DROCKSDB_SCHED_GETCPU_PRESENT"
-    "-DROCKSDB_AUXV_GETAUXVAL_PRESENT"
-    "-DROCKSDB_IOURING_PRESENT"
-    "-I/usr/local/include/"
-    "-DUSE_AWS"
-    "-march=native"
-    "-DHAVE_UINT128_EXTENSION"
-)
-
-# Флаги для создания общих библиотек (?)
-set(PLATFORM_SHARED_CFLAGS "-fPIC")
-set(PLATFORM_SHARED_EXT "so")
-set(PLATFORM_SHARED_LDFLAGS "-Wl,--no-as-needed -shared -Wl,-soname -Wl,")
-set(PLATFORM_SHARED_VERSIONED true)
-
-# Флаги линковки для исполняемых файлов (?)
-set(EXEC_LDFLAGS "-ldl")
-
-# JEMALLOC (?)
-set(JEMALLOC_INCLUDE "")
-set(JEMALLOC_LIB "")
-set(JEMALLOC 1)
-set(WITH_JEMALLOC_FLAG 1)
-
-# Версии RocksDB (?)
-set(ROCKSDB_MAJOR 9)
-set(ROCKSDB_MINOR 1)
-set(ROCKSDB_PATCH 1)
-
-# Другие переменные (?)
-set(CLANG_SCAN_BUILD "scan-build")
-set(CLANG_ANALYZER "/usr/bin/clang++")
-set(PROFILING_FLAGS "-pg")
-set(FIND "find")
-set(WATCH "watch")
-set(FOLLY_PATH "")
-set(LUA_PATH "")
-
-set(target_source  facade/query_builder.cpp
-                   utils/utils.c
-                   facade/drivers/cassandra_driver/cassandra_driver.cpp
-                   facade/drivers/rocksdb_driver/rocksdb_driver.cpp
-                   facade/session.cpp
-                   facade/command/cassandra_command/cas_transaction_command.cpp
-                   facade/command/rocksdb_command/roc_transaction_command.cpp
-                   facade/command/command.cpp
-                   tam/src/ddl_func_tam.c
-                   tam/src/index_scan_tam.c
-                   tam/src/misc_func_tam.c
-                   tam/src/mod_tuple_tam.c
-                   tam/src/non_mod_tuple_tam.c
-                   tam/src/parallel_scan_tam.c
-                   tam/src/scan_func_tam.c
-                   tam/src/slot_func_tam.c
-                   tam/tam.c
-                   cpp.cpp
-                   hooks/src/hook.c
-                   clouddb.c)
+file(GLOB_RECURSE src ./*.cpp ./*.c ./*.hpp ./*.h)
 
 add_postgresql_extension(
   clouddb
   VERSION 1.0
-  SOURCES ${cpp_sources} ${c_sources}
+  SOURCES ${src}
   SCRIPTS clouddb--1.0.sql
   REGRESS basic
 )
 
-link_directories("/home/user/rocksdb-cloud/")
+link_directories("/usr/local/lib/rocksdb-cloud/")
 link_directories("/usr/local/pgsql/lib/")
-include_directories("/home/user/rocksdb-cloud/include/")
-
-# Установка флагов компиляции
-target_compile_options(clouddb PRIVATE ${PLATFORM_CXXFLAGS} ${PLATFORM_CCFLAGS})
+include_directories("/usr/local/lib/rocksdb-cloud/include/")
 
-# Установка флагов линковки
-target_link_libraries(clouddb PRIVATE rocksdb cassandra ${PLATFORM_LDFLAGS})
 
 
-target_link_libraries(clouddb cassandra pq)
+target_link_libraries(clouddb PRIVATE rocksdb cassandra pq)
diff --git a/clouddb/src/clouddb/clouddb.c b/clouddb/src/clouddb/clouddb.c
index 068a66aa78c..a9f12134724 100644
--- a/clouddb/src/clouddb/clouddb.c
+++ b/clouddb/src/clouddb/clouddb.c
@@ -5,12 +5,9 @@
 #include <lib/stringinfo.h>
 #include <libpq/pqformat.h>
 
-#include "cpp.h"
 #include "hooks/include/hook.h"
 
 PG_MODULE_MAGIC;
 void _PG_init() {
-
-
   hook_init();
 }
diff --git a/clouddb/src/clouddb/clouddb.h b/clouddb/src/clouddb/clouddb.h
index 3cf9335ac16..0ccb750d0e1 100644
--- a/clouddb/src/clouddb/clouddb.h
+++ b/clouddb/src/clouddb/clouddb.h
@@ -3,8 +3,4 @@
 
 #include <postgres.h>
 
-typedef struct Quaternion {
-  double a, b, c, d;
-} Quaternion;
-
-#endif  // SAMPLES_QUARTERNION_H_
+#endif
diff --git a/clouddb/src/clouddb/cpp.cpp b/clouddb/src/clouddb/cpp.cpp
deleted file mode 100644
index 37703b5295e..00000000000
--- a/clouddb/src/clouddb/cpp.cpp
+++ /dev/null
@@ -1,43 +0,0 @@
-#include "cpp.h"
-
-#include <algorithm>
-#include <iostream>
-#include <vector>
-
-int some::getA() { return this->a; }
-int some::getB() { return this->b; }
-
-char *some::getMessa() { return this->messa; }
-
-EXPORT_C some *create_class(some *some2) {
-  some some1;
-  // std::cout << ((struct some_copy *)(some2))->message << "\n";
-  some2 = &some1;
-  return some2;
-}
-
-EXPORT_C int result() {
-  std::vector<int> vec = {5, 3, 8, 1, 2};
-  std::sort(vec.begin(), vec.end());
-  return vec[0];
-}
-
-EXPORT_C char *getMessa(some *some1) { return some1->getMessa(); }
-
-EXPORT_C int getAvalue() {
-  some somer;
-  return somer.a;
-}
-
-EXPORT_C int getAwhichFunc() {
-  some somer;
-  return somer.getA();
-}
-
-EXPORT_C int setAndGetA(int k) {
-  some somer;
-  somer.setA(k);
-  return somer.getA();
-}
-
-EXPORT_C int getInClass(some *some1) { return some1->getB(); }
diff --git a/clouddb/src/clouddb/cpp.h b/clouddb/src/clouddb/cpp.h
deleted file mode 100644
index 5e0d0c7de38..00000000000
--- a/clouddb/src/clouddb/cpp.h
+++ /dev/null
@@ -1,53 +0,0 @@
-#ifndef CPP_H
-#define CPP_H
-
-#include "utils/c_export.h"
-
-#ifdef __cplusplus
-#include <iostream>
-
-class some {
-private:
-  char *messa;
-  int b;
-
-public:
-  char *getMessa();
-  int getB();
-  some(){};
-  some(char *m) : messa(m){};
-  int a = 5;
-  int getA();
-  int setA(int i) {
-    a = i;
-    return a;
-  }
-  ~some() { std::cout << "adios amigos" << "\n"; }
-};
-
-struct some_copy {
-  int message;
-};
-
-#else
-typedef struct some1 {
-  int message;
-} some;
-
-#endif // class
-
-EXPORT_C int getInClass(some *some1);
-
-EXPORT_C char *getMessa(some *some1);
-
-EXPORT_C some *create_class(some *some2);
-
-EXPORT_C int result();
-
-EXPORT_C int getAvalue();
-
-EXPORT_C int getAwhichFunc();
-
-EXPORT_C int setAndGetA(int k);
-
-#endif
diff --git a/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.h b/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.h
index 5c150f57090..730be9dd8d2 100644
--- a/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.h
+++ b/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.h
@@ -16,31 +16,27 @@ extern "C" {
 
 #ifdef __cplusplus
 
+#include <bits/std_thread.h>
+#include <rocksdb/cloud/db_cloud.h>
+#include <rocksdb/db.h>
+#include <rocksdb/iterator.h>
+#include <rocksdb/listener.h>
+#include <rocksdb/options.h>
+#include <rocksdb/slice.h>
+#include <sstream>
 #include <string>
 #include <unordered_map>
-#include <sstream>
 
 #include "../../../utils/utils.h"
 #include "../../utils/metadata.h"
 
-#include <rocksdb/listener.h>
-#include <rocksdb/options.h>
-#include <rocksdb/db.h>
-#include <rocksdb/slice.h>
-#include <rocksdb/iterator.h>
-
-#include <bits/std_thread.h>
-
-#include <rocksdb/cloud/db_cloud.h>
-#include <rocksdb/options.h>
-
-
-class RocksDBDriver: public IDriver {
-private:
+class RocksDBDriver : public IDriver {
+ private:
   ROCKSDB_NAMESPACE::DBCloud* db;
-  std::unordered_map<std::string, ROCKSDB_NAMESPACE::ColumnFamilyHandle*> columnFamilies;
+  std::unordered_map<std::string, ROCKSDB_NAMESPACE::ColumnFamilyHandle*>
+      columnFamilies;
 
-  //require live for correct work
+  // require live for correct work
   std::unordered_map<std::string, ItemPointerData> mapPointers;
   ROCKSDB_NAMESPACE::WriteOptions wopt;
   std::shared_ptr<ROCKSDB_NAMESPACE::FileSystem> cloud_fs;
@@ -48,24 +44,28 @@ private:
   std::unique_ptr<ROCKSDB_NAMESPACE::Env> cloud_env;
   ROCKSDB_NAMESPACE::CloudFileSystemOptions cloud_fs_options;
   ROCKSDB_NAMESPACE::CloudFileSystem* cfs;
-public:
+
+ public:
   ~RocksDBDriver() = default;
   RocksDBDriver(std::unordered_map<std::string, std::string> config);
 
   void createTable(std::string tableName);
 
-  void insertData(std::string tableName, std::vector<std::string> fieldName, std::vector<std::string> fieldData, std::vector<size_t> sizes, ItemPointerData pointer) ;
+  void insertData(std::string tableName, std::vector<std::string> fieldName,
+                  std::vector<std::string> fieldData, std::vector<size_t> sizes,
+                  ItemPointerData pointer);
 
   void beginScan(Relation relation, Snapshot snapshot, int nkeys,
-                         struct ScanKeyData* key,
-                         ParallelTableScanDesc parallel_scan, uint32 flags,
-                         TransactionId id) { return; };
+                 struct ScanKeyData* key, ParallelTableScanDesc parallel_scan,
+                 uint32 flags, TransactionId id) {
+    return;
+  };
   int selectData(Snapshot snapshot) { return 0; };
   char** getValue() { return 0; };
   ItemPointerData getTid() { return ItemPointerData(); };
 
   ItemPointerData getNewPointer(std::string tableName);
-  ItemPointerData getLastPointer(const std::string &tableName);
+  ItemPointerData getLastPointer(const std::string& tableName);
 
   void startFlushThread();
   void stopFlushThread();
@@ -73,5 +73,4 @@ public:
 
 #endif
 
-
-#endif
\ No newline at end of file
+#endif
diff --git a/clouddb/src/clouddb/utils/utils.c b/clouddb/src/clouddb/utils/utils.c
index b4d4f54c321..d0a478e6c31 100644
--- a/clouddb/src/clouddb/utils/utils.c
+++ b/clouddb/src/clouddb/utils/utils.c
@@ -1,5 +1,4 @@
 #include "utils.h"
-#include "../facade/session.h"
 
 uint32 get_event_horizont_xmin() {
   uint32 xmin = 0;
diff --git a/test/main.py b/test/main.py
new file mode 100644
index 00000000000..b78b993ce23
--- /dev/null
+++ b/test/main.py
@@ -0,0 +1,51 @@
+import psycopg2
+
+# Настройки подключения
+DB_HOST = "localhost"  # Имя сервиса в Docker-Compose или 127.0.0.1, если порт проброшен
+DB_PORT = "5432"       # Порт PostgreSQL (по умолчанию 5432)
+DB_NAME = "postgres"   # Имя БД (по умолчанию postgres)
+DB_USER = "postgres"   # Имя пользователя
+DB_PASS = "db"  # Пароль (замени на свой)
+
+# Подключение к PostgreSQL
+try:
+    conn = psycopg2.connect(
+        host=DB_HOST,
+        port=DB_PORT,
+        dbname=DB_NAME,
+        user=DB_USER,
+        password=DB_PASS
+    )
+    conn.autocommit = True
+    cursor = conn.cursor()
+
+    # Создаём расширение
+    print("Создаём расширение clouddb...")
+    cursor.execute("CREATE EXTENSION IF NOT EXISTS clouddb;")
+
+    # Создаём таблицу
+    print("Создаём таблицу mytable...")
+    cursor.execute("DROP TABLE IF EXISTS mytable;")
+    cursor.execute("CREATE TABLE mytable (title text, content text) USING clouddb;")
+
+    # Вставляем тестовые данные
+    print("Добавляем тестовые данные...")
+    cursor.execute("INSERT INTO mytable (title, content) VALUES ('Hello', 'This is a test entry');")
+    cursor.execute("INSERT INTO mytable (title, content) VALUES ('PostgreSQL', 'Running in Docker!');")
+
+    # Выполняем тестовый запрос
+    print("Выполняем SELECT * FROM mytable:")
+    cursor.execute("SELECT * FROM mytable;")
+    rows = cursor.fetchall()
+
+    for row in rows:
+        print(row)
+
+    # Закрываем соединение
+    cursor.close()
+    conn.close()
+    print("✅ Тест завершён успешно!")
+
+except Exception as e:
+    print(f"Ошибка: {e}")
+
-- 
GitLab


From 0c40795d15e27c0a96589a6879f47c0815b9dbe8 Mon Sep 17 00:00:00 2001
From: Snezhana Zhuiko <zhuikosnezhana@gmail.com>
Date: Mon, 10 Mar 2025 16:38:00 +0700
Subject: [PATCH 4/5] Revert "feat: Dockerfile"

This reverts commit 11c51afe8a88108424b479d02521433b7d5afc83.
---
 .gitmodules                                   |   6 -
 clouddb/Dockerfile                            |  26 +--
 clouddb/external/aws                          |   1 -
 clouddb/external/rocksdb                      |   1 -
 clouddb/src/clouddb/CMakeLists.txt            | 149 +++++++++++++++++-
 clouddb/src/clouddb/clouddb.c                 |   3 +
 clouddb/src/clouddb/clouddb.h                 |   6 +-
 clouddb/src/clouddb/cpp.cpp                   |  43 +++++
 clouddb/src/clouddb/cpp.h                     |  53 +++++++
 .../drivers/rocksdb_driver/rocksdb_driver.h   |  49 +++---
 clouddb/src/clouddb/utils/utils.c             |   1 +
 test/main.py                                  |  51 ------
 12 files changed, 278 insertions(+), 111 deletions(-)
 delete mode 160000 clouddb/external/aws
 delete mode 160000 clouddb/external/rocksdb
 create mode 100644 clouddb/src/clouddb/cpp.cpp
 create mode 100644 clouddb/src/clouddb/cpp.h
 delete mode 100644 test/main.py

diff --git a/.gitmodules b/.gitmodules
index 53bfa81d11b..a03f69df67a 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -5,9 +5,3 @@
 [submodule "clouddb/external/cassandra_driver"]
 	path = clouddb/external/cassandra_driver
 	url = https://github.com/datastax/cpp-driver.git
-[submodule "clouddb/external/aws"]
-	path = clouddb/external/aws
-	url = https://github.com/aws/aws-sdk-cpp.git
-[submodule "clouddb/external/rocksdb"]
-	path = clouddb/external/rocksdb
-	url = https://github.com/undy11203/rocksdb-cloud.git
diff --git a/clouddb/Dockerfile b/clouddb/Dockerfile
index 5ef9b36f975..6a3e9b5fc8c 100644
--- a/clouddb/Dockerfile
+++ b/clouddb/Dockerfile
@@ -21,7 +21,10 @@ RUN apt-get update && apt-get install -y \
     libpq-dev \
     icu-devtools \ 
     libicu-dev \
-    git \
+    git
+
+# Устанавливаем зависимости для сборки расширения и Cassandra драйвера
+RUN apt-get update && apt-get install -y \
     libpq-dev \
     libuv1-dev \
     libssl-dev \
@@ -30,7 +33,6 @@ RUN apt-get update && apt-get install -y \
 
 WORKDIR /usr/src
 
-# Сборка драйвера Cassandra
 COPY external/cassandra_driver /usr/src/cassandra_driver
 RUN cd /usr/src/cassandra_driver && \
     mkdir /usr/src/cassandra_driver/build && cd /usr/src/cassandra_driver/build && \
@@ -39,24 +41,6 @@ RUN cd /usr/src/cassandra_driver && \
     make install && \
     ldconfig
 
-# Сборка AWS SDK, зависимости для RocksDB-Cloud
-COPY external/aws /usr/src/aws_sdk
-RUN cd /usr/src/aws_sdk &&\
-    cmake -DCMAKE_BUILD_TYPE=Release '-DBUILD_ONLY=kinesis;core;s3;transfer' -S . -B build && cd build && \
-    make -j8 && \
-    make install && \
-    ldconfig
-
-COPY external/rocksdb /usr/src/rocksdb
-ENV USE_AWS=1
-ENV USE_RTTI=1
-ENV DISABLE_WARNING_AS_ERROR=1
-RUN cd /usr/src/rocksdb &&\
-    make -j8 static_lib &&\
-    ldconfig
-
-
-# Сборка постгреса
 COPY external/postgres /usr/src/postgres
 RUN /usr/src/postgres/configure --prefix=/usr/local/pgsql --without-icu --without-perl && \
     make -j8 && \
@@ -66,8 +50,6 @@ RUN useradd -m -U -r -d /home/postgres -s /bin/bash postgres && \
     mkdir -p /var/lib/postgresql && \
     chown -R postgres:postgres /var/lib/postgresql /home/postgres
 
-
-
 ##############################################
 # Stage 1: РЎР±РѕСЂРєР° CloudDB
 ##############################################
diff --git a/clouddb/external/aws b/clouddb/external/aws
deleted file mode 160000
index 00fb461a3ca..00000000000
--- a/clouddb/external/aws
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 00fb461a3cac85baf4a1ffc98fb4fc2f9cf3a1bd
diff --git a/clouddb/external/rocksdb b/clouddb/external/rocksdb
deleted file mode 160000
index 5d44ac66b33..00000000000
--- a/clouddb/external/rocksdb
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 5d44ac66b337b0dd79675d5761c7b6887c8c79a4
diff --git a/clouddb/src/clouddb/CMakeLists.txt b/clouddb/src/clouddb/CMakeLists.txt
index 61ef58193f7..0b11d0ba4f5 100644
--- a/clouddb/src/clouddb/CMakeLists.txt
+++ b/clouddb/src/clouddb/CMakeLists.txt
@@ -1,17 +1,156 @@
-file(GLOB_RECURSE src ./*.cpp ./*.c ./*.hpp ./*.h)
+
+set(USE_AWS 1) #(?)
+
+# Платформа (?)
+set(PLATFORM "OS_LINUX")
+
+# Флаги линковки для платформы (need)
+set(PLATFORM_LDFLAGS 
+    "-laws-cpp-sdk-s3"
+    "-laws-cpp-sdk-kinesis"
+    "-laws-cpp-sdk-core"
+    "-laws-cpp-sdk-transfer"
+    "-lpthread"
+    "-lrt"
+    "-ldl"
+    "-fPIC"
+    "-lsnappy"
+    "-lgflags"
+    "-lz"
+    "-lbz2"
+    "-llz4"
+    "-lzstd"
+    "-lnuma"
+    "-ltbb"
+    "-luring"
+    "-ldl"
+)
+
+# Флаги компиляции для платформы (?)
+set(PLATFORM_CCFLAGS 
+    "-DROCKSDB_PLATFORM_POSIX"
+    "-DROCKSDB_LIB_IO_POSIX"
+    "-DOS_LINUX"
+    "-fno-builtin-memcmp"
+    "-DROCKSDB_FALLOCATE_PRESENT"
+    "-DSNAPPY"
+    "-DGFLAGS=1"
+    "-DZLIB"
+    "-DBZIP2"
+    "-DLZ4"
+    "-DZSTD"
+    "-DNUMA"
+    "-DTBB"
+    "-DROCKSDB_MALLOC_USABLE_SIZE"
+    "-DROCKSDB_PTHREAD_ADAPTIVE_MUTEX"
+    "-DROCKSDB_BACKTRACE"
+    "-DROCKSDB_RANGESYNC_PRESENT"
+    "-DROCKSDB_SCHED_GETCPU_PRESENT"
+    "-DROCKSDB_AUXV_GETAUXVAL_PRESENT"
+    "-DROCKSDB_IOURING_PRESENT"
+    "-I/usr/local/include/"
+    "-DUSE_AWS"
+    "-march=native"
+    "-DHAVE_UINT128_EXTENSION"
+)
+
+set(PLATFORM_CXXFLAGS #(?)
+    "-std=c++17"  
+    "-faligned-new"
+    "-DHAVE_ALIGNED_NEW"
+    "-DROCKSDB_PLATFORM_POSIX"
+    "-DROCKSDB_LIB_IO_POSIX"
+    "-DOS_LINUX"
+    "-fno-builtin-memcmp"
+    "-DROCKSDB_FALLOCATE_PRESENT"
+    "-DSNAPPY"
+    "-DGFLAGS=1"
+    "-DZLIB"
+    "-DBZIP2"
+    "-DLZ4"
+    "-DZSTD"
+    "-DNUMA"
+    "-DTBB"
+    "-DROCKSDB_MALLOC_USABLE_SIZE"
+    "-DROCKSDB_PTHREAD_ADAPTIVE_MUTEX"
+    "-DROCKSDB_BACKTRACE"
+    "-DROCKSDB_RANGESYNC_PRESENT"
+    "-DROCKSDB_SCHED_GETCPU_PRESENT"
+    "-DROCKSDB_AUXV_GETAUXVAL_PRESENT"
+    "-DROCKSDB_IOURING_PRESENT"
+    "-I/usr/local/include/"
+    "-DUSE_AWS"
+    "-march=native"
+    "-DHAVE_UINT128_EXTENSION"
+)
+
+# Флаги для создания общих библиотек (?)
+set(PLATFORM_SHARED_CFLAGS "-fPIC")
+set(PLATFORM_SHARED_EXT "so")
+set(PLATFORM_SHARED_LDFLAGS "-Wl,--no-as-needed -shared -Wl,-soname -Wl,")
+set(PLATFORM_SHARED_VERSIONED true)
+
+# Флаги линковки для исполняемых файлов (?)
+set(EXEC_LDFLAGS "-ldl")
+
+# JEMALLOC (?)
+set(JEMALLOC_INCLUDE "")
+set(JEMALLOC_LIB "")
+set(JEMALLOC 1)
+set(WITH_JEMALLOC_FLAG 1)
+
+# Версии RocksDB (?)
+set(ROCKSDB_MAJOR 9)
+set(ROCKSDB_MINOR 1)
+set(ROCKSDB_PATCH 1)
+
+# Другие переменные (?)
+set(CLANG_SCAN_BUILD "scan-build")
+set(CLANG_ANALYZER "/usr/bin/clang++")
+set(PROFILING_FLAGS "-pg")
+set(FIND "find")
+set(WATCH "watch")
+set(FOLLY_PATH "")
+set(LUA_PATH "")
+
+set(target_source  facade/query_builder.cpp
+                   utils/utils.c
+                   facade/drivers/cassandra_driver/cassandra_driver.cpp
+                   facade/drivers/rocksdb_driver/rocksdb_driver.cpp
+                   facade/session.cpp
+                   facade/command/cassandra_command/cas_transaction_command.cpp
+                   facade/command/rocksdb_command/roc_transaction_command.cpp
+                   facade/command/command.cpp
+                   tam/src/ddl_func_tam.c
+                   tam/src/index_scan_tam.c
+                   tam/src/misc_func_tam.c
+                   tam/src/mod_tuple_tam.c
+                   tam/src/non_mod_tuple_tam.c
+                   tam/src/parallel_scan_tam.c
+                   tam/src/scan_func_tam.c
+                   tam/src/slot_func_tam.c
+                   tam/tam.c
+                   cpp.cpp
+                   hooks/src/hook.c
+                   clouddb.c)
 
 add_postgresql_extension(
   clouddb
   VERSION 1.0
-  SOURCES ${src}
+  SOURCES ${cpp_sources} ${c_sources}
   SCRIPTS clouddb--1.0.sql
   REGRESS basic
 )
 
-link_directories("/usr/local/lib/rocksdb-cloud/")
+link_directories("/home/user/rocksdb-cloud/")
 link_directories("/usr/local/pgsql/lib/")
-include_directories("/usr/local/lib/rocksdb-cloud/include/")
+include_directories("/home/user/rocksdb-cloud/include/")
+
+# Установка флагов компиляции
+target_compile_options(clouddb PRIVATE ${PLATFORM_CXXFLAGS} ${PLATFORM_CCFLAGS})
 
+# Установка флагов линковки
+target_link_libraries(clouddb PRIVATE rocksdb cassandra ${PLATFORM_LDFLAGS})
 
 
-target_link_libraries(clouddb PRIVATE rocksdb cassandra pq)
+target_link_libraries(clouddb cassandra pq)
diff --git a/clouddb/src/clouddb/clouddb.c b/clouddb/src/clouddb/clouddb.c
index a9f12134724..068a66aa78c 100644
--- a/clouddb/src/clouddb/clouddb.c
+++ b/clouddb/src/clouddb/clouddb.c
@@ -5,9 +5,12 @@
 #include <lib/stringinfo.h>
 #include <libpq/pqformat.h>
 
+#include "cpp.h"
 #include "hooks/include/hook.h"
 
 PG_MODULE_MAGIC;
 void _PG_init() {
+
+
   hook_init();
 }
diff --git a/clouddb/src/clouddb/clouddb.h b/clouddb/src/clouddb/clouddb.h
index 0ccb750d0e1..3cf9335ac16 100644
--- a/clouddb/src/clouddb/clouddb.h
+++ b/clouddb/src/clouddb/clouddb.h
@@ -3,4 +3,8 @@
 
 #include <postgres.h>
 
-#endif
+typedef struct Quaternion {
+  double a, b, c, d;
+} Quaternion;
+
+#endif  // SAMPLES_QUARTERNION_H_
diff --git a/clouddb/src/clouddb/cpp.cpp b/clouddb/src/clouddb/cpp.cpp
new file mode 100644
index 00000000000..37703b5295e
--- /dev/null
+++ b/clouddb/src/clouddb/cpp.cpp
@@ -0,0 +1,43 @@
+#include "cpp.h"
+
+#include <algorithm>
+#include <iostream>
+#include <vector>
+
+int some::getA() { return this->a; }
+int some::getB() { return this->b; }
+
+char *some::getMessa() { return this->messa; }
+
+EXPORT_C some *create_class(some *some2) {
+  some some1;
+  // std::cout << ((struct some_copy *)(some2))->message << "\n";
+  some2 = &some1;
+  return some2;
+}
+
+EXPORT_C int result() {
+  std::vector<int> vec = {5, 3, 8, 1, 2};
+  std::sort(vec.begin(), vec.end());
+  return vec[0];
+}
+
+EXPORT_C char *getMessa(some *some1) { return some1->getMessa(); }
+
+EXPORT_C int getAvalue() {
+  some somer;
+  return somer.a;
+}
+
+EXPORT_C int getAwhichFunc() {
+  some somer;
+  return somer.getA();
+}
+
+EXPORT_C int setAndGetA(int k) {
+  some somer;
+  somer.setA(k);
+  return somer.getA();
+}
+
+EXPORT_C int getInClass(some *some1) { return some1->getB(); }
diff --git a/clouddb/src/clouddb/cpp.h b/clouddb/src/clouddb/cpp.h
new file mode 100644
index 00000000000..5e0d0c7de38
--- /dev/null
+++ b/clouddb/src/clouddb/cpp.h
@@ -0,0 +1,53 @@
+#ifndef CPP_H
+#define CPP_H
+
+#include "utils/c_export.h"
+
+#ifdef __cplusplus
+#include <iostream>
+
+class some {
+private:
+  char *messa;
+  int b;
+
+public:
+  char *getMessa();
+  int getB();
+  some(){};
+  some(char *m) : messa(m){};
+  int a = 5;
+  int getA();
+  int setA(int i) {
+    a = i;
+    return a;
+  }
+  ~some() { std::cout << "adios amigos" << "\n"; }
+};
+
+struct some_copy {
+  int message;
+};
+
+#else
+typedef struct some1 {
+  int message;
+} some;
+
+#endif // class
+
+EXPORT_C int getInClass(some *some1);
+
+EXPORT_C char *getMessa(some *some1);
+
+EXPORT_C some *create_class(some *some2);
+
+EXPORT_C int result();
+
+EXPORT_C int getAvalue();
+
+EXPORT_C int getAwhichFunc();
+
+EXPORT_C int setAndGetA(int k);
+
+#endif
diff --git a/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.h b/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.h
index 730be9dd8d2..5c150f57090 100644
--- a/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.h
+++ b/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.h
@@ -16,27 +16,31 @@ extern "C" {
 
 #ifdef __cplusplus
 
-#include <bits/std_thread.h>
-#include <rocksdb/cloud/db_cloud.h>
-#include <rocksdb/db.h>
-#include <rocksdb/iterator.h>
-#include <rocksdb/listener.h>
-#include <rocksdb/options.h>
-#include <rocksdb/slice.h>
-#include <sstream>
 #include <string>
 #include <unordered_map>
+#include <sstream>
 
 #include "../../../utils/utils.h"
 #include "../../utils/metadata.h"
 
-class RocksDBDriver : public IDriver {
- private:
+#include <rocksdb/listener.h>
+#include <rocksdb/options.h>
+#include <rocksdb/db.h>
+#include <rocksdb/slice.h>
+#include <rocksdb/iterator.h>
+
+#include <bits/std_thread.h>
+
+#include <rocksdb/cloud/db_cloud.h>
+#include <rocksdb/options.h>
+
+
+class RocksDBDriver: public IDriver {
+private:
   ROCKSDB_NAMESPACE::DBCloud* db;
-  std::unordered_map<std::string, ROCKSDB_NAMESPACE::ColumnFamilyHandle*>
-      columnFamilies;
+  std::unordered_map<std::string, ROCKSDB_NAMESPACE::ColumnFamilyHandle*> columnFamilies;
 
-  // require live for correct work
+  //require live for correct work
   std::unordered_map<std::string, ItemPointerData> mapPointers;
   ROCKSDB_NAMESPACE::WriteOptions wopt;
   std::shared_ptr<ROCKSDB_NAMESPACE::FileSystem> cloud_fs;
@@ -44,28 +48,24 @@ class RocksDBDriver : public IDriver {
   std::unique_ptr<ROCKSDB_NAMESPACE::Env> cloud_env;
   ROCKSDB_NAMESPACE::CloudFileSystemOptions cloud_fs_options;
   ROCKSDB_NAMESPACE::CloudFileSystem* cfs;
-
- public:
+public:
   ~RocksDBDriver() = default;
   RocksDBDriver(std::unordered_map<std::string, std::string> config);
 
   void createTable(std::string tableName);
 
-  void insertData(std::string tableName, std::vector<std::string> fieldName,
-                  std::vector<std::string> fieldData, std::vector<size_t> sizes,
-                  ItemPointerData pointer);
+  void insertData(std::string tableName, std::vector<std::string> fieldName, std::vector<std::string> fieldData, std::vector<size_t> sizes, ItemPointerData pointer) ;
 
   void beginScan(Relation relation, Snapshot snapshot, int nkeys,
-                 struct ScanKeyData* key, ParallelTableScanDesc parallel_scan,
-                 uint32 flags, TransactionId id) {
-    return;
-  };
+                         struct ScanKeyData* key,
+                         ParallelTableScanDesc parallel_scan, uint32 flags,
+                         TransactionId id) { return; };
   int selectData(Snapshot snapshot) { return 0; };
   char** getValue() { return 0; };
   ItemPointerData getTid() { return ItemPointerData(); };
 
   ItemPointerData getNewPointer(std::string tableName);
-  ItemPointerData getLastPointer(const std::string& tableName);
+  ItemPointerData getLastPointer(const std::string &tableName);
 
   void startFlushThread();
   void stopFlushThread();
@@ -73,4 +73,5 @@ class RocksDBDriver : public IDriver {
 
 #endif
 
-#endif
+
+#endif
\ No newline at end of file
diff --git a/clouddb/src/clouddb/utils/utils.c b/clouddb/src/clouddb/utils/utils.c
index d0a478e6c31..b4d4f54c321 100644
--- a/clouddb/src/clouddb/utils/utils.c
+++ b/clouddb/src/clouddb/utils/utils.c
@@ -1,4 +1,5 @@
 #include "utils.h"
+#include "../facade/session.h"
 
 uint32 get_event_horizont_xmin() {
   uint32 xmin = 0;
diff --git a/test/main.py b/test/main.py
deleted file mode 100644
index b78b993ce23..00000000000
--- a/test/main.py
+++ /dev/null
@@ -1,51 +0,0 @@
-import psycopg2
-
-# Настройки подключения
-DB_HOST = "localhost"  # Имя сервиса в Docker-Compose или 127.0.0.1, если порт проброшен
-DB_PORT = "5432"       # Порт PostgreSQL (по умолчанию 5432)
-DB_NAME = "postgres"   # Имя БД (по умолчанию postgres)
-DB_USER = "postgres"   # Имя пользователя
-DB_PASS = "db"  # Пароль (замени на свой)
-
-# Подключение к PostgreSQL
-try:
-    conn = psycopg2.connect(
-        host=DB_HOST,
-        port=DB_PORT,
-        dbname=DB_NAME,
-        user=DB_USER,
-        password=DB_PASS
-    )
-    conn.autocommit = True
-    cursor = conn.cursor()
-
-    # Создаём расширение
-    print("Создаём расширение clouddb...")
-    cursor.execute("CREATE EXTENSION IF NOT EXISTS clouddb;")
-
-    # Создаём таблицу
-    print("Создаём таблицу mytable...")
-    cursor.execute("DROP TABLE IF EXISTS mytable;")
-    cursor.execute("CREATE TABLE mytable (title text, content text) USING clouddb;")
-
-    # Вставляем тестовые данные
-    print("Добавляем тестовые данные...")
-    cursor.execute("INSERT INTO mytable (title, content) VALUES ('Hello', 'This is a test entry');")
-    cursor.execute("INSERT INTO mytable (title, content) VALUES ('PostgreSQL', 'Running in Docker!');")
-
-    # Выполняем тестовый запрос
-    print("Выполняем SELECT * FROM mytable:")
-    cursor.execute("SELECT * FROM mytable;")
-    rows = cursor.fetchall()
-
-    for row in rows:
-        print(row)
-
-    # Закрываем соединение
-    cursor.close()
-    conn.close()
-    print("✅ Тест завершён успешно!")
-
-except Exception as e:
-    print(f"Ошибка: {e}")
-
-- 
GitLab


From 89f4b4a5a32a4a9310b5c889b318cd503cff8b17 Mon Sep 17 00:00:00 2001
From: Snezhana Zhuiko <zhuikosnezhana@gmail.com>
Date: Mon, 10 Mar 2025 16:38:18 +0700
Subject: [PATCH 5/5] Revert "Merge branch 'rocksdb' into 'cpp'"

This reverts commit fe45a123b2c84103e56d6835587d989def483cbd, reversing
changes made to 6ccd3e556afd4ffe3bad57a39e9e628d860a38d5.
---
 clouddb/CMakeLists.txt                        |   4 +-
 clouddb/src/clouddb/CMakeLists.txt            | 167 +++------------
 clouddb/src/clouddb/clouddb.c                 |   6 +-
 .../cas_transaction_command.cpp               |  10 +-
 .../src/clouddb/facade/command/command.cpp    |  11 +-
 clouddb/src/clouddb/facade/command/command.h  |   2 -
 .../roc_transaction_command.cpp               | 150 -------------
 .../rocksdb_command/roc_transaction_command.h |  89 --------
 .../cassandra_driver/cassandra_driver.cpp     | 121 ++++-------
 .../drivers/rocksdb_driver/rocksdb_driver.cpp | 200 ------------------
 .../drivers/rocksdb_driver/rocksdb_driver.h   |  77 -------
 clouddb/src/clouddb/facade/query_builder.cpp  |   2 +
 clouddb/src/clouddb/facade/session.cpp        |   2 -
 clouddb/src/clouddb/facade/session.h          |   6 +-
 clouddb/src/clouddb/tam/all_tam.h             | 109 +++++++++-
 clouddb/src/clouddb/tam/src/mod_tuple_tam.c   |   6 -
 clouddb/src/clouddb/tam/src/scan_func_tam.c   |   4 -
 clouddb/src/clouddb/tam/tam.c                 |  19 +-
 18 files changed, 205 insertions(+), 780 deletions(-)
 delete mode 100644 clouddb/src/clouddb/facade/command/rocksdb_command/roc_transaction_command.cpp
 delete mode 100644 clouddb/src/clouddb/facade/command/rocksdb_command/roc_transaction_command.h
 delete mode 100644 clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.cpp
 delete mode 100644 clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.h

diff --git a/clouddb/CMakeLists.txt b/clouddb/CMakeLists.txt
index ed3ddfec540..2d4742869cb 100644
--- a/clouddb/CMakeLists.txt
+++ b/clouddb/CMakeLists.txt
@@ -5,9 +5,7 @@ list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
 
 find_package(PostgreSQL REQUIRED)
 
-# set(CMAKE_BUILD_TYPE Debug)
-
-set(CMAKE_CXX_STANDARD 17)
+set(CMAKE_CXX_STANDARD 14)
 
 include_directories(${PostgreSQL_INCLUDE_DIRS}
                     ${PostgreSQL_SERVER_INCLUDE_DIRS})
diff --git a/clouddb/src/clouddb/CMakeLists.txt b/clouddb/src/clouddb/CMakeLists.txt
index 0b11d0ba4f5..a92292c4226 100644
--- a/clouddb/src/clouddb/CMakeLists.txt
+++ b/clouddb/src/clouddb/CMakeLists.txt
@@ -1,139 +1,31 @@
-
-set(USE_AWS 1) #(?)
-
-# Платформа (?)
-set(PLATFORM "OS_LINUX")
-
-# Флаги линковки для платформы (need)
-set(PLATFORM_LDFLAGS 
-    "-laws-cpp-sdk-s3"
-    "-laws-cpp-sdk-kinesis"
-    "-laws-cpp-sdk-core"
-    "-laws-cpp-sdk-transfer"
-    "-lpthread"
-    "-lrt"
-    "-ldl"
-    "-fPIC"
-    "-lsnappy"
-    "-lgflags"
-    "-lz"
-    "-lbz2"
-    "-llz4"
-    "-lzstd"
-    "-lnuma"
-    "-ltbb"
-    "-luring"
-    "-ldl"
+set(cpp_sources
+    facade/query_builder.cpp
+    facade/drivers/cassandra_driver/cassandra_driver.cpp
+    facade/session.cpp
+    facade/command/cassandra_command/cas_transaction_command.cpp
+    facade/command/command.cpp
+    facade/utils/utils.cpp
+    cpp.cpp
 )
 
-# Флаги компиляции для платформы (?)
-set(PLATFORM_CCFLAGS 
-    "-DROCKSDB_PLATFORM_POSIX"
-    "-DROCKSDB_LIB_IO_POSIX"
-    "-DOS_LINUX"
-    "-fno-builtin-memcmp"
-    "-DROCKSDB_FALLOCATE_PRESENT"
-    "-DSNAPPY"
-    "-DGFLAGS=1"
-    "-DZLIB"
-    "-DBZIP2"
-    "-DLZ4"
-    "-DZSTD"
-    "-DNUMA"
-    "-DTBB"
-    "-DROCKSDB_MALLOC_USABLE_SIZE"
-    "-DROCKSDB_PTHREAD_ADAPTIVE_MUTEX"
-    "-DROCKSDB_BACKTRACE"
-    "-DROCKSDB_RANGESYNC_PRESENT"
-    "-DROCKSDB_SCHED_GETCPU_PRESENT"
-    "-DROCKSDB_AUXV_GETAUXVAL_PRESENT"
-    "-DROCKSDB_IOURING_PRESENT"
-    "-I/usr/local/include/"
-    "-DUSE_AWS"
-    "-march=native"
-    "-DHAVE_UINT128_EXTENSION"
+set(c_sources
+    utils/utils.c
+    tam/src/ddl_func_tam.c
+    tam/src/index_scan_tam.c
+    tam/src/misc_func_tam.c
+    tam/src/mod_tuple_tam.c
+    tam/src/non_mod_tuple_tam.c
+    tam/src/parallel_scan_tam.c
+    tam/src/scan_func_tam.c
+    tam/src/slot_func_tam.c
+    tam/tam.c
+    iam/iam.c
+    iam/src/scan_func_iam.c
+    iam/src/mod_func_iam.c
+    hooks/src/hook.c
+    clouddb.c
 )
 
-set(PLATFORM_CXXFLAGS #(?)
-    "-std=c++17"  
-    "-faligned-new"
-    "-DHAVE_ALIGNED_NEW"
-    "-DROCKSDB_PLATFORM_POSIX"
-    "-DROCKSDB_LIB_IO_POSIX"
-    "-DOS_LINUX"
-    "-fno-builtin-memcmp"
-    "-DROCKSDB_FALLOCATE_PRESENT"
-    "-DSNAPPY"
-    "-DGFLAGS=1"
-    "-DZLIB"
-    "-DBZIP2"
-    "-DLZ4"
-    "-DZSTD"
-    "-DNUMA"
-    "-DTBB"
-    "-DROCKSDB_MALLOC_USABLE_SIZE"
-    "-DROCKSDB_PTHREAD_ADAPTIVE_MUTEX"
-    "-DROCKSDB_BACKTRACE"
-    "-DROCKSDB_RANGESYNC_PRESENT"
-    "-DROCKSDB_SCHED_GETCPU_PRESENT"
-    "-DROCKSDB_AUXV_GETAUXVAL_PRESENT"
-    "-DROCKSDB_IOURING_PRESENT"
-    "-I/usr/local/include/"
-    "-DUSE_AWS"
-    "-march=native"
-    "-DHAVE_UINT128_EXTENSION"
-)
-
-# Флаги для создания общих библиотек (?)
-set(PLATFORM_SHARED_CFLAGS "-fPIC")
-set(PLATFORM_SHARED_EXT "so")
-set(PLATFORM_SHARED_LDFLAGS "-Wl,--no-as-needed -shared -Wl,-soname -Wl,")
-set(PLATFORM_SHARED_VERSIONED true)
-
-# Флаги линковки для исполняемых файлов (?)
-set(EXEC_LDFLAGS "-ldl")
-
-# JEMALLOC (?)
-set(JEMALLOC_INCLUDE "")
-set(JEMALLOC_LIB "")
-set(JEMALLOC 1)
-set(WITH_JEMALLOC_FLAG 1)
-
-# Версии RocksDB (?)
-set(ROCKSDB_MAJOR 9)
-set(ROCKSDB_MINOR 1)
-set(ROCKSDB_PATCH 1)
-
-# Другие переменные (?)
-set(CLANG_SCAN_BUILD "scan-build")
-set(CLANG_ANALYZER "/usr/bin/clang++")
-set(PROFILING_FLAGS "-pg")
-set(FIND "find")
-set(WATCH "watch")
-set(FOLLY_PATH "")
-set(LUA_PATH "")
-
-set(target_source  facade/query_builder.cpp
-                   utils/utils.c
-                   facade/drivers/cassandra_driver/cassandra_driver.cpp
-                   facade/drivers/rocksdb_driver/rocksdb_driver.cpp
-                   facade/session.cpp
-                   facade/command/cassandra_command/cas_transaction_command.cpp
-                   facade/command/rocksdb_command/roc_transaction_command.cpp
-                   facade/command/command.cpp
-                   tam/src/ddl_func_tam.c
-                   tam/src/index_scan_tam.c
-                   tam/src/misc_func_tam.c
-                   tam/src/mod_tuple_tam.c
-                   tam/src/non_mod_tuple_tam.c
-                   tam/src/parallel_scan_tam.c
-                   tam/src/scan_func_tam.c
-                   tam/src/slot_func_tam.c
-                   tam/tam.c
-                   cpp.cpp
-                   hooks/src/hook.c
-                   clouddb.c)
-
 add_postgresql_extension(
   clouddb
   VERSION 1.0
@@ -142,15 +34,6 @@ add_postgresql_extension(
   REGRESS basic
 )
 
-link_directories("/home/user/rocksdb-cloud/")
 link_directories("/usr/local/pgsql/lib/")
-include_directories("/home/user/rocksdb-cloud/include/")
-
-# Установка флагов компиляции
-target_compile_options(clouddb PRIVATE ${PLATFORM_CXXFLAGS} ${PLATFORM_CCFLAGS})
-
-# Установка флагов линковки
-target_link_libraries(clouddb PRIVATE rocksdb cassandra ${PLATFORM_LDFLAGS})
-
 
-target_link_libraries(clouddb cassandra pq)
+target_link_libraries(clouddb cassandra pq)
\ No newline at end of file
diff --git a/clouddb/src/clouddb/clouddb.c b/clouddb/src/clouddb/clouddb.c
index 068a66aa78c..e0627b75b50 100644
--- a/clouddb/src/clouddb/clouddb.c
+++ b/clouddb/src/clouddb/clouddb.c
@@ -9,8 +9,12 @@
 #include "hooks/include/hook.h"
 
 PG_MODULE_MAGIC;
-void _PG_init() {
 
+void _PG_init() {
+  char *m = "hello";
+  some *some2 = &(some){.message = 6};
+  some2 = create_class(some2);
+  // printf("%d\n", getInClass(some2));
 
   hook_init();
 }
diff --git a/clouddb/src/clouddb/facade/command/cassandra_command/cas_transaction_command.cpp b/clouddb/src/clouddb/facade/command/cassandra_command/cas_transaction_command.cpp
index b7f9726559a..a5e3aee27ec 100644
--- a/clouddb/src/clouddb/facade/command/cassandra_command/cas_transaction_command.cpp
+++ b/clouddb/src/clouddb/facade/command/cassandra_command/cas_transaction_command.cpp
@@ -148,8 +148,6 @@ ITransactionCommand *CasTransactionCommand::createInsertCommand(
       (char **)malloc(sizeof(char *) * RelationGetNumberOfAttributes(relation));
   int *fieldSize =
       (int *)malloc(sizeof(int) * RelationGetNumberOfAttributes(relation));
-  // std::cout << "size: " << RelationGetNumberOfAttributes(relation) <<
-  // std::endl;
 
   TupleDesc desc = slot->tts_tupleDescriptor;
   for (int i = 0; i < desc->natts; i++) {
@@ -172,7 +170,6 @@ ITransactionCommand *CasTransactionCommand::createInsertCommand(
   this->operation = INSERT_VALUE;
 
   this->tableName = RelationGetRelationName(relation);
-  // std::cout << this->tableName << " tableName" << std::endl;
   this->fieldData =
       convertToVector(fieldData, RelationGetNumberOfAttributes(relation));
   free(fieldData);
@@ -184,10 +181,9 @@ ITransactionCommand *CasTransactionCommand::createInsertCommand(
     this->fieldName.push_back(strdup(NameStr(attr->attname)));
   }
 
+  auto driver = std::static_pointer_cast<CassandraDriver>(session->getDriver());
   slot->tts_tid = driver->getNewPointer(
       std::string(RelationGetRelationName(relation)), driver->getKeyspace());
-  // std::cout << slot->tts_tid.ip_blkid.bi_hi << slot->tts_tid.ip_blkid.bi_lo
-  //           << slot->tts_tid.ip_posid << std::endl;
 
   this->metadata.xmin = GetCurrentTransactionId();
   this->metadata.xmin_commited = true;
@@ -353,8 +349,6 @@ ITransactionCommand *CasTransactionCommand::createUpdateSlotCommand(
       (char **)malloc(sizeof(char *) * RelationGetNumberOfAttributes(relation));
   int *fieldSize =
       (int *)malloc(sizeof(int) * RelationGetNumberOfAttributes(relation));
-  // std::cout << "size: " << RelationGetNumberOfAttributes(relation) <<
-  // std::endl;
 
   TupleDesc desc = slot->tts_tupleDescriptor;
   for (int i = 0; i < desc->natts; i++) {
@@ -425,4 +419,4 @@ ITransactionCommand *CasTransactionCommand::createTruncateTable(
   this->operation = TRUNCATE_TABLE;
   this->tableName = std::string(relName);
   return this;
-}
+}
\ No newline at end of file
diff --git a/clouddb/src/clouddb/facade/command/command.cpp b/clouddb/src/clouddb/facade/command/command.cpp
index aa05b91fbf4..4f2a1095e94 100644
--- a/clouddb/src/clouddb/facade/command/command.cpp
+++ b/clouddb/src/clouddb/facade/command/command.cpp
@@ -5,11 +5,10 @@ ITransactionCommand *createTransactionCommand(std::shared_ptr<IDriver> driver) {
     return new CasTransactionCommand(
         std::dynamic_pointer_cast<CassandraDriver>(driver));
   }
-  else if (std::dynamic_pointer_cast<RocksDBDriver>(driver)) {
-    return new RocTransactionCommand(
-        std::dynamic_pointer_cast<RocksDBDriver>(driver));
-  }
-
+  // else if (std::dynamic_pointer_cast<YDBDriver>(driver)) {
+  //   return YDBTransactionCommand(
+  //       std::dynamic_pointer_cast<YDBDriver>(driver));
+  // }
   return nullptr;
 }
 
@@ -117,4 +116,4 @@ EXPORT_C ITransactionCommand *update_tuple_to_index(Session *session, TupleTable
   ITransactionCommand *command = createTransactionCommand(session->getDriver());
   command = command->update_tuple_to_index(session, slot, indexInfo, indexRelation, heapRelation);
   return command;  
-}
+}
\ No newline at end of file
diff --git a/clouddb/src/clouddb/facade/command/command.h b/clouddb/src/clouddb/facade/command/command.h
index 6b696365181..4e9a8d2c28c 100644
--- a/clouddb/src/clouddb/facade/command/command.h
+++ b/clouddb/src/clouddb/facade/command/command.h
@@ -5,8 +5,6 @@
 
 // команды каждого драйвера
 #include "cassandra_command/cas_transaction_command.h"
-#include "rocksdb_command/roc_transaction_command.h"
-
 
 #ifdef __cplusplus
 
diff --git a/clouddb/src/clouddb/facade/command/rocksdb_command/roc_transaction_command.cpp b/clouddb/src/clouddb/facade/command/rocksdb_command/roc_transaction_command.cpp
deleted file mode 100644
index fdcfe28b5bc..00000000000
--- a/clouddb/src/clouddb/facade/command/rocksdb_command/roc_transaction_command.cpp
+++ /dev/null
@@ -1,150 +0,0 @@
-#include "roc_transaction_command.h"
-#include <iostream>
-
-namespace {
-std::vector<std::string> convertToVector(char **charArray, int size) {
-  std::vector<std::string> result;
-  if (charArray == nullptr) {
-    return result;  // Если входной указатель null, возвращаем пустой вектор
-  }
-
-  // Перебираем каждый элемент массива charArray
-  for (size_t i = 0; i < size; ++i) {
-    if (charArray[i] != nullptr) {
-      result.emplace_back(charArray[i]);  // Добавляем строку в вектор
-    } else {
-      result.emplace_back("");  // Добавляем пустую строку для nullptr
-    }
-  }
-  return result;
-}
-
-std::vector<size_t> convertToVector(int *intArray, int size) {
-  std::vector<size_t> result;
-  for (int i = 0; i < size; i++) {
-    result.push_back(intArray[i]);
-  }
-  return result;
-}
-}  // namespace
-
-
-int RocTransactionCommand::execute() {
-    if (this->operation == RCREATE_TABLE) {
-      driver->createTable(tableName);
-    }else if(this->operation == RINSERT_VALUE) {
-      driver->insertData(tableName, fieldName, fieldData, fieldSize, pointer);
-    }
-  return 0;
-}
-
-RocTransactionCommand::RocTransactionCommand(std::shared_ptr<RocksDBDriver> driver) {
-  this->driver = std::dynamic_pointer_cast<RocksDBDriver>(driver);
-}
-
-ITransactionCommand *RocTransactionCommand::createCreateTableCommand(
-    Session *session, Relation rel) {
-  this->operation = RCREATE_TABLE;
-
-  // забавно, но здесь нет ни одной функции, а следовательно они безопасны для
-  // c++
-  this->tableName = std::string(RelationGetRelationName(rel));
-  for (int i = 0; i < RelationGetNumberOfAttributes(rel); i++) {
-    Form_pg_attribute attr = TupleDescAttr(rel->rd_att, i);
-    this->fieldName.push_back(strdup(NameStr(attr->attname)));
-  }
-  return this;
-}
-
-ITransactionCommand *RocTransactionCommand::createInsertCommand(
-    Session *session, Relation relation, TupleTableSlot *slot, CommandId cid,
-    int options, BulkInsertState bistate) {
-  char **fieldData =
-      (char **)malloc(sizeof(char *) * RelationGetNumberOfAttributes(relation));
-  int *fieldSize =
-      (int *)malloc(sizeof(int) * RelationGetNumberOfAttributes(relation));
-
-  TupleDesc desc = slot->tts_tupleDescriptor;
-  for (int i = 0; i < desc->natts; i++) {
-    if (slot->tts_isnull[i]) {
-      fieldData[i] = NULL;
-      fieldSize[i] = -1;
-      continue;
-    }
-    Oid outFunc;
-    bool typIsVarlena;
-    Form_pg_attribute attr = TupleDescAttr(desc, i);
-    getTypeOutputInfo(attr->atttypid, &outFunc, &typIsVarlena);
-    fieldData[i] = OidOutputFunctionCall(outFunc, slot->tts_values[i]);
-    fieldSize[i] = strlen(fieldData[i]);
-  }
-
-  this->operation = RINSERT_VALUE;
-
-  this->tableName = RelationGetRelationName(relation);
-  this->fieldData =
-      convertToVector(fieldData, RelationGetNumberOfAttributes(relation));
-  free(fieldData);
-  this->fieldSize =
-      convertToVector(fieldSize, RelationGetNumberOfAttributes(relation));
-  free(fieldSize);
-  for (int i = 0; i < RelationGetNumberOfAttributes(relation); i++) {
-    Form_pg_attribute attr = TupleDescAttr(relation->rd_att, i);
-    this->fieldName.push_back(strdup(NameStr(attr->attname)));
-  }
-
-  slot->tts_tid = driver->getNewPointer(
-      std::string(RelationGetRelationName(relation)));
-  pointer = slot->tts_tid;
-  return this;
-}
-
-ITransactionCommand *RocTransactionCommand::beginScanCommand(
-    Session *session, Relation relation, Snapshot snapshot, int nkeys,
-    struct ScanKeyData *key, ParallelTableScanDesc parallel_scan, uint32 flags,
-    TransactionId id) {
-
-  return this;
-}
-
-ITransactionCommand *RocTransactionCommand::selectDataCommand(
-    Session *session, Snapshot snapshot) {
-
-  return this;
-}
-
-ITransactionCommand *RocTransactionCommand::createDeleteSlotCommand(
-    Session *session, TransactionId id, ItemPointer newtid, Relation relation,
-    ItemPointer tid, CommandId cid, Snapshot snapshot, Snapshot crosscheck,
-    bool wait, TM_FailureData *tmfd, bool changingPart) {
-
-  return this;
-}
-
-ITransactionCommand *RocTransactionCommand::createUpdateSlotCommand(
-    Session *session, TransactionId id, Relation relation, ItemPointer otid,
-    TupleTableSlot *slot, CommandId cid, Snapshot snapshot, Snapshot crosscheck,
-    bool wait, TM_FailureData *tmfd, LockTupleMode *lockmode,
-    TU_UpdateIndexes *update_indexes) {
-
-  return this;
-}
-
-ITransactionCommand *RocTransactionCommand::createVacuumCommand(
-    Session *session, TransactionId id, Relation rel, VacuumParams *params,
-    BufferAccessStrategy bstrategy) {
-
-  return this;
-}
-
-ITransactionCommand *RocTransactionCommand::createDropTable(Session *session,
-                                                            char *relName) {
-
-  return this;
-}
-
-ITransactionCommand *RocTransactionCommand::createTruncateTable(
-    Session *session, char *relName) {
-
-  return this;
-}
diff --git a/clouddb/src/clouddb/facade/command/rocksdb_command/roc_transaction_command.h b/clouddb/src/clouddb/facade/command/rocksdb_command/roc_transaction_command.h
deleted file mode 100644
index 9ea6c2c3fd0..00000000000
--- a/clouddb/src/clouddb/facade/command/rocksdb_command/roc_transaction_command.h
+++ /dev/null
@@ -1,89 +0,0 @@
-#ifndef ROC_TRANSACTION_COMMAND_H
-#define ROC_TRANSACTION_COMMAND_H
-
-#include "../../query_builder.h"
-#include "../itransaction_command.h"
-
-#ifdef __cplusplus
-#include <vector>
-
-#include "../../utils/metadata.h"
-
-enum RocTransactionOperation {
-  RCREATE_TABLE,
-  RINSERT_VALUE,
-  RBEGIN_SCAN,
-  RSELECT_DATA,
-  RDELETE_SLOT,
-  RUPDATE_SLOT,
-  RVACUUM_TABLE,
-  RTRUNCATE_TABLE,
-  RDROP_TABLE
-};
-
-class RocTransactionCommand : public ITransactionCommand {
- private:
-   std::string tableName;
-  std::vector<std::string> fieldName;
-  std::vector<std::string> fieldData;
-  std::vector<size_t> fieldSize;
-//   RocksDBBuilder builder;
-  RocTransactionOperation operation;
-  ItemPointerData pointer;
-  Metadata metadata;
-
-  // scan data
-  Relation relation;
-  Snapshot snapshot;
-  int nkeys;
-  struct ScanKeyData *key;
-  ParallelTableScanDesc parallel_scan;
-  uint32 flags;
-  TransactionId id;
-
-  std::shared_ptr<RocksDBDriver> driver;
-
- public:
-  RocTransactionCommand() {};
-  RocTransactionCommand(std::shared_ptr<RocksDBDriver> driver);
-  int execute() override;
-  ITransactionCommand *createCreateTableCommand(Session *session,
-                                                Relation rel) override;
-  ITransactionCommand *createInsertCommand(Session *session, Relation relation,
-                                           TupleTableSlot *slot, CommandId cid,
-                                           int options,
-                                           BulkInsertState bistate) override;
-  ITransactionCommand *beginScanCommand(Session *session, Relation relation,
-                                        Snapshot snapshot, int nkeys,
-                                        struct ScanKeyData *key,
-                                        ParallelTableScanDesc parallel_scan,
-                                        uint32 flags,
-                                        TransactionId id) override;
-  ITransactionCommand *selectDataCommand(Session *session,
-                                         Snapshot snapshot) override;
-
-  ITransactionCommand *createDeleteSlotCommand(
-      Session *session, TransactionId id, ItemPointer newtid, Relation relation,
-      ItemPointer tid, CommandId cid, Snapshot snapshot, Snapshot crosscheck,
-      bool wait, TM_FailureData *tmfd, bool changingPart) override;
-
-  ITransactionCommand *createUpdateSlotCommand(
-      Session *session, TransactionId id, Relation relation, ItemPointer otid,
-      TupleTableSlot *slot, CommandId cid, Snapshot snapshot,
-      Snapshot crosscheck, bool wait, TM_FailureData *tmfd,
-      LockTupleMode *lockmode, TU_UpdateIndexes *update_indexes) override;
-
-  ITransactionCommand *createVacuumCommand(
-      Session *session, TransactionId id, Relation rel, VacuumParams *params,
-      BufferAccessStrategy bstrategy) override;
-
-  ITransactionCommand *createDropTable(Session *session,
-                                       char *relName) override;
-
-  ITransactionCommand *createTruncateTable(Session *session,
-                                           char *relName) override;
-};
-
-#endif  // !__cplusplus
-
-#endif  // !CAS_TRANSACTION_COMMAND_H
diff --git a/clouddb/src/clouddb/facade/drivers/cassandra_driver/cassandra_driver.cpp b/clouddb/src/clouddb/facade/drivers/cassandra_driver/cassandra_driver.cpp
index a705bc3dfc1..acfbbc26379 100644
--- a/clouddb/src/clouddb/facade/drivers/cassandra_driver/cassandra_driver.cpp
+++ b/clouddb/src/clouddb/facade/drivers/cassandra_driver/cassandra_driver.cpp
@@ -5,7 +5,6 @@
 #include <storage/itemptr.h>
 
 #include <cassandra.h>
-#include <chrono>
 #include <cstring>
 #include <iostream>
 #include <unordered_map>
@@ -125,12 +124,11 @@ CassandraDriver::CassandraDriver(
     : mapPointers() {
   builder = CassandraBuilder();
 
-  this->hostname = config["cassandra.host"];
-  this->keyspace = config["cassandra.keyspace"];
-  this->replicationFactor =
-      std::atoi(config["cassandra.replication_factor"].c_str());
-  // std::cout << this->hostname << " " << this->keyspace << " "
-  //           << this->replicationFactor << std::endl;
+  hostname = config["cassandra.host"];
+  keyspace = config["cassandra.keyspace"];
+  replicationFactor = std::atoi(config["cassandra.replication_factor"].c_str());
+  std::cout << this->hostname << " " << this->keyspace << " "
+            << this->replicationFactor << '\n';
 
   clusterPtr = cass_cluster_new();
   cass_cluster_set_contact_points(clusterPtr, hostname.data());
@@ -153,7 +151,6 @@ CassandraDriver::CassandraDriver(
 
   std::string query =
       this->builder.buildKeyspace(this->keyspace, this->replicationFactor);
-  // std::cout << query << std::endl;
   execCqlQuery(query);
 }
 
@@ -181,14 +178,9 @@ void CassandraDriver::execCqlQuery(std::string query, Metadata metadata,
                                    int var) {
   CassError rc = CASS_OK;
   CassFuture *future = NULL;
-  // std::cout << query << std::endl;
-  // std::cout << metadata.mask << std::endl;
   CassStatement *statement = cass_statement_new(query.data(), var);
   convert data = {.data = metadata.ctid};
-  // std::cout << metadata.t_ctid.ip_blkid.bi_hi << " "
-  //           << metadata.t_ctid.ip_blkid.bi_lo << " " <<
-  //           metadata.t_ctid.ip_posid
-  //           << std::endl;
+
   cass_statement_bind_bytes(statement, var - 1, (cass_byte_t *)data.a, 6);
   bindPartMetadataInStatement(statement, metadata);
 
@@ -212,7 +204,6 @@ void CassandraDriver::execCqlQuery(std::string query,
   CassError rc = CASS_OK;
   CassFuture *future = NULL;
   CassStatement *statement = cass_statement_new(query.data(), var);
-  // std::cout << "\n\n\n";
   for (int i = 0; i < fields.size(); ++i) {
     char *a = const_cast<char *>(fields[i].c_str());
     convert b;
@@ -241,20 +232,11 @@ void CassandraDriver::execCqlQuery(std::string query,
                                    std::vector<std::string> fieldData,
                                    std::vector<size_t> fieldSize,
                                    Metadata metadata, int var) {
-  // auto start = std::chrono::high_resolution_clock::now();
   CassError rc = CASS_OK;
   CassFuture *future = NULL;
-  static int i = 0;
-  i++;
   CassStatement *statement = cass_statement_new(query.data(), var);
-  static CassBatch *batch = NULL;
-  if (batch == NULL)
-    batch = cass_batch_new(CASS_BATCH_TYPE_UNLOGGED);  // Создаем пакет
-  // std::cout << query << std::endl;
-  // std::cout << fieldData.size() << std::endl;
 
   for (int i = 0; i < fieldData.size(); ++i) {
-    // std::cout << fieldData[i] << " vlaue" << std::endl;
     if (fieldData[i] == "") {
       cass_statement_bind_null(statement, i + 1);
       continue;
@@ -265,35 +247,43 @@ void CassandraDriver::execCqlQuery(std::string query,
                               fieldSize[i]);
   }
   bindMetadataInStatement(statement, metadata, fieldData.size() + 1);
-  cass_batch_add_statement(batch, statement);
+
+  future = cass_session_execute(this->sessionPtr, statement);
+  // cass_future_wait(future);
+
+  // rc = cass_future_error_code(future);
+  // if (rc != CASS_OK) {
+  //   const char *message;
+  //   size_t message_length;
+  //   cass_future_error_message(future, &message, &message_length);
+  //   std::cerr << "Connection error: " << std::string(message, message_length)
+  //             << std::endl;
+  // }
+  cass_future_free(future);
   cass_statement_free(statement);
+}
+
+void CassandraDriver::execCqlQueryIndex(std::string query,
+                                   std::vector<std::string> fieldData,
+                                   std::vector<size_t> fieldSize,
+                                   Metadata metadata, int var) {
+  CassError rc = CASS_OK;
+  CassFuture *future = NULL;
+  CassStatement *statement = cass_statement_new(query.data(), var);
+
+  for (int i = 0; i < fieldData.size(); ++i) {
+    if (fieldData[i] == "") {
+      cass_statement_bind_null(statement, i + 2);
+      continue;
+    }
+
+    cass_statement_bind_bytes(statement, i + 2,
+                              (const cass_byte_t *)fieldData[i].c_str(),
+                              fieldSize[i]);
+  }
+  bindMetadataInStatementWithIndex(statement, metadata, fieldData.size() + 2);
 
-  if (i == 10) {
-    // std::cout << "yee " << batch << " " << &batch << std::endl;
-    i = 0;
-
-    future = cass_session_execute_batch(this->sessionPtr, batch);
-    cass_batch_free(batch);  // Освобождаем пакет
-    batch = NULL;
-    // cass_future_wait(future);
-
-    // rc = cass_future_error_code(future);
-    //
-    // if (rc != CASS_OK) {
-    //   const char *message;
-    //   size_t message_length;
-    //   cass_future_error_message(future, &message, &message_length);
-    //   std::cout << "Connection error: " << std::string(message,
-    //   message_length)
-    //             << std::endl;
-    // }
-  }
-  // auto end = std::chrono::high_resolution_clock::now();
-  // std::chrono::duration<double> duration = end - start;
-  // std::cout << "Время выполнения функции: " << duration.count() << " секунд."
-  //           << std::endl;
-
-  // future = cass_session_execute(this->sessionPtr, statement);
+  future = cass_session_execute(this->sessionPtr, statement);
   // cass_future_wait(future);
 
   // rc = cass_future_error_code(future);
@@ -304,7 +294,8 @@ void CassandraDriver::execCqlQuery(std::string query,
   //   std::cerr << "Connection error: " << std::string(message, message_length)
   //             << std::endl;
   // }
-  // cass_future_free(future);
+  cass_future_free(future);
+  cass_statement_free(statement);
 }
 
 CassFuture *CassandraDriver::execCqlQueryWithRes(std::string query) {
@@ -358,7 +349,6 @@ ItemPointerData CassandraDriver::getLastPointer(const std::string &tableName,
   }
 
   std::string query = builder.buildGetLastPointer(key, tableName);
-  // std::cout << "query last pointer: " << query << std::endl;
   CassFuture *future = execCqlQueryWithRes(query);
   ItemPointerData last = {};
 
@@ -512,11 +502,7 @@ int CassandraDriver::selectData(Snapshot snapshot, size_t metadataCount) {
     CassRow *row =
         const_cast<CassRow *>(cass_iterator_get_row(this->iterator.iter));
     CassError error = loadMetadata(row, metadata);
-    // std::cout << metadata.xmin << " " << metadata.xmax << " select"
-    //           << std::endl;
-    if (!inVisibilityArea(metadata, snapshot, ReadNextTransactionId() - 1)) {
-      return selectData(snapshot);  // надо пофиксить
-    }
+
     this->iterator.row.value.clear();
     this->iterator.row.size.clear();
 
@@ -537,12 +523,7 @@ int CassandraDriver::selectData(Snapshot snapshot, size_t metadataCount) {
       cass_value_get_bytes(casValue, &bytes, &size);
       this->iterator.row.value.push_back(bytes);
       this->iterator.row.size.push_back(size);
-    }
-    const cass_byte_t *bytes;
-    cass_value_get_bytes(cass_row_get_column_by_name(row, "key_name"), &bytes,
-                         &size);
-    // std::cout << "select data: " << this->iterator.row.value[0] << " "
-    //           << this->iterator.row.size.size() << std::endl;
+    } 
     return 1;
   }
   return 0;
@@ -603,8 +584,7 @@ void CassandraDriver::vacuum(std::string query, CassFuture *future,
     loadMetadata(row, metadata);
     cass_value_get_bytes(cass_row_get_column_by_name(row, KEY_NAME), &bytes,
                          &size);
-    // std::cout << metadata.xmax << " xmax metadata  and id - " << id
-    //           << std::endl;
+
     if (metadata.xmax == 0) {
       continue;
     }
@@ -627,18 +607,11 @@ void CassandraDriver::vacuum(std::string query, CassFuture *future,
   if (keysInBatch > 0) {
     std::vector<std::string> keysV;
     for (int i = 0; i < keysInBatch; i++) {
-      // std::cout << keys[i].data.ip_blkid.bi_hi << " "
-      //           << keys[i].data.ip_blkid.bi_lo << " " <<
-      //           keys[i].data.ip_posid
-      //           << std::endl;
-      //
+
       keysV.emplace_back(keys[i].a, 6);
       char *a = const_cast<char *>(keysV[i].c_str());
       convert b;
       memcpy(b.a, a, 6);
-      // std::cout << b.data.ip_blkid.bi_hi << " " << b.data.ip_blkid.bi_lo << "
-      // "
-      //           << b.data.ip_posid << std::endl;
     }
     execCqlQuery(builder.buildDropTuple(keyspace, tableName, keysInBatch),
                  keysV, keysInBatch);
diff --git a/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.cpp b/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.cpp
deleted file mode 100644
index ac3be46eb23..00000000000
--- a/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.cpp
+++ /dev/null
@@ -1,200 +0,0 @@
-#include "rocksdb_driver.h"
-#include <bits/this_thread_sleep.h>
-
-#include <iostream>
-
-using namespace ROCKSDB_NAMESPACE;
-
-std::string kDBPath = "/tmp/rocksdb_cloud_durable";
-
-std::string kBucketSuffix = "cloud.durable.example.";
-std::string kRegion = "us-west-2";
-
-static const bool flushAtEnd = true;
-static const bool disableWAL = false;
-
-
-RocksDBDriver::RocksDBDriver(std::unordered_map<std::string, std::string> config) : mapPointers() {
-  std::cout << "Construct" << std::endl;
-  cloud_fs_options.aws_options.endpoint_override = "127.0.0.1:9000";
-
-  // Store a reference to a cloud file system. A new cloud env object should be
-  // associated with every new cloud-db.
-
-  cloud_fs_options.credentials.InitializeSimple(
-      getenv("AWS_ACCESS_KEY_ID"), getenv("AWS_SECRET_ACCESS_KEY"));
-  if (!cloud_fs_options.credentials.HasValid().ok()) {
-    fprintf(
-        stderr,
-        "Please set env variables "
-        "AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY with cloud credentials");
-  }
-
-  // Append the user name to the bucket name in an attempt to make it
-  // globally unique. S3 bucket-names need to be globally unique.
-  // If you want to rerun this example, then unique user-name suffix here.
-  char* user = getenv("USER");
-  kBucketSuffix.append(user);
-
-  // "rockset." is the default bucket prefix
-  const std::string bucketPrefix = "";
-  cloud_fs_options.src_bucket.SetBucketName(kBucketSuffix, bucketPrefix);
-  cloud_fs_options.dest_bucket.SetBucketName(kBucketSuffix, bucketPrefix);
-
-  // create a bucket name for debugging purposes
-  const std::string bucketName = bucketPrefix + kBucketSuffix;
-
-  // Create a new AWS cloud env Status
-  Status s = CloudFileSystemEnv::NewAwsFileSystem(
-      FileSystem::Default(), kBucketSuffix, kDBPath, kRegion, kBucketSuffix,
-      kDBPath, kRegion, cloud_fs_options, nullptr, &cfs);
-  if (!s.ok()) {
-    fprintf(stderr, "Unable to create cloud env in bucket %s. %s\n",
-            bucketName.c_str(), s.ToString().c_str());
-  }
-  cloud_fs.reset(cfs);
-
-  // Create options and use the AWS file system that we created earlier
-  cloud_env = NewCompositeEnv(cloud_fs);
-  options.env = cloud_env.get();
-  options.create_if_missing = true;
-
-  // No persistent read-cache
-  std::string persistent_cache = "";
-
-  // options for each write
-  wopt.disableWAL = disableWAL;
-
-  // open DB
-  s = DBCloud::Open(options, kDBPath, persistent_cache, 0, &db);
-  if (!s.ok()) {
-    throw std::runtime_error("Unable to open db at path1 " + 
-                              kDBPath + 
-                              " with bucket " + 
-                              bucketName + 
-                              ". " + 
-                              s.ToString() + "\n");
-  }
-
-
-    /***********************
-   *                       *
-   *          Test         *
-   *                       *
-   ************************/
-
-  // s = db->Put(wopt, "key1", "value");
-
-  // db->Flush(FlushOptions());
-
-  // std::cout << "Test succes" << std::endl;
-}
-
-void RocksDBDriver::createTable(std::string tableName){
-  std::cout << "Create" << std::endl;
-  // ROCKSDB_NAMESPACE::ColumnFamilyOptions cfOptions;
-  // // Здесь можно настроить параметры семейства колонок, если необходимо
-  // ROCKSDB_NAMESPACE::ColumnFamilyHandle* cfHandle;
-  // auto status = db->CreateColumnFamily(cfOptions, tableName, &cfHandle);
-  // if (!status.ok()) {
-  //     throw std::runtime_error("Unable to create column family: " + status.ToString());
-  // }
-
-  // // Сохраняем дескриптор семейства колонок в мапу
-  // columnFamilies[tableName] = cfHandle;
-}
-
-void RocksDBDriver::insertData(std::string tableName, std::vector<std::string> fieldName, std::vector<std::string> fieldData, std::vector<size_t> sizes, ItemPointerData pointer) {
-  static int countOperation = 0;
-  
-  std::string key = std::to_string(pointer.ip_blkid.bi_hi) + "_" + 
-                    std::to_string(pointer.ip_blkid.bi_lo) + "_" + 
-                    std::to_string(pointer.ip_posid);
-
-  std::string value;
-  for (size_t i = 0; i < fieldData.size(); ++i) {
-    value += fieldData[i];
-    if (i < fieldData.size() - 1) {
-      value += "|";  // Use a delimiter to separate fields
-    }
-  }
-
-  // auto batch = rocksdb::WriteBatch();
-  auto status = db->Put(this->wopt, key, value);
-
-  if (!status.ok()) {
-    throw std::runtime_error("Failed to insert data: " + status.ToString());
-  }
-
-  countOperation++;
-  if(countOperation % 50000 == 0){
-    db->Flush(FlushOptions());
-  }
-}
-
-ItemPointerData RocksDBDriver::getNewPointer(std::string tableName) {
-  ItemPointerData data = getLastPointer(tableName);
-  if (data.ip_posid < UINT16_MAX) {
-    data.ip_posid++;
-  } else {
-    data.ip_posid = 1;
-    if (data.ip_blkid.bi_lo < UINT16_MAX) {
-      data.ip_blkid.bi_lo++;
-    } else {
-      data.ip_blkid.bi_lo = 0;
-      if (data.ip_blkid.bi_hi < UINT16_MAX) {
-        data.ip_blkid.bi_hi++;
-      } else {
-        data.ip_blkid.bi_hi = 0;
-      }
-    }
-  }
-  mapPointers[tableName] = data;
-  return data;
-}
-
-ItemPointerData RocksDBDriver::getLastPointer(const std::string &tableName) {
-  auto it = this->mapPointers.find(tableName);
-  if (it != this->mapPointers.end()) {
-    return it->second;
-  }
-
-  ItemPointerData last = {};
-  ROCKSDB_NAMESPACE::ReadOptions readOptions;
-  ROCKSDB_NAMESPACE::Iterator* itr = db->NewIterator(readOptions);
-
-  itr->SeekToLast();
-  if (itr->Valid()) {
-    std::string lastKey = itr->key().ToString();
-    std::istringstream iss(lastKey);
-    std::string token;
-    std::vector<uint16_t> parts;
-
-    while (std::getline(iss, token, '_')) {
-      parts.push_back(static_cast<uint16_t>(std::stoi(token)));
-    }
-
-    if (parts.size() == 3) {
-      last.ip_blkid.bi_hi = parts[0];
-      last.ip_blkid.bi_lo = parts[1];
-      last.ip_posid = parts[2];
-    }
-  }else{
-    last.ip_blkid.bi_hi = 1;
-    last.ip_blkid.bi_lo = 1;
-    last.ip_posid = 1;
-    return last;
-  }
-
-  delete itr;
-
-  mapPointers[tableName] = last;
-  return last;
-  // last.ip_blkid.bi_hi = 1;
-  // last.ip_blkid.bi_lo = 1;
-  // last.ip_posid = 1;
-  // return last;
-
-}
-
-
diff --git a/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.h b/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.h
deleted file mode 100644
index 5c150f57090..00000000000
--- a/clouddb/src/clouddb/facade/drivers/rocksdb_driver/rocksdb_driver.h
+++ /dev/null
@@ -1,77 +0,0 @@
-#ifndef ROCKSDB_DRIVER_H
-#define ROCKSDB_DRIVER_H
-
-#include "../idriver.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-#include <postgres.h>
-#include <fmgr.h>
-
-#include <access/transam.h>
-#ifdef __cplusplus
-}
-#endif
-
-#ifdef __cplusplus
-
-#include <string>
-#include <unordered_map>
-#include <sstream>
-
-#include "../../../utils/utils.h"
-#include "../../utils/metadata.h"
-
-#include <rocksdb/listener.h>
-#include <rocksdb/options.h>
-#include <rocksdb/db.h>
-#include <rocksdb/slice.h>
-#include <rocksdb/iterator.h>
-
-#include <bits/std_thread.h>
-
-#include <rocksdb/cloud/db_cloud.h>
-#include <rocksdb/options.h>
-
-
-class RocksDBDriver: public IDriver {
-private:
-  ROCKSDB_NAMESPACE::DBCloud* db;
-  std::unordered_map<std::string, ROCKSDB_NAMESPACE::ColumnFamilyHandle*> columnFamilies;
-
-  //require live for correct work
-  std::unordered_map<std::string, ItemPointerData> mapPointers;
-  ROCKSDB_NAMESPACE::WriteOptions wopt;
-  std::shared_ptr<ROCKSDB_NAMESPACE::FileSystem> cloud_fs;
-  ROCKSDB_NAMESPACE::Options options;
-  std::unique_ptr<ROCKSDB_NAMESPACE::Env> cloud_env;
-  ROCKSDB_NAMESPACE::CloudFileSystemOptions cloud_fs_options;
-  ROCKSDB_NAMESPACE::CloudFileSystem* cfs;
-public:
-  ~RocksDBDriver() = default;
-  RocksDBDriver(std::unordered_map<std::string, std::string> config);
-
-  void createTable(std::string tableName);
-
-  void insertData(std::string tableName, std::vector<std::string> fieldName, std::vector<std::string> fieldData, std::vector<size_t> sizes, ItemPointerData pointer) ;
-
-  void beginScan(Relation relation, Snapshot snapshot, int nkeys,
-                         struct ScanKeyData* key,
-                         ParallelTableScanDesc parallel_scan, uint32 flags,
-                         TransactionId id) { return; };
-  int selectData(Snapshot snapshot) { return 0; };
-  char** getValue() { return 0; };
-  ItemPointerData getTid() { return ItemPointerData(); };
-
-  ItemPointerData getNewPointer(std::string tableName);
-  ItemPointerData getLastPointer(const std::string &tableName);
-
-  void startFlushThread();
-  void stopFlushThread();
-};
-
-#endif
-
-
-#endif
\ No newline at end of file
diff --git a/clouddb/src/clouddb/facade/query_builder.cpp b/clouddb/src/clouddb/facade/query_builder.cpp
index 4ab0dbebd8f..d969304ef4a 100644
--- a/clouddb/src/clouddb/facade/query_builder.cpp
+++ b/clouddb/src/clouddb/facade/query_builder.cpp
@@ -220,7 +220,9 @@ std::string CassandraBuilder::buildSelectAll(std::string keyspace,
   query += " <= ";
   query += std::to_string(id);
   query += "  ALLOW FILTERING;";
+
   // std::cout << query << std::endl;
+
   return query;
 }
 
diff --git a/clouddb/src/clouddb/facade/session.cpp b/clouddb/src/clouddb/facade/session.cpp
index f9f8f6f704d..6216efe3d40 100644
--- a/clouddb/src/clouddb/facade/session.cpp
+++ b/clouddb/src/clouddb/facade/session.cpp
@@ -19,8 +19,6 @@ std::unordered_map<std::string, std::string> parseConfig(char **config) {
 Session::Session(std::unordered_map<std::string, std::string> config) {
   if (config["driver"] == "cassandra") {
     this->driver = std::make_shared<CassandraDriver>(config);
-  }else if(config["driver"] == "rocksdb") {
-    this->driver = std::make_shared<RocksDBDriver>(config);
   }
 }
 
diff --git a/clouddb/src/clouddb/facade/session.h b/clouddb/src/clouddb/facade/session.h
index 38d6e541014..dd0cdccbbbc 100644
--- a/clouddb/src/clouddb/facade/session.h
+++ b/clouddb/src/clouddb/facade/session.h
@@ -4,16 +4,14 @@
 #include "../utils/c_export.h"
 #include "command/icommand.h"
 #include "drivers/cassandra_driver/cassandra_driver.h"
-#include "drivers/rocksdb_driver/rocksdb_driver.h"
 //
 
 #ifdef __cplusplus
 #include <memory>
 #include <string>
 #include <unordered_map>
-#include <iostream>
 
-enum DRIVERS { Cassandra, RocksDb };
+enum DRIVERS { Cassandra };
 
 class Session {
  public:
@@ -29,7 +27,7 @@ class Session {
   std::weak_ptr<ICommand> command;
   Session(std::unordered_map<std::string, std::string> config);
   Session();
-  ~Session() {std::cout << "~Session" << std::endl;};
+  ~Session() = default;
 
   // delete all
   Session(const Session &) = delete;
diff --git a/clouddb/src/clouddb/tam/all_tam.h b/clouddb/src/clouddb/tam/all_tam.h
index d00e11646c9..43134944a91 100644
--- a/clouddb/src/clouddb/tam/all_tam.h
+++ b/clouddb/src/clouddb/tam/all_tam.h
@@ -16,7 +16,114 @@
 #include "../facade/command/command.h"
 #include "../utils/utils.h"
 
-extern Session* session;
+#include "access/hio.h"
+#include "access/multixact.h"
+#include "access/relscan.h"
+#include "access/sysattr.h"
+#include "access/transam.h"
+#include "access/valid.h"
+#include "access/visibilitymap.h"
+#include "access/xact.h"
+#include "access/xlogutils.h"
+#include "catalog/catalog.h"
+#include "catalog/namespace.h"
+#include "miscadmin.h"
+#include "pgstat.h"
+#include "storage/bufmgr.h"
+#include "storage/freespace.h"
+#include "storage/lmgr.h"
+#include "storage/procarray.h"
+#include "storage/smgr.h"
+#include "storage/standby.h"
+#include "utils/datum.h"
+#include "utils/inval.h"
+#include "utils/snapmgr.h"
+#include "utils/syscache.h"
+
+
+#include "access/genam.h"
+#include "access/table.h"
+#include "catalog/indexing.h"
+#include "catalog/objectaddress.h"
+#include "catalog/pg_description.h"
+#include "catalog/pg_shdescription.h"
+#include "commands/comment.h"
+#include "commands/dbcommands.h"
+#include "utils/fmgroids.h"
+#include "catalog/pg_index.h"
+#include "catalog/pg_class.h"
+#include "catalog/pg_namespace.h"
+#include "utils/relcache.h"
+#include "utils/varbit.h"
+#include "commands/sequence.h"
+
+
+#include <access/heapam.h>
+#include <access/htup_details.h>
+#include <access/relation.h>
+#include <access/tableam.h>
+#include <cassandra.h>
+#include <catalog/index.h>
+#include <commands/vacuum.h>
+#include <executor/executor.h>
+#include <executor/spi.h>
+#include <executor/tuptable.h>
+#include <fmgr.h>
+#include <miscadmin.h>
+#include <nodes/execnodes.h>
+#include <postmaster/bgworker.h>
+#include <postmaster/interrupt.h>
+#include <stdlib.h>
+#include <storage/ipc.h>
+#include <storage/lwlock.h>
+#include <storage/shmem.h>
+#include <string.h>
+#include <tcop/tcopprot.h>
+#include <utils/builtins.h>
+#include <utils/guc.h>
+#include <utils/lsyscache.h>
+#include <utils/rel.h> /* ... and relations */
+#include <utils/snapmgr.h>
+
+#include "access/amapi.h"
+#include "access/genam.h"
+#include "access/relscan.h"
+#include "catalog/index.h"
+#include "catalog/pg_type.h"
+#include "commands/vacuum.h"
+#include "miscadmin.h"
+#include "storage/bufmgr.h"
+#include "utils/memutils.h"
+#include "nodes/pathnodes.h"
+
+#include <access/heapam.h>
+#include <access/htup_details.h>
+#include <access/relation.h>
+#include <access/tableam.h>
+#include <cassandra.h>
+#include <catalog/index.h>
+#include <commands/vacuum.h>
+#include <executor/executor.h>
+#include <executor/spi.h>
+#include <executor/tuptable.h>
+#include <fmgr.h>
+#include <miscadmin.h>
+#include <nodes/execnodes.h>
+#include <postmaster/bgworker.h>
+#include <postmaster/interrupt.h>
+#include <stdlib.h>
+#include <storage/ipc.h>
+#include <storage/lwlock.h>
+#include <storage/shmem.h>
+#include <string.h>
+#include <tcop/tcopprot.h>
+#include <utils/builtins.h>
+#include <utils/guc.h>
+#include <utils/lsyscache.h>
+#include <utils/rel.h> /* ... and relations */
+#include <utils/snapmgr.h>
+#include "access/amapi.h"
+
 extern const TableAmRoutine clouddb_methods;
 
 #endif
diff --git a/clouddb/src/clouddb/tam/src/mod_tuple_tam.c b/clouddb/src/clouddb/tam/src/mod_tuple_tam.c
index 9ddd5e479ee..4a7c40cf7a8 100644
--- a/clouddb/src/clouddb/tam/src/mod_tuple_tam.c
+++ b/clouddb/src/clouddb/tam/src/mod_tuple_tam.c
@@ -4,14 +4,9 @@
 
 void clouddb_tuple_insert(Relation relation, TupleTableSlot *slot,
                           CommandId cid, int options, BulkInsertState bistate) {
-  // Вычисляем разницу
-  /* clock_t start = clock(); */
   Session *session = getSessionInstance(NULL);
   executeCommand(session, createInsertCommand(session, relation, slot, cid,
                                               options, bistate));
-  /* clock_t end = clock(); */
-  /* double time_spent = (double)(end - start) / CLOCKS_PER_SEC * 1000; */
-  /* printf("Время выполнения функции: %.3f milliseconds\n", time_spent); */
 }
 
 void clouddb_tuple_insert_speculative(Relation relation, TupleTableSlot *slot,
@@ -141,4 +136,3 @@ TM_Result clouddb_tuple_lock(Relation relation, ItemPointer tid,
   TM_Result result = 0;
   return result;
 }
-
diff --git a/clouddb/src/clouddb/tam/src/scan_func_tam.c b/clouddb/src/clouddb/tam/src/scan_func_tam.c
index 489bef859d4..b7a9878899a 100644
--- a/clouddb/src/clouddb/tam/src/scan_func_tam.c
+++ b/clouddb/src/clouddb/tam/src/scan_func_tam.c
@@ -43,12 +43,8 @@ bool clouddb_getnextslot(TableScanDesc sscan, ScanDirection direction,
   char **values = getValueForScan(driver);
 
   slot->tts_tid = getTidForScan(driver);
-  /* printf("%d %d %d\n", slot->tts_tid.ip_posid, slot->tts_tid.ip_blkid.bi_lo,
-   */
-  /*        slot->tts_tid.ip_blkid.bi_hi); */
 
   TupleDesc desc = RelationGetDescr(sscan->rs_rd);
-  /* printf("%s\n", values[0]); */
 
   for (int i = 0; i < desc->natts; ++i) {
     char *curValue = values[i];
diff --git a/clouddb/src/clouddb/tam/tam.c b/clouddb/src/clouddb/tam/tam.c
index dbd294918d2..3d2059d2987 100644
--- a/clouddb/src/clouddb/tam/tam.c
+++ b/clouddb/src/clouddb/tam/tam.c
@@ -7,8 +7,6 @@
 #include "include/scan_func_tam.h"
 #include "include/slot_func_tam.h"
 
-Session* session;
-
 const TableAmRoutine clouddb_methods = {
     .type = T_TableAmRoutine,
 
@@ -73,21 +71,20 @@ const TableAmRoutine clouddb_methods = {
 
 PG_FUNCTION_INFO_V1(clouddb_table_handler);
 Datum clouddb_table_handler(PG_FUNCTION_ARGS) {
-    printf("Init\n");
-  char *host = GetConfigOption("cassandra.host", false, false);
-  char *keyspace = GetConfigOption("cassandra.keyspace", false, false);
+  char *keyspace = (char *)GetConfigOption("cassandra.keyspace", false, false);
+  char *host = (char *)GetConfigOption("cassandra.host", false, false);
   char *replicationFactor =
       (char *)GetConfigOption("cassandra.replication_factor", false, false);
 
-    char **config = (char **)malloc(sizeof(char *) * 7);
-  config[0] = "rocksdb";
+  char **config = (char **)malloc(sizeof(char *) * 7);
+  config[0] = "cassandra";
   config[1] = "cassandra.host";
-  config[2] = "host";
+  config[2] = host;
   config[3] = "cassandra.keyspace";
-  config[4] = "keyspace";
+  config[4] = keyspace;
   config[5] = "cassandra.replication_factor";
-  config[6] = "replicationFactor";
-  session = getSessionInstance(config);
+  config[6] = replicationFactor;
+  Session *session = getSessionInstance((void *)config);
 
   PG_RETURN_POINTER(&clouddb_methods);
 }
-- 
GitLab