From c58eb400a499616f61b0cf62b06a66e4a23e26da Mon Sep 17 00:00:00 2001 From: Fredi Kats Date: Sat, 20 Feb 2021 23:33:34 +0300 Subject: [PATCH 001/378] init: add base code for first lab --- .../basics/exceptions/DatabaseException.java | 2 +- .../com/itmo/java/basics/index/KvsIndex.java | 4 +- .../java/basics/index/SegmentOffsetInfo.java | 2 +- .../basics/index/impl/MapBasedKvsIndex.java | 4 +- .../java/basics/index/impl/SegmentIndex.java | 4 +- .../index/impl/SegmentOffsetInfoImpl.java | 4 +- .../java/basics/index/impl/TableIndex.java | 4 +- .../com/itmo/java/basics/logic/Database.java | 18 +-- .../java/basics/logic/DatabaseRecord.java | 2 +- .../com/itmo/java/basics/logic/Segment.java | 19 ++- .../com/itmo/java/basics/logic/Table.java | 14 +- .../basics/logic/WritableDatabaseRecord.java | 2 +- .../java/basics/logic/impl/DatabaseImpl.java | 86 ++---------- .../java/basics/logic/impl/SegmentImpl.java | 124 ++---------------- .../java/basics/logic/impl/TableImpl.java | 89 ++----------- .../basics/logic/io/DatabaseInputStream.java | 27 +--- .../basics/logic/io/DatabaseOutputStream.java | 21 +-- 17 files changed, 77 insertions(+), 349 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/exceptions/DatabaseException.java b/src/main/java/com/itmo/java/basics/exceptions/DatabaseException.java index 85a33133..07d921e7 100644 --- a/src/main/java/com/itmo/java/basics/exceptions/DatabaseException.java +++ b/src/main/java/com/itmo/java/basics/exceptions/DatabaseException.java @@ -1,4 +1,4 @@ -package com.itmo.java.basics.exceptions; +package main.java.com.itmo.java.basics.exceptions; public class DatabaseException extends Exception { public DatabaseException(String message) { diff --git a/src/main/java/com/itmo/java/basics/index/KvsIndex.java b/src/main/java/com/itmo/java/basics/index/KvsIndex.java index 15534257..5ea358f6 100644 --- a/src/main/java/com/itmo/java/basics/index/KvsIndex.java +++ b/src/main/java/com/itmo/java/basics/index/KvsIndex.java @@ -1,4 +1,4 @@ -package com.itmo.java.basics.index; +package main.java.com.itmo.java.basics.index; import java.util.Optional; @@ -6,7 +6,7 @@ public interface KvsIndex { /** * Оповещает индекс об обновлении значения по определенному ключу. * - * @param key ключ, который обновился + * @param key ключ, который обновился * @param value новое значение */ void onIndexedEntityUpdated(K key, V value); diff --git a/src/main/java/com/itmo/java/basics/index/SegmentOffsetInfo.java b/src/main/java/com/itmo/java/basics/index/SegmentOffsetInfo.java index 93921ecd..38230ed5 100644 --- a/src/main/java/com/itmo/java/basics/index/SegmentOffsetInfo.java +++ b/src/main/java/com/itmo/java/basics/index/SegmentOffsetInfo.java @@ -1,4 +1,4 @@ -package com.itmo.java.basics.index; +package main.java.com.itmo.java.basics.index; public interface SegmentOffsetInfo { long getOffset(); diff --git a/src/main/java/com/itmo/java/basics/index/impl/MapBasedKvsIndex.java b/src/main/java/com/itmo/java/basics/index/impl/MapBasedKvsIndex.java index ba102d65..caae3e48 100644 --- a/src/main/java/com/itmo/java/basics/index/impl/MapBasedKvsIndex.java +++ b/src/main/java/com/itmo/java/basics/index/impl/MapBasedKvsIndex.java @@ -1,6 +1,6 @@ -package com.itmo.java.basics.index.impl; +package main.java.com.itmo.java.basics.index.impl; -import com.itmo.java.basics.index.KvsIndex; +import main.java.com.itmo.java.basics.index.KvsIndex; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/com/itmo/java/basics/index/impl/SegmentIndex.java b/src/main/java/com/itmo/java/basics/index/impl/SegmentIndex.java index 7370c6d6..ee6b8e48 100644 --- a/src/main/java/com/itmo/java/basics/index/impl/SegmentIndex.java +++ b/src/main/java/com/itmo/java/basics/index/impl/SegmentIndex.java @@ -1,6 +1,6 @@ -package com.itmo.java.basics.index.impl; +package main.java.com.itmo.java.basics.index.impl; -import com.itmo.java.basics.index.SegmentOffsetInfo; +import main.java.com.itmo.java.basics.index.SegmentOffsetInfo; public class SegmentIndex extends MapBasedKvsIndex { } diff --git a/src/main/java/com/itmo/java/basics/index/impl/SegmentOffsetInfoImpl.java b/src/main/java/com/itmo/java/basics/index/impl/SegmentOffsetInfoImpl.java index 9ee2edc0..413cc58e 100644 --- a/src/main/java/com/itmo/java/basics/index/impl/SegmentOffsetInfoImpl.java +++ b/src/main/java/com/itmo/java/basics/index/impl/SegmentOffsetInfoImpl.java @@ -1,6 +1,6 @@ -package com.itmo.java.basics.index.impl; +package main.java.com.itmo.java.basics.index.impl; -import com.itmo.java.basics.index.SegmentOffsetInfo; +import main.java.com.itmo.java.basics.index.SegmentOffsetInfo; public class SegmentOffsetInfoImpl implements SegmentOffsetInfo { private final long offset; diff --git a/src/main/java/com/itmo/java/basics/index/impl/TableIndex.java b/src/main/java/com/itmo/java/basics/index/impl/TableIndex.java index eceaeea8..86eddfde 100644 --- a/src/main/java/com/itmo/java/basics/index/impl/TableIndex.java +++ b/src/main/java/com/itmo/java/basics/index/impl/TableIndex.java @@ -1,6 +1,6 @@ -package com.itmo.java.basics.index.impl; +package main.java.com.itmo.java.basics.index.impl; -import com.itmo.java.basics.logic.Segment; +import main.java.com.itmo.java.basics.logic.Segment; public class TableIndex extends MapBasedKvsIndex { } diff --git a/src/main/java/com/itmo/java/basics/logic/Database.java b/src/main/java/com/itmo/java/basics/logic/Database.java index 912a1536..a7aeecca 100644 --- a/src/main/java/com/itmo/java/basics/logic/Database.java +++ b/src/main/java/com/itmo/java/basics/logic/Database.java @@ -1,6 +1,6 @@ -package com.itmo.java.basics.logic; +package main.java.com.itmo.java.basics.logic; -import com.itmo.java.basics.exceptions.DatabaseException; +import main.java.com.itmo.java.basics.exceptions.DatabaseException; import java.util.Optional; @@ -18,17 +18,17 @@ public interface Database { * @param tableName имя таблицы * @throws DatabaseException если таблица с данным именем уже существует или если произошла ошибка ввода-вывода */ - void createTableIfNotExists(String tableName) throws DatabaseException, IOException; + void createTableIfNotExists(String tableName) throws DatabaseException; /** * Записывает значение в указанную таблицу по переданному ключу. * - * @param tableName таблица, в которую нужно записать значение - * @param objectKey ключ, по которому нужно записать значение + * @param tableName таблица, в которую нужно записать значение + * @param objectKey ключ, по которому нужно записать значение * @param objectValue значение, которое нужно записать * @throws DatabaseException если указанная таблица не была найдена или если произошла ошибка ввода-вывода */ - void write(String tableName, String objectKey, byte[] objectValue) throws DatabaseException, IOException; + void write(String tableName, String objectKey, byte[] objectValue) throws DatabaseException; /** * Считывает значение из указанной таблицы по заданному ключу. @@ -36,9 +36,9 @@ public interface Database { * @param tableName таблица, из которой нужно считать значение * @param objectKey ключ, по которому нужно получить значение * @return значение, которое находится по ключу - * @throws DatabaseException если не была найдена указанная таблица, или произошла ошибка ввода-вывода + * @throws DatabaseException если не была найдена указанная таблица, или если не была найдена запись по данному ключу, или произошла ошибка ввода-вывода */ - Optional read(String tableName, String objectKey) throws DatabaseException, IOException; + Optional read(String tableName, String objectKey) throws DatabaseException; - void delete(String tableName, String objectKey) throws DatabaseException, IOException; + void delete(String tableName, String objectKey) throws DatabaseException; } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/DatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/DatabaseRecord.java index ee4d17b0..4428875e 100644 --- a/src/main/java/com/itmo/java/basics/logic/DatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/DatabaseRecord.java @@ -1,4 +1,4 @@ -package com.itmo.java.basics.logic; +package main.java.com.itmo.java.basics.logic; /** * Представляет собой единицу хранения в БД diff --git a/src/main/java/com/itmo/java/basics/logic/Segment.java b/src/main/java/com/itmo/java/basics/logic/Segment.java index 6168fdcb..8fd3b4ca 100644 --- a/src/main/java/com/itmo/java/basics/logic/Segment.java +++ b/src/main/java/com/itmo/java/basics/logic/Segment.java @@ -1,15 +1,10 @@ -package com.itmo.java.basics.logic; +package main.java.com.itmo.java.basics.logic; + +import main.java.com.itmo.java.basics.exceptions.DatabaseException; import java.io.IOException; import java.util.Optional; -/** - * Сегмент - append-only файл, хранящий пары ключ-значение, разделенные специальным символом. - * - имеет ограниченный размер, большие значения (>100000) записываются в последний сегмент, если он не read-only - * - при превышении размера сегмента создается новый сегмент и дальнейшие операции записи производятся в него - * - именование файла-сегмента должно позволять установить очередность их появления - * - является неизменяемым после появления более нового сегмента - */ public interface Segment { /** * Возвращает имя сегмента. @@ -18,15 +13,19 @@ public interface Segment { */ String getName(); + // todo sukhoa in future may return something like SegmentWriteResult .. with report and error details? + // for new returns false if cannot allocate requested capacity + // exception is questionable /** * Записывает значение по указанному ключу в сегмент. * - * @param objectKey ключ, по которому нужно записать значение + * @param objectKey ключ, по которому нужно записать значение * @param objectValue значение, которое нужно записать * @return {@code true} - если значение записалось, {@code false} - если нет * @throws IOException если произошла ошибка ввода-вывода. + * @throws DatabaseException */ - boolean write(String objectKey, byte[] objectValue) throws IOException; + boolean write(String objectKey, byte[] objectValue) throws IOException, DatabaseException; /** * Считывает значение из сегмента по переданному ключу. diff --git a/src/main/java/com/itmo/java/basics/logic/Table.java b/src/main/java/com/itmo/java/basics/logic/Table.java index 37e82917..c01f4b4d 100644 --- a/src/main/java/com/itmo/java/basics/logic/Table.java +++ b/src/main/java/com/itmo/java/basics/logic/Table.java @@ -1,6 +1,6 @@ -package com.itmo.java.basics.logic; +package main.java.com.itmo.java.basics.logic; -import com.itmo.java.basics.exceptions.DatabaseException; +import main.java.com.itmo.java.basics.exceptions.DatabaseException; import java.util.Optional; @@ -24,21 +24,21 @@ public interface Table { /** * Записывает в таблицу переданное значение по указанному ключу. * - * @param objectKey ключ, по которому нужно записать значение + * @param objectKey ключ, по которому нужно записать значение * @param objectValue значение, которое нужно записать * @throws DatabaseException если произошла ошибка ввода-вывода */ - void write(String objectKey, byte[] objectValue) throws DatabaseException, IOException; + void write(String objectKey, byte[] objectValue) throws DatabaseException; /** * Считывает значение из таблицы по заданному ключу. * * @param objectKey ключ, по которому нужно получить значение * @return значение, которое находится по ключу - * @throws DatabaseException если произошла ошибка ввода-вывода + * @throws DatabaseException если не была найдена запись по данному ключу или произошла ошибка ввода-вывода */ - Optional read(String objectKey) throws DatabaseException, IOException; + Optional read(String objectKey) throws DatabaseException; - void delete(String objectKey) throws DatabaseException, IOException; + void delete(String objectKey) throws DatabaseException; } diff --git a/src/main/java/com/itmo/java/basics/logic/WritableDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/WritableDatabaseRecord.java index f1f859c7..d1be1c27 100644 --- a/src/main/java/com/itmo/java/basics/logic/WritableDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/WritableDatabaseRecord.java @@ -1,4 +1,4 @@ -package com.itmo.java.basics.logic; +package main.java.com.itmo.java.basics.logic; /** * Содержит информацию о параметрах {@link DatabaseRecord} для хранения в БД diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index 69f8b702..cb6dca85 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -1,108 +1,38 @@ -package com.itmo.java.basics.logic.impl; +package main.java.com.itmo.java.basics.logic.impl; -import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.index.impl.TableIndex; -import com.itmo.java.basics.initialization.DatabaseInitializationContext; -import com.itmo.java.basics.logic.Database; -import com.itmo.java.basics.logic.Table; +import main.java.com.itmo.java.basics.exceptions.DatabaseException; +import main.java.com.itmo.java.basics.logic.Database; -import java.io.IOException; -import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.HashMap; -import java.util.Map; import java.util.Optional; public class DatabaseImpl implements Database { - - private final String dbName; - private final Path databaseRoot; - private Map tableDictionary = new HashMap(); - - private DatabaseImpl(String dbName, Path databaseRoot) { - this.dbName = dbName; - this.databaseRoot = databaseRoot; - } - - private DatabaseImpl(DatabaseInitializationContext context) { - this.dbName = context.getDbName(); - this.databaseRoot = context.getDatabasePath(); - this.tableDictionary = context.getTables(); - } - public static Database create(String dbName, Path databaseRoot) throws DatabaseException { - - if (dbName == null) { - throw new DatabaseException("Why dataBase name is null?"); - } - if (Files.exists(Paths.get(databaseRoot.toString(), dbName))) { - throw new DatabaseException("This" + dbName + "already exists"); - } - try { - Files.createDirectory(Paths.get(databaseRoot.toString(), dbName)); - } catch (IOException ex) { - throw new DatabaseException("Error while creating a DataBase(" + dbName + ") directory", ex); - } - return new DatabaseImpl(dbName, databaseRoot); - } - - public static Database initializeFromContext(DatabaseInitializationContext context) { - return new DatabaseImpl(context); + return null; } @Override public String getName() { - return dbName; + return null; } @Override public void createTableIfNotExists(String tableName) throws DatabaseException { - if (tableName == null) { - throw new DatabaseException("Why tableName name is null?"); - } - if ((tableDictionary.containsKey(tableName)) || (Files.exists(Paths.get(databaseRoot.toString(), dbName, tableName)))) { - throw new DatabaseException("We have " + tableName + " in " + dbName + "directory"); - } - TableIndex newTableIndex = new TableIndex(); - Path pathToTableRoot = Paths.get(databaseRoot.toString(), dbName); - Table newTable = TableImpl.create(tableName, pathToTableRoot, newTableIndex); - tableDictionary.put(tableName, newTable); } @Override public void write(String tableName, String objectKey, byte[] objectValue) throws DatabaseException { - if (tableName == null) { - throw new DatabaseException("Error while writing in , null name"); - } - if (!tableDictionary.containsKey(tableName)) { - throw new DatabaseException("Table " + tableName + " doesn't exist in database" + dbName); - } - - Table table = tableDictionary.get(tableName); - table.write(objectKey, objectValue); } @Override public Optional read(String tableName, String objectKey) throws DatabaseException { - Table table = tableDictionary.get(tableName); - if (tableName == null) { - throw new DatabaseException("Error while reading in database , null name"); - } - return table.read(objectKey); + return Optional.empty(); } @Override public void delete(String tableName, String objectKey) throws DatabaseException { - if (!tableDictionary.containsKey(tableName)) { - throw new DatabaseException("Table " + tableName + " doesnt exist in database" + dbName); - } - if (tableName == null) { - throw new DatabaseException("Writing in database error"); - } - Table tableImpl = tableDictionary.get(tableName); - tableImpl.delete(objectKey); + } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index cf7cb752..b9318a5a 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -1,77 +1,15 @@ -package com.itmo.java.basics.logic.impl; +package main.java.com.itmo.java.basics.logic.impl; -import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.index.SegmentOffsetInfo; -import com.itmo.java.basics.index.impl.SegmentIndex; -import com.itmo.java.basics.index.impl.SegmentOffsetInfoImpl; -import com.itmo.java.basics.initialization.SegmentInitializationContext; -import com.itmo.java.basics.logic.DatabaseRecord; -import com.itmo.java.basics.logic.Segment; -import com.itmo.java.basics.logic.io.DatabaseInputStream; -import com.itmo.java.basics.logic.io.DatabaseOutputStream; +import main.java.com.itmo.java.basics.logic.Segment; +import main.java.com.itmo.java.basics.exceptions.DatabaseException; import java.io.IOException; -import java.io.OutputStream; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.Optional; -import static java.nio.file.StandardOpenOption.APPEND; - public class SegmentImpl implements Segment { - - private final Path tableRootPath; - private final String segmentName; - private final SegmentIndex segmentIndex; - private final long sizeMaximum = 100000; - private final DatabaseOutputStream outStream; - private long segmentSize = 0; - - public SegmentImpl(Path tableRootPath, String segmentName, OutputStream outStream) { - this.tableRootPath = tableRootPath; - this.segmentName = segmentName; - this.segmentIndex = new SegmentIndex(); - this.outStream = new DatabaseOutputStream(outStream); - } - - private SegmentImpl(SegmentInitializationContext context, OutputStream outStream) { - this.tableRootPath = context.getSegmentPath(); - this.segmentName = context.getSegmentName(); - this.segmentIndex = context.getIndex(); - this.segmentSize = context.getCurrentSize(); - this.outStream = new DatabaseOutputStream(outStream); - } - - public static Segment create(String segmentName, Path tableRootPath) throws DatabaseException { - - Path segmentRoot = Paths.get(tableRootPath.toString(), segmentName); - boolean isCreated; - OutputStream output; - - try { - isCreated = segmentRoot.toFile().createNewFile(); - output = Files.newOutputStream(segmentRoot); - } catch (IOException ex) { - throw new DatabaseException("Error while creating segment " + segmentName, ex); - } - if (!isCreated) { - throw new DatabaseException("Error while creating segment " + segmentName + "as it already exists"); - } - return new SegmentImpl(segmentRoot, segmentName, output); - } - - public static Segment initializeFromContext(SegmentInitializationContext context) throws RuntimeException { - - OutputStream output; - try { - output = Files.newOutputStream(context.getSegmentPath(), APPEND); - } catch (IOException ex) { - throw new RuntimeException("Error while newOpenFile in Segment initializeFromContext", ex); - } - SegmentImpl newSegment = new SegmentImpl(context, output); - return newSegment; + static Segment create(String segmentName, Path tableRootPath) throws DatabaseException { + throw new UnsupportedOperationException(); // todo implement } static String createSegmentName(String tableName) { @@ -80,64 +18,26 @@ static String createSegmentName(String tableName) { @Override public String getName() { - return segmentName; + return null; } @Override - public boolean write(String objectKey, byte[] objectValue) throws IOException { - - if (isReadOnly()) { - outStream.close(); - return false; - } - if (objectValue == null) { - return delete(objectKey); - } - SetDatabaseRecord newSeg = new SetDatabaseRecord(objectKey.getBytes(StandardCharsets.UTF_8), objectValue); - segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); - segmentSize += outStream.write(newSeg); - return true; + public boolean write(String objectKey, byte[] objectValue) throws IOException, DatabaseException { + return false; } @Override public Optional read(String objectKey) throws IOException { - - Optional offsetInfo = segmentIndex.searchForKey(objectKey); - if (offsetInfo.isEmpty()) { - return Optional.empty(); - } - - long myOf = offsetInfo.get().getOffset(); - try (DatabaseInputStream input = new DatabaseInputStream(Files.newInputStream(tableRootPath))) { - long skipped = input.skip(myOf); - if (skipped != myOf) { - throw new IOException("Error while skipping bytes in segment called " + segmentName); - } - Optional value = input.readDbUnit(); - if (value.isEmpty()) { - return Optional.empty(); - } - return Optional.ofNullable(value.get().getValue()); - } catch (IOException exception) { - throw new IOException("Error while creating a Segment file " + segmentName, exception); - } + return Optional.empty(); } @Override public boolean isReadOnly() { - return segmentSize >= sizeMaximum; + return false; } @Override public boolean delete(String objectKey) throws IOException { - - if (isReadOnly()) { - outStream.close(); - return false; - } - RemoveDatabaseRecord newSeg = new RemoveDatabaseRecord(objectKey.getBytes()); - segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); - segmentSize += outStream.write(newSeg); - return true; + return false; } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index 20265491..82db4cd0 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -1,103 +1,34 @@ -package com.itmo.java.basics.logic.impl; +package main.java.com.itmo.java.basics.logic.impl; -import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.index.impl.TableIndex; -import com.itmo.java.basics.initialization.TableInitializationContext; -import com.itmo.java.basics.logic.Segment; -import com.itmo.java.basics.logic.Table; +import main.java.com.itmo.java.basics.exceptions.DatabaseException; +import main.java.com.itmo.java.basics.index.impl.TableIndex; +import main.java.com.itmo.java.basics.logic.Table; -import java.io.IOException; -import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.Optional; public class TableImpl implements Table { - - private final String tableName; - private final Path pathToDatabaseRoot; - private final TableIndex tableIndex; - private Segment lastSegment; - - private TableImpl(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { - this.tableName = tableName; - this.pathToDatabaseRoot = pathToDatabaseRoot; - this.tableIndex = tableIndex; - this.lastSegment = SegmentImpl.create(SegmentImpl.createSegmentName(tableName), pathToDatabaseRoot); - } - - private TableImpl(TableInitializationContext context) { - this.tableName = context.getTableName(); - this.lastSegment = context.getCurrentSegment(); - this.pathToDatabaseRoot = context.getTablePath().getParent(); - this.tableIndex = context.getTableIndex(); - } - - public static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { - if (tableName == null) { - throw new DatabaseException("Why tableBase name is null?"); - } - Path pathToTableRoot = Paths.get(pathToDatabaseRoot.toString(), tableName); - try { - Files.createDirectory(pathToTableRoot); - } catch (IOException ex) { - throw new DatabaseException("Error while creating a Table(" + tableName + ") directory"); - } - TableImpl newTb = new TableImpl(tableName, pathToTableRoot, tableIndex); - return new CachingTable(newTb); + static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { + return null; } - - public static Table initializeFromContext(TableInitializationContext context) { - return new CachingTable(new TableImpl(context)); - } - - @Override public String getName() { - return tableName; + return null; } @Override public void write(String objectKey, byte[] objectValue) throws DatabaseException { - try { - boolean canWewrite = lastSegment.write(objectKey, objectValue); - if (!canWewrite) { - lastSegment = SegmentImpl.create(SegmentImpl.createSegmentName(tableName), pathToDatabaseRoot); - lastSegment.write(objectKey, objectValue); - } - tableIndex.onIndexedEntityUpdated(objectKey, lastSegment); - } catch (IOException ex) { - throw new DatabaseException("Writing in database error ", ex); - } } @Override public Optional read(String objectKey) throws DatabaseException { - try { - Optional segmentRead = tableIndex.searchForKey(objectKey); - - if (segmentRead.isPresent()) { - return segmentRead.get().read(objectKey); - } else - return Optional.empty(); - } catch (IOException ex) { - throw new DatabaseException("Reading in database error ", ex); - } + return Optional.empty(); } @Override public void delete(String objectKey) throws DatabaseException { - try { - boolean canDel = lastSegment.delete(objectKey); - if (!canDel) { - lastSegment = SegmentImpl.create(SegmentImpl.createSegmentName(tableName), pathToDatabaseRoot); - lastSegment.delete(objectKey); - } - tableIndex.onIndexedEntityUpdated(objectKey, null); - } catch (IOException ex) { - throw new DatabaseException("Deleting error in Table"); - } + } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java index 3e3bc895..2db39228 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java @@ -1,9 +1,7 @@ -package com.itmo.java.basics.logic.io; +package main.java.com.itmo.java.basics.logic.io; -import com.itmo.java.basics.logic.DatabaseRecord; -import com.itmo.java.basics.logic.WritableDatabaseRecord; -import com.itmo.java.basics.logic.impl.RemoveDatabaseRecord; -import com.itmo.java.basics.logic.impl.SetDatabaseRecord; +import main.java.com.itmo.java.basics.logic.DatabaseRecord; +import main.java.com.itmo.java.basics.logic.WritableDatabaseRecord; import java.io.DataInputStream; import java.io.IOException; @@ -22,24 +20,9 @@ public DatabaseInputStream(InputStream inputStream) { /** * Читает следующую запись (см {@link DatabaseOutputStream#write(WritableDatabaseRecord)}) - * * @return следующую запись, если она существует. {@link Optional#empty()} - если конец файла достигнут */ public Optional readDbUnit() throws IOException { - try { - int keySize = readInt(); - byte[] key = readNBytes(keySize); - int valueSize = readInt(); - - if (valueSize != REMOVED_OBJECT_SIZE) { - byte[] value = readNBytes(valueSize); - Optional result = Optional.of(new SetDatabaseRecord(key, value)); - return result; - } else { - return Optional.of(new RemoveDatabaseRecord(key)); - } - } catch (IOException ex) { - return Optional.empty(); - } + return null; } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java index 5c46dfa5..68c15d7c 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java @@ -1,6 +1,6 @@ -package com.itmo.java.basics.logic.io; +package main.java.com.itmo.java.basics.logic.io; -import com.itmo.java.basics.logic.WritableDatabaseRecord; +import main.java.com.itmo.java.basics.logic.WritableDatabaseRecord; import java.io.DataOutputStream; import java.io.IOException; @@ -11,12 +11,8 @@ */ public class DatabaseOutputStream extends DataOutputStream { - private final OutputStream outputStream; - public DatabaseOutputStream(OutputStream outputStream) { - super(outputStream); - this.outputStream = outputStream; } /** @@ -35,17 +31,6 @@ public DatabaseOutputStream(OutputStream outputStream) { * @throws IOException если запись не удалась */ public int write(WritableDatabaseRecord databaseRecord) throws IOException { - - writeInt(databaseRecord.getKeySize()); - write(databaseRecord.getKey()); - writeInt(databaseRecord.getValueSize()); - - if (databaseRecord.isValuePresented()) { - write(databaseRecord.getValue()); - } - flush(); - - return (int) databaseRecord.size(); - + return 0; } } \ No newline at end of file From af7c074a48b679dfbdd6bf135f336b5ed689ef74 Mon Sep 17 00:00:00 2001 From: shinehlina Date: Wed, 24 Feb 2021 13:14:30 +0300 Subject: [PATCH 002/378] add pom.xml --- pom.xml | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/pom.xml b/pom.xml index 54c242ea..2ec7fade 100644 --- a/pom.xml +++ b/pom.xml @@ -16,21 +16,6 @@ - - org.projectlombok - lombok - 1.18.18 - compile - true - - - - org.mockito - mockito-inline - 3.8.0 - test - - junit junit @@ -53,4 +38,4 @@ https://repo1.maven.org/maven2/ - \ No newline at end of file + From 9ae779d903887485f90c671452ac241eb1b92171 Mon Sep 17 00:00:00 2001 From: Ilya Kuznetsov Date: Thu, 25 Feb 2021 21:53:06 +0300 Subject: [PATCH 003/378] fix: Rename base packages to correspond with file paths (#1) --- .../itmo/java/basics/exceptions/DatabaseException.java | 2 +- src/main/java/com/itmo/java/basics/index/KvsIndex.java | 2 +- .../com/itmo/java/basics/index/SegmentOffsetInfo.java | 2 +- .../com/itmo/java/basics/index/impl/MapBasedKvsIndex.java | 4 ++-- .../com/itmo/java/basics/index/impl/SegmentIndex.java | 4 ++-- .../java/basics/index/impl/SegmentOffsetInfoImpl.java | 4 ++-- .../java/com/itmo/java/basics/index/impl/TableIndex.java | 4 ++-- src/main/java/com/itmo/java/basics/logic/Database.java | 4 ++-- .../java/com/itmo/java/basics/logic/DatabaseRecord.java | 2 +- src/main/java/com/itmo/java/basics/logic/Segment.java | 4 ++-- src/main/java/com/itmo/java/basics/logic/Table.java | 4 ++-- .../itmo/java/basics/logic/WritableDatabaseRecord.java | 2 +- .../com/itmo/java/basics/logic/impl/DatabaseImpl.java | 6 +++--- .../java/com/itmo/java/basics/logic/impl/SegmentImpl.java | 6 +++--- .../java/com/itmo/java/basics/logic/impl/TableImpl.java | 8 ++++---- .../itmo/java/basics/logic/io/DatabaseInputStream.java | 6 +++--- .../itmo/java/basics/logic/io/DatabaseOutputStream.java | 4 ++-- 17 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/exceptions/DatabaseException.java b/src/main/java/com/itmo/java/basics/exceptions/DatabaseException.java index 07d921e7..85a33133 100644 --- a/src/main/java/com/itmo/java/basics/exceptions/DatabaseException.java +++ b/src/main/java/com/itmo/java/basics/exceptions/DatabaseException.java @@ -1,4 +1,4 @@ -package main.java.com.itmo.java.basics.exceptions; +package com.itmo.java.basics.exceptions; public class DatabaseException extends Exception { public DatabaseException(String message) { diff --git a/src/main/java/com/itmo/java/basics/index/KvsIndex.java b/src/main/java/com/itmo/java/basics/index/KvsIndex.java index 5ea358f6..4b7b182f 100644 --- a/src/main/java/com/itmo/java/basics/index/KvsIndex.java +++ b/src/main/java/com/itmo/java/basics/index/KvsIndex.java @@ -1,4 +1,4 @@ -package main.java.com.itmo.java.basics.index; +package com.itmo.java.basics.index; import java.util.Optional; diff --git a/src/main/java/com/itmo/java/basics/index/SegmentOffsetInfo.java b/src/main/java/com/itmo/java/basics/index/SegmentOffsetInfo.java index 38230ed5..93921ecd 100644 --- a/src/main/java/com/itmo/java/basics/index/SegmentOffsetInfo.java +++ b/src/main/java/com/itmo/java/basics/index/SegmentOffsetInfo.java @@ -1,4 +1,4 @@ -package main.java.com.itmo.java.basics.index; +package com.itmo.java.basics.index; public interface SegmentOffsetInfo { long getOffset(); diff --git a/src/main/java/com/itmo/java/basics/index/impl/MapBasedKvsIndex.java b/src/main/java/com/itmo/java/basics/index/impl/MapBasedKvsIndex.java index caae3e48..ba102d65 100644 --- a/src/main/java/com/itmo/java/basics/index/impl/MapBasedKvsIndex.java +++ b/src/main/java/com/itmo/java/basics/index/impl/MapBasedKvsIndex.java @@ -1,6 +1,6 @@ -package main.java.com.itmo.java.basics.index.impl; +package com.itmo.java.basics.index.impl; -import main.java.com.itmo.java.basics.index.KvsIndex; +import com.itmo.java.basics.index.KvsIndex; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/com/itmo/java/basics/index/impl/SegmentIndex.java b/src/main/java/com/itmo/java/basics/index/impl/SegmentIndex.java index ee6b8e48..7370c6d6 100644 --- a/src/main/java/com/itmo/java/basics/index/impl/SegmentIndex.java +++ b/src/main/java/com/itmo/java/basics/index/impl/SegmentIndex.java @@ -1,6 +1,6 @@ -package main.java.com.itmo.java.basics.index.impl; +package com.itmo.java.basics.index.impl; -import main.java.com.itmo.java.basics.index.SegmentOffsetInfo; +import com.itmo.java.basics.index.SegmentOffsetInfo; public class SegmentIndex extends MapBasedKvsIndex { } diff --git a/src/main/java/com/itmo/java/basics/index/impl/SegmentOffsetInfoImpl.java b/src/main/java/com/itmo/java/basics/index/impl/SegmentOffsetInfoImpl.java index 413cc58e..9ee2edc0 100644 --- a/src/main/java/com/itmo/java/basics/index/impl/SegmentOffsetInfoImpl.java +++ b/src/main/java/com/itmo/java/basics/index/impl/SegmentOffsetInfoImpl.java @@ -1,6 +1,6 @@ -package main.java.com.itmo.java.basics.index.impl; +package com.itmo.java.basics.index.impl; -import main.java.com.itmo.java.basics.index.SegmentOffsetInfo; +import com.itmo.java.basics.index.SegmentOffsetInfo; public class SegmentOffsetInfoImpl implements SegmentOffsetInfo { private final long offset; diff --git a/src/main/java/com/itmo/java/basics/index/impl/TableIndex.java b/src/main/java/com/itmo/java/basics/index/impl/TableIndex.java index 86eddfde..eceaeea8 100644 --- a/src/main/java/com/itmo/java/basics/index/impl/TableIndex.java +++ b/src/main/java/com/itmo/java/basics/index/impl/TableIndex.java @@ -1,6 +1,6 @@ -package main.java.com.itmo.java.basics.index.impl; +package com.itmo.java.basics.index.impl; -import main.java.com.itmo.java.basics.logic.Segment; +import com.itmo.java.basics.logic.Segment; public class TableIndex extends MapBasedKvsIndex { } diff --git a/src/main/java/com/itmo/java/basics/logic/Database.java b/src/main/java/com/itmo/java/basics/logic/Database.java index a7aeecca..93365bd7 100644 --- a/src/main/java/com/itmo/java/basics/logic/Database.java +++ b/src/main/java/com/itmo/java/basics/logic/Database.java @@ -1,6 +1,6 @@ -package main.java.com.itmo.java.basics.logic; +package com.itmo.java.basics.logic; -import main.java.com.itmo.java.basics.exceptions.DatabaseException; +import com.itmo.java.basics.exceptions.DatabaseException; import java.util.Optional; diff --git a/src/main/java/com/itmo/java/basics/logic/DatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/DatabaseRecord.java index 4428875e..ee4d17b0 100644 --- a/src/main/java/com/itmo/java/basics/logic/DatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/DatabaseRecord.java @@ -1,4 +1,4 @@ -package main.java.com.itmo.java.basics.logic; +package com.itmo.java.basics.logic; /** * Представляет собой единицу хранения в БД diff --git a/src/main/java/com/itmo/java/basics/logic/Segment.java b/src/main/java/com/itmo/java/basics/logic/Segment.java index 8fd3b4ca..a44c735c 100644 --- a/src/main/java/com/itmo/java/basics/logic/Segment.java +++ b/src/main/java/com/itmo/java/basics/logic/Segment.java @@ -1,6 +1,6 @@ -package main.java.com.itmo.java.basics.logic; +package com.itmo.java.basics.logic; -import main.java.com.itmo.java.basics.exceptions.DatabaseException; +import com.itmo.java.basics.exceptions.DatabaseException; import java.io.IOException; import java.util.Optional; diff --git a/src/main/java/com/itmo/java/basics/logic/Table.java b/src/main/java/com/itmo/java/basics/logic/Table.java index c01f4b4d..863b5567 100644 --- a/src/main/java/com/itmo/java/basics/logic/Table.java +++ b/src/main/java/com/itmo/java/basics/logic/Table.java @@ -1,6 +1,6 @@ -package main.java.com.itmo.java.basics.logic; +package com.itmo.java.basics.logic; -import main.java.com.itmo.java.basics.exceptions.DatabaseException; +import com.itmo.java.basics.exceptions.DatabaseException; import java.util.Optional; diff --git a/src/main/java/com/itmo/java/basics/logic/WritableDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/WritableDatabaseRecord.java index d1be1c27..f1f859c7 100644 --- a/src/main/java/com/itmo/java/basics/logic/WritableDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/WritableDatabaseRecord.java @@ -1,4 +1,4 @@ -package main.java.com.itmo.java.basics.logic; +package com.itmo.java.basics.logic; /** * Содержит информацию о параметрах {@link DatabaseRecord} для хранения в БД diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index cb6dca85..ec9c1aee 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -1,7 +1,7 @@ -package main.java.com.itmo.java.basics.logic.impl; +package com.itmo.java.basics.logic.impl; -import main.java.com.itmo.java.basics.exceptions.DatabaseException; -import main.java.com.itmo.java.basics.logic.Database; +import com.itmo.java.basics.exceptions.DatabaseException; +import com.itmo.java.basics.logic.Database; import java.nio.file.Path; import java.util.Optional; diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index b9318a5a..93b9ccf3 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -1,7 +1,7 @@ -package main.java.com.itmo.java.basics.logic.impl; +package com.itmo.java.basics.logic.impl; -import main.java.com.itmo.java.basics.logic.Segment; -import main.java.com.itmo.java.basics.exceptions.DatabaseException; +import com.itmo.java.basics.logic.Segment; +import com.itmo.java.basics.exceptions.DatabaseException; import java.io.IOException; import java.nio.file.Path; diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index 82db4cd0..78d3ee1d 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -1,8 +1,8 @@ -package main.java.com.itmo.java.basics.logic.impl; +package com.itmo.java.basics.logic.impl; -import main.java.com.itmo.java.basics.exceptions.DatabaseException; -import main.java.com.itmo.java.basics.index.impl.TableIndex; -import main.java.com.itmo.java.basics.logic.Table; +import com.itmo.java.basics.exceptions.DatabaseException; +import com.itmo.java.basics.index.impl.TableIndex; +import com.itmo.java.basics.logic.Table; import java.nio.file.Path; import java.util.Optional; diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java index 2db39228..c3a06bad 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java @@ -1,7 +1,7 @@ -package main.java.com.itmo.java.basics.logic.io; +package com.itmo.java.basics.logic.io; -import main.java.com.itmo.java.basics.logic.DatabaseRecord; -import main.java.com.itmo.java.basics.logic.WritableDatabaseRecord; +import com.itmo.java.basics.logic.DatabaseRecord; +import com.itmo.java.basics.logic.WritableDatabaseRecord; import java.io.DataInputStream; import java.io.IOException; diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java index 68c15d7c..069a0435 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java @@ -1,6 +1,6 @@ -package main.java.com.itmo.java.basics.logic.io; +package com.itmo.java.basics.logic.io; -import main.java.com.itmo.java.basics.logic.WritableDatabaseRecord; +import com.itmo.java.basics.logic.WritableDatabaseRecord; import java.io.DataOutputStream; import java.io.IOException; From 5d826be65fa7591fdfc639646dfbb1ad84667368 Mon Sep 17 00:00:00 2001 From: asukhovitsky Date: Tue, 9 Mar 2021 12:57:08 +0300 Subject: [PATCH 004/378] update --- .../com/itmo/java/basics/logic/Segment.java | 3 +-- .../logic/impl/RemoveDatabaseRecord.java | 21 ++++----------- .../java/basics/logic/impl/SegmentImpl.java | 2 +- .../basics/logic/impl/SetDatabaseRecord.java | 26 +++++-------------- 4 files changed, 14 insertions(+), 38 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/Segment.java b/src/main/java/com/itmo/java/basics/logic/Segment.java index a44c735c..47adfb17 100644 --- a/src/main/java/com/itmo/java/basics/logic/Segment.java +++ b/src/main/java/com/itmo/java/basics/logic/Segment.java @@ -23,9 +23,8 @@ public interface Segment { * @param objectValue значение, которое нужно записать * @return {@code true} - если значение записалось, {@code false} - если нет * @throws IOException если произошла ошибка ввода-вывода. - * @throws DatabaseException */ - boolean write(String objectKey, byte[] objectValue) throws IOException, DatabaseException; + boolean write(String objectKey, byte[] objectValue) throws IOException; /** * Считывает значение из сегмента по переданному ключу. diff --git a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java index 6d09b739..c85eed9b 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java @@ -2,30 +2,20 @@ import com.itmo.java.basics.logic.WritableDatabaseRecord; -/** - * Запись в БД, означающая удаление значения по ключу - */ public class RemoveDatabaseRecord implements WritableDatabaseRecord { - private byte[] key; - private byte[] value; - - public RemoveDatabaseRecord(byte[] key) { - this.key = key; - } - @Override public byte[] getKey() { - return key; + return new byte[0]; } @Override public byte[] getValue() { - return null; + return new byte[0]; } @Override public long size() { - return getKeySize() + 4 + 4; + return 0; } @Override @@ -33,14 +23,13 @@ public boolean isValuePresented() { return false; } - @Override public int getKeySize() { - return key.length; + return 0; } @Override public int getValueSize() { - return -1; + return 0; } } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 93b9ccf3..871dc3a6 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -22,7 +22,7 @@ public String getName() { } @Override - public boolean write(String objectKey, byte[] objectValue) throws IOException, DatabaseException { + public boolean write(String objectKey, byte[] objectValue) throws IOException { return false; } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java index 38ced136..170ddba4 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java @@ -2,47 +2,35 @@ import com.itmo.java.basics.logic.WritableDatabaseRecord; -/** - * Запись в БД, означающая добавление значения по ключу - */ public class SetDatabaseRecord implements WritableDatabaseRecord { - private byte[] key; - private byte[] value; - - public SetDatabaseRecord(byte[] key, byte[] value) { - this.key = key; - this.value = value; - } - - @Override public byte[] getKey() { - return key; + return new byte[0]; } @Override public byte[] getValue() { - return value; + return new byte[0]; } @Override public long size() { - return getKeySize() + getValueSize() + 4 + 4; + return 0; } @Override public boolean isValuePresented() { - return true; + return false; } @Override public int getKeySize() { - return key.length; + return 0; } @Override public int getValueSize() { - return value.length; + return 0; } -} \ No newline at end of file +} From c1952bd2b8793d4b359e0ee6323648aeddb19f0f Mon Sep 17 00:00:00 2001 From: Max Golish Date: Wed, 17 Mar 2021 00:23:24 +0300 Subject: [PATCH 005/378] fix: Edit javadoc --- .../java/com/itmo/java/basics/logic/Database.java | 2 +- .../java/com/itmo/java/basics/logic/Segment.java | 12 +++++++----- src/main/java/com/itmo/java/basics/logic/Table.java | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/Database.java b/src/main/java/com/itmo/java/basics/logic/Database.java index 93365bd7..4757df0d 100644 --- a/src/main/java/com/itmo/java/basics/logic/Database.java +++ b/src/main/java/com/itmo/java/basics/logic/Database.java @@ -36,7 +36,7 @@ public interface Database { * @param tableName таблица, из которой нужно считать значение * @param objectKey ключ, по которому нужно получить значение * @return значение, которое находится по ключу - * @throws DatabaseException если не была найдена указанная таблица, или если не была найдена запись по данному ключу, или произошла ошибка ввода-вывода + * @throws DatabaseException если не была найдена указанная таблица, или произошла ошибка ввода-вывода */ Optional read(String tableName, String objectKey) throws DatabaseException; diff --git a/src/main/java/com/itmo/java/basics/logic/Segment.java b/src/main/java/com/itmo/java/basics/logic/Segment.java index 47adfb17..95125e5d 100644 --- a/src/main/java/com/itmo/java/basics/logic/Segment.java +++ b/src/main/java/com/itmo/java/basics/logic/Segment.java @@ -1,10 +1,15 @@ package com.itmo.java.basics.logic; -import com.itmo.java.basics.exceptions.DatabaseException; - import java.io.IOException; import java.util.Optional; +/** + * Сегмент - append-only файл, хранящий пары ключ-значение, разделенные специальным символом. + * - имеет ограниченный размер, большие значения (>100000) записываются в последний сегмент, если он не read-only + * - при превышении размера сегмента создается новый сегмент и дальнейшие операции записи производятся в него + * - именование файла-сегмента должно позволять установить очередность их появления + * - является неизменяемым после появления более нового сегмента + */ public interface Segment { /** * Возвращает имя сегмента. @@ -13,9 +18,6 @@ public interface Segment { */ String getName(); - // todo sukhoa in future may return something like SegmentWriteResult .. with report and error details? - // for new returns false if cannot allocate requested capacity - // exception is questionable /** * Записывает значение по указанному ключу в сегмент. * diff --git a/src/main/java/com/itmo/java/basics/logic/Table.java b/src/main/java/com/itmo/java/basics/logic/Table.java index 863b5567..0bf55f8b 100644 --- a/src/main/java/com/itmo/java/basics/logic/Table.java +++ b/src/main/java/com/itmo/java/basics/logic/Table.java @@ -35,7 +35,7 @@ public interface Table { * * @param objectKey ключ, по которому нужно получить значение * @return значение, которое находится по ключу - * @throws DatabaseException если не была найдена запись по данному ключу или произошла ошибка ввода-вывода + * @throws DatabaseException если произошла ошибка ввода-вывода */ Optional read(String objectKey) throws DatabaseException; From 4d95eef533e709ccdabe5d16a1abfa0baa2af12c Mon Sep 17 00:00:00 2001 From: Fredi Kats Date: Thu, 1 Apr 2021 01:20:53 +0300 Subject: [PATCH 006/378] init: add base code for second lab --- .../java/basics/config/DatabaseConfig.java | 8 +-- .../impl/ExecutionEnvironmentImpl.java | 13 +---- .../DatabaseInitializationContextImpl.java | 15 ++---- .../impl/DatabaseInitializer.java | 40 ++------------- .../impl/DatabaseServerInitializer.java | 39 -------------- .../impl/InitializationContextImpl.java | 8 +-- .../SegmentInitializationContextImpl.java | 25 ++------- .../impl/SegmentInitializer.java | 51 ------------------- .../impl/TableInitializationContextImpl.java | 18 ++----- .../initialization/impl/TableInitializer.java | 38 +------------- .../java/basics/logic/impl/DatabaseImpl.java | 5 ++ .../java/basics/logic/impl/SegmentImpl.java | 9 +++- .../java/basics/logic/impl/TableImpl.java | 7 ++- 13 files changed, 41 insertions(+), 235 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java b/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java index 6ae46737..485309b0 100644 --- a/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java +++ b/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java @@ -1,15 +1,9 @@ package com.itmo.java.basics.config; public class DatabaseConfig { - public static final String DEFAULT_WORKING_PATH = "db_files"; - private final String workingPath; - - public DatabaseConfig(String workingPath) { - this.workingPath = workingPath; - } public String getWorkingPath() { - return workingPath; + return null; } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java index 61006344..e7ea7aa2 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java +++ b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java @@ -5,32 +5,23 @@ import com.itmo.java.basics.logic.Database; import java.nio.file.Path; -import java.util.HashMap; -import java.util.Map; import java.util.Optional; public class ExecutionEnvironmentImpl implements ExecutionEnvironment { - - private final DatabaseConfig dbConfig; - private final Map dataBase; - public ExecutionEnvironmentImpl(DatabaseConfig config) { - dbConfig = config; - dataBase = new HashMap<>(); } @Override public Optional getDatabase(String name) { - return Optional.ofNullable(dataBase.get(name)); + return null; } @Override public void addDatabase(Database db) { - dataBase.put(db.getName(), db); } @Override public Path getWorkingPath() { - return Path.of(dbConfig.getWorkingPath()); + return null; } } diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java index 2c436c12..d71ca20b 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java @@ -4,38 +4,29 @@ import com.itmo.java.basics.logic.Table; import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.HashMap; import java.util.Map; public class DatabaseInitializationContextImpl implements DatabaseInitializationContext { - private final String dbName; - private final Path dbRoot; - private final Map tablesMap = new HashMap<>(); - public DatabaseInitializationContextImpl(String dbName, Path databaseRoot) { - this.dbName = dbName; - this.dbRoot = Path.of(databaseRoot.toString(), dbName); } @Override public String getDbName() { - return dbName; + return null; } @Override public Path getDatabasePath() { - return Paths.get(dbRoot.toString()); + return null; } @Override public Map getTables() { - return tablesMap; + return null; } @Override public void addTable(Table table) { - tablesMap.put(table.getName(), table); } } diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java index 9696500e..f9c36a06 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java @@ -1,56 +1,22 @@ package com.itmo.java.basics.initialization.impl; import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.index.impl.TableIndex; -import com.itmo.java.basics.initialization.DatabaseInitializationContext; import com.itmo.java.basics.initialization.InitializationContext; import com.itmo.java.basics.initialization.Initializer; -import com.itmo.java.basics.logic.Database; -import com.itmo.java.basics.logic.impl.DatabaseImpl; - -import java.io.File; -import java.nio.file.Files; public class DatabaseInitializer implements Initializer { - - private final TableInitializer tableInitializer; - public DatabaseInitializer(TableInitializer tableInitializer) { - this.tableInitializer = tableInitializer; } /** * Добавляет в контекст информацию об инициализируемой бд. * Запускает инициализацию всех таблиц это базы * - * @param context контекст с информацией об инициализируемой бд и об окружении + * @param initialContext контекст с информацией об инициализируемой бд и об окружении * @throws DatabaseException если в контексте лежит неправильный путь к базе, невозможно прочитать содержимого папки, - * или если возникла ошибка дочерних инициализаторов + * или если возникла ошибка дочерних инициализаторов */ @Override - public void perform(InitializationContext context) throws DatabaseException { - - if (context.executionEnvironment() == null) { - throw new DatabaseException("Context executionEnvironment is null"); - } - - DatabaseInitializationContext dbinitialContext = context.currentDbContext(); - if (!Files.exists(dbinitialContext.getDatabasePath())) { - throw new DatabaseException("We dont have this " + dbinitialContext.getDbName()); - } - - File curFile = new File(dbinitialContext.getDatabasePath().toString()); - - if (!curFile.exists()) { - throw new DatabaseException(dbinitialContext.getDbName() + " does not exist"); - } - - File[] directory = curFile.listFiles(); - for (File table : directory) { - TableInitializationContextImpl tableContext = new TableInitializationContextImpl(table.getName(), dbinitialContext.getDatabasePath(), new TableIndex()); - tableInitializer.perform(new InitializationContextImpl(context.executionEnvironment(), dbinitialContext, tableContext, null)); - } - Database database = DatabaseImpl.initializeFromContext(dbinitialContext); - context.executionEnvironment().addDatabase(database); + public void perform(InitializationContext initialContext) throws DatabaseException { } } diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java index 72f311d7..3d124324 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java @@ -1,20 +1,12 @@ package com.itmo.java.basics.initialization.impl; -import com.itmo.java.basics.console.ExecutionEnvironment; import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.initialization.InitializationContext; import com.itmo.java.basics.initialization.Initializer; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; - public class DatabaseServerInitializer implements Initializer { - private final Initializer databaseInitializer; public DatabaseServerInitializer(DatabaseInitializer databaseInitializer) { - this.databaseInitializer = databaseInitializer; } /** @@ -26,36 +18,5 @@ public DatabaseServerInitializer(DatabaseInitializer databaseInitializer) { */ @Override public void perform(InitializationContext context) throws DatabaseException { - - if (context.executionEnvironment() == null) { - throw new DatabaseException("Context executionEnvironment is null"); - } - - ExecutionEnvironment ExecutionEnvironment = context.executionEnvironment(); - Path path = ExecutionEnvironment.getWorkingPath(); - - if (!Files.exists(path)) { - try { - Files.createDirectory(path); - } catch (IOException ex) { - throw new DatabaseException("Error while creating " + path.toString(), ex); - } - } - File curFile = new File(path.toString()); - File[] directory = curFile.listFiles(); - if (directory == null) { - throw new DatabaseException("Error while working with" + curFile.toString()); - } - - for (File in : directory) { - DatabaseInitializationContextImpl dbContext = new DatabaseInitializationContextImpl(in.getName(), path); - databaseInitializer.perform(new InitializationContextImpl(context.executionEnvironment(), dbContext, null, null)); - } } } - - - - - - diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/InitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/InitializationContextImpl.java index 114e0dae..552ede30 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/InitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/InitializationContextImpl.java @@ -13,10 +13,10 @@ public class InitializationContextImpl implements InitializationContext { private final TableInitializationContext currentTableContext; private final SegmentInitializationContext currentSegmentContext; - public InitializationContextImpl(ExecutionEnvironment executionEnvironment, - DatabaseInitializationContext currentDatabaseContext, - TableInitializationContext currentTableContext, - SegmentInitializationContext currentSegmentContext) { + private InitializationContextImpl(ExecutionEnvironment executionEnvironment, + DatabaseInitializationContext currentDatabaseContext, + TableInitializationContext currentTableContext, + SegmentInitializationContext currentSegmentContext) { this.executionEnvironment = executionEnvironment; this.currentDatabaseContext = currentDatabaseContext; this.currentTableContext = currentTableContext; diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java index 84844e53..45ad02b5 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java @@ -4,46 +4,31 @@ import com.itmo.java.basics.initialization.SegmentInitializationContext; import java.nio.file.Path; -import java.nio.file.Paths; public class SegmentInitializationContextImpl implements SegmentInitializationContext { - - private final String segmentName; - private final Path segmentPath; - private final long currentSize; - private final SegmentIndex segmentIndex; - - public SegmentInitializationContextImpl(String segmentName, Path segmentPath, int currentSize, SegmentIndex index) { - this.segmentName = segmentName; - this.segmentPath = segmentPath; - this.currentSize = currentSize; - this.segmentIndex = index; + private SegmentInitializationContextImpl(String segmentName, Path segmentPath, int currentSize, SegmentIndex index) { } public SegmentInitializationContextImpl(String segmentName, Path tablePath, int currentSize) { - this.segmentName = segmentName; - this.segmentPath = Paths.get(tablePath.toString(), segmentName); - this.currentSize = currentSize; - this.segmentIndex = new SegmentIndex(); } @Override public String getSegmentName() { - return segmentName; + return null; } @Override public Path getSegmentPath() { - return segmentPath; + return null; } @Override public SegmentIndex getIndex() { - return segmentIndex; + return null; } @Override public long getCurrentSize() { - return currentSize; + return 0; } } diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java index 90409c2a..de935219 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java @@ -1,23 +1,8 @@ package com.itmo.java.basics.initialization.impl; import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.index.impl.SegmentIndex; -import com.itmo.java.basics.index.impl.SegmentOffsetInfoImpl; import com.itmo.java.basics.initialization.InitializationContext; import com.itmo.java.basics.initialization.Initializer; -import com.itmo.java.basics.initialization.SegmentInitializationContext; -import com.itmo.java.basics.logic.DatabaseRecord; -import com.itmo.java.basics.logic.Segment; -import com.itmo.java.basics.logic.impl.SegmentImpl; -import com.itmo.java.basics.logic.io.DatabaseInputStream; - -import java.io.FileInputStream; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; public class SegmentInitializer implements Initializer { @@ -32,41 +17,5 @@ public class SegmentInitializer implements Initializer { */ @Override public void perform(InitializationContext context) throws DatabaseException { - - if (context.currentSegmentContext() == null) { - throw new DatabaseException("Context segment is null"); - } - - int size = 0; - SegmentInitializationContext segmentinitialContext = context.currentSegmentContext(); - SegmentIndex segIndex = segmentinitialContext.getIndex(); - Path segPath = segmentinitialContext.getSegmentPath(); - Segment segment = SegmentImpl.initializeFromContext(segmentinitialContext); - List keys = new ArrayList<>(); - - if (!Files.exists(segPath)) { - throw new DatabaseException(segmentinitialContext.getSegmentName() + " does not exist"); - } - try (DatabaseInputStream InputStream = new DatabaseInputStream(new FileInputStream(segPath.toFile()))) { - Optional dbUnitOp = InputStream.readDbUnit(); - while (dbUnitOp.isPresent()) { - DatabaseRecord dbUnits = dbUnitOp.get(); - segIndex.onIndexedEntityUpdated(new String(dbUnits.getKey()), new SegmentOffsetInfoImpl(size)); - size += dbUnits.size(); - keys.add(new String(dbUnits.getKey())); - dbUnitOp = InputStream.readDbUnit(); - } - } catch (IOException ex) { - throw new DatabaseException("Error while initialisation segment", ex); - } - - Segment newSegment = SegmentImpl.initializeFromContext(new SegmentInitializationContextImpl(segmentinitialContext.getSegmentName(), segmentinitialContext.getSegmentPath(), size, segIndex)); - - for (String in : keys) { - context.currentTableContext().getTableIndex().onIndexedEntityUpdated(in, segment); - } - context.currentTableContext().updateCurrentSegment(newSegment); } } - - diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java index f757eca1..9d52528e 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java @@ -7,40 +7,30 @@ import java.nio.file.Path; public class TableInitializationContextImpl implements TableInitializationContext { - - private final String tableName; - private final Path databasePath; - private final TableIndex tableIndex; - private Segment lastSegment; - public TableInitializationContextImpl(String tableName, Path databasePath, TableIndex tableIndex) { - this.tableName = tableName; - this.databasePath = Path.of(databasePath.toString(), tableName); - this.tableIndex = tableIndex; } @Override public String getTableName() { - return tableName; + return null; } @Override public Path getTablePath() { - return databasePath; + return null; } @Override public TableIndex getTableIndex() { - return tableIndex; + return null; } @Override public Segment getCurrentSegment() { - return lastSegment; + return null; } @Override public void updateCurrentSegment(Segment segment) { - lastSegment = segment; } } diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java index 4162c1a8..c6c7c620 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java @@ -3,22 +3,10 @@ import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.initialization.InitializationContext; import com.itmo.java.basics.initialization.Initializer; -import com.itmo.java.basics.initialization.SegmentInitializationContext; -import com.itmo.java.basics.initialization.TableInitializationContext; -import com.itmo.java.basics.logic.Table; -import com.itmo.java.basics.logic.impl.TableImpl; - -import java.io.File; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; public class TableInitializer implements Initializer { - private final Initializer segmentInitializer; - public TableInitializer(SegmentInitializer segmentInitializer) { - this.segmentInitializer = segmentInitializer; } /** @@ -27,33 +15,9 @@ public TableInitializer(SegmentInitializer segmentInitializer) { * * @param context контекст с информацией об инициализируемой бд, окружении, таблицы * @throws DatabaseException если в контексте лежит неправильный путь к таблице, невозможно прочитать содержимого папки, - * или если возникла ошибка ошибка дочерних инициализаторов + * или если возникла ошибка ошибка дочерних инициализаторов */ @Override - public void perform(InitializationContext context) throws DatabaseException { - - if (context.currentDbContext() == null) { - throw new DatabaseException("Context Db is null"); - } - - TableInitializationContext tbinitalContext = context.currentTableContext(); - File curFile = new File(tbinitalContext.getTablePath().toString()); - - if (!curFile.exists()) { - throw new DatabaseException("Directory " + tbinitalContext.getTableName() + " does not exist"); - } - - File[] files = curFile.listFiles(); - List segments = Arrays.asList(files); - Collections.sort(segments); - - for (File seg : segments) { - SegmentInitializationContext segmentContext = new SegmentInitializationContextImpl(seg.getName(), tbinitalContext.getTablePath(), 0); - segmentInitializer.perform(new InitializationContextImpl(context.executionEnvironment(), context.currentDbContext(), context.currentTableContext(), segmentContext)); - } - - Table newTable = TableImpl.initializeFromContext(tbinitalContext); - context.currentDbContext().addTable(newTable); } } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index ec9c1aee..2864e87d 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -1,6 +1,7 @@ package com.itmo.java.basics.logic.impl; import com.itmo.java.basics.exceptions.DatabaseException; +import com.itmo.java.basics.initialization.DatabaseInitializationContext; import com.itmo.java.basics.logic.Database; import java.nio.file.Path; @@ -11,6 +12,10 @@ public static Database create(String dbName, Path databaseRoot) throws DatabaseE return null; } + public static Database initializeFromContext(DatabaseInitializationContext context) { + return null; + } + @Override public String getName() { return null; diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 871dc3a6..8152f75f 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -1,5 +1,6 @@ package com.itmo.java.basics.logic.impl; +import com.itmo.java.basics.initialization.SegmentInitializationContext; import com.itmo.java.basics.logic.Segment; import com.itmo.java.basics.exceptions.DatabaseException; @@ -8,8 +9,12 @@ import java.util.Optional; public class SegmentImpl implements Segment { - static Segment create(String segmentName, Path tableRootPath) throws DatabaseException { - throw new UnsupportedOperationException(); // todo implement + public static Segment create(String segmentName, Path tableRootPath) throws DatabaseException { + throw new UnsupportedOperationException(); + } + + public static Segment initializeFromContext(SegmentInitializationContext context) { + return null; } static String createSegmentName(String tableName) { diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index 78d3ee1d..16d8a872 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -2,13 +2,18 @@ import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.index.impl.TableIndex; +import com.itmo.java.basics.initialization.TableInitializationContext; import com.itmo.java.basics.logic.Table; import java.nio.file.Path; import java.util.Optional; public class TableImpl implements Table { - static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { + public static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { + return null; + } + + public static Table initializeFromContext(TableInitializationContext context) { return null; } From a79e3bd900703b3d3ce6f8cb853b0a94703cf60c Mon Sep 17 00:00:00 2001 From: Fredi Kats Date: Sun, 25 Apr 2021 23:07:16 +0300 Subject: [PATCH 007/378] feat: update docs --- .../SegmentInitializationContextImpl.java | 11 ++++++-- .../java/basics/logic/impl/CachingTable.java | 3 +++ .../basics/logic/impl/DatabaseCacheImpl.java | 25 ++++--------------- .../java/basics/logic/impl/DatabaseImpl.java | 4 +++ .../logic/impl/RemoveDatabaseRecord.java | 3 +++ .../java/basics/logic/impl/SegmentImpl.java | 7 ++++++ .../basics/logic/impl/SetDatabaseRecord.java | 3 +++ .../java/basics/logic/impl/TableImpl.java | 9 +++++++ 8 files changed, 43 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java index 45ad02b5..127f71ca 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java @@ -6,10 +6,17 @@ import java.nio.file.Path; public class SegmentInitializationContextImpl implements SegmentInitializationContext { - private SegmentInitializationContextImpl(String segmentName, Path segmentPath, int currentSize, SegmentIndex index) { + public SegmentInitializationContextImpl(String segmentName, Path segmentPath, long currentSize, SegmentIndex index) { } - public SegmentInitializationContextImpl(String segmentName, Path tablePath, int currentSize) { + /** + * Не используйте этот конструктор. Оставлен для совместимости со старыми тестами. + */ + public SegmentInitializationContextImpl(String segmentName, Path tablePath, long currentSize) { + } + + public SegmentInitializationContextImpl(String segmentName, Path tablePath) { + this(segmentName, tablePath.resolve(segmentName), 0, new SegmentIndex()); } @Override diff --git a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java index 05f09cbc..40c8d66e 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java @@ -6,6 +6,9 @@ import java.util.Optional; +/** + * Декторато для таблицы. Кэширует данные + */ public class CachingTable implements Table { private final Table cacheTable; diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java index ef91ea58..8ec5e331 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java @@ -2,36 +2,21 @@ import com.itmo.java.basics.logic.DatabaseCache; -import java.util.LinkedHashMap; -import java.util.Map; - public class DatabaseCacheImpl implements DatabaseCache { - - private static final int dbCapacity = 5000; - private final Map dbCache; - - public DatabaseCacheImpl() { - - this.dbCache = new LinkedHashMap(dbCapacity, 1f, true) { - @Override - protected boolean removeEldestEntry(Map.Entry eldest) { - return size() > dbCapacity; - } - }; - } + private static final int CAPACITY = 5_000; @Override public byte[] get(String key) { - return dbCache.get(key); + return new byte[0]; } @Override public void set(String key, byte[] value) { - dbCache.put(key, value); + } @Override public void delete(String key) { - dbCache.remove(key); + } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index 2864e87d..d00df223 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -8,6 +8,10 @@ import java.util.Optional; public class DatabaseImpl implements Database { + /** + * @param databaseRoot путь к директории, которая может содержать несколько БД, + * поэтому при создании БД необходимо создать директорию внутри databaseRoot. + */ public static Database create(String dbName, Path databaseRoot) throws DatabaseException { return null; } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java index c85eed9b..8c13ec39 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java @@ -2,6 +2,9 @@ import com.itmo.java.basics.logic.WritableDatabaseRecord; +/** + * Запись в БД, означающая удаление значения по ключу + */ public class RemoveDatabaseRecord implements WritableDatabaseRecord { @Override public byte[] getKey() { diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 8152f75f..8fcb0d21 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -8,6 +8,13 @@ import java.nio.file.Path; import java.util.Optional; +/** + * Сегмент - append-only файл, хранящий пары ключ-значение, разделенные специальным символом. + * - имеет ограниченный размер, большие значения (>100000) записываются в последний сегмент, если он не read-only + * - при превышении размера сегмента создается новый сегмент и дальнейшие операции записи производятся в него + * - именование файла-сегмента должно позволять установить очередность их появления + * - является неизменяемым после появления более нового сегмента + */ public class SegmentImpl implements Segment { public static Segment create(String segmentName, Path tableRootPath) throws DatabaseException { throw new UnsupportedOperationException(); diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java index 170ddba4..9164106b 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java @@ -2,6 +2,9 @@ import com.itmo.java.basics.logic.WritableDatabaseRecord; +/** + * Запись в БД, означающая добавление значения по ключу + */ public class SetDatabaseRecord implements WritableDatabaseRecord { @Override diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index 16d8a872..428a3fa6 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -8,6 +8,15 @@ import java.nio.file.Path; import java.util.Optional; +/** + * Таблица - логическая сущность, представляющая собой набор файлов-сегментов, которые объединены одним + * именем и используются для хранения однотипных данных (данных, представляющих собой одну и ту же сущность, + * например, таблица "Пользователи") + *

+ * - имеет единый размер сегмента + * - представляет из себя директорию в файловой системе, именованную как таблица + * и хранящую файлы-сегменты данной таблицы + */ public class TableImpl implements Table { public static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { return null; From 0ebdfe4ffcb3ab06c9e6441c012dd2d1282bc56f Mon Sep 17 00:00:00 2001 From: shine2 Date: Sat, 1 May 2021 12:33:24 +0300 Subject: [PATCH 008/378] init: add base code for third lab --- .../com/itmo/java/basics/DatabaseServer.java | 27 +++---- .../basics/console/DatabaseCommandResult.java | 11 +-- .../java/basics/console/DatabaseCommands.java | 17 +++-- .../console/impl/CreateDatabaseCommand.java | 36 ++------- .../console/impl/CreateTableCommand.java | 42 ++--------- .../basics/console/impl/DeleteKeyCommand.java | 46 ++---------- .../impl/FailedDatabaseCommandResult.java | 15 ++-- .../basics/console/impl/GetKeyCommand.java | 48 ++---------- .../basics/console/impl/SetKeyCommand.java | 48 ++---------- .../impl/SuccessDatabaseCommandResult.java | 16 ++-- .../java/basics/logic/DatabaseFactory.java | 2 +- .../java/basics/logic/impl/SegmentImpl.java | 2 +- .../java/client/client/SimpleKvsClient.java | 75 ++++--------------- .../command/CreateDatabaseKvsCommand.java | 19 ++--- .../client/command/CreateTableKvsCommand.java | 25 +++---- .../java/client/command/DeleteKvsCommand.java | 26 ++----- .../java/client/command/GetKvsCommand.java | 21 ++---- .../itmo/java/client/command/KvsCommand.java | 6 +- .../java/client/command/SetKvsCommand.java | 24 ++---- .../DirectReferenceKvsConnection.java | 18 ++--- .../java/client/connection/KvsConnection.java | 3 +- .../itmo/java/protocol/model/RespArray.java | 23 ++---- .../java/protocol/model/RespBulkString.java | 23 ++---- .../java/protocol/model/RespCommandId.java | 19 ++--- .../itmo/java/protocol/model/RespError.java | 14 ++-- .../itmo/java/protocol/model/RespObject.java | 2 +- 26 files changed, 162 insertions(+), 446 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/DatabaseServer.java b/src/main/java/com/itmo/java/basics/DatabaseServer.java index fc9b5972..7fb6c866 100644 --- a/src/main/java/com/itmo/java/basics/DatabaseServer.java +++ b/src/main/java/com/itmo/java/basics/DatabaseServer.java @@ -1,19 +1,15 @@ package com.itmo.java.basics; -import com.itmo.java.basics.console.*; +import com.itmo.java.basics.console.DatabaseCommand; +import com.itmo.java.basics.console.DatabaseCommandResult; +import com.itmo.java.basics.console.ExecutionEnvironment; import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.initialization.impl.*; +import com.itmo.java.basics.initialization.impl.DatabaseServerInitializer; import com.itmo.java.protocol.model.RespArray; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; public class DatabaseServer { - - private final ExecutorService executorService = Executors.newSingleThreadExecutor(); - private final ExecutionEnvironment enviroment; - /** * Con structor * @@ -22,20 +18,17 @@ public class DatabaseServer { * @throws DatabaseException если произошла ошибка инициализации */ public static DatabaseServer initialize(ExecutionEnvironment env, DatabaseServerInitializer initializer) throws DatabaseException { - initializer.perform(new InitializationContextImpl(env, null, null, null)); - return new DatabaseServer(env); - } - - private DatabaseServer(ExecutionEnvironment env) { - this.enviroment = env; + //TODO implement + return null; } public CompletableFuture executeNextCommand(RespArray message) { - return CompletableFuture.supplyAsync(() -> - DatabaseCommands.valueOf(message.getObjects().get(DatabaseCommandArgPositions.COMMAND_NAME.getPositionIndex()).asString()).getCommand(enviroment, message.getObjects()).execute(), executorService); + //TODO implement + return null; } public CompletableFuture executeNextCommand(DatabaseCommand command) { - return CompletableFuture.supplyAsync(command::execute, executorService); + //TODO implement + return null; } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java b/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java index fb491ece..3ea9e4a4 100644 --- a/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java +++ b/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java @@ -1,7 +1,5 @@ package com.itmo.java.basics.console; -import com.itmo.java.basics.console.impl.FailedDatabaseCommandResult; -import com.itmo.java.basics.console.impl.SuccessDatabaseCommandResult; import com.itmo.java.protocol.model.RespObject; public interface DatabaseCommandResult extends DatabaseApiSerializable { @@ -13,7 +11,8 @@ public interface DatabaseCommandResult extends DatabaseApiSerializable { * @return успешный результат выполнения команды, который был сформирован */ static DatabaseCommandResult success(byte[] result) { - return new SuccessDatabaseCommandResult(result); + //TODO implement + return null; } /** @@ -23,7 +22,8 @@ static DatabaseCommandResult success(byte[] result) { * @return результат зафейленный команды, при выполнении которой произошла ошибка */ static DatabaseCommandResult error(String message) { - return new FailedDatabaseCommandResult(message); + //TODO implement + return null; } /** @@ -34,7 +34,8 @@ static DatabaseCommandResult error(String message) { * @return результат команды, при выполнении которой произошла ошибка */ static DatabaseCommandResult error(Exception exception) { - return new FailedDatabaseCommandResult(exception.getMessage()); + //TODO implement + return null; } /** diff --git a/src/main/java/com/itmo/java/basics/console/DatabaseCommands.java b/src/main/java/com/itmo/java/basics/console/DatabaseCommands.java index 5b73b14b..30268987 100644 --- a/src/main/java/com/itmo/java/basics/console/DatabaseCommands.java +++ b/src/main/java/com/itmo/java/basics/console/DatabaseCommands.java @@ -1,7 +1,5 @@ package com.itmo.java.basics.console; -import com.itmo.java.basics.console.impl.*; -import com.itmo.java.basics.logic.impl.DatabaseImpl; import com.itmo.java.protocol.model.RespObject; import java.util.List; @@ -15,31 +13,36 @@ public enum DatabaseCommands { CREATE_DATABASE { @Override public DatabaseCommand getCommand(ExecutionEnvironment env, List commandArgs) { - return new CreateDatabaseCommand(env, DatabaseImpl::create, commandArgs); + //TODO implement + return null; } }, CREATE_TABLE { @Override public DatabaseCommand getCommand(ExecutionEnvironment env, List commandArgs) { - return new CreateTableCommand(env, commandArgs); + //TODO implement + return null; } }, SET_KEY { @Override public DatabaseCommand getCommand(ExecutionEnvironment env, List commandArgs) { - return new SetKeyCommand(env, commandArgs); + //TODO implement + return null; } }, GET_KEY { @Override public DatabaseCommand getCommand(ExecutionEnvironment env, List commandArgs) { - return new GetKeyCommand(env, commandArgs); + //TODO implement + return null; } }, DELETE_KEY { @Override public DatabaseCommand getCommand(ExecutionEnvironment env, List commandArgs) { - return new DeleteKeyCommand(env, commandArgs); + //TODO implement + return null; } }; diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java index f1f0b5b1..97e45650 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java @@ -4,11 +4,9 @@ import com.itmo.java.basics.console.DatabaseCommandArgPositions; import com.itmo.java.basics.console.DatabaseCommandResult; import com.itmo.java.basics.console.ExecutionEnvironment; -import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.logic.DatabaseFactory; import com.itmo.java.protocol.model.RespObject; -import java.nio.charset.StandardCharsets; import java.util.List; /** @@ -16,29 +14,19 @@ */ public class CreateDatabaseCommand implements DatabaseCommand { - private final ExecutionEnvironment environment; - private final DatabaseFactory dbfactory; - private final List commandargs; - private static final int numberOfAgrguments = 3; - /** * Создает команду. *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * - * @param env env - * @param factory функция создания базы данных (пример: DatabaseImpl::create) - * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. - * Id команды, имя команды, имя создаваемой бд + * @param env env + * @param factory функция создания базы данных (пример: DatabaseImpl::create) + * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * Id команды, имя команды, имя создаваемой бд * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public CreateDatabaseCommand(ExecutionEnvironment env, DatabaseFactory factory, List comArgs) { - if (comArgs.size() != numberOfAgrguments) { - throw new IllegalArgumentException("Why " + comArgs.size() + "!= 3 , in CreateDataBaseCommand"); - } - environment = env; - dbfactory = factory; - commandargs = comArgs; + public CreateDatabaseCommand(ExecutionEnvironment env, DatabaseFactory factory, List commandArgs) { + //TODO implement } /** @@ -48,15 +36,7 @@ public CreateDatabaseCommand(ExecutionEnvironment env, DatabaseFactory factory, */ @Override public DatabaseCommandResult execute() { - try { - String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - if (dbName == null) { - throw new DatabaseException("Why dbname is null? "); - } - environment.addDatabase(dbfactory.createNonExistent(dbName, environment.getWorkingPath())); - return DatabaseCommandResult.success(("Success add " + dbName).getBytes(StandardCharsets.UTF_8)); - } catch (DatabaseException ex) { - return new FailedDatabaseCommandResult(ex.getMessage()); - } + //TODO implement + return null; } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java index b813f2ac..7965480b 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java @@ -4,39 +4,27 @@ import com.itmo.java.basics.console.DatabaseCommandArgPositions; import com.itmo.java.basics.console.DatabaseCommandResult; import com.itmo.java.basics.console.ExecutionEnvironment; -import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.logic.Database; import com.itmo.java.protocol.model.RespObject; -import java.nio.charset.StandardCharsets; import java.util.List; -import java.util.Optional; /** * Команда для создания базы таблицы */ public class CreateTableCommand implements DatabaseCommand { - private final ExecutionEnvironment environment; - private final List commandargs; - private static final int numberOfAgrguments = 4; - /** * Создает команду *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * - * @param env env - * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. - * Id команды, имя команды, имя бд, имя таблицы + * @param env env + * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * Id команды, имя команды, имя бд, имя таблицы * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public CreateTableCommand(ExecutionEnvironment env, List comArgs) { - if (comArgs.size() != numberOfAgrguments) { - throw new IllegalArgumentException("Why " + comArgs.size() + "!= 4 , in CreateTableCommand"); - } - environment = env; - commandargs = comArgs; + public CreateTableCommand(ExecutionEnvironment env, List commandArgs) { + //TODO implement } /** @@ -46,23 +34,7 @@ public CreateTableCommand(ExecutionEnvironment env, List comArgs) { */ @Override public DatabaseCommandResult execute() { - try { - String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - if (dbName == null) { - throw new DatabaseException("Why dbname is null?"); - } - String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); - if (tbName == null) { - throw new DatabaseException("Why tbName is null?"); - } - Optional dataBase = environment.getDatabase(dbName); - if (dataBase.isEmpty()) { - throw new DatabaseException("We dont have" + dbName); - } - dataBase.get().createTableIfNotExists(tbName); - return DatabaseCommandResult.success(("Success add " + dbName + tbName).getBytes(StandardCharsets.UTF_8)); - } catch (DatabaseException ex) { - return new FailedDatabaseCommandResult(ex.getMessage()); - } + //TODO implement + return null; } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java index c9e426f1..ccb52507 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java @@ -4,39 +4,27 @@ import com.itmo.java.basics.console.DatabaseCommandArgPositions; import com.itmo.java.basics.console.DatabaseCommandResult; import com.itmo.java.basics.console.ExecutionEnvironment; -import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.logic.Database; import com.itmo.java.protocol.model.RespObject; -import java.nio.charset.StandardCharsets; import java.util.List; -import java.util.Optional; /** * Команда для создания удаления значения по ключу */ public class DeleteKeyCommand implements DatabaseCommand { - private final ExecutionEnvironment environment; - private final List commandargs; - private static final int numberOfAgrguments = 5; - /** * Создает команду. *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * - * @param env env - * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. - * Id команды, имя команды, имя бд, таблицы, ключ + * @param env env + * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * Id команды, имя команды, имя бд, таблицы, ключ * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { - if (comArgs.size() != numberOfAgrguments) { - throw new IllegalArgumentException("Why " + comArgs.size() + "!= 5 , in CreateTableCommand"); - } - environment = env; - commandargs = comArgs; + public DeleteKeyCommand(ExecutionEnvironment env, List commandArgs) { + //TODO implement } /** @@ -46,27 +34,7 @@ public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { */ @Override public DatabaseCommandResult execute() { - try { - String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - if (dbName == null) { - throw new DatabaseException("Why dbname is null?"); - } - String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); - if (tbName == null) { - throw new DatabaseException("Why tbName is null?"); - } - String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); - if (key == null) { - throw new DatabaseException("Why key is null?"); - } - Optional dataBase = environment.getDatabase(dbName); - if (dataBase.isEmpty()) { - throw new DatabaseException("We dont have" + dbName); - } - dataBase.get().delete(tbName, key); - return DatabaseCommandResult.success(("Success del " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); - } catch (DatabaseException ex) { - return new FailedDatabaseCommandResult(ex.getMessage()); - } + //TODO implement + return null; } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java b/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java index fc08c3c1..cd54a9ab 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java +++ b/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java @@ -4,18 +4,13 @@ import com.itmo.java.protocol.model.RespError; import com.itmo.java.protocol.model.RespObject; -import java.nio.charset.StandardCharsets; - /** * Зафейленная команда */ public class FailedDatabaseCommandResult implements DatabaseCommandResult { - - private final String payLoad; - - public FailedDatabaseCommandResult(String pload) { - payLoad = pload; + public FailedDatabaseCommandResult(String payload) { + //TODO implement } /** @@ -23,7 +18,8 @@ public FailedDatabaseCommandResult(String pload) { */ @Override public String getPayLoad() { - return payLoad; + //TODO implement + return null; } @Override @@ -36,6 +32,7 @@ public boolean isSuccess() { */ @Override public RespObject serialize() { - return new RespError(payLoad.getBytes(StandardCharsets.UTF_8)); + //TODO implement + return null; } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java index 07095674..6c91c7e1 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java @@ -4,38 +4,27 @@ import com.itmo.java.basics.console.DatabaseCommandArgPositions; import com.itmo.java.basics.console.DatabaseCommandResult; import com.itmo.java.basics.console.ExecutionEnvironment; -import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.logic.Database; import com.itmo.java.protocol.model.RespObject; import java.util.List; -import java.util.Optional; /** * Команда для чтения данных по ключу */ public class GetKeyCommand implements DatabaseCommand { - private final ExecutionEnvironment environment; - private final List commandargs; - private static final int numberOfAgrguments = 5; - /** * Создает команду. *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * - * @param env env - * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. - * Id команды, имя команды, имя бд, таблицы, ключ + * @param env env + * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * Id команды, имя команды, имя бд, таблицы, ключ * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public GetKeyCommand(ExecutionEnvironment env, List comArgs) { - if (comArgs.size() != numberOfAgrguments) { - throw new IllegalArgumentException("Why " + comArgs.size() + "!= 5 , in CreateTableCommand"); - } - environment = env; - commandargs = comArgs; + public GetKeyCommand(ExecutionEnvironment env, List commandArgs) { + //TODO implement } /** @@ -45,30 +34,7 @@ public GetKeyCommand(ExecutionEnvironment env, List comArgs) { */ @Override public DatabaseCommandResult execute() { - try { - String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - if (dbName == null) { - throw new DatabaseException("Why dbname is null?"); - } - String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); - if (tbName == null) { - throw new DatabaseException("Why tbName is null?"); - } - String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); - if (key == null) { - throw new DatabaseException("Why key is null?"); - } - Optional dataBase = environment.getDatabase(dbName); - if (dataBase.isEmpty()) { - throw new DatabaseException("We dont have" + dbName); - } - Optional value = dataBase.get().read(tbName, key); - if (value.isEmpty()) { - throw new DatabaseException("We dont have" + dbName + tbName + key); - } - return DatabaseCommandResult.success(value.get()); - } catch (DatabaseException ex) { - return new FailedDatabaseCommandResult(ex.getMessage()); - } + //TODO implement + return null; } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java index a95597b5..7789834c 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java @@ -4,39 +4,28 @@ import com.itmo.java.basics.console.DatabaseCommandArgPositions; import com.itmo.java.basics.console.DatabaseCommandResult; import com.itmo.java.basics.console.ExecutionEnvironment; -import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.logic.Database; import com.itmo.java.protocol.model.RespObject; -import java.nio.charset.StandardCharsets; import java.util.List; -import java.util.Optional; + /** * Команда для создания записи значения */ public class SetKeyCommand implements DatabaseCommand { - private final ExecutionEnvironment environment; - private final List commandargs; - private static final int numberOfAgrguments = 6; - /** * Создает команду. *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * - * @param env env - * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. - * Id команды, имя команды, имя бд, таблицы, ключ, значение + * @param env env + * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * Id команды, имя команды, имя бд, таблицы, ключ, значение * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public SetKeyCommand(ExecutionEnvironment env, List comArgs) { - if (comArgs.size() != numberOfAgrguments) { - throw new IllegalArgumentException("Why " + comArgs.size() + "!= 5 , in CreateTableCommand"); - } - environment = env; - commandargs = comArgs; + public SetKeyCommand(ExecutionEnvironment env, List commandArgs) { + //TODO implement } /** @@ -46,28 +35,7 @@ public SetKeyCommand(ExecutionEnvironment env, List comArgs) { */ @Override public DatabaseCommandResult execute() { - try { - String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - if (dbName == null) { - throw new DatabaseException("Why dbname is null?"); - } - String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); - if (tbName == null) { - throw new DatabaseException("Why tbName is null?"); - } - String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); - if (key == null) { - throw new DatabaseException("Why key is null?"); - } - Optional dataBase = environment.getDatabase(dbName); - if (dataBase.isEmpty()) { - throw new DatabaseException("We dont have" + dbName); - } - byte[] value = commandargs.get(DatabaseCommandArgPositions.VALUE.getPositionIndex()).asString().getBytes(StandardCharsets.UTF_8); - dataBase.get().write(tbName, key, value); - return DatabaseCommandResult.success(("Success add key " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); - } catch (DatabaseException ex) { - return new FailedDatabaseCommandResult(ex.getMessage()); - } + //TODO implement + return null; } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java b/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java index ae8fad44..d7b998db 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java +++ b/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java @@ -9,19 +9,14 @@ */ public class SuccessDatabaseCommandResult implements DatabaseCommandResult { - private final byte[] payLoad; - - public SuccessDatabaseCommandResult(byte[] pload) { - payLoad = pload; + public SuccessDatabaseCommandResult(byte[] payload) { + //TODO implement } @Override public String getPayLoad() { - if(payLoad != null) { - return new String(payLoad); - } else { - return null; - } + //TODO implement + return null; } @Override @@ -34,6 +29,7 @@ public boolean isSuccess() { */ @Override public RespObject serialize() { - return new RespBulkString(payLoad); + //TODO implement + return null; } } diff --git a/src/main/java/com/itmo/java/basics/logic/DatabaseFactory.java b/src/main/java/com/itmo/java/basics/logic/DatabaseFactory.java index 641c322f..9e076b86 100644 --- a/src/main/java/com/itmo/java/basics/logic/DatabaseFactory.java +++ b/src/main/java/com/itmo/java/basics/logic/DatabaseFactory.java @@ -11,7 +11,7 @@ public interface DatabaseFactory { * * @param dbName имя базы данных * @param dbRoot путь до директории, в которой будет создана база данных - * @return объект созданной бд + * @return объект созданной таблицы * @throws DatabaseException если база данных с данным именем уже существует или если произошла ошибка ввода-вывода */ Database createNonExistent(String dbName, Path dbRoot) throws DatabaseException; diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 8fcb0d21..a635ace6 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -1,8 +1,8 @@ package com.itmo.java.basics.logic.impl; +import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.initialization.SegmentInitializationContext; import com.itmo.java.basics.logic.Segment; -import com.itmo.java.basics.exceptions.DatabaseException; import java.io.IOException; import java.nio.file.Path; diff --git a/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java b/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java index 0cd550af..1e8b33d2 100644 --- a/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java +++ b/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java @@ -1,97 +1,50 @@ package com.itmo.java.client.client; -import com.itmo.java.basics.console.DatabaseCommandResult; -import com.itmo.java.client.command.*; + import com.itmo.java.client.connection.KvsConnection; -import com.itmo.java.client.exception.ConnectionException; import com.itmo.java.client.exception.DatabaseExecutionException; -import com.itmo.java.protocol.model.RespObject; import java.util.function.Supplier; public class SimpleKvsClient implements KvsClient { - private final String dbName; - private final KvsConnection connectionSupplier; - /** - * Конструктор + * Констурктор * * @param databaseName имя базы, с которой работает - * @param connectionSupplier метод создания подключения к базе + * @param connectionSupplier метод создания коннекшена к базе */ public SimpleKvsClient(String databaseName, Supplier connectionSupplier) { - dbName = databaseName; - this.connectionSupplier = connectionSupplier.get(); + //TODO implement } @Override public String createDatabase() throws DatabaseExecutionException { - try { - CreateDatabaseKvsCommand dbKvsCom = new CreateDatabaseKvsCommand(dbName); - RespObject obj = connectionSupplier.send(dbKvsCom.getCommandId(), dbKvsCom.serialize()); - if (obj.isError()) { - throw new DatabaseExecutionException(obj.asString()); - } - return obj.asString(); - } catch (ConnectionException ex) { - return DatabaseCommandResult.error(ex).getPayLoad(); - } + //TODO implement + return null; } @Override public String createTable(String tableName) throws DatabaseExecutionException { - try { - CreateTableKvsCommand tbKvsCom = new CreateTableKvsCommand(dbName, tableName); - RespObject obj = connectionSupplier.send(tbKvsCom.getCommandId(), tbKvsCom.serialize()); - if (obj.isError()) { - throw new DatabaseExecutionException(obj.asString()); - } - return obj.asString(); - } catch (ConnectionException ex) { - return DatabaseCommandResult.error(ex).getPayLoad(); - } + //TODO implement + return null; } @Override public String get(String tableName, String key) throws DatabaseExecutionException { - try { - GetKvsCommand getKvsCom = new GetKvsCommand(dbName, tableName, key); - RespObject obj = connectionSupplier.send(getKvsCom.getCommandId(), getKvsCom.serialize()); - if (obj.isError()) { - throw new DatabaseExecutionException(obj.asString()); - } - return obj.asString(); - } catch (ConnectionException ex) { - return DatabaseCommandResult.error(ex).getPayLoad(); - } + //TODO implement + return null; } @Override public String set(String tableName, String key, String value) throws DatabaseExecutionException { - try { - SetKvsCommand setKvsCom = new SetKvsCommand(dbName, tableName, key, value); - RespObject obj = connectionSupplier.send(setKvsCom.getCommandId(), setKvsCom.serialize()); - if (obj.isError()) { - throw new DatabaseExecutionException(obj.asString()); - } - return obj.asString(); - } catch (ConnectionException ex) { - return DatabaseCommandResult.error(ex).getPayLoad(); - } + //TODO implement + return null; } @Override public String delete(String tableName, String key) throws DatabaseExecutionException { - try { - DeleteKvsCommand delKvsCom = new DeleteKvsCommand(dbName, tableName, key); - RespObject obj = connectionSupplier.send(delKvsCom.getCommandId(), delKvsCom.serialize()); - if (obj.isError()) { - throw new DatabaseExecutionException(obj.asString()); - } - return obj.asString(); - } catch (ConnectionException ex) { - return DatabaseCommandResult.error(ex).getPayLoad(); - } + //TODO implement + return null; } } diff --git a/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java b/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java index 964abfab..c4331742 100644 --- a/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java @@ -3,17 +3,13 @@ import com.itmo.java.protocol.model.RespArray; import com.itmo.java.protocol.model.RespBulkString; import com.itmo.java.protocol.model.RespCommandId; - -import java.nio.charset.StandardCharsets; +import com.itmo.java.protocol.model.RespObject; /** * Команда для создания бд */ public class CreateDatabaseKvsCommand implements KvsCommand { - private static final String COMMAND_NAME = "CREATE_DATABASE"; - private final String dbName; - private final int dbID; /** * Создает объект @@ -21,8 +17,7 @@ public class CreateDatabaseKvsCommand implements KvsCommand { * @param databaseName имя базы данных */ public CreateDatabaseKvsCommand(String databaseName) { - dbID = idGen.get(); - dbName = databaseName; + //TODO implement } /** @@ -31,14 +26,14 @@ public CreateDatabaseKvsCommand(String databaseName) { * @return объект */ @Override - public RespArray serialize() { - return new RespArray(new RespCommandId(dbID), - new RespBulkString(COMMAND_NAME.getBytes(StandardCharsets.UTF_8)), - new RespBulkString(dbName.getBytes(StandardCharsets.UTF_8))); + public RespObject serialize() { + //TODO implement + return null; } @Override public int getCommandId() { - return dbID; + //TODO implement + return 0; } } diff --git a/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java b/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java index edcd1746..12c56024 100644 --- a/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java @@ -1,25 +1,19 @@ package com.itmo.java.client.command; +import com.itmo.java.basics.console.DatabaseCommands; import com.itmo.java.protocol.model.RespArray; import com.itmo.java.protocol.model.RespBulkString; import com.itmo.java.protocol.model.RespCommandId; - -import java.nio.charset.StandardCharsets; +import com.itmo.java.protocol.model.RespObject; /** * Команда для создания таблицы */ public class CreateTableKvsCommand implements KvsCommand { - - private static final String COMMAND_NAME = "CREATE_TABLE"; - private final String dbName; - private final int tbID; - private final String tbName; + private static final DatabaseCommands COMMAND_NAME = DatabaseCommands.CREATE_TABLE; public CreateTableKvsCommand(String databaseName, String tableName) { - dbName = databaseName; - tbName = tableName; - tbID = idGen.get(); + //TODO implement } /** @@ -28,15 +22,14 @@ public CreateTableKvsCommand(String databaseName, String tableName) { * @return объект */ @Override - public RespArray serialize() { - return new RespArray(new RespCommandId(tbID), - new RespBulkString(COMMAND_NAME.getBytes(StandardCharsets.UTF_8)), - new RespBulkString(dbName.getBytes(StandardCharsets.UTF_8)), - new RespBulkString(tbName.getBytes(StandardCharsets.UTF_8))); + public RespObject serialize() { + //TODO implement + return null; } @Override public int getCommandId() { - return tbID; + //TODO implement + return 0; } } diff --git a/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java b/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java index ea7e1827..23125470 100644 --- a/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java @@ -3,22 +3,14 @@ import com.itmo.java.protocol.model.RespArray; import com.itmo.java.protocol.model.RespBulkString; import com.itmo.java.protocol.model.RespCommandId; - -import java.nio.charset.StandardCharsets; +import com.itmo.java.protocol.model.RespObject; public class DeleteKvsCommand implements KvsCommand { - private static final String COMMAND_NAME = "DELETE_KEY"; - private final String dbName; - private final String tbName; - private final String Key; - private final int delID; + public DeleteKvsCommand(String databaseName, String tableName, String key) { - dbName = databaseName; - tbName = tableName; - Key = key; - delID = idGen.get(); + //TODO implement } /** @@ -27,16 +19,14 @@ public DeleteKvsCommand(String databaseName, String tableName, String key) { * @return объект */ @Override - public RespArray serialize() { - return new RespArray(new RespCommandId(delID), - new RespBulkString(COMMAND_NAME.getBytes(StandardCharsets.UTF_8)), - new RespBulkString(dbName.getBytes(StandardCharsets.UTF_8)), - new RespBulkString(tbName.getBytes(StandardCharsets.UTF_8)), - new RespBulkString(Key.getBytes(StandardCharsets.UTF_8))); + public RespObject serialize() { + //TODO implement + return null; } @Override public int getCommandId() { - return delID; + //TODO implement + return 0; } } diff --git a/src/main/java/com/itmo/java/client/command/GetKvsCommand.java b/src/main/java/com/itmo/java/client/command/GetKvsCommand.java index 43009e30..6933c9f9 100644 --- a/src/main/java/com/itmo/java/client/command/GetKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/GetKvsCommand.java @@ -4,21 +4,12 @@ import com.itmo.java.protocol.model.RespBulkString; import com.itmo.java.protocol.model.RespCommandId; -import java.nio.charset.StandardCharsets; - public class GetKvsCommand implements KvsCommand { private static final String COMMAND_NAME = "GET_KEY"; - private final String dbName; - private final String tbName; - private final String Key; - private final int getID; public GetKvsCommand(String databaseName, String tableName, String key) { - dbName = databaseName; - tbName = tableName; - Key = key; - getID = idGen.get(); + //TODO implement } /** @@ -28,15 +19,13 @@ public GetKvsCommand(String databaseName, String tableName, String key) { */ @Override public RespArray serialize() { - return new RespArray(new RespCommandId(getID), - new RespBulkString(COMMAND_NAME.getBytes(StandardCharsets.UTF_8)), - new RespBulkString(dbName.getBytes(StandardCharsets.UTF_8)), - new RespBulkString(tbName.getBytes(StandardCharsets.UTF_8)), - new RespBulkString(Key.getBytes(StandardCharsets.UTF_8))); + //TODO implement + return null; } @Override public int getCommandId() { - return getID; + //TODO implement + return 0; } } diff --git a/src/main/java/com/itmo/java/client/command/KvsCommand.java b/src/main/java/com/itmo/java/client/command/KvsCommand.java index b5b4ed6b..b22b5b7d 100644 --- a/src/main/java/com/itmo/java/client/command/KvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/KvsCommand.java @@ -1,13 +1,13 @@ package com.itmo.java.client.command; -import com.itmo.java.protocol.model.RespArray; +import com.itmo.java.protocol.model.RespObject; import java.util.concurrent.atomic.AtomicInteger; public interface KvsCommand { /** * Счетчик для команды. Каждая созданная команда использует это поле для создания id, инкрементирует значение - * Первая команда создается с id 0 + * Первая комада создается с id 0 */ AtomicInteger idGen = new AtomicInteger(); @@ -16,7 +16,7 @@ public interface KvsCommand { * * @return RESP объект */ - RespArray serialize(); + RespObject serialize(); /** * Id команды diff --git a/src/main/java/com/itmo/java/client/command/SetKvsCommand.java b/src/main/java/com/itmo/java/client/command/SetKvsCommand.java index cb704e90..7e913ba4 100644 --- a/src/main/java/com/itmo/java/client/command/SetKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/SetKvsCommand.java @@ -4,23 +4,12 @@ import com.itmo.java.protocol.model.RespBulkString; import com.itmo.java.protocol.model.RespCommandId; -import java.nio.charset.StandardCharsets; - public class SetKvsCommand implements KvsCommand { private static final String COMMAND_NAME = "SET_KEY"; - private final String dbName; - private final String tbName; - private final String Key; - private final int setID; - private final String Value; public SetKvsCommand(String databaseName, String tableName, String key, String value) { - dbName = databaseName; - tbName = tableName; - Key = key; - setID = idGen.get(); - Value = value; + //TODO implement } /** @@ -30,16 +19,13 @@ public SetKvsCommand(String databaseName, String tableName, String key, String v */ @Override public RespArray serialize() { - return new RespArray(new RespCommandId(setID), - new RespBulkString(COMMAND_NAME.getBytes(StandardCharsets.UTF_8)), - new RespBulkString(dbName.getBytes(StandardCharsets.UTF_8)), - new RespBulkString(tbName.getBytes(StandardCharsets.UTF_8)), - new RespBulkString(Key.getBytes(StandardCharsets.UTF_8)), - new RespBulkString(Value.getBytes(StandardCharsets.UTF_8))); + //TODO implement + return null; } @Override public int getCommandId() { - return setID; + //TODO implement + return 0; } } diff --git a/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java b/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java index 40d0ccbd..4062446b 100644 --- a/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java @@ -2,30 +2,22 @@ import com.itmo.java.basics.DatabaseServer; import com.itmo.java.client.exception.ConnectionException; -import com.itmo.java.protocol.model.RespArray; import com.itmo.java.protocol.model.RespObject; -import java.util.concurrent.ExecutionException; - /** - * Реализация подключения, когда есть прямая ссылка на объект + * Реализация коннекшена, когда есть прямая ссылка на объект * (пока еще нет реализации сокетов) */ public class DirectReferenceKvsConnection implements KvsConnection { - private final DatabaseServer dbServer; - public DirectReferenceKvsConnection(DatabaseServer databaseServer) { - dbServer = databaseServer; + //TODO implement } @Override - public RespObject send(int commandId, RespArray command) throws ConnectionException { - try { - return dbServer.executeNextCommand(command).get().serialize(); - } catch (ExecutionException | InterruptedException ex) { - throw new ConnectionException(ex.getMessage(), ex.getCause()); - } + public RespObject send(int commandId, RespObject command) throws ConnectionException { + //TODO implement + return null; } /** diff --git a/src/main/java/com/itmo/java/client/connection/KvsConnection.java b/src/main/java/com/itmo/java/client/connection/KvsConnection.java index 741387fb..1d16c3da 100644 --- a/src/main/java/com/itmo/java/client/connection/KvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/KvsConnection.java @@ -1,7 +1,6 @@ package com.itmo.java.client.connection; import com.itmo.java.client.exception.ConnectionException; -import com.itmo.java.protocol.model.RespArray; import com.itmo.java.protocol.model.RespObject; /** @@ -16,5 +15,5 @@ public interface KvsConnection extends AutoCloseable { * @return Результат исполнения * @throws ConnectionException если не удалось прочитать ответ */ - RespObject send(int commandId, RespArray command) throws ConnectionException; + RespObject send(int commandId, RespObject command) throws ConnectionException; } diff --git a/src/main/java/com/itmo/java/protocol/model/RespArray.java b/src/main/java/com/itmo/java/protocol/model/RespArray.java index a3200f35..7ea1d934 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespArray.java +++ b/src/main/java/com/itmo/java/protocol/model/RespArray.java @@ -2,10 +2,7 @@ import java.io.IOException; import java.io.OutputStream; -import java.nio.charset.StandardCharsets; -import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; /** * Массив RESP объектов @@ -16,10 +13,9 @@ public class RespArray implements RespObject { * Код объекта */ public static final byte CODE = '*'; - private List objects; - public RespArray(RespObject... obj) { - objects = Arrays.asList(obj); + public RespArray(RespObject... objects) { + //TODO implement } /** @@ -39,20 +35,17 @@ public boolean isError() { */ @Override public String asString() { - return objects.stream().map(object -> asString()).collect(Collectors.joining(" ")); + //TODO implement + return null; } @Override - public void write(OutputStream output) throws IOException { - output.write(CODE); - output.write(Integer.toString(objects.size()).getBytes(StandardCharsets.UTF_8)); - output.write(CRLF); - for (RespObject obj : objects) { - obj.write(output); - } + public void write(OutputStream os) throws IOException { + //TODO implement } public List getObjects() { - return objects; + //TODO implement + return null; } } diff --git a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java index c3a53d83..0d1463a6 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java +++ b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java @@ -2,7 +2,6 @@ import java.io.IOException; import java.io.OutputStream; -import java.nio.charset.StandardCharsets; /** * Строка @@ -12,12 +11,11 @@ public class RespBulkString implements RespObject { * Код объекта */ public static final byte CODE = '$'; - public static final int NULL_STRING_SIZE = -1; - private final byte[] data; + public static final int NULL_STRING_SIZE = -1; - public RespBulkString(byte[] inform) { - data = inform; + public RespBulkString(byte[] data) { + //TODO implement } /** @@ -37,19 +35,12 @@ public boolean isError() { */ @Override public String asString() { - return new String(data); + //TODO implement + return null; } @Override - public void write(OutputStream output) throws IOException { - output.write(CODE); - if (data == null) { - output.write(Integer.toString(NULL_STRING_SIZE).getBytes(StandardCharsets.UTF_8)); - } else { - output.write(Integer.toString(data.length).getBytes(StandardCharsets.UTF_8)); - output.write(CRLF); - output.write(data); - } - output.write(CRLF); + public void write(OutputStream os) throws IOException { + //TODO implement } } diff --git a/src/main/java/com/itmo/java/protocol/model/RespCommandId.java b/src/main/java/com/itmo/java/protocol/model/RespCommandId.java index d7213a79..40327cd4 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespCommandId.java +++ b/src/main/java/com/itmo/java/protocol/model/RespCommandId.java @@ -2,7 +2,6 @@ import java.io.IOException; import java.io.OutputStream; -import java.nio.charset.StandardCharsets; /** * Id @@ -13,10 +12,9 @@ public class RespCommandId implements RespObject { * Код объекта */ public static final byte CODE = '!'; - private final int commandId; - public RespCommandId(int comId) { - commandId = comId; + public RespCommandId(int commandId) { + //TODO implement } /** @@ -31,17 +29,12 @@ public boolean isError() { @Override public String asString() { - return Integer.toString(commandId); + //TODO implement + return null; } @Override - public void write(OutputStream output) throws IOException { - output.write(CODE); - int commandByte = commandId; - output.write((commandByte >>> 24) & 0xFF); - output.write((commandByte >>> 16) & 0xFF); - output.write((commandByte >>> 8) & 0xFF); - output.write(commandByte &0xFF); - output.write(CRLF); + public void write(OutputStream os) throws IOException { + //TODO implement } } diff --git a/src/main/java/com/itmo/java/protocol/model/RespError.java b/src/main/java/com/itmo/java/protocol/model/RespError.java index 8688757d..f998c07f 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespError.java +++ b/src/main/java/com/itmo/java/protocol/model/RespError.java @@ -12,10 +12,9 @@ public class RespError implements RespObject { * Код объекта */ public static final byte CODE = '-'; - public byte[] message; - public RespError(byte[] mes) { - message = mes; + public RespError(byte[] message) { + //TODO implement } /** @@ -30,13 +29,12 @@ public boolean isError() { @Override public String asString() { - return new String(message); + //TODO implement + return null; } @Override - public void write(OutputStream output) throws IOException { - output.write(CODE); - output.write(message); - output.write(CRLF); + public void write(OutputStream os) throws IOException { + //TODO implement } } diff --git a/src/main/java/com/itmo/java/protocol/model/RespObject.java b/src/main/java/com/itmo/java/protocol/model/RespObject.java index 4388f02a..be37b0f2 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespObject.java +++ b/src/main/java/com/itmo/java/protocol/model/RespObject.java @@ -5,7 +5,7 @@ import java.nio.charset.StandardCharsets; /** - * Представляет собой объект в RESP + * Преставляет собой объект в RESP */ public interface RespObject { From e6dbf92dabb4dd20da5d646ded96ce96de37880a Mon Sep 17 00:00:00 2001 From: shine2 Date: Tue, 4 May 2021 12:07:05 +0300 Subject: [PATCH 009/378] change to RespArray --- .../itmo/java/client/command/CreateDatabaseKvsCommand.java | 3 +-- .../com/itmo/java/client/command/CreateTableKvsCommand.java | 6 ++---- .../java/com/itmo/java/client/command/DeleteKvsCommand.java | 3 +-- src/main/java/com/itmo/java/client/command/KvsCommand.java | 4 ++-- .../client/connection/DirectReferenceKvsConnection.java | 3 ++- .../java/com/itmo/java/client/connection/KvsConnection.java | 3 ++- 6 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java b/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java index c4331742..b01c9c9a 100644 --- a/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java @@ -3,7 +3,6 @@ import com.itmo.java.protocol.model.RespArray; import com.itmo.java.protocol.model.RespBulkString; import com.itmo.java.protocol.model.RespCommandId; -import com.itmo.java.protocol.model.RespObject; /** * Команда для создания бд @@ -26,7 +25,7 @@ public CreateDatabaseKvsCommand(String databaseName) { * @return объект */ @Override - public RespObject serialize() { + public RespArray serialize() { //TODO implement return null; } diff --git a/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java b/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java index 12c56024..45b1642d 100644 --- a/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java @@ -1,16 +1,14 @@ package com.itmo.java.client.command; -import com.itmo.java.basics.console.DatabaseCommands; import com.itmo.java.protocol.model.RespArray; import com.itmo.java.protocol.model.RespBulkString; import com.itmo.java.protocol.model.RespCommandId; -import com.itmo.java.protocol.model.RespObject; /** * Команда для создания таблицы */ public class CreateTableKvsCommand implements KvsCommand { - private static final DatabaseCommands COMMAND_NAME = DatabaseCommands.CREATE_TABLE; + private static final String COMMAND_NAME = "CREATE_TABLE"; public CreateTableKvsCommand(String databaseName, String tableName) { //TODO implement @@ -22,7 +20,7 @@ public CreateTableKvsCommand(String databaseName, String tableName) { * @return объект */ @Override - public RespObject serialize() { + public RespArray serialize() { //TODO implement return null; } diff --git a/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java b/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java index 23125470..4278ce85 100644 --- a/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java @@ -3,7 +3,6 @@ import com.itmo.java.protocol.model.RespArray; import com.itmo.java.protocol.model.RespBulkString; import com.itmo.java.protocol.model.RespCommandId; -import com.itmo.java.protocol.model.RespObject; public class DeleteKvsCommand implements KvsCommand { private static final String COMMAND_NAME = "DELETE_KEY"; @@ -19,7 +18,7 @@ public DeleteKvsCommand(String databaseName, String tableName, String key) { * @return объект */ @Override - public RespObject serialize() { + public RespArray serialize() { //TODO implement return null; } diff --git a/src/main/java/com/itmo/java/client/command/KvsCommand.java b/src/main/java/com/itmo/java/client/command/KvsCommand.java index b22b5b7d..3e7c22fe 100644 --- a/src/main/java/com/itmo/java/client/command/KvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/KvsCommand.java @@ -1,6 +1,6 @@ package com.itmo.java.client.command; -import com.itmo.java.protocol.model.RespObject; +import com.itmo.java.protocol.model.RespArray; import java.util.concurrent.atomic.AtomicInteger; @@ -16,7 +16,7 @@ public interface KvsCommand { * * @return RESP объект */ - RespObject serialize(); + RespArray serialize(); /** * Id команды diff --git a/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java b/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java index 4062446b..7ceab3f3 100644 --- a/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java @@ -2,6 +2,7 @@ import com.itmo.java.basics.DatabaseServer; import com.itmo.java.client.exception.ConnectionException; +import com.itmo.java.protocol.model.RespArray; import com.itmo.java.protocol.model.RespObject; /** @@ -15,7 +16,7 @@ public DirectReferenceKvsConnection(DatabaseServer databaseServer) { } @Override - public RespObject send(int commandId, RespObject command) throws ConnectionException { + public RespObject send(int commandId, RespArray command) throws ConnectionException { //TODO implement return null; } diff --git a/src/main/java/com/itmo/java/client/connection/KvsConnection.java b/src/main/java/com/itmo/java/client/connection/KvsConnection.java index 1d16c3da..741387fb 100644 --- a/src/main/java/com/itmo/java/client/connection/KvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/KvsConnection.java @@ -1,6 +1,7 @@ package com.itmo.java.client.connection; import com.itmo.java.client.exception.ConnectionException; +import com.itmo.java.protocol.model.RespArray; import com.itmo.java.protocol.model.RespObject; /** @@ -15,5 +16,5 @@ public interface KvsConnection extends AutoCloseable { * @return Результат исполнения * @throws ConnectionException если не удалось прочитать ответ */ - RespObject send(int commandId, RespObject command) throws ConnectionException; + RespObject send(int commandId, RespArray command) throws ConnectionException; } From 30e9fc60aa19df0df3d38aae97fcc2bd9c68d3b5 Mon Sep 17 00:00:00 2001 From: shinehlina Date: Sun, 2 May 2021 14:07:46 +0300 Subject: [PATCH 010/378] fix docs --- src/main/java/com/itmo/java/basics/logic/DatabaseFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/basics/logic/DatabaseFactory.java b/src/main/java/com/itmo/java/basics/logic/DatabaseFactory.java index 9e076b86..641c322f 100644 --- a/src/main/java/com/itmo/java/basics/logic/DatabaseFactory.java +++ b/src/main/java/com/itmo/java/basics/logic/DatabaseFactory.java @@ -11,7 +11,7 @@ public interface DatabaseFactory { * * @param dbName имя базы данных * @param dbRoot путь до директории, в которой будет создана база данных - * @return объект созданной таблицы + * @return объект созданной бд * @throws DatabaseException если база данных с данным именем уже существует или если произошла ошибка ввода-вывода */ Database createNonExistent(String dbName, Path dbRoot) throws DatabaseException; From 4ec7589b8902ddcb8795e2f3603a6c006be01161 Mon Sep 17 00:00:00 2001 From: asukhovitsky Date: Sat, 8 May 2021 14:51:02 +0300 Subject: [PATCH 011/378] minor --- .../java/com/itmo/java/basics/DatabaseServer.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/DatabaseServer.java b/src/main/java/com/itmo/java/basics/DatabaseServer.java index 7fb6c866..2a770b1f 100644 --- a/src/main/java/com/itmo/java/basics/DatabaseServer.java +++ b/src/main/java/com/itmo/java/basics/DatabaseServer.java @@ -8,8 +8,13 @@ import com.itmo.java.protocol.model.RespArray; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; public class DatabaseServer { + + private ExecutorService executorService = Executors.newSingleThreadExecutor(); + /** * Con structor * @@ -23,8 +28,10 @@ public static DatabaseServer initialize(ExecutionEnvironment env, DatabaseServer } public CompletableFuture executeNextCommand(RespArray message) { - //TODO implement - return null; + return CompletableFuture.supplyAsync(() -> { + // code here... + return null; + }, executorService); } public CompletableFuture executeNextCommand(DatabaseCommand command) { From bd3fd2cf0b3abea204260c8a076764991ec4341c Mon Sep 17 00:00:00 2001 From: superpupervlad Date: Wed, 12 May 2021 09:01:54 +0300 Subject: [PATCH 012/378] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=BE=D0=BF=D0=B5=D1=87=D0=B0=D1=82=D0=BA=D0=B8?= =?UTF-8?q?=20(#3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/itmo/java/basics/DatabaseServer.java | 4 ++-- .../com/itmo/java/basics/console/DatabaseCommandResult.java | 2 +- .../com/itmo/java/basics/console/impl/SetKeyCommand.java | 1 - .../initialization/impl/DatabaseServerInitializer.java | 2 +- .../java/basics/initialization/impl/SegmentInitializer.java | 1 - .../com/itmo/java/basics/logic/WritableDatabaseRecord.java | 2 +- .../java/com/itmo/java/basics/logic/impl/CachingTable.java | 2 +- .../com/itmo/java/basics/logic/io/DatabaseOutputStream.java | 2 +- .../java/com/itmo/java/client/client/SimpleKvsClient.java | 5 ++--- src/main/java/com/itmo/java/client/command/KvsCommand.java | 2 +- .../java/client/connection/DirectReferenceKvsConnection.java | 2 +- src/main/java/com/itmo/java/protocol/model/RespObject.java | 2 +- 12 files changed, 12 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/DatabaseServer.java b/src/main/java/com/itmo/java/basics/DatabaseServer.java index 2a770b1f..e54d5722 100644 --- a/src/main/java/com/itmo/java/basics/DatabaseServer.java +++ b/src/main/java/com/itmo/java/basics/DatabaseServer.java @@ -16,9 +16,9 @@ public class DatabaseServer { private ExecutorService executorService = Executors.newSingleThreadExecutor(); /** - * Con structor + * Конструктор * - * @param env env для инициализации. Далее работа происходит с заполненым объектом + * @param env env для инициализации. Далее работа происходит с заполненным объектом * @param initializer готовый чейн инициализации * @throws DatabaseException если произошла ошибка инициализации */ diff --git a/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java b/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java index 3ea9e4a4..996e418d 100644 --- a/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java +++ b/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java @@ -28,7 +28,7 @@ static DatabaseCommandResult error(String message) { /** * Формирует результат команды, при выполнении которой произошла ошибка. - * Берется сообщение из исключения. Если в исключении нет сообщения - стэктрейст + * Берется сообщение из исключения. Если в исключении нет сообщения - стэктрейс * * @param exception исключение, из которого нужно сформировать результат выполнения команды * @return результат команды, при выполнении которой произошла ошибка diff --git a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java index 7789834c..debef1c0 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java @@ -8,7 +8,6 @@ import java.util.List; - /** * Команда для создания записи значения */ diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java index 3d124324..592980e2 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java @@ -11,7 +11,7 @@ public DatabaseServerInitializer(DatabaseInitializer databaseInitializer) { /** * Если заданная в окружении директория не существует - создает ее - * Добавляет информацию о существующих в директории базах, нацинает их инициалиализацию + * Добавляет информацию о существующих в директории базах, начинает их инициализацию * * @param context контекст, содержащий информацию об окружении * @throws DatabaseException если произошла ошибка при создании директории, ее обходе или ошибка инициализации бд diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java index de935219..8174c145 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java @@ -4,7 +4,6 @@ import com.itmo.java.basics.initialization.InitializationContext; import com.itmo.java.basics.initialization.Initializer; - public class SegmentInitializer implements Initializer { /** diff --git a/src/main/java/com/itmo/java/basics/logic/WritableDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/WritableDatabaseRecord.java index f1f859c7..38128f04 100644 --- a/src/main/java/com/itmo/java/basics/logic/WritableDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/WritableDatabaseRecord.java @@ -12,7 +12,7 @@ public interface WritableDatabaseRecord extends DatabaseRecord { /** - * Возвращает размер значения в байтах. -1, если значение отсутвует + * Возвращает размер значения в байтах. -1, если значение отсутствует */ int getValueSize(); } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java index 40c8d66e..5907df77 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java @@ -7,7 +7,7 @@ import java.util.Optional; /** - * Декторато для таблицы. Кэширует данные + * Декоратор для таблицы. Кэширует данные */ public class CachingTable implements Table { diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java index 069a0435..336555f1 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java @@ -17,7 +17,7 @@ public DatabaseOutputStream(OutputStream outputStream) { /** * Записывает в БД в следующем формате: - * - Размер ключа в байтахб используя {@link WritableDatabaseRecord#getKeySize()} + * - Размер ключа в байтах используя {@link WritableDatabaseRecord#getKeySize()} * - Ключ * - Размер записи в байтах {@link WritableDatabaseRecord#getValueSize()} * - Запись diff --git a/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java b/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java index 1e8b33d2..646e8db5 100644 --- a/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java +++ b/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java @@ -1,6 +1,5 @@ package com.itmo.java.client.client; - import com.itmo.java.client.connection.KvsConnection; import com.itmo.java.client.exception.DatabaseExecutionException; @@ -9,10 +8,10 @@ public class SimpleKvsClient implements KvsClient { /** - * Констурктор + * Конструктор * * @param databaseName имя базы, с которой работает - * @param connectionSupplier метод создания коннекшена к базе + * @param connectionSupplier метод создания подключения к базе */ public SimpleKvsClient(String databaseName, Supplier connectionSupplier) { //TODO implement diff --git a/src/main/java/com/itmo/java/client/command/KvsCommand.java b/src/main/java/com/itmo/java/client/command/KvsCommand.java index 3e7c22fe..b5b4ed6b 100644 --- a/src/main/java/com/itmo/java/client/command/KvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/KvsCommand.java @@ -7,7 +7,7 @@ public interface KvsCommand { /** * Счетчик для команды. Каждая созданная команда использует это поле для создания id, инкрементирует значение - * Первая комада создается с id 0 + * Первая команда создается с id 0 */ AtomicInteger idGen = new AtomicInteger(); diff --git a/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java b/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java index 7ceab3f3..cdd7f271 100644 --- a/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java @@ -6,7 +6,7 @@ import com.itmo.java.protocol.model.RespObject; /** - * Реализация коннекшена, когда есть прямая ссылка на объект + * Реализация подключения, когда есть прямая ссылка на объект * (пока еще нет реализации сокетов) */ public class DirectReferenceKvsConnection implements KvsConnection { diff --git a/src/main/java/com/itmo/java/protocol/model/RespObject.java b/src/main/java/com/itmo/java/protocol/model/RespObject.java index be37b0f2..4388f02a 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespObject.java +++ b/src/main/java/com/itmo/java/protocol/model/RespObject.java @@ -5,7 +5,7 @@ import java.nio.charset.StandardCharsets; /** - * Преставляет собой объект в RESP + * Представляет собой объект в RESP */ public interface RespObject { From 6cad9bf08e4571509bf5737b444766fd66d8313c Mon Sep 17 00:00:00 2001 From: shine2 Date: Fri, 28 May 2021 02:06:05 +0300 Subject: [PATCH 013/378] init 4 lab --- .../com/itmo/java/basics/DatabaseServer.java | 5 + .../itmo/java/basics/config/ConfigLoader.java | 33 +++++++ .../basics/config/DatabaseServerConfig.java | 14 +++ .../itmo/java/basics/config/ServerConfig.java | 18 ++++ .../connector/JavaSocketServerConnector.java | 86 +++++++++++++++++ .../itmo/java/basics/resp/CommandReader.java | 37 ++++++++ .../client/connection/ConnectionConfig.java | 22 +++++ .../connection/SocketKvsConnection.java | 37 ++++++++ .../client/exception/ConnectionException.java | 4 + .../com/itmo/java/protocol/RespReader.java | 94 +++++++++++++++++++ .../com/itmo/java/protocol/RespWriter.java | 25 +++++ .../java/protocol/model/RespBulkString.java | 2 + src/main/resources/server.properties | 0 13 files changed, 377 insertions(+) create mode 100644 src/main/java/com/itmo/java/basics/config/ConfigLoader.java create mode 100644 src/main/java/com/itmo/java/basics/config/DatabaseServerConfig.java create mode 100644 src/main/java/com/itmo/java/basics/config/ServerConfig.java create mode 100644 src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java create mode 100644 src/main/java/com/itmo/java/basics/resp/CommandReader.java create mode 100644 src/main/java/com/itmo/java/client/connection/ConnectionConfig.java create mode 100644 src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java create mode 100644 src/main/java/com/itmo/java/protocol/RespReader.java create mode 100644 src/main/java/com/itmo/java/protocol/RespWriter.java create mode 100644 src/main/resources/server.properties diff --git a/src/main/java/com/itmo/java/basics/DatabaseServer.java b/src/main/java/com/itmo/java/basics/DatabaseServer.java index e54d5722..4155872b 100644 --- a/src/main/java/com/itmo/java/basics/DatabaseServer.java +++ b/src/main/java/com/itmo/java/basics/DatabaseServer.java @@ -38,4 +38,9 @@ public CompletableFuture executeNextCommand(DatabaseComma //TODO implement return null; } + + public ExecutionEnvironment getEnv() { + //TODO implement + return null; + } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/config/ConfigLoader.java b/src/main/java/com/itmo/java/basics/config/ConfigLoader.java new file mode 100644 index 00000000..f7509b0d --- /dev/null +++ b/src/main/java/com/itmo/java/basics/config/ConfigLoader.java @@ -0,0 +1,33 @@ +package com.itmo.java.basics.config; + +/** + * Класс, отвечающий за подгрузку данных из конфигурационного файла формата .properties + */ +public class ConfigLoader { + + /** + * По умолчанию читает из server.properties + */ + public ConfigLoader() { + //TODO implement + } + + /** + * @param name Имя конфикурационного файла, откуда читать + */ + public ConfigLoader(String name) { + //TODO implement + } + + /** + * Считывает конфиг из указанного в конструкторе файла. + * Если не удалось считать из заданного фойла, или какого-то конкретно значения не оказалось, + * то используют дефолтные значения из {@link DatabaseConfig} и {@link ServerConfig} + *
+ * Читаются: "kvs.workingPath", "kvs.host", "kvs.port" (но в конфигурационном файле допустимы и другие проперти + */ + public DatabaseServerConfig readConfig() { + //TODO implement + return null; + } +} diff --git a/src/main/java/com/itmo/java/basics/config/DatabaseServerConfig.java b/src/main/java/com/itmo/java/basics/config/DatabaseServerConfig.java new file mode 100644 index 00000000..50d6d36a --- /dev/null +++ b/src/main/java/com/itmo/java/basics/config/DatabaseServerConfig.java @@ -0,0 +1,14 @@ +package com.itmo.java.basics.config; + +import lombok.Builder; +import lombok.Getter; +import lombok.ToString; + +@ToString +@Getter +@Builder +public class DatabaseServerConfig { + private final ServerConfig serverConfig; + + private final DatabaseConfig dbConfig; +} diff --git a/src/main/java/com/itmo/java/basics/config/ServerConfig.java b/src/main/java/com/itmo/java/basics/config/ServerConfig.java new file mode 100644 index 00000000..d9d71f32 --- /dev/null +++ b/src/main/java/com/itmo/java/basics/config/ServerConfig.java @@ -0,0 +1,18 @@ +package com.itmo.java.basics.config; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * Какой хост и какой порт будет слушать наш сервер + */ +@Getter +@AllArgsConstructor +public class ServerConfig { + + public static final String DEFAULT_HOST = "localhost"; + public static final int DEFAULT_PORT = 8080; + + private final String host; + private final int port; +} diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java new file mode 100644 index 00000000..1d0eff66 --- /dev/null +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -0,0 +1,86 @@ +package com.itmo.java.basics.connector; + +import com.itmo.java.basics.DatabaseServer; +import com.itmo.java.basics.config.ServerConfig; +import com.itmo.java.basics.resp.CommandReader; +import com.itmo.java.protocol.RespWriter; + +import java.io.Closeable; +import java.io.IOException; +import java.net.Socket; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** + * Класс, который предоставляет доступ к серверу через сокеты + */ +public class JavaSocketServerConnector implements AutoCloseable { + + /** + * Экзекьютор для выполнения ClientTask + */ + private final ExecutorService clientIOWorkers = Executors.newSingleThreadExecutor(); + + /** + * Стартует сервер. По аналогии с сокетом открывает коннекшн в конструкторе. + *

+ * Начинает слушать заданный порт, начинает аксептить клиентские сокеты. На каждый из них начинает клиентскую таску + */ + public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig config) { + //TODO implement + } + + /** + * Стартует сервер. Начинает слушать нужный порт, на каждый клиентский сокет создает клиентскую таску и исполняет команды с помощью {@link DatabaseServer} + */ + public void start() throws IOException { + //TODO implement + } + + /** + * Закрывает все, что нужно ¯\_(ツ)_/¯ (Начавшиеся исполняться клиентские задачи должны быть исполнены) + */ + @Override + public void close() throws Exception { + //TODO implement + } + + + public static void main(String[] args) throws Exception { + //можнно запускать прямо здесь + } + + /** + * Runnable, описывающий исполнение клиентской команды. + */ + static class ClientTask implements Runnable, Closeable { + + /** + * @param client клиентский сокет + * @param server сервер, на котором исполняется задача + */ + public ClientTask(Socket client, DatabaseServer server) { + //TODO implement + } + + /** + * Исполняет задачи из одного клиентского сокета, пока клиент не отсоединился или текущий поток был прерван (interrupted). + * Для кажной из задач: + * 1. Читает из сокета команду с помощью {@link CommandReader} + * 2. Исполняет ее на сервере + * 3. Записывает результат в сокет с помощью {@link RespWriter} + */ + @Override + public void run() { + //TODO implement + } + + /** + * Закрывает клиентский сокет + */ + @Override + public void close() { + //TODO implement + } + } +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/resp/CommandReader.java b/src/main/java/com/itmo/java/basics/resp/CommandReader.java new file mode 100644 index 00000000..9132bed1 --- /dev/null +++ b/src/main/java/com/itmo/java/basics/resp/CommandReader.java @@ -0,0 +1,37 @@ +package com.itmo.java.basics.resp; + +import com.itmo.java.basics.console.DatabaseCommand; +import com.itmo.java.basics.console.ExecutionEnvironment; +import com.itmo.java.protocol.RespReader; + +import java.io.IOException; + +public class CommandReader implements AutoCloseable { + + public CommandReader(RespReader reader, ExecutionEnvironment env) { + //TODO implement + } + + /** + * Есть ли следующая команда в ридере? + */ + public boolean hasNextCommand() throws IOException { + //TODO implement + return false; + } + + /** + * Считывает комманду с помощью ридера и возвращает ее + * + * @throws IllegalArgumentException если нет имени команды и id + */ + public DatabaseCommand readCommand() throws IOException { + //TODO implement + return null; + } + + @Override + public void close() throws Exception { + //TODO implement + } +} diff --git a/src/main/java/com/itmo/java/client/connection/ConnectionConfig.java b/src/main/java/com/itmo/java/client/connection/ConnectionConfig.java new file mode 100644 index 00000000..776ca8ab --- /dev/null +++ b/src/main/java/com/itmo/java/client/connection/ConnectionConfig.java @@ -0,0 +1,22 @@ +package com.itmo.java.client.connection; + +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.ToString; + +/** + * Класс содержит информацию, что слушает сервер, по какому адресу с ним взаимодействовать. + * (По идее они должны совпадать с тем, какие мы используем в server.properties) + */ +@Getter +@ToString +@EqualsAndHashCode +@AllArgsConstructor +public class ConnectionConfig { + public static final String DEFAULT_HOST = "localhost"; + public static final int DEFAULT_PORT = 8080; + + private final String host; + private final int port; +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java new file mode 100644 index 00000000..4a0b4825 --- /dev/null +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -0,0 +1,37 @@ +package com.itmo.java.client.connection; + +import com.itmo.java.client.exception.ConnectionException; +import com.itmo.java.protocol.RespReader; +import com.itmo.java.protocol.RespWriter; +import com.itmo.java.protocol.model.RespArray; +import com.itmo.java.protocol.model.RespObject; + +/** + * С помощью {@link RespWriter} и {@link RespReader} читает/пишет в сокет + */ +public class SocketKvsConnection implements KvsConnection { + + public SocketKvsConnection(ConnectionConfig config) { + //TODO implement + } + + /** + * Отправляет с помощью сокета команду и получает результат. + * @param commandId id команды (номер) + * @param command команда + * @throws ConnectionException если сокет закрыт или если произошла другая ошибка соединения + */ + @Override + public synchronized RespObject send(int commandId, RespArray command) throws ConnectionException { + //TODO implement + return null; + } + + /** + * Закрывает сокет (и другие использованные ресурсы) + */ + @Override + public void close() { + //TODO implement + } +} diff --git a/src/main/java/com/itmo/java/client/exception/ConnectionException.java b/src/main/java/com/itmo/java/client/exception/ConnectionException.java index 5cb9da57..da99fdc8 100644 --- a/src/main/java/com/itmo/java/client/exception/ConnectionException.java +++ b/src/main/java/com/itmo/java/client/exception/ConnectionException.java @@ -4,6 +4,10 @@ * Ошибка подключения */ public class ConnectionException extends Exception { + public ConnectionException(String message) { + super(message); + } + public ConnectionException(String message, Throwable cause) { super(message, cause); } diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java new file mode 100644 index 00000000..629b33a9 --- /dev/null +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -0,0 +1,94 @@ +package com.itmo.java.protocol; + +import com.itmo.java.protocol.model.RespArray; +import com.itmo.java.protocol.model.RespBulkString; +import com.itmo.java.protocol.model.RespCommandId; +import com.itmo.java.protocol.model.RespError; +import com.itmo.java.protocol.model.RespObject; + +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; + +public class RespReader implements AutoCloseable { + + /** + * Специальные символы окончания элемента + */ + private static final byte CR = '\r'; + private static final byte LF = '\n'; + + public RespReader(InputStream is) { + //TODO implement + } + + /** + * Есть ли следующий массив в стриме? + */ + public boolean hasArray() throws IOException { + //TODO implement + return false; + } + + /** + * Считывает из input stream следующий объект. Может прочитать любой объект, сам определит его тип на основе кода объекта. + * Например, если первый элемент "-", то вернет ошибку. Если "$" - bulk строку + * + * @throws EOFException если stream пустой + * @throws IOException при ошибке чтения + */ + public RespObject readObject() throws IOException { + //TODO implement + return null; + } + + /** + * Считывает объект ошибки + * + * @throws EOFException если stream пустой + * @throws IOException при ошибке чтения + */ + public RespError readError() throws IOException { + //TODO implement + return null; + } + + /** + * Читает bulk строку + * + * @throws EOFException если stream пустой + * @throws IOException при ошибке чтения + */ + public RespBulkString readBulkString() throws IOException { + //TODO implement + return null; + } + + /** + * Считывает массив RESP элементов + * + * @throws EOFException если stream пустой + * @throws IOException при ошибке чтения + */ + public RespArray readArray() throws IOException { + //TODO implement + return null; + } + + /** + * Считывает id команды + * + * @throws EOFException если stream пустой + * @throws IOException при ошибке чтения + */ + public RespCommandId readCommandId() throws IOException { + //TODO implement + return null; + } + + + @Override + public void close() throws IOException { + //TODO implement + } +} diff --git a/src/main/java/com/itmo/java/protocol/RespWriter.java b/src/main/java/com/itmo/java/protocol/RespWriter.java new file mode 100644 index 00000000..5dace402 --- /dev/null +++ b/src/main/java/com/itmo/java/protocol/RespWriter.java @@ -0,0 +1,25 @@ +package com.itmo.java.protocol; + +import com.itmo.java.protocol.model.RespObject; + +import java.io.IOException; +import java.io.OutputStream; + +public class RespWriter implements AutoCloseable{ + + public RespWriter(OutputStream os) { + //TODO implement + } + + /** + * Записывает в output stream объект + */ + public void write(RespObject object) throws IOException { + //TODO implement + } + + @Override + public void close() throws IOException { + //TODO implement + } +} diff --git a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java index 0d1463a6..3862259b 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java +++ b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java @@ -14,6 +14,8 @@ public class RespBulkString implements RespObject { public static final int NULL_STRING_SIZE = -1; + public static final RespBulkString NULL_STRING = new RespBulkString(new byte[0]); + public RespBulkString(byte[] data) { //TODO implement } diff --git a/src/main/resources/server.properties b/src/main/resources/server.properties new file mode 100644 index 00000000..e69de29b From cf9580ea8b589ca1aa369d0c33b5a8c2c75af33e Mon Sep 17 00:00:00 2001 From: Sergei Papikian <50848091+I-SER-I@users.noreply.github.com> Date: Fri, 28 May 2021 13:56:37 +0300 Subject: [PATCH 014/378] Typos fixing (#4) --- src/main/java/com/itmo/java/basics/config/ConfigLoader.java | 4 ++-- .../itmo/java/basics/connector/JavaSocketServerConnector.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/config/ConfigLoader.java b/src/main/java/com/itmo/java/basics/config/ConfigLoader.java index f7509b0d..c96d3be8 100644 --- a/src/main/java/com/itmo/java/basics/config/ConfigLoader.java +++ b/src/main/java/com/itmo/java/basics/config/ConfigLoader.java @@ -21,10 +21,10 @@ public ConfigLoader(String name) { /** * Считывает конфиг из указанного в конструкторе файла. - * Если не удалось считать из заданного фойла, или какого-то конкретно значения не оказалось, + * Если не удалось считать из заданного файла, или какого-то конкретно значения не оказалось, * то используют дефолтные значения из {@link DatabaseConfig} и {@link ServerConfig} *
- * Читаются: "kvs.workingPath", "kvs.host", "kvs.port" (но в конфигурационном файле допустимы и другие проперти + * Читаются: "kvs.workingPath", "kvs.host", "kvs.port" (но в конфигурационном файле допустимы и другие проперти) */ public DatabaseServerConfig readConfig() { //TODO implement diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index 1d0eff66..e2bb056a 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -64,7 +64,7 @@ public ClientTask(Socket client, DatabaseServer server) { } /** - * Исполняет задачи из одного клиентского сокета, пока клиент не отсоединился или текущий поток был прерван (interrupted). + * Исполняет задачи из одного клиентского сокета, пока клиент не отсоединился или текущий поток не был прерван (interrupted). * Для кажной из задач: * 1. Читает из сокета команду с помощью {@link CommandReader} * 2. Исполняет ее на сервере From eef64b130e58178e1dc38735ae940dfb0252cb05 Mon Sep 17 00:00:00 2001 From: Matthew Dudko Date: Fri, 28 May 2021 14:19:17 +0300 Subject: [PATCH 015/378] fix: null bulk string field in RespBulkString --- src/main/java/com/itmo/java/protocol/model/RespBulkString.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java index 3862259b..d1cba566 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java +++ b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java @@ -14,7 +14,7 @@ public class RespBulkString implements RespObject { public static final int NULL_STRING_SIZE = -1; - public static final RespBulkString NULL_STRING = new RespBulkString(new byte[0]); + public static final RespBulkString NULL_STRING = new RespBulkString(null); public RespBulkString(byte[] data) { //TODO implement From 06c57117b858bc4fe19481688c3d588bb75da842 Mon Sep 17 00:00:00 2001 From: asukhovitsky Date: Fri, 28 May 2021 21:58:07 +0300 Subject: [PATCH 016/378] minor --- .../connector/JavaSocketServerConnector.java | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index e2bb056a..cfc03b47 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -14,40 +14,42 @@ /** * Класс, который предоставляет доступ к серверу через сокеты */ -public class JavaSocketServerConnector implements AutoCloseable { +public class JavaSocketServerConnector implements Closeable { /** * Экзекьютор для выполнения ClientTask */ private final ExecutorService clientIOWorkers = Executors.newSingleThreadExecutor(); +// private final ServerSocket serverSocket; // todo uncomment + private final ExecutorService connectionAcceptorExecutor = Executors.newSingleThreadExecutor(); + /** * Стартует сервер. По аналогии с сокетом открывает коннекшн в конструкторе. *

* Начинает слушать заданный порт, начинает аксептить клиентские сокеты. На каждый из них начинает клиентскую таску */ - public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig config) { - //TODO implement + public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig config) throws IOException { } - /** - * Стартует сервер. Начинает слушать нужный порт, на каждый клиентский сокет создает клиентскую таску и исполняет команды с помощью {@link DatabaseServer} - */ - public void start() throws IOException { - //TODO implement + public void start() { + connectionAcceptorExecutor.submit(() -> { + // todo implement + }); } /** - * Закрывает все, что нужно ¯\_(ツ)_/¯ (Начавшиеся исполняться клиентские задачи должны быть исполнены) + * Закрывает все, что нужно ¯\_(ツ)_/¯ */ @Override - public void close() throws Exception { - //TODO implement + public void close() { + System.out.println("Stopping socket connector"); + // todo implement } public static void main(String[] args) throws Exception { - //можнно запускать прямо здесь + // можнно запускать прямо здесь } /** From e28e13695ef9bd92b9095001f18e6c5ecc319745 Mon Sep 17 00:00:00 2001 From: shinehlina Date: Sat, 29 May 2021 14:18:35 +0300 Subject: [PATCH 017/378] fix connector docs --- .../java/basics/connector/JavaSocketServerConnector.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index cfc03b47..cbb7ca07 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -26,12 +26,13 @@ public class JavaSocketServerConnector implements Closeable { /** * Стартует сервер. По аналогии с сокетом открывает коннекшн в конструкторе. - *

- * Начинает слушать заданный порт, начинает аксептить клиентские сокеты. На каждый из них начинает клиентскую таску */ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig config) throws IOException { } - + + /** + * Начинает слушать заданный порт, начинает аксептить клиентские сокеты. На каждый из них начинает клиентскую таску + */ public void start() { connectionAcceptorExecutor.submit(() -> { // todo implement @@ -85,4 +86,4 @@ public void close() { //TODO implement } } -} \ No newline at end of file +} From 3a397beca493a77c049b3ba27f964160b2148f98 Mon Sep 17 00:00:00 2001 From: aftilion <59564484+aftilion@users.noreply.github.com> Date: Thu, 18 Mar 2021 22:06:20 +0300 Subject: [PATCH 018/378] Initial commit --- pom.xml | 15 +++++++++++++++ .../java/basics/logic/WritableDatabaseRecord.java | 2 +- .../itmo/java/basics/logic/impl/SegmentImpl.java | 5 +++++ .../itmo/java/basics/logic/impl/TableImpl.java | 2 ++ .../basics/logic/io/DatabaseOutputStream.java | 2 +- 5 files changed, 24 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 2ec7fade..c00befa3 100644 --- a/pom.xml +++ b/pom.xml @@ -16,6 +16,21 @@ + + org.projectlombok + lombok + 1.18.18 + compile + true + + + + org.mockito + mockito-inline + 3.8.0 + test + + junit junit diff --git a/src/main/java/com/itmo/java/basics/logic/WritableDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/WritableDatabaseRecord.java index 38128f04..f1f859c7 100644 --- a/src/main/java/com/itmo/java/basics/logic/WritableDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/WritableDatabaseRecord.java @@ -12,7 +12,7 @@ public interface WritableDatabaseRecord extends DatabaseRecord { /** - * Возвращает размер значения в байтах. -1, если значение отсутствует + * Возвращает размер значения в байтах. -1, если значение отсутвует */ int getValueSize(); } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index a635ace6..9e9593a7 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -1,5 +1,7 @@ package com.itmo.java.basics.logic.impl; +import com.itmo.java.basics.logic.Segment; +import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.initialization.SegmentInitializationContext; import com.itmo.java.basics.logic.Segment; @@ -8,6 +10,9 @@ import java.nio.file.Path; import java.util.Optional; +public class SegmentImpl implements Segment { + static Segment create(String segmentName, Path tableRootPath) throws DatabaseException { + throw new UnsupportedOperationException(); // todo implement /** * Сегмент - append-only файл, хранящий пары ключ-значение, разделенные специальным символом. * - имеет ограниченный размер, большие значения (>100000) записываются в последний сегмент, если он не read-only diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index 428a3fa6..51187e52 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -8,6 +8,8 @@ import java.nio.file.Path; import java.util.Optional; +public class TableImpl implements Table { + static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { /** * Таблица - логическая сущность, представляющая собой набор файлов-сегментов, которые объединены одним * именем и используются для хранения однотипных данных (данных, представляющих собой одну и ту же сущность, diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java index 336555f1..069a0435 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java @@ -17,7 +17,7 @@ public DatabaseOutputStream(OutputStream outputStream) { /** * Записывает в БД в следующем формате: - * - Размер ключа в байтах используя {@link WritableDatabaseRecord#getKeySize()} + * - Размер ключа в байтахб используя {@link WritableDatabaseRecord#getKeySize()} * - Ключ * - Размер записи в байтах {@link WritableDatabaseRecord#getValueSize()} * - Запись From 708d3630ebc9f6fd0dcb4cd15a480042ca0df11c Mon Sep 17 00:00:00 2001 From: aftilion Date: Wed, 24 Mar 2021 22:11:19 +0300 Subject: [PATCH 019/378] lab1java lab1java.1 --- .../com/itmo/java/basics/logic/Database.java | 9 +- .../com/itmo/java/basics/logic/Table.java | 7 +- .../java/basics/logic/impl/DatabaseImpl.java | 92 ++++++++++++-- .../logic/impl/RemoveDatabaseRecord.java | 30 +++-- .../java/basics/logic/impl/SegmentImpl.java | 119 ++++++++++++++++-- .../basics/logic/impl/SetDatabaseRecord.java | 33 +++-- .../java/basics/logic/impl/TableImpl.java | 119 ++++++++++++++---- .../basics/logic/io/DatabaseInputStream.java | 35 +++++- .../basics/logic/io/DatabaseOutputStream.java | 19 ++- 9 files changed, 389 insertions(+), 74 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/Database.java b/src/main/java/com/itmo/java/basics/logic/Database.java index 4757df0d..758c4fd5 100644 --- a/src/main/java/com/itmo/java/basics/logic/Database.java +++ b/src/main/java/com/itmo/java/basics/logic/Database.java @@ -2,6 +2,7 @@ import com.itmo.java.basics.exceptions.DatabaseException; +import java.io.IOException; import java.util.Optional; public interface Database { @@ -18,7 +19,7 @@ public interface Database { * @param tableName имя таблицы * @throws DatabaseException если таблица с данным именем уже существует или если произошла ошибка ввода-вывода */ - void createTableIfNotExists(String tableName) throws DatabaseException; + void createTableIfNotExists(String tableName) throws DatabaseException, IOException; /** * Записывает значение в указанную таблицу по переданному ключу. @@ -28,7 +29,7 @@ public interface Database { * @param objectValue значение, которое нужно записать * @throws DatabaseException если указанная таблица не была найдена или если произошла ошибка ввода-вывода */ - void write(String tableName, String objectKey, byte[] objectValue) throws DatabaseException; + void write(String tableName, String objectKey, byte[] objectValue) throws DatabaseException, IOException; /** * Считывает значение из указанной таблицы по заданному ключу. @@ -38,7 +39,7 @@ public interface Database { * @return значение, которое находится по ключу * @throws DatabaseException если не была найдена указанная таблица, или произошла ошибка ввода-вывода */ - Optional read(String tableName, String objectKey) throws DatabaseException; + Optional read(String tableName, String objectKey) throws DatabaseException, IOException; - void delete(String tableName, String objectKey) throws DatabaseException; + void delete(String tableName, String objectKey) throws DatabaseException, IOException; } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/Table.java b/src/main/java/com/itmo/java/basics/logic/Table.java index 0bf55f8b..f9c06bca 100644 --- a/src/main/java/com/itmo/java/basics/logic/Table.java +++ b/src/main/java/com/itmo/java/basics/logic/Table.java @@ -2,6 +2,7 @@ import com.itmo.java.basics.exceptions.DatabaseException; +import java.io.IOException; import java.util.Optional; /** @@ -28,7 +29,7 @@ public interface Table { * @param objectValue значение, которое нужно записать * @throws DatabaseException если произошла ошибка ввода-вывода */ - void write(String objectKey, byte[] objectValue) throws DatabaseException; + void write(String objectKey, byte[] objectValue) throws DatabaseException, IOException; /** * Считывает значение из таблицы по заданному ключу. @@ -37,8 +38,8 @@ public interface Table { * @return значение, которое находится по ключу * @throws DatabaseException если произошла ошибка ввода-вывода */ - Optional read(String objectKey) throws DatabaseException; + Optional read(String objectKey) throws DatabaseException, IOException; - void delete(String objectKey) throws DatabaseException; + void delete(String objectKey) throws DatabaseException, IOException; } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index d00df223..8c3b42f9 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -1,19 +1,53 @@ package com.itmo.java.basics.logic.impl; import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.initialization.DatabaseInitializationContext; +import com.itmo.java.basics.index.impl.TableIndex; import com.itmo.java.basics.logic.Database; +import com.itmo.java.basics.logic.Table; +import javax.imageio.IIOException; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.Map; import java.util.Optional; public class DatabaseImpl implements Database { - /** - * @param databaseRoot путь к директории, которая может содержать несколько БД, - * поэтому при создании БД необходимо создать директорию внутри databaseRoot. - */ - public static Database create(String dbName, Path databaseRoot) throws DatabaseException { - return null; + + + public String dbName; + public Path databaseRoot; + + public static Map tableDictionary = new HashMap(); + + private DatabaseImpl(String dbName, Path databaseRoot) + { + this.dbName = dbName; + this.databaseRoot = databaseRoot; + } + + + public static Database create(String dbName, Path databaseRoot) throws DatabaseException, IOException { + + if (dbName == null) + throw new DatabaseException("Why dataBase name is null?"); + + if(Files.exists(Paths.get(databaseRoot.toString(),dbName))) + throw new DatabaseException("This" + dbName + "already exists"); + + try + { + Files.createDirectory(Paths.get(databaseRoot.toString(),dbName)); + } + catch(IOException ex) + { + throw new DatabaseException("Error while creating a DataBase("+dbName+") directory"); + } + + return new DatabaseImpl(dbName,databaseRoot); } public static Database initializeFromContext(DatabaseInitializationContext context) { @@ -22,26 +56,58 @@ public static Database initializeFromContext(DatabaseInitializationContext conte @Override public String getName() { - return null; + + return dbName; } @Override - public void createTableIfNotExists(String tableName) throws DatabaseException { + public void createTableIfNotExists(String tableName) throws DatabaseException, IOException { + + if (tableName == null) + throw new DatabaseException("Why tableName name is null?"); + + if ((tableDictionary.containsKey(tableName)) || (Files.exists(Paths.get(databaseRoot.toString(),dbName , tableName)))) + throw new DatabaseException("We have " + tableName + " in " +dbName+ "directory"); + TableIndex newTableIndex = new TableIndex(); + Path pathToTableRoot = Paths.get(databaseRoot.toString() , dbName); + TableImpl newTable = (TableImpl) TableImpl.create(tableName , pathToTableRoot , newTableIndex); + + tableDictionary.put(tableName,newTable); } @Override - public void write(String tableName, String objectKey, byte[] objectValue) throws DatabaseException { + public void write(String tableName, String objectKey, byte[] objectValue) throws DatabaseException, IOException { + TableImpl tableimpl = tableDictionary.get(tableName); + + if (tableName == null) + throw new DatabaseException("Error while writing in database"); + tableimpl.write(objectKey , objectValue ); } @Override - public Optional read(String tableName, String objectKey) throws DatabaseException { - return Optional.empty(); + public Optional read(String tableName, String objectKey) throws DatabaseException, IOException { + + TableImpl tableimpl = tableDictionary.get(tableName); + + if (tableName == null) + throw new DatabaseException("Error while writing in database"); + + return tableimpl.read(objectKey); + + //return Optional.empty(); } @Override - public void delete(String tableName, String objectKey) throws DatabaseException { + public void delete(String tableName, String objectKey) throws DatabaseException, IOException { + + TableImpl tableimpl = tableDictionary.get(tableName); + + if (tableName == null) + throw new DatabaseException("Writing in database error"); + + tableimpl.delete(objectKey); } } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java index 8c13ec39..a6f1046a 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java @@ -6,33 +6,45 @@ * Запись в БД, означающая удаление значения по ключу */ public class RemoveDatabaseRecord implements WritableDatabaseRecord { + public byte[] key; + public byte[] value; + + public RemoveDatabaseRecord(byte[] key){ this.key = key;} @Override - public byte[] getKey() { - return new byte[0]; + + + public byte[] getKey() + { + return key; } @Override - public byte[] getValue() { - return new byte[0]; + public byte[] getValue() + { + return null; } @Override public long size() { - return 0; + return getKeySize() + getValueSize() + 4 + 4; } @Override public boolean isValuePresented() { + //return ((getValue() == null ) && (getValueSize() == 0)); return false; } @Override - public int getKeySize() { - return 0; + public int getKeySize() + { + return key.length; } @Override - public int getValueSize() { - return 0; + public int getValueSize() + { + return -1; } } + diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 9e9593a7..b7074000 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -1,16 +1,40 @@ package com.itmo.java.basics.logic.impl; +import com.itmo.java.basics.index.SegmentOffsetInfo; +import com.itmo.java.basics.index.impl.SegmentIndex; +import com.itmo.java.basics.index.impl.SegmentOffsetInfoImpl; +import com.itmo.java.basics.logic.DatabaseRecord; import com.itmo.java.basics.logic.Segment; import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.initialization.SegmentInitializationContext; -import com.itmo.java.basics.logic.Segment; +import com.itmo.java.basics.logic.io.DatabaseInputStream; +import com.itmo.java.basics.logic.io.DatabaseOutputStream; import java.io.IOException; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.util.Optional; public class SegmentImpl implements Segment { + + public Path tableRootPath; + public String segmentName; + public SegmentIndex segmentIndex; + public final long size_M = 100000; + public long segmentSize ; + private final DatabaseOutputStream out; + + public SegmentImpl(Path tableRootPath, String segmentName, OutputStream out) { + + this.tableRootPath = tableRootPath; + this.segmentName = segmentName; + this.segmentIndex = new SegmentIndex(); + this.out = new DatabaseOutputStream(out); + + } + static Segment create(String segmentName, Path tableRootPath) throws DatabaseException { throw new UnsupportedOperationException(); // todo implement /** @@ -29,32 +53,107 @@ public static Segment initializeFromContext(SegmentInitializationContext context return null; } - static String createSegmentName(String tableName) { + Path segRoot = Paths.get(tableRootPath.toString(), segmentName); + boolean have; + OutputStream outputStream; + + try + { + have = tableRootPath.toFile().createNewFile(); + outputStream = Files.newOutputStream(segRoot); + + } + catch(IOException exception) + { + throw new DatabaseException("Creating Error " + segmentName); + } + if(!have) + { + throw new DatabaseException("Creating Error" + segmentName + "as it already exists"); + } + + return new SegmentImpl(segRoot, segmentName, outputStream); + } + + static String createSegmentName(String tableName) + { return tableName + "_" + System.currentTimeMillis(); } @Override - public String getName() { - return null; + public String getName() + { + return segmentName; } @Override public boolean write(String objectKey, byte[] objectValue) throws IOException { - return false; + + if(isReadOnly()) + { + out.close(); + return false; + } + + if(objectValue == null) + { + return delete(objectKey); + } + + SetDatabaseRecord newSeg= new SetDatabaseRecord(objectKey.getBytes(StandardCharsets.UTF_8), objectValue); + + segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); + segmentSize += out.write(newSeg); + return true; } @Override public Optional read(String objectKey) throws IOException { - return Optional.empty(); + + //if (segmentSize == 0) + // return Optional.empty(); + + Optional offsetInfo = segmentIndex.searchForKey(objectKey); + + if(offsetInfo.isEmpty()) + return Optional.empty(); + + + long myOf = offsetInfo.get().getOffset(); + + DatabaseInputStream input = new DatabaseInputStream(Files.newInputStream(tableRootPath)); + input.skip(myOf); + + Optional value = input.readDbUnit(); + + if(value.isEmpty()) + return Optional.empty(); + + input.close(); + return Optional.of(value.get().getValue()); } @Override public boolean isReadOnly() { - return false; + if (segmentSize >= size_M) + return true; + else + return false; } @Override public boolean delete(String objectKey) throws IOException { - return false; + + + if(isReadOnly()) + { + out.close(); + return false; + } + + RemoveDatabaseRecord newSeg = new RemoveDatabaseRecord(objectKey.getBytes()); + segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); + segmentSize += out.write(newSeg); + return true; } } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java index 9164106b..87aebf65 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java @@ -7,33 +7,46 @@ */ public class SetDatabaseRecord implements WritableDatabaseRecord { + public byte[] key; + public byte[] value; + + public SetDatabaseRecord(byte[] key , byte[] value) + { + this.key = key; + this.value =value; + } @Override - public byte[] getKey() { - return new byte[0]; + public byte[] getKey() + { + return key; } @Override - public byte[] getValue() { - return new byte[0]; + public byte[] getValue() + { + return value; } @Override public long size() { - return 0; + return getKeySize() + getValueSize() + 4 + 4; } @Override public boolean isValuePresented() { - return false; + // return ((getValue() == null ) && (getValueSize() == 0)); + return true; } @Override - public int getKeySize() { - return 0; + public int getKeySize() + { + return key.length; } @Override - public int getValueSize() { - return 0; + public int getValueSize() + { + return value.length; } } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index 51187e52..1e7ca3ae 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -2,49 +2,126 @@ import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.index.impl.TableIndex; -import com.itmo.java.basics.initialization.TableInitializationContext; +import com.itmo.java.basics.logic.Segment; import com.itmo.java.basics.logic.Table; +import com.itmo.java.basics.logic.io.DatabaseOutputStream; +import javax.imageio.IIOException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.Map; import java.util.Optional; public class TableImpl implements Table { - static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { -/** - * Таблица - логическая сущность, представляющая собой набор файлов-сегментов, которые объединены одним - * именем и используются для хранения однотипных данных (данных, представляющих собой одну и ту же сущность, - * например, таблица "Пользователи") - *

- * - имеет единый размер сегмента - * - представляет из себя директорию в файловой системе, именованную как таблица - * и хранящую файлы-сегменты данной таблицы - */ -public class TableImpl implements Table { - public static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { - return null; + + public String tableName; + public Path pathToDatabaseRoot; + public TableIndex tableIndex; + public SegmentImpl lastSegment; + + public static Map tableDictionary = new HashMap(); + + private TableImpl(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) + { + this.tableName = tableName; + this.pathToDatabaseRoot = pathToDatabaseRoot; + this.tableIndex = tableIndex; } - public static Table initializeFromContext(TableInitializationContext context) { - return null; + static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException, IOException { + + if (tableName == null) + throw new DatabaseException("Why tableBase name is null?"); + + Path pathToTableRoot = Paths.get(pathToDatabaseRoot.toString() , tableName); + + try + { + Files.createDirectory(pathToTableRoot); + } + catch(IOException ex) + { + throw new DatabaseException("Error while creating a Table("+tableName+") directory"); + } + + return new TableImpl(tableName , pathToTableRoot , tableIndex); + } @Override public String getName() { - return null; + + return tableName; } @Override - public void write(String objectKey, byte[] objectValue) throws DatabaseException { + public void write(String objectKey, byte[] objectValue) throws DatabaseException, IOException { + + try + { + boolean canWewrite = lastSegment.write(objectKey, objectValue); + + if (canWewrite) + { + + this.lastSegment = (SegmentImpl) SegmentImpl.create(SegmentImpl.createSegmentName(tableName),pathToDatabaseRoot); + this.lastSegment.write(objectKey ,objectValue); + } + tableIndex.onIndexedEntityUpdated(objectKey,lastSegment); + } + catch(IOException ex) + { + throw new DatabaseException("Writing in database error " + ex); + } + } @Override - public Optional read(String objectKey) throws DatabaseException { - return Optional.empty(); + public Optional read(String objectKey) throws DatabaseException, IOException { + + try + { + Optional segmentRead = tableIndex.searchForKey(objectKey); + + if(segmentRead.isPresent()) + { + return segmentRead.get().read(objectKey); + + } + + else + return Optional.empty(); + } + + catch (IOException ex) { + throw new DatabaseException("Reading in database error " + ex); + } } @Override - public void delete(String objectKey) throws DatabaseException { + public void delete(String objectKey) throws DatabaseException, IOException { + + try + { + boolean canDel = lastSegment.delete(objectKey); + + if(!canDel) + { + this.lastSegment = (SegmentImpl) SegmentImpl.create(SegmentImpl.createSegmentName(tableName),pathToDatabaseRoot); + this.lastSegment.delete(objectKey); + } + tableIndex.onIndexedEntityUpdated(objectKey , null); + } + catch(IOException ex) + { + throw new DatabaseException("Deleting error in Table"); + } } } diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java index c3a06bad..ae2f3d72 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java @@ -2,10 +2,12 @@ import com.itmo.java.basics.logic.DatabaseRecord; import com.itmo.java.basics.logic.WritableDatabaseRecord; +import com.itmo.java.basics.logic.impl.SetDatabaseRecord; import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; +import java.util.Arrays; import java.util.Optional; /** @@ -18,11 +20,38 @@ public DatabaseInputStream(InputStream inputStream) { super(inputStream); } - /** + /** * Читает следующую запись (см {@link DatabaseOutputStream#write(WritableDatabaseRecord)}) * @return следующую запись, если она существует. {@link Optional#empty()} - если конец файла достигнут */ public Optional readDbUnit() throws IOException { - return null; + + if (available() <= 4) + { + return Optional.empty(); + } + int keySize = readInt(); + if (available() <= 0) + { + return Optional.empty(); + } + byte[] key = readNBytes(keySize); + if (available() <= 4) + { + return Optional.empty(); + } + int valueSize = readInt(); + + if ((available() <= 0) && (valueSize == REMOVED_OBJECT_SIZE)) + { + return Optional.empty(); + } + + byte[] value = readNBytes(valueSize); + SetDatabaseRecord datarecord = new SetDatabaseRecord(key,value); + // datarecord.key = key; + // datarecord.value= value; + return Optional.of(datarecord); + } } -} + diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java index 069a0435..f4bafa44 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java @@ -3,6 +3,7 @@ import com.itmo.java.basics.logic.WritableDatabaseRecord; import java.io.DataOutputStream; +import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; @@ -11,8 +12,11 @@ */ public class DatabaseOutputStream extends DataOutputStream { + private OutputStream outputStream; public DatabaseOutputStream(OutputStream outputStream) { + super(outputStream); + this.outputStream = outputStream; } /** @@ -31,6 +35,19 @@ public DatabaseOutputStream(OutputStream outputStream) { * @throws IOException если запись не удалась */ public int write(WritableDatabaseRecord databaseRecord) throws IOException { - return 0; + //String DataBaseRecord = databaseRecord.getKeySize() + databaseRecord.getKey().toString() + databaseRecord.getValueSize() + databaseRecord.getValue().toString(); + // запихать в один write? + + + writeInt(databaseRecord.getKeySize()); + write(databaseRecord.getKey()); + writeInt(databaseRecord.getValueSize()); + if (databaseRecord.isValuePresented()) + write(databaseRecord.getValue()); + // just write mm, + flush(); + + return databaseRecord.getKeySize()+ databaseRecord.getValueSize() + 4 + 4; + } } \ No newline at end of file From 0100fda60af6db107328eca900ff9e843b420da8 Mon Sep 17 00:00:00 2001 From: aftilion Date: Sat, 27 Mar 2021 14:49:03 +0300 Subject: [PATCH 020/378] lab1 lab1.redact --- .../java/com/itmo/java/basics/MainTest.java | 68 ----------- .../com/itmo/java/basics/index/KvsIndex.java | 2 +- .../com/itmo/java/basics/logic/Database.java | 5 +- .../com/itmo/java/basics/logic/Segment.java | 2 +- .../com/itmo/java/basics/logic/Table.java | 3 +- .../java/basics/logic/impl/DatabaseImpl.java | 70 ++++++------ .../logic/impl/RemoveDatabaseRecord.java | 24 ++-- .../java/basics/logic/impl/SegmentImpl.java | 77 +++++-------- .../basics/logic/impl/SetDatabaseRecord.java | 23 ++-- .../java/basics/logic/impl/TableImpl.java | 108 ++++++------------ .../basics/logic/io/DatabaseInputStream.java | 36 +++--- .../basics/logic/io/DatabaseOutputStream.java | 21 ++-- 12 files changed, 147 insertions(+), 292 deletions(-) delete mode 100644 src/main/java/com/itmo/java/basics/MainTest.java diff --git a/src/main/java/com/itmo/java/basics/MainTest.java b/src/main/java/com/itmo/java/basics/MainTest.java deleted file mode 100644 index eec8a891..00000000 --- a/src/main/java/com/itmo/java/basics/MainTest.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.itmo.java.basics; - -import com.itmo.java.basics.config.DatabaseConfig; -import com.itmo.java.basics.console.impl.ExecutionEnvironmentImpl; -import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.initialization.*; -import com.itmo.java.basics.initialization.impl.*; -import com.itmo.java.basics.logic.*; -import com.itmo.java.basics.logic.impl.*; - -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.*; -import java.nio.file.Path; -import java.util.Comparator; -import java.util.Optional; - -public class MainTest { - public static void main(String[] args) throws DatabaseException, IOException { -// Files.walk(Path.of("db", "anime")) -// .sorted(Comparator.reverseOrder()) -// .map(Path::toFile) -// .forEach(File::delete); - try { - Database db = DatabaseImpl.create("anime", Path.of("db")); - db.createTableIfNotExists("naruto"); - db.write("naruto", "key", "value".getBytes(StandardCharsets.UTF_8)); - db.write("naruto", "key", "value2".getBytes(StandardCharsets.UTF_8)); - db.write("naruto", "key", null); - db.write("naruto", "key1", "value1".getBytes(StandardCharsets.UTF_8)); - db.write("naruto", "key2", "".getBytes(StandardCharsets.UTF_8)); - } - catch (DatabaseException ex) - {throw new DatabaseException(ex);} -// System.out.printf( -// "get = %s expected = %s\n", -// new String(db.read("naruto", "saske").get()), -// "ora" -// ); -// db.write("naruto", "saske", null); -// db.delete("naruto", "saske"); -// System.out.printf( -// "get = %s expected = %s\n", -// db.read("naruto", "saske").toString(), -// Optional.empty().toString() -// ); -// db.write("naruto", "saske", "ora".getBytes(StandardCharsets.UTF_8)); -// System.out.printf( -// "get = %s expected = %s\n", -// new String(db.read("naruto", "saske").get()), -// "ora" -// ); - -// Initializer initializer = -// new DatabaseServerInitializer( -// new DatabaseInitializer( -// new TableInitializer( -// new SegmentInitializer()))); -// var execEnv = new ExecutionEnvironmentImpl( -// new DatabaseConfig("db") -// ); -// var context = new InitializationContextImpl( -// execEnv, null, null, null -// ); -// initializer.perform(context); - } -} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/index/KvsIndex.java b/src/main/java/com/itmo/java/basics/index/KvsIndex.java index 4b7b182f..15534257 100644 --- a/src/main/java/com/itmo/java/basics/index/KvsIndex.java +++ b/src/main/java/com/itmo/java/basics/index/KvsIndex.java @@ -6,7 +6,7 @@ public interface KvsIndex { /** * Оповещает индекс об обновлении значения по определенному ключу. * - * @param key ключ, который обновился + * @param key ключ, который обновился * @param value новое значение */ void onIndexedEntityUpdated(K key, V value); diff --git a/src/main/java/com/itmo/java/basics/logic/Database.java b/src/main/java/com/itmo/java/basics/logic/Database.java index 758c4fd5..912a1536 100644 --- a/src/main/java/com/itmo/java/basics/logic/Database.java +++ b/src/main/java/com/itmo/java/basics/logic/Database.java @@ -2,7 +2,6 @@ import com.itmo.java.basics.exceptions.DatabaseException; -import java.io.IOException; import java.util.Optional; public interface Database { @@ -24,8 +23,8 @@ public interface Database { /** * Записывает значение в указанную таблицу по переданному ключу. * - * @param tableName таблица, в которую нужно записать значение - * @param objectKey ключ, по которому нужно записать значение + * @param tableName таблица, в которую нужно записать значение + * @param objectKey ключ, по которому нужно записать значение * @param objectValue значение, которое нужно записать * @throws DatabaseException если указанная таблица не была найдена или если произошла ошибка ввода-вывода */ diff --git a/src/main/java/com/itmo/java/basics/logic/Segment.java b/src/main/java/com/itmo/java/basics/logic/Segment.java index 95125e5d..6168fdcb 100644 --- a/src/main/java/com/itmo/java/basics/logic/Segment.java +++ b/src/main/java/com/itmo/java/basics/logic/Segment.java @@ -21,7 +21,7 @@ public interface Segment { /** * Записывает значение по указанному ключу в сегмент. * - * @param objectKey ключ, по которому нужно записать значение + * @param objectKey ключ, по которому нужно записать значение * @param objectValue значение, которое нужно записать * @return {@code true} - если значение записалось, {@code false} - если нет * @throws IOException если произошла ошибка ввода-вывода. diff --git a/src/main/java/com/itmo/java/basics/logic/Table.java b/src/main/java/com/itmo/java/basics/logic/Table.java index f9c06bca..37e82917 100644 --- a/src/main/java/com/itmo/java/basics/logic/Table.java +++ b/src/main/java/com/itmo/java/basics/logic/Table.java @@ -2,7 +2,6 @@ import com.itmo.java.basics.exceptions.DatabaseException; -import java.io.IOException; import java.util.Optional; /** @@ -25,7 +24,7 @@ public interface Table { /** * Записывает в таблицу переданное значение по указанному ключу. * - * @param objectKey ключ, по которому нужно записать значение + * @param objectKey ключ, по которому нужно записать значение * @param objectValue значение, которое нужно записать * @throws DatabaseException если произошла ошибка ввода-вывода */ diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index 8c3b42f9..c889217b 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -5,8 +5,6 @@ import com.itmo.java.basics.logic.Database; import com.itmo.java.basics.logic.Table; -import javax.imageio.IIOException; -import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -17,37 +15,30 @@ public class DatabaseImpl implements Database { - - public String dbName; - public Path databaseRoot; - - public static Map tableDictionary = new HashMap(); - - private DatabaseImpl(String dbName, Path databaseRoot) - { + public String dbName; + public Path databaseRoot; + public Map tableDictionary = new HashMap(); + private DatabaseImpl(String dbName, Path databaseRoot) { this.dbName = dbName; this.databaseRoot = databaseRoot; } - public static Database create(String dbName, Path databaseRoot) throws DatabaseException, IOException { + public static Database create(String dbName, Path databaseRoot) throws DatabaseException { if (dbName == null) throw new DatabaseException("Why dataBase name is null?"); - if(Files.exists(Paths.get(databaseRoot.toString(),dbName))) + if (Files.exists(Paths.get(databaseRoot.toString(), dbName))) throw new DatabaseException("This" + dbName + "already exists"); - try - { - Files.createDirectory(Paths.get(databaseRoot.toString(),dbName)); - } - catch(IOException ex) - { - throw new DatabaseException("Error while creating a DataBase("+dbName+") directory"); + try { + Files.createDirectory(Paths.get(databaseRoot.toString(), dbName)); + } catch (IOException ex) { + throw new DatabaseException("Error while creating a DataBase(" + dbName + ") directory"); } - return new DatabaseImpl(dbName,databaseRoot); + return new DatabaseImpl(dbName, databaseRoot); } public static Database initializeFromContext(DatabaseInitializationContext context) { @@ -56,58 +47,61 @@ public static Database initializeFromContext(DatabaseInitializationContext conte @Override public String getName() { - return dbName; } @Override - public void createTableIfNotExists(String tableName) throws DatabaseException, IOException { + public void createTableIfNotExists(String tableName) throws DatabaseException { if (tableName == null) throw new DatabaseException("Why tableName name is null?"); - if ((tableDictionary.containsKey(tableName)) || (Files.exists(Paths.get(databaseRoot.toString(),dbName , tableName)))) - throw new DatabaseException("We have " + tableName + " in " +dbName+ "directory"); + if ((tableDictionary.containsKey(tableName)) || (Files.exists(Paths.get(databaseRoot.toString(), dbName, tableName)))) + throw new DatabaseException("We have " + tableName + " in " + dbName + "directory"); TableIndex newTableIndex = new TableIndex(); - Path pathToTableRoot = Paths.get(databaseRoot.toString() , dbName); - TableImpl newTable = (TableImpl) TableImpl.create(tableName , pathToTableRoot , newTableIndex); + Path pathToTableRoot = Paths.get(databaseRoot.toString(), dbName); + Table newTable = TableImpl.create(tableName, pathToTableRoot, newTableIndex); - tableDictionary.put(tableName,newTable); + tableDictionary.put(tableName, newTable); } @Override - public void write(String tableName, String objectKey, byte[] objectValue) throws DatabaseException, IOException { - TableImpl tableimpl = tableDictionary.get(tableName); + public void write(String tableName, String objectKey, byte[] objectValue) throws DatabaseException { + if (!tableDictionary.containsKey(tableName)) { + throw new DatabaseException("Table " + tableName + " doesn't exist in database" + dbName); + } if (tableName == null) throw new DatabaseException("Error while writing in database"); - tableimpl.write(objectKey , objectValue ); + Table table = tableDictionary.get(tableName); + table.write(objectKey, objectValue); } @Override - public Optional read(String tableName, String objectKey) throws DatabaseException, IOException { + public Optional read(String tableName, String objectKey) throws DatabaseException { - TableImpl tableimpl = tableDictionary.get(tableName); + Table table = tableDictionary.get(tableName); if (tableName == null) throw new DatabaseException("Error while writing in database"); - return tableimpl.read(objectKey); - - //return Optional.empty(); + return table.read(objectKey); } @Override - public void delete(String tableName, String objectKey) throws DatabaseException, IOException { + public void delete(String tableName, String objectKey) throws DatabaseException { - TableImpl tableimpl = tableDictionary.get(tableName); + if (!tableDictionary.containsKey(tableName)) { + throw new DatabaseException("Table " + tableName + " doesn't exist in database" + dbName); + } if (tableName == null) throw new DatabaseException("Writing in database error"); - tableimpl.delete(objectKey); + Table tableImpl = tableDictionary.get(tableName); + tableImpl.delete(objectKey); } } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java index a6f1046a..f046d1a6 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java @@ -9,18 +9,17 @@ public class RemoveDatabaseRecord implements WritableDatabaseRecord { public byte[] key; public byte[] value; - public RemoveDatabaseRecord(byte[] key){ this.key = key;} - @Override - + public RemoveDatabaseRecord(byte[] key) { + this.key = key; + } - public byte[] getKey() - { + @Override + public byte[] getKey() { return key; } @Override - public byte[] getValue() - { + public byte[] getValue() { return null; } @@ -30,20 +29,15 @@ public long size() { } @Override - public boolean isValuePresented() { - //return ((getValue() == null ) && (getValueSize() == 0)); - return false; - } + public boolean isValuePresented() { return false; } @Override - public int getKeySize() - { + public int getKeySize() { return key.length; } @Override - public int getValueSize() - { + public int getValueSize() { return -1; } } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index b7074000..8ba6fecd 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -1,11 +1,11 @@ package com.itmo.java.basics.logic.impl; +import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.index.SegmentOffsetInfo; import com.itmo.java.basics.index.impl.SegmentIndex; import com.itmo.java.basics.index.impl.SegmentOffsetInfoImpl; import com.itmo.java.basics.logic.DatabaseRecord; import com.itmo.java.basics.logic.Segment; -import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.logic.io.DatabaseInputStream; import com.itmo.java.basics.logic.io.DatabaseOutputStream; @@ -19,20 +19,18 @@ public class SegmentImpl implements Segment { - public Path tableRootPath; + public Path tableRootPath; public String segmentName; public SegmentIndex segmentIndex; - public final long size_M = 100000; - public long segmentSize ; - private final DatabaseOutputStream out; - - public SegmentImpl(Path tableRootPath, String segmentName, OutputStream out) { + public final long sizeMaximum = 100000; + public long segmentSize; + private final DatabaseOutputStream outStream; + public SegmentImpl(Path tableRootPath, String segmentName, OutputStream outStream) { this.tableRootPath = tableRootPath; this.segmentName = segmentName; this.segmentIndex = new SegmentIndex(); - this.out = new DatabaseOutputStream(out); - + this.outStream = new DatabaseOutputStream(outStream); } static Segment create(String segmentName, Path tableRootPath) throws DatabaseException { @@ -54,71 +52,59 @@ public static Segment initializeFromContext(SegmentInitializationContext context } Path segRoot = Paths.get(tableRootPath.toString(), segmentName); - boolean have; + boolean fileExists; OutputStream outputStream; - try - { - have = tableRootPath.toFile().createNewFile(); + try { + fileExists = segRoot.toFile().createNewFile(); outputStream = Files.newOutputStream(segRoot); - } - catch(IOException exception) - { + } catch (IOException exception) { throw new DatabaseException("Creating Error " + segmentName); } - if(!have) - { + if (!fileExists) { throw new DatabaseException("Creating Error" + segmentName + "as it already exists"); } return new SegmentImpl(segRoot, segmentName, outputStream); } - static String createSegmentName(String tableName) - { + static String createSegmentName(String tableName) { return tableName + "_" + System.currentTimeMillis(); } @Override - public String getName() - { + public String getName() { return segmentName; } @Override public boolean write(String objectKey, byte[] objectValue) throws IOException { - if(isReadOnly()) - { - out.close(); + if (isReadOnly()) { + outStream.close(); return false; } - if(objectValue == null) - { + if (objectValue == null) { return delete(objectKey); } - SetDatabaseRecord newSeg= new SetDatabaseRecord(objectKey.getBytes(StandardCharsets.UTF_8), objectValue); + SetDatabaseRecord newSeg = new SetDatabaseRecord(objectKey.getBytes(StandardCharsets.UTF_8), objectValue); segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); - segmentSize += out.write(newSeg); + segmentSize += outStream.write(newSeg); return true; } @Override public Optional read(String objectKey) throws IOException { - //if (segmentSize == 0) - // return Optional.empty(); - Optional offsetInfo = segmentIndex.searchForKey(objectKey); - if(offsetInfo.isEmpty()) + if (offsetInfo.isEmpty()) return Optional.empty(); - long myOf = offsetInfo.get().getOffset(); DatabaseInputStream input = new DatabaseInputStream(Files.newInputStream(tableRootPath)); @@ -126,34 +112,31 @@ public Optional read(String objectKey) throws IOException { Optional value = input.readDbUnit(); - if(value.isEmpty()) + if (value.isEmpty()) return Optional.empty(); input.close(); - return Optional.of(value.get().getValue()); + return Optional.of(value.get().getValue()); } @Override - public boolean isReadOnly() { - if (segmentSize >= size_M) - return true; - else - return false; - } + public boolean isReadOnly() { return segmentSize >= sizeMaximum;} @Override public boolean delete(String objectKey) throws IOException { - - if(isReadOnly()) - { - out.close(); + if (isReadOnly()) { + outStream.close(); return false; } + if (segmentIndex.searchForKey(objectKey).isPresent()){ + throw new IOException("Deleting error in Segment"); + } + RemoveDatabaseRecord newSeg = new RemoveDatabaseRecord(objectKey.getBytes()); segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); - segmentSize += out.write(newSeg); + segmentSize += outStream.write(newSeg); return true; } } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java index 87aebf65..5b103e03 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java @@ -10,20 +10,18 @@ public class SetDatabaseRecord implements WritableDatabaseRecord { public byte[] key; public byte[] value; - public SetDatabaseRecord(byte[] key , byte[] value) - { + public SetDatabaseRecord(byte[] key, byte[] value) { this.key = key; - this.value =value; + this.value = value; } + @Override - public byte[] getKey() - { + public byte[] getKey() { return key; } @Override - public byte[] getValue() - { + public byte[] getValue() { return value; } @@ -33,20 +31,15 @@ public long size() { } @Override - public boolean isValuePresented() { - // return ((getValue() == null ) && (getValueSize() == 0)); - return true; - } + public boolean isValuePresented() { return true; } @Override - public int getKeySize() - { + public int getKeySize() { return key.length; } @Override - public int getValueSize() - { + public int getValueSize() { return value.length; } } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index 1e7ca3ae..f2854e1a 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -4,123 +4,91 @@ import com.itmo.java.basics.index.impl.TableIndex; import com.itmo.java.basics.logic.Segment; import com.itmo.java.basics.logic.Table; -import com.itmo.java.basics.logic.io.DatabaseOutputStream; -import javax.imageio.IIOException; -import java.io.FileOutputStream; import java.io.IOException; -import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.HashMap; -import java.util.Map; import java.util.Optional; public class TableImpl implements Table { - public String tableName; - public Path pathToDatabaseRoot; - public TableIndex tableIndex; - public SegmentImpl lastSegment; + public String tableName; + public Path pathToDatabaseRoot; + public TableIndex tableIndex; + public Segment lastSegment; - public static Map tableDictionary = new HashMap(); - - private TableImpl(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) - { + private TableImpl(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { this.tableName = tableName; this.pathToDatabaseRoot = pathToDatabaseRoot; this.tableIndex = tableIndex; + this.lastSegment = SegmentImpl.create(SegmentImpl.createSegmentName(tableName), pathToDatabaseRoot); } - static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException, IOException { + static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { if (tableName == null) throw new DatabaseException("Why tableBase name is null?"); - Path pathToTableRoot = Paths.get(pathToDatabaseRoot.toString() , tableName); + Path pathToTableRoot = Paths.get(pathToDatabaseRoot.toString(), tableName); - try - { + try { Files.createDirectory(pathToTableRoot); - } - catch(IOException ex) - { - throw new DatabaseException("Error while creating a Table("+tableName+") directory"); + } catch (IOException ex) { + throw new DatabaseException("Error while creating a Table(" + tableName + ") directory"); } - return new TableImpl(tableName , pathToTableRoot , tableIndex); - + return new TableImpl(tableName, pathToTableRoot, tableIndex); } @Override - public String getName() { - - return tableName; - } + public String getName() { return tableName; } @Override - public void write(String objectKey, byte[] objectValue) throws DatabaseException, IOException { + public void write(String objectKey, byte[] objectValue) throws DatabaseException { - try - { + try { boolean canWewrite = lastSegment.write(objectKey, objectValue); - if (canWewrite) - { - - this.lastSegment = (SegmentImpl) SegmentImpl.create(SegmentImpl.createSegmentName(tableName),pathToDatabaseRoot); - this.lastSegment.write(objectKey ,objectValue); + if (!canWewrite) { + lastSegment = SegmentImpl.create(SegmentImpl.createSegmentName(tableName), pathToDatabaseRoot); + lastSegment.write(objectKey, objectValue); } - tableIndex.onIndexedEntityUpdated(objectKey,lastSegment); + tableIndex.onIndexedEntityUpdated(objectKey, lastSegment); + } catch (IOException ex) { + throw new DatabaseException("Writing in database error " + ex); } - catch(IOException ex) - { - throw new DatabaseException("Writing in database error " + ex); - } - - } @Override - public Optional read(String objectKey) throws DatabaseException, IOException { + public Optional read(String objectKey) throws DatabaseException { - try - { + try { Optional segmentRead = tableIndex.searchForKey(objectKey); - if(segmentRead.isPresent()) - { - return segmentRead.get().read(objectKey); - - } - - else - return Optional.empty(); - } + if (segmentRead.isPresent()) { + return segmentRead.get().read(objectKey); - catch (IOException ex) { - throw new DatabaseException("Reading in database error " + ex); + } else + return Optional.empty(); + } catch (IOException ex) { + throw new DatabaseException("Reading in database error " + ex); } } @Override - public void delete(String objectKey) throws DatabaseException, IOException { + public void delete(String objectKey) throws DatabaseException { - try - { - boolean canDel = lastSegment.delete(objectKey); + try { + boolean canDel = lastSegment.delete(objectKey); - if(!canDel) - { - this.lastSegment = (SegmentImpl) SegmentImpl.create(SegmentImpl.createSegmentName(tableName),pathToDatabaseRoot); - this.lastSegment.delete(objectKey); - } + if (!canDel) { + this.lastSegment = SegmentImpl.create(SegmentImpl.createSegmentName(tableName), pathToDatabaseRoot); + this.lastSegment.delete(objectKey); + } - tableIndex.onIndexedEntityUpdated(objectKey , null); - } - catch(IOException ex) - { + tableIndex.onIndexedEntityUpdated(objectKey, null); + } catch (IOException ex) { throw new DatabaseException("Deleting error in Table"); } } diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java index ae2f3d72..a18df289 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java @@ -7,7 +7,6 @@ import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; -import java.util.Arrays; import java.util.Optional; /** @@ -20,38 +19,35 @@ public DatabaseInputStream(InputStream inputStream) { super(inputStream); } - /** + /** * Читает следующую запись (см {@link DatabaseOutputStream#write(WritableDatabaseRecord)}) + * * @return следующую запись, если она существует. {@link Optional#empty()} - если конец файла достигнут */ public Optional readDbUnit() throws IOException { - if (available() <= 4) - { - return Optional.empty(); + if (available() <= 4) { + return Optional.empty(); } - int keySize = readInt(); - if (available() <= 0) - { + int keySize = readInt(); + + if (available() <= 0) { return Optional.empty(); } - byte[] key = readNBytes(keySize); - if (available() <= 4) - { + byte[] key = readNBytes(keySize); + + if (available() <= 4) { return Optional.empty(); } - int valueSize = readInt(); + int valueSize = readInt(); - if ((available() <= 0) && (valueSize == REMOVED_OBJECT_SIZE)) - { + if ((available() <= 0) && (valueSize == REMOVED_OBJECT_SIZE)) { return Optional.empty(); } + byte[] value = readNBytes(valueSize); + SetDatabaseRecord datarecord = new SetDatabaseRecord(key, value); - byte[] value = readNBytes(valueSize); - SetDatabaseRecord datarecord = new SetDatabaseRecord(key,value); - // datarecord.key = key; - // datarecord.value= value; - return Optional.of(datarecord); - } + return Optional.of(datarecord); } +} diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java index f4bafa44..a716e32c 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java @@ -3,7 +3,6 @@ import com.itmo.java.basics.logic.WritableDatabaseRecord; import java.io.DataOutputStream; -import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; @@ -12,7 +11,8 @@ */ public class DatabaseOutputStream extends DataOutputStream { - private OutputStream outputStream; + private final OutputStream outputStream; + public DatabaseOutputStream(OutputStream outputStream) { super(outputStream); @@ -35,19 +35,16 @@ public DatabaseOutputStream(OutputStream outputStream) { * @throws IOException если запись не удалась */ public int write(WritableDatabaseRecord databaseRecord) throws IOException { - //String DataBaseRecord = databaseRecord.getKeySize() + databaseRecord.getKey().toString() + databaseRecord.getValueSize() + databaseRecord.getValue().toString(); - // запихать в один write? + writeInt(databaseRecord.getKeySize()); + write(databaseRecord.getKey()); + writeInt(databaseRecord.getValueSize()); - writeInt(databaseRecord.getKeySize()); - write(databaseRecord.getKey()); - writeInt(databaseRecord.getValueSize()); - if (databaseRecord.isValuePresented()) - write(databaseRecord.getValue()); - // just write mm, - flush(); + if (databaseRecord.isValuePresented()) + write(databaseRecord.getValue()); + flush(); - return databaseRecord.getKeySize()+ databaseRecord.getValueSize() + 4 + 4; + return databaseRecord.getKeySize() + databaseRecord.getValueSize() + 4 + 4; } } \ No newline at end of file From 8abadf6b425d17050fc344d77a37b3fd87f788cf Mon Sep 17 00:00:00 2001 From: aftilion Date: Fri, 2 Apr 2021 16:06:55 +0300 Subject: [PATCH 021/378] lab1 commit1 --- .../java/basics/logic/impl/SegmentImpl.java | 52 +++++++++++-------- .../java/basics/logic/impl/TableImpl.java | 4 +- 2 files changed, 33 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 8ba6fecd..4abc5770 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -52,21 +52,25 @@ public static Segment initializeFromContext(SegmentInitializationContext context } Path segRoot = Paths.get(tableRootPath.toString(), segmentName); - boolean fileExists; - OutputStream outputStream; + //boolean fileExists; + //OutputStream outputStream; - try { + try( OutputStream outputStream = Files.newOutputStream(segRoot) ) { + boolean fileExists; fileExists = segRoot.toFile().createNewFile(); - outputStream = Files.newOutputStream(segRoot); - } catch (IOException exception) { - throw new DatabaseException("Creating Error " + segmentName); + if (!fileExists) { + throw new DatabaseException("Creating Error" + segmentName + "as it already exists"); + } + + return new SegmentImpl(segRoot, segmentName, outputStream); + } catch (IOException ex) { + throw new DatabaseException("Creating Error " + segmentName + ex); } - if (!fileExists) { - throw new DatabaseException("Creating Error" + segmentName + "as it already exists"); + catch (DatabaseException ex){ + throw new DatabaseException( "Creating error" + ex); } - - return new SegmentImpl(segRoot, segmentName, outputStream); + // return new SegmentImpl(segRoot, segmentName, outputStream); } static String createSegmentName(String tableName) { @@ -104,19 +108,25 @@ public Optional read(String objectKey) throws IOException { if (offsetInfo.isEmpty()) return Optional.empty(); - long myOf = offsetInfo.get().getOffset(); - DatabaseInputStream input = new DatabaseInputStream(Files.newInputStream(tableRootPath)); - input.skip(myOf); - - Optional value = input.readDbUnit(); - - if (value.isEmpty()) - return Optional.empty(); - - input.close(); - return Optional.of(value.get().getValue()); + try{ + DatabaseInputStream input = new DatabaseInputStream(Files.newInputStream(tableRootPath)); + long skipped = input.skip(myOf); + if( skipped != myOf){ + throw new IOException("Error while skipping bytes" + segmentName); + } + input.skip(myOf); + Optional value = input.readDbUnit(); + if (value.isEmpty()) + return Optional.empty(); + + input.close(); + return Optional.of(value.get().getValue()); + } + catch ( IOException ex){ + throw new IOException( "Error while reading " + segmentName + ex); + } } @Override diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index f2854e1a..fc9213b6 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -83,8 +83,8 @@ public void delete(String objectKey) throws DatabaseException { boolean canDel = lastSegment.delete(objectKey); if (!canDel) { - this.lastSegment = SegmentImpl.create(SegmentImpl.createSegmentName(tableName), pathToDatabaseRoot); - this.lastSegment.delete(objectKey); + lastSegment = SegmentImpl.create(SegmentImpl.createSegmentName(tableName), pathToDatabaseRoot); + lastSegment.delete(objectKey); } tableIndex.onIndexedEntityUpdated(objectKey, null); From d73c491cfd6c8ec3f32d8b69eabb522e95a36f61 Mon Sep 17 00:00:00 2001 From: aftilion Date: Fri, 2 Apr 2021 16:12:28 +0300 Subject: [PATCH 022/378] lab1 --- .../java/basics/logic/impl/SegmentImpl.java | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 4abc5770..465137c5 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -52,25 +52,21 @@ public static Segment initializeFromContext(SegmentInitializationContext context } Path segRoot = Paths.get(tableRootPath.toString(), segmentName); - //boolean fileExists; - //OutputStream outputStream; + boolean fileExists; + OutputStream outputStream; - try( OutputStream outputStream = Files.newOutputStream(segRoot) ) { - boolean fileExists; + try { fileExists = segRoot.toFile().createNewFile(); + outputStream = Files.newOutputStream(segRoot); - if (!fileExists) { - throw new DatabaseException("Creating Error" + segmentName + "as it already exists"); - } - - return new SegmentImpl(segRoot, segmentName, outputStream); } catch (IOException ex) { throw new DatabaseException("Creating Error " + segmentName + ex); } - catch (DatabaseException ex){ - throw new DatabaseException( "Creating error" + ex); + if (!fileExists) { + throw new DatabaseException("Creating Error" + segmentName + "as it already exists"); } - // return new SegmentImpl(segRoot, segmentName, outputStream); + + return new SegmentImpl(segRoot, segmentName, outputStream); } static String createSegmentName(String tableName) { From 493319b606d3cc87592c7f03e9ce35ab6d55b774 Mon Sep 17 00:00:00 2001 From: aftilion Date: Sun, 4 Apr 2021 13:55:58 +0300 Subject: [PATCH 023/378] lab1 end --- .../java/basics/logic/impl/SegmentImpl.java | 44 +++++++++---------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 465137c5..e9310d5b 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -52,21 +52,18 @@ public static Segment initializeFromContext(SegmentInitializationContext context } Path segRoot = Paths.get(tableRootPath.toString(), segmentName); - boolean fileExists; - OutputStream outputStream; - try { + try(OutputStream outputStream = Files.newOutputStream(segRoot) ) { + boolean fileExists; fileExists = segRoot.toFile().createNewFile(); - outputStream = Files.newOutputStream(segRoot); + if (!fileExists) { + throw new DatabaseException("Creating Error" + segmentName + "as it already exists"); + } + return new SegmentImpl(segRoot, segmentName, outputStream); } catch (IOException ex) { throw new DatabaseException("Creating Error " + segmentName + ex); } - if (!fileExists) { - throw new DatabaseException("Creating Error" + segmentName + "as it already exists"); - } - - return new SegmentImpl(segRoot, segmentName, outputStream); } static String createSegmentName(String tableName) { @@ -91,7 +88,6 @@ public boolean write(String objectKey, byte[] objectValue) throws IOException { } SetDatabaseRecord newSeg = new SetDatabaseRecord(objectKey.getBytes(StandardCharsets.UTF_8), objectValue); - segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); segmentSize += outStream.write(newSeg); return true; @@ -102,26 +98,27 @@ public Optional read(String objectKey) throws IOException { Optional offsetInfo = segmentIndex.searchForKey(objectKey); - if (offsetInfo.isEmpty()) + if (offsetInfo.isEmpty()) { return Optional.empty(); + } long myOf = offsetInfo.get().getOffset(); - - try{ + try { DatabaseInputStream input = new DatabaseInputStream(Files.newInputStream(tableRootPath)); long skipped = input.skip(myOf); - if( skipped != myOf){ - throw new IOException("Error while skipping bytes" + segmentName); + if (skipped != myOf) { + throw new IOException("Error while skipping bytes " + segmentName); } - input.skip(myOf); Optional value = input.readDbUnit(); - if (value.isEmpty()) - return Optional.empty(); + if (value.isEmpty()) { + return Optional.empty(); + } input.close(); + return Optional.of(value.get().getValue()); } - catch ( IOException ex){ - throw new IOException( "Error while reading " + segmentName + ex); + catch(IOException ex) { + throw new IOException("Error while reading in " + segmentName + ex); } } @@ -136,8 +133,9 @@ public boolean delete(String objectKey) throws IOException { return false; } - if (segmentIndex.searchForKey(objectKey).isPresent()){ - throw new IOException("Deleting error in Segment"); + if (segmentIndex.searchForKey(objectKey).isEmpty()){ + outStream.close(); + return false; } RemoveDatabaseRecord newSeg = new RemoveDatabaseRecord(objectKey.getBytes()); @@ -145,4 +143,4 @@ public boolean delete(String objectKey) throws IOException { segmentSize += outStream.write(newSeg); return true; } -} +} \ No newline at end of file From d4bb38fea680ec7c16cda917268435e9b472cfcf Mon Sep 17 00:00:00 2001 From: aftilion Date: Thu, 15 Apr 2021 16:22:25 +0300 Subject: [PATCH 024/378] lab1 15/04 --- .../java/basics/logic/impl/DatabaseImpl.java | 8 +-- .../logic/impl/RemoveDatabaseRecord.java | 4 +- .../java/basics/logic/impl/SegmentImpl.java | 72 +++++++------------ .../basics/logic/impl/SetDatabaseRecord.java | 4 +- .../java/basics/logic/impl/TableImpl.java | 12 ++-- 5 files changed, 40 insertions(+), 60 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index c889217b..74d6cf16 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -15,9 +15,9 @@ public class DatabaseImpl implements Database { - public String dbName; - public Path databaseRoot; - public Map tableDictionary = new HashMap(); + private String dbName; + private Path databaseRoot; + private Map tableDictionary = new HashMap(); private DatabaseImpl(String dbName, Path databaseRoot) { this.dbName = dbName; this.databaseRoot = databaseRoot; @@ -35,7 +35,7 @@ public static Database create(String dbName, Path databaseRoot) throws DatabaseE try { Files.createDirectory(Paths.get(databaseRoot.toString(), dbName)); } catch (IOException ex) { - throw new DatabaseException("Error while creating a DataBase(" + dbName + ") directory"); + throw new DatabaseException("Error while creating a DataBase(" + dbName + ") directory" , ex); } return new DatabaseImpl(dbName, databaseRoot); diff --git a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java index f046d1a6..7dcde002 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java @@ -6,8 +6,8 @@ * Запись в БД, означающая удаление значения по ключу */ public class RemoveDatabaseRecord implements WritableDatabaseRecord { - public byte[] key; - public byte[] value; + private byte[] key; + private byte[] value; public RemoveDatabaseRecord(byte[] key) { this.key = key; diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index e9310d5b..97ad7c1f 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -19,11 +19,11 @@ public class SegmentImpl implements Segment { - public Path tableRootPath; - public String segmentName; - public SegmentIndex segmentIndex; - public final long sizeMaximum = 100000; - public long segmentSize; + private Path tableRootPath; + private String segmentName; + private SegmentIndex segmentIndex; + private final long sizeMaximum = 100000; + private long segmentSize; private final DatabaseOutputStream outStream; public SegmentImpl(Path tableRootPath, String segmentName, OutputStream outStream) { @@ -34,36 +34,20 @@ public SegmentImpl(Path tableRootPath, String segmentName, OutputStream outStrea } static Segment create(String segmentName, Path tableRootPath) throws DatabaseException { - throw new UnsupportedOperationException(); // todo implement -/** - * Сегмент - append-only файл, хранящий пары ключ-значение, разделенные специальным символом. - * - имеет ограниченный размер, большие значения (>100000) записываются в последний сегмент, если он не read-only - * - при превышении размера сегмента создается новый сегмент и дальнейшие операции записи производятся в него - * - именование файла-сегмента должно позволять установить очередность их появления - * - является неизменяемым после появления более нового сегмента - */ -public class SegmentImpl implements Segment { - public static Segment create(String segmentName, Path tableRootPath) throws DatabaseException { - throw new UnsupportedOperationException(); - } - - public static Segment initializeFromContext(SegmentInitializationContext context) { - return null; - } - - Path segRoot = Paths.get(tableRootPath.toString(), segmentName); - - try(OutputStream outputStream = Files.newOutputStream(segRoot) ) { - boolean fileExists; - fileExists = segRoot.toFile().createNewFile(); - - if (!fileExists) { - throw new DatabaseException("Creating Error" + segmentName + "as it already exists"); - } - return new SegmentImpl(segRoot, segmentName, outputStream); - } catch (IOException ex) { - throw new DatabaseException("Creating Error " + segmentName + ex); + Path segmentRoot = Paths.get(tableRootPath.toString(), segmentName); + boolean isCreated; + OutputStream outputStream; + + try{ + isCreated = segmentRoot.toFile().createNewFile(); + outputStream = Files.newOutputStream(segmentRoot); + }catch(IOException ex){ + throw new DatabaseException("Error while creating segment " + segmentName, ex); } + if(!isCreated){ + throw new DatabaseException("Error while creating segment " + segmentName + "as it already exists"); + } + return new SegmentImpl(segmentRoot, segmentName, outputStream); } static String createSegmentName(String tableName) { @@ -82,11 +66,9 @@ public boolean write(String objectKey, byte[] objectValue) throws IOException { outStream.close(); return false; } - if (objectValue == null) { return delete(objectKey); } - SetDatabaseRecord newSeg = new SetDatabaseRecord(objectKey.getBytes(StandardCharsets.UTF_8), objectValue); segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); segmentSize += outStream.write(newSeg); @@ -97,28 +79,26 @@ public boolean write(String objectKey, byte[] objectValue) throws IOException { public Optional read(String objectKey) throws IOException { Optional offsetInfo = segmentIndex.searchForKey(objectKey); - if (offsetInfo.isEmpty()) { return Optional.empty(); } + long myOf = offsetInfo.get().getOffset(); - try { - DatabaseInputStream input = new DatabaseInputStream(Files.newInputStream(tableRootPath)); - long skipped = input.skip(myOf); + try (DatabaseInputStream in = new DatabaseInputStream(Files.newInputStream(tableRootPath))) { + long skipped = in.skip(myOf); if (skipped != myOf) { - throw new IOException("Error while skipping bytes " + segmentName); + throw new IOException("Error while skipping bytes in segment called " + segmentName); } - Optional value = input.readDbUnit(); + Optional value = in.readDbUnit(); if (value.isEmpty()) { return Optional.empty(); } - input.close(); return Optional.of(value.get().getValue()); - } - catch(IOException ex) { - throw new IOException("Error while reading in " + segmentName + ex); + + } catch (IOException exception) { + throw new IOException("Error while creating a Segment file " + segmentName, exception); } } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java index 5b103e03..29dd3d46 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java @@ -7,8 +7,8 @@ */ public class SetDatabaseRecord implements WritableDatabaseRecord { - public byte[] key; - public byte[] value; + private byte[] key; + private byte[] value; public SetDatabaseRecord(byte[] key, byte[] value) { this.key = key; diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index fc9213b6..3f6fdae0 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -13,10 +13,10 @@ public class TableImpl implements Table { - public String tableName; - public Path pathToDatabaseRoot; - public TableIndex tableIndex; - public Segment lastSegment; + private String tableName; + private Path pathToDatabaseRoot; + private TableIndex tableIndex; + private Segment lastSegment; private TableImpl(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { this.tableName = tableName; @@ -56,7 +56,7 @@ public void write(String objectKey, byte[] objectValue) throws DatabaseException } tableIndex.onIndexedEntityUpdated(objectKey, lastSegment); } catch (IOException ex) { - throw new DatabaseException("Writing in database error " + ex); + throw new DatabaseException("Writing in database error " , ex); } } @@ -72,7 +72,7 @@ public Optional read(String objectKey) throws DatabaseException { } else return Optional.empty(); } catch (IOException ex) { - throw new DatabaseException("Reading in database error " + ex); + throw new DatabaseException("Reading in database error " , ex); } } From 1ca04b690d91fe9b9dfc9b2f2e0883ddf86ebb4e Mon Sep 17 00:00:00 2001 From: Fredi Kats Date: Thu, 1 Apr 2021 01:20:53 +0300 Subject: [PATCH 025/378] init: add base code for second lab (cherry picked from commit 048b2e9026da74ec54d8b6fa1e2d7057384d3cb2) --- .../impl/DatabaseServerInitializer.java | 2 +- .../impl/SegmentInitializationContextImpl.java | 11 ++--------- .../initialization/impl/SegmentInitializer.java | 1 + .../com/itmo/java/basics/logic/impl/DatabaseImpl.java | 1 + .../com/itmo/java/basics/logic/impl/SegmentImpl.java | 8 ++++++++ .../com/itmo/java/basics/logic/impl/TableImpl.java | 7 +++++++ 6 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java index 592980e2..3d124324 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java @@ -11,7 +11,7 @@ public DatabaseServerInitializer(DatabaseInitializer databaseInitializer) { /** * Если заданная в окружении директория не существует - создает ее - * Добавляет информацию о существующих в директории базах, начинает их инициализацию + * Добавляет информацию о существующих в директории базах, нацинает их инициалиализацию * * @param context контекст, содержащий информацию об окружении * @throws DatabaseException если произошла ошибка при создании директории, ее обходе или ошибка инициализации бд diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java index 127f71ca..45ad02b5 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java @@ -6,17 +6,10 @@ import java.nio.file.Path; public class SegmentInitializationContextImpl implements SegmentInitializationContext { - public SegmentInitializationContextImpl(String segmentName, Path segmentPath, long currentSize, SegmentIndex index) { + private SegmentInitializationContextImpl(String segmentName, Path segmentPath, int currentSize, SegmentIndex index) { } - /** - * Не используйте этот конструктор. Оставлен для совместимости со старыми тестами. - */ - public SegmentInitializationContextImpl(String segmentName, Path tablePath, long currentSize) { - } - - public SegmentInitializationContextImpl(String segmentName, Path tablePath) { - this(segmentName, tablePath.resolve(segmentName), 0, new SegmentIndex()); + public SegmentInitializationContextImpl(String segmentName, Path tablePath, int currentSize) { } @Override diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java index 8174c145..de935219 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java @@ -4,6 +4,7 @@ import com.itmo.java.basics.initialization.InitializationContext; import com.itmo.java.basics.initialization.Initializer; + public class SegmentInitializer implements Initializer { /** diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index 74d6cf16..0d4d3ff9 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -2,6 +2,7 @@ import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.index.impl.TableIndex; +import com.itmo.java.basics.initialization.DatabaseInitializationContext; import com.itmo.java.basics.logic.Database; import com.itmo.java.basics.logic.Table; diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 97ad7c1f..cf0fb156 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -1,5 +1,7 @@ package com.itmo.java.basics.logic.impl; +import com.itmo.java.basics.initialization.SegmentInitializationContext; +import com.itmo.java.basics.logic.Segment; import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.index.SegmentOffsetInfo; import com.itmo.java.basics.index.impl.SegmentIndex; @@ -18,6 +20,12 @@ import java.util.Optional; public class SegmentImpl implements Segment { + public static Segment create(String segmentName, Path tableRootPath) throws DatabaseException { + throw new UnsupportedOperationException(); + } + + public static Segment initializeFromContext(SegmentInitializationContext context) { + return null; private Path tableRootPath; private String segmentName; diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index 3f6fdae0..fff53bbe 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -3,6 +3,7 @@ import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.index.impl.TableIndex; import com.itmo.java.basics.logic.Segment; +import com.itmo.java.basics.initialization.TableInitializationContext; import com.itmo.java.basics.logic.Table; import java.io.IOException; @@ -12,6 +13,12 @@ import java.util.Optional; public class TableImpl implements Table { + public static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { + return null; + } + + public static Table initializeFromContext(TableInitializationContext context) { + return null; private String tableName; private Path pathToDatabaseRoot; From 85e377f8eb1a8cef003e26e5644865e65687a2a6 Mon Sep 17 00:00:00 2001 From: aftilion <59564484+aftilion@users.noreply.github.com> Date: Sun, 16 May 2021 12:56:07 +0300 Subject: [PATCH 026/378] Lab2 (#3) * lab2_start_commit * lab2_start_comiit2 * commit1 * commit1 * commit2 * commit 3 * commit3 * commit4 * com * com * 30/04 * 30/04 * 30/04 * 30/04 * 30/04 * 30/04 * 30/04 * 30/04 * 30/04 * 30/04 * 30/04 * 30/04 * 30/04 * 30/04 * 30/04 * 30/04 * 30/04 * 30/04 * 30/04 * 30/04 * 30/04 * 30/04 * 30/04 * 30/04 * 30/04 * 30/04 * 30/04 * 30/04 * 30/04 * 30/04 * 30/04 * 30/04 * 30/04 * 30/04 * 30/04 * 1/05 * 1/05/1 * 1/05/2 * 1/05/3 * 1/05/04 * 1 * 1 * kkk * kkk * k * k * kkk * 1 * 1 * 1 * 1 * 1 * 1 * 1 * 1 * 1 * 1 * Update RemoveDatabaseRecord.java * ends * a * good * good? * g * good&& * good?? * good * 1 * 1 * 1 * a * a * q * good * kekw * end * delete imports * cntrlaltl * Update TableImpl.java * Update TableImpl.java * Update SegmentImpl.java * Update SegmentImpl.java * Update SegmentImpl.java --- .../java/com/itmo/java/basics/MainTest.java | 68 +++++++++++++++++ .../java/basics/config/DatabaseConfig.java | 8 +- .../impl/ExecutionEnvironmentImpl.java | 11 ++- .../DatabaseInitializationContextImpl.java | 15 +++- .../impl/DatabaseInitializer.java | 40 +++++++++- .../impl/DatabaseServerInitializer.java | 39 ++++++++++ .../impl/InitializationContextImpl.java | 8 +- .../SegmentInitializationContextImpl.java | 25 +++++-- .../impl/SegmentInitializer.java | 51 +++++++++++++ .../impl/TableInitializationContextImpl.java | 18 ++++- .../initialization/impl/TableInitializer.java | 38 +++++++++- .../basics/logic/impl/DatabaseCacheImpl.java | 25 +++++-- .../java/basics/logic/impl/DatabaseImpl.java | 58 +++++++------- .../logic/impl/RemoveDatabaseRecord.java | 7 +- .../java/basics/logic/impl/SegmentImpl.java | 75 +++++++++++-------- .../basics/logic/impl/SetDatabaseRecord.java | 5 +- .../java/basics/logic/impl/TableImpl.java | 51 ++++++------- .../basics/logic/io/DatabaseInputStream.java | 35 ++++----- .../basics/logic/io/DatabaseOutputStream.java | 5 +- 19 files changed, 441 insertions(+), 141 deletions(-) create mode 100644 src/main/java/com/itmo/java/basics/MainTest.java diff --git a/src/main/java/com/itmo/java/basics/MainTest.java b/src/main/java/com/itmo/java/basics/MainTest.java new file mode 100644 index 00000000..eec8a891 --- /dev/null +++ b/src/main/java/com/itmo/java/basics/MainTest.java @@ -0,0 +1,68 @@ +package com.itmo.java.basics; + +import com.itmo.java.basics.config.DatabaseConfig; +import com.itmo.java.basics.console.impl.ExecutionEnvironmentImpl; +import com.itmo.java.basics.exceptions.DatabaseException; +import com.itmo.java.basics.initialization.*; +import com.itmo.java.basics.initialization.impl.*; +import com.itmo.java.basics.logic.*; +import com.itmo.java.basics.logic.impl.*; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.*; +import java.nio.file.Path; +import java.util.Comparator; +import java.util.Optional; + +public class MainTest { + public static void main(String[] args) throws DatabaseException, IOException { +// Files.walk(Path.of("db", "anime")) +// .sorted(Comparator.reverseOrder()) +// .map(Path::toFile) +// .forEach(File::delete); + try { + Database db = DatabaseImpl.create("anime", Path.of("db")); + db.createTableIfNotExists("naruto"); + db.write("naruto", "key", "value".getBytes(StandardCharsets.UTF_8)); + db.write("naruto", "key", "value2".getBytes(StandardCharsets.UTF_8)); + db.write("naruto", "key", null); + db.write("naruto", "key1", "value1".getBytes(StandardCharsets.UTF_8)); + db.write("naruto", "key2", "".getBytes(StandardCharsets.UTF_8)); + } + catch (DatabaseException ex) + {throw new DatabaseException(ex);} +// System.out.printf( +// "get = %s expected = %s\n", +// new String(db.read("naruto", "saske").get()), +// "ora" +// ); +// db.write("naruto", "saske", null); +// db.delete("naruto", "saske"); +// System.out.printf( +// "get = %s expected = %s\n", +// db.read("naruto", "saske").toString(), +// Optional.empty().toString() +// ); +// db.write("naruto", "saske", "ora".getBytes(StandardCharsets.UTF_8)); +// System.out.printf( +// "get = %s expected = %s\n", +// new String(db.read("naruto", "saske").get()), +// "ora" +// ); + +// Initializer initializer = +// new DatabaseServerInitializer( +// new DatabaseInitializer( +// new TableInitializer( +// new SegmentInitializer()))); +// var execEnv = new ExecutionEnvironmentImpl( +// new DatabaseConfig("db") +// ); +// var context = new InitializationContextImpl( +// execEnv, null, null, null +// ); +// initializer.perform(context); + } +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java b/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java index 485309b0..6ae46737 100644 --- a/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java +++ b/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java @@ -1,9 +1,15 @@ package com.itmo.java.basics.config; public class DatabaseConfig { + public static final String DEFAULT_WORKING_PATH = "db_files"; + private final String workingPath; + + public DatabaseConfig(String workingPath) { + this.workingPath = workingPath; + } public String getWorkingPath() { - return null; + return workingPath; } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java index e7ea7aa2..4f198006 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java +++ b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java @@ -5,23 +5,30 @@ import com.itmo.java.basics.logic.Database; import java.nio.file.Path; +import java.util.HashMap; import java.util.Optional; public class ExecutionEnvironmentImpl implements ExecutionEnvironment { + + DatabaseConfig dbConfig; + HashMap dataBase = new HashMap(); + public ExecutionEnvironmentImpl(DatabaseConfig config) { + dbConfig = config; } @Override public Optional getDatabase(String name) { - return null; + return Optional.ofNullable(dataBase.get(name)); } @Override public void addDatabase(Database db) { + dataBase.put(db.getName(), db); } @Override public Path getWorkingPath() { - return null; + return Path.of(dbConfig.getWorkingPath()); } } diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java index d71ca20b..2c436c12 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java @@ -4,29 +4,38 @@ import com.itmo.java.basics.logic.Table; import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashMap; import java.util.Map; public class DatabaseInitializationContextImpl implements DatabaseInitializationContext { + private final String dbName; + private final Path dbRoot; + private final Map tablesMap = new HashMap<>(); + public DatabaseInitializationContextImpl(String dbName, Path databaseRoot) { + this.dbName = dbName; + this.dbRoot = Path.of(databaseRoot.toString(), dbName); } @Override public String getDbName() { - return null; + return dbName; } @Override public Path getDatabasePath() { - return null; + return Paths.get(dbRoot.toString()); } @Override public Map getTables() { - return null; + return tablesMap; } @Override public void addTable(Table table) { + tablesMap.put(table.getName(), table); } } diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java index f9c36a06..9696500e 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java @@ -1,22 +1,56 @@ package com.itmo.java.basics.initialization.impl; import com.itmo.java.basics.exceptions.DatabaseException; +import com.itmo.java.basics.index.impl.TableIndex; +import com.itmo.java.basics.initialization.DatabaseInitializationContext; import com.itmo.java.basics.initialization.InitializationContext; import com.itmo.java.basics.initialization.Initializer; +import com.itmo.java.basics.logic.Database; +import com.itmo.java.basics.logic.impl.DatabaseImpl; + +import java.io.File; +import java.nio.file.Files; public class DatabaseInitializer implements Initializer { + + private final TableInitializer tableInitializer; + public DatabaseInitializer(TableInitializer tableInitializer) { + this.tableInitializer = tableInitializer; } /** * Добавляет в контекст информацию об инициализируемой бд. * Запускает инициализацию всех таблиц это базы * - * @param initialContext контекст с информацией об инициализируемой бд и об окружении + * @param context контекст с информацией об инициализируемой бд и об окружении * @throws DatabaseException если в контексте лежит неправильный путь к базе, невозможно прочитать содержимого папки, - * или если возникла ошибка дочерних инициализаторов + * или если возникла ошибка дочерних инициализаторов */ @Override - public void perform(InitializationContext initialContext) throws DatabaseException { + public void perform(InitializationContext context) throws DatabaseException { + + if (context.executionEnvironment() == null) { + throw new DatabaseException("Context executionEnvironment is null"); + } + + DatabaseInitializationContext dbinitialContext = context.currentDbContext(); + if (!Files.exists(dbinitialContext.getDatabasePath())) { + throw new DatabaseException("We dont have this " + dbinitialContext.getDbName()); + } + + File curFile = new File(dbinitialContext.getDatabasePath().toString()); + + if (!curFile.exists()) { + throw new DatabaseException(dbinitialContext.getDbName() + " does not exist"); + } + + File[] directory = curFile.listFiles(); + for (File table : directory) { + TableInitializationContextImpl tableContext = new TableInitializationContextImpl(table.getName(), dbinitialContext.getDatabasePath(), new TableIndex()); + tableInitializer.perform(new InitializationContextImpl(context.executionEnvironment(), dbinitialContext, tableContext, null)); + } + Database database = DatabaseImpl.initializeFromContext(dbinitialContext); + context.executionEnvironment().addDatabase(database); } } diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java index 3d124324..72f311d7 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java @@ -1,12 +1,20 @@ package com.itmo.java.basics.initialization.impl; +import com.itmo.java.basics.console.ExecutionEnvironment; import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.initialization.InitializationContext; import com.itmo.java.basics.initialization.Initializer; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + public class DatabaseServerInitializer implements Initializer { + private final Initializer databaseInitializer; public DatabaseServerInitializer(DatabaseInitializer databaseInitializer) { + this.databaseInitializer = databaseInitializer; } /** @@ -18,5 +26,36 @@ public DatabaseServerInitializer(DatabaseInitializer databaseInitializer) { */ @Override public void perform(InitializationContext context) throws DatabaseException { + + if (context.executionEnvironment() == null) { + throw new DatabaseException("Context executionEnvironment is null"); + } + + ExecutionEnvironment ExecutionEnvironment = context.executionEnvironment(); + Path path = ExecutionEnvironment.getWorkingPath(); + + if (!Files.exists(path)) { + try { + Files.createDirectory(path); + } catch (IOException ex) { + throw new DatabaseException("Error while creating " + path.toString(), ex); + } + } + File curFile = new File(path.toString()); + File[] directory = curFile.listFiles(); + if (directory == null) { + throw new DatabaseException("Error while working with" + curFile.toString()); + } + + for (File in : directory) { + DatabaseInitializationContextImpl dbContext = new DatabaseInitializationContextImpl(in.getName(), path); + databaseInitializer.perform(new InitializationContextImpl(context.executionEnvironment(), dbContext, null, null)); + } } } + + + + + + diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/InitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/InitializationContextImpl.java index 552ede30..114e0dae 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/InitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/InitializationContextImpl.java @@ -13,10 +13,10 @@ public class InitializationContextImpl implements InitializationContext { private final TableInitializationContext currentTableContext; private final SegmentInitializationContext currentSegmentContext; - private InitializationContextImpl(ExecutionEnvironment executionEnvironment, - DatabaseInitializationContext currentDatabaseContext, - TableInitializationContext currentTableContext, - SegmentInitializationContext currentSegmentContext) { + public InitializationContextImpl(ExecutionEnvironment executionEnvironment, + DatabaseInitializationContext currentDatabaseContext, + TableInitializationContext currentTableContext, + SegmentInitializationContext currentSegmentContext) { this.executionEnvironment = executionEnvironment; this.currentDatabaseContext = currentDatabaseContext; this.currentTableContext = currentTableContext; diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java index 45ad02b5..84844e53 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java @@ -4,31 +4,46 @@ import com.itmo.java.basics.initialization.SegmentInitializationContext; import java.nio.file.Path; +import java.nio.file.Paths; public class SegmentInitializationContextImpl implements SegmentInitializationContext { - private SegmentInitializationContextImpl(String segmentName, Path segmentPath, int currentSize, SegmentIndex index) { + + private final String segmentName; + private final Path segmentPath; + private final long currentSize; + private final SegmentIndex segmentIndex; + + public SegmentInitializationContextImpl(String segmentName, Path segmentPath, int currentSize, SegmentIndex index) { + this.segmentName = segmentName; + this.segmentPath = segmentPath; + this.currentSize = currentSize; + this.segmentIndex = index; } public SegmentInitializationContextImpl(String segmentName, Path tablePath, int currentSize) { + this.segmentName = segmentName; + this.segmentPath = Paths.get(tablePath.toString(), segmentName); + this.currentSize = currentSize; + this.segmentIndex = new SegmentIndex(); } @Override public String getSegmentName() { - return null; + return segmentName; } @Override public Path getSegmentPath() { - return null; + return segmentPath; } @Override public SegmentIndex getIndex() { - return null; + return segmentIndex; } @Override public long getCurrentSize() { - return 0; + return currentSize; } } diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java index de935219..90409c2a 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java @@ -1,8 +1,23 @@ package com.itmo.java.basics.initialization.impl; import com.itmo.java.basics.exceptions.DatabaseException; +import com.itmo.java.basics.index.impl.SegmentIndex; +import com.itmo.java.basics.index.impl.SegmentOffsetInfoImpl; import com.itmo.java.basics.initialization.InitializationContext; import com.itmo.java.basics.initialization.Initializer; +import com.itmo.java.basics.initialization.SegmentInitializationContext; +import com.itmo.java.basics.logic.DatabaseRecord; +import com.itmo.java.basics.logic.Segment; +import com.itmo.java.basics.logic.impl.SegmentImpl; +import com.itmo.java.basics.logic.io.DatabaseInputStream; + +import java.io.FileInputStream; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; public class SegmentInitializer implements Initializer { @@ -17,5 +32,41 @@ public class SegmentInitializer implements Initializer { */ @Override public void perform(InitializationContext context) throws DatabaseException { + + if (context.currentSegmentContext() == null) { + throw new DatabaseException("Context segment is null"); + } + + int size = 0; + SegmentInitializationContext segmentinitialContext = context.currentSegmentContext(); + SegmentIndex segIndex = segmentinitialContext.getIndex(); + Path segPath = segmentinitialContext.getSegmentPath(); + Segment segment = SegmentImpl.initializeFromContext(segmentinitialContext); + List keys = new ArrayList<>(); + + if (!Files.exists(segPath)) { + throw new DatabaseException(segmentinitialContext.getSegmentName() + " does not exist"); + } + try (DatabaseInputStream InputStream = new DatabaseInputStream(new FileInputStream(segPath.toFile()))) { + Optional dbUnitOp = InputStream.readDbUnit(); + while (dbUnitOp.isPresent()) { + DatabaseRecord dbUnits = dbUnitOp.get(); + segIndex.onIndexedEntityUpdated(new String(dbUnits.getKey()), new SegmentOffsetInfoImpl(size)); + size += dbUnits.size(); + keys.add(new String(dbUnits.getKey())); + dbUnitOp = InputStream.readDbUnit(); + } + } catch (IOException ex) { + throw new DatabaseException("Error while initialisation segment", ex); + } + + Segment newSegment = SegmentImpl.initializeFromContext(new SegmentInitializationContextImpl(segmentinitialContext.getSegmentName(), segmentinitialContext.getSegmentPath(), size, segIndex)); + + for (String in : keys) { + context.currentTableContext().getTableIndex().onIndexedEntityUpdated(in, segment); + } + context.currentTableContext().updateCurrentSegment(newSegment); } } + + diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java index 9d52528e..f757eca1 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java @@ -7,30 +7,40 @@ import java.nio.file.Path; public class TableInitializationContextImpl implements TableInitializationContext { + + private final String tableName; + private final Path databasePath; + private final TableIndex tableIndex; + private Segment lastSegment; + public TableInitializationContextImpl(String tableName, Path databasePath, TableIndex tableIndex) { + this.tableName = tableName; + this.databasePath = Path.of(databasePath.toString(), tableName); + this.tableIndex = tableIndex; } @Override public String getTableName() { - return null; + return tableName; } @Override public Path getTablePath() { - return null; + return databasePath; } @Override public TableIndex getTableIndex() { - return null; + return tableIndex; } @Override public Segment getCurrentSegment() { - return null; + return lastSegment; } @Override public void updateCurrentSegment(Segment segment) { + lastSegment = segment; } } diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java index c6c7c620..4162c1a8 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java @@ -3,10 +3,22 @@ import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.initialization.InitializationContext; import com.itmo.java.basics.initialization.Initializer; +import com.itmo.java.basics.initialization.SegmentInitializationContext; +import com.itmo.java.basics.initialization.TableInitializationContext; +import com.itmo.java.basics.logic.Table; +import com.itmo.java.basics.logic.impl.TableImpl; + +import java.io.File; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; public class TableInitializer implements Initializer { + private final Initializer segmentInitializer; + public TableInitializer(SegmentInitializer segmentInitializer) { + this.segmentInitializer = segmentInitializer; } /** @@ -15,9 +27,33 @@ public TableInitializer(SegmentInitializer segmentInitializer) { * * @param context контекст с информацией об инициализируемой бд, окружении, таблицы * @throws DatabaseException если в контексте лежит неправильный путь к таблице, невозможно прочитать содержимого папки, - * или если возникла ошибка ошибка дочерних инициализаторов + * или если возникла ошибка ошибка дочерних инициализаторов */ @Override + public void perform(InitializationContext context) throws DatabaseException { + + if (context.currentDbContext() == null) { + throw new DatabaseException("Context Db is null"); + } + + TableInitializationContext tbinitalContext = context.currentTableContext(); + File curFile = new File(tbinitalContext.getTablePath().toString()); + + if (!curFile.exists()) { + throw new DatabaseException("Directory " + tbinitalContext.getTableName() + " does not exist"); + } + + File[] files = curFile.listFiles(); + List segments = Arrays.asList(files); + Collections.sort(segments); + + for (File seg : segments) { + SegmentInitializationContext segmentContext = new SegmentInitializationContextImpl(seg.getName(), tbinitalContext.getTablePath(), 0); + segmentInitializer.perform(new InitializationContextImpl(context.executionEnvironment(), context.currentDbContext(), context.currentTableContext(), segmentContext)); + } + + Table newTable = TableImpl.initializeFromContext(tbinitalContext); + context.currentDbContext().addTable(newTable); } } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java index 8ec5e331..ef91ea58 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java @@ -2,21 +2,36 @@ import com.itmo.java.basics.logic.DatabaseCache; +import java.util.LinkedHashMap; +import java.util.Map; + public class DatabaseCacheImpl implements DatabaseCache { - private static final int CAPACITY = 5_000; + + private static final int dbCapacity = 5000; + private final Map dbCache; + + public DatabaseCacheImpl() { + + this.dbCache = new LinkedHashMap(dbCapacity, 1f, true) { + @Override + protected boolean removeEldestEntry(Map.Entry eldest) { + return size() > dbCapacity; + } + }; + } @Override public byte[] get(String key) { - return new byte[0]; + return dbCache.get(key); } @Override public void set(String key, byte[] value) { - + dbCache.put(key, value); } @Override public void delete(String key) { - + dbCache.remove(key); } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index 0d4d3ff9..69f8b702 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -16,34 +16,39 @@ public class DatabaseImpl implements Database { - private String dbName; - private Path databaseRoot; + private final String dbName; + private final Path databaseRoot; private Map tableDictionary = new HashMap(); + private DatabaseImpl(String dbName, Path databaseRoot) { this.dbName = dbName; this.databaseRoot = databaseRoot; } + private DatabaseImpl(DatabaseInitializationContext context) { + this.dbName = context.getDbName(); + this.databaseRoot = context.getDatabasePath(); + this.tableDictionary = context.getTables(); + } public static Database create(String dbName, Path databaseRoot) throws DatabaseException { - if (dbName == null) + if (dbName == null) { throw new DatabaseException("Why dataBase name is null?"); - - if (Files.exists(Paths.get(databaseRoot.toString(), dbName))) + } + if (Files.exists(Paths.get(databaseRoot.toString(), dbName))) { throw new DatabaseException("This" + dbName + "already exists"); - + } try { Files.createDirectory(Paths.get(databaseRoot.toString(), dbName)); } catch (IOException ex) { - throw new DatabaseException("Error while creating a DataBase(" + dbName + ") directory" , ex); + throw new DatabaseException("Error while creating a DataBase(" + dbName + ") directory", ex); } - return new DatabaseImpl(dbName, databaseRoot); } public static Database initializeFromContext(DatabaseInitializationContext context) { - return null; + return new DatabaseImpl(context); } @Override @@ -54,55 +59,50 @@ public String getName() { @Override public void createTableIfNotExists(String tableName) throws DatabaseException { - if (tableName == null) + if (tableName == null) { throw new DatabaseException("Why tableName name is null?"); - - if ((tableDictionary.containsKey(tableName)) || (Files.exists(Paths.get(databaseRoot.toString(), dbName, tableName)))) + } + if ((tableDictionary.containsKey(tableName)) || (Files.exists(Paths.get(databaseRoot.toString(), dbName, tableName)))) { throw new DatabaseException("We have " + tableName + " in " + dbName + "directory"); - + } TableIndex newTableIndex = new TableIndex(); Path pathToTableRoot = Paths.get(databaseRoot.toString(), dbName); Table newTable = TableImpl.create(tableName, pathToTableRoot, newTableIndex); - tableDictionary.put(tableName, newTable); } @Override public void write(String tableName, String objectKey, byte[] objectValue) throws DatabaseException { + + if (tableName == null) { + throw new DatabaseException("Error while writing in , null name"); + } if (!tableDictionary.containsKey(tableName)) { throw new DatabaseException("Table " + tableName + " doesn't exist in database" + dbName); } - if (tableName == null) - throw new DatabaseException("Error while writing in database"); - Table table = tableDictionary.get(tableName); table.write(objectKey, objectValue); } @Override public Optional read(String tableName, String objectKey) throws DatabaseException { - Table table = tableDictionary.get(tableName); - - if (tableName == null) - throw new DatabaseException("Error while writing in database"); - + if (tableName == null) { + throw new DatabaseException("Error while reading in database , null name"); + } return table.read(objectKey); } @Override public void delete(String tableName, String objectKey) throws DatabaseException { - if (!tableDictionary.containsKey(tableName)) { - throw new DatabaseException("Table " + tableName + " doesn't exist in database" + dbName); + throw new DatabaseException("Table " + tableName + " doesnt exist in database" + dbName); } - - if (tableName == null) + if (tableName == null) { throw new DatabaseException("Writing in database error"); - + } Table tableImpl = tableDictionary.get(tableName); - tableImpl.delete(objectKey); } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java index 7dcde002..7406a93c 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java @@ -25,11 +25,14 @@ public byte[] getValue() { @Override public long size() { - return getKeySize() + getValueSize() + 4 + 4; + return getKeySize() + 4 + 4; } @Override - public boolean isValuePresented() { return false; } + public boolean isValuePresented() { + return false; + } + @Override public int getKeySize() { diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index cf0fb156..406e4b93 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -1,11 +1,10 @@ package com.itmo.java.basics.logic.impl; -import com.itmo.java.basics.initialization.SegmentInitializationContext; -import com.itmo.java.basics.logic.Segment; import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.index.SegmentOffsetInfo; import com.itmo.java.basics.index.impl.SegmentIndex; import com.itmo.java.basics.index.impl.SegmentOffsetInfoImpl; +import com.itmo.java.basics.initialization.SegmentInitializationContext; import com.itmo.java.basics.logic.DatabaseRecord; import com.itmo.java.basics.logic.Segment; import com.itmo.java.basics.logic.io.DatabaseInputStream; @@ -19,20 +18,16 @@ import java.nio.file.Paths; import java.util.Optional; -public class SegmentImpl implements Segment { - public static Segment create(String segmentName, Path tableRootPath) throws DatabaseException { - throw new UnsupportedOperationException(); - } +import static java.nio.file.StandardOpenOption.APPEND; - public static Segment initializeFromContext(SegmentInitializationContext context) { - return null; +public class SegmentImpl implements Segment { - private Path tableRootPath; - private String segmentName; - private SegmentIndex segmentIndex; + private final Path tableRootPath; + private final String segmentName; + private final SegmentIndex segmentIndex; private final long sizeMaximum = 100000; - private long segmentSize; private final DatabaseOutputStream outStream; + private long segmentSize = 0; public SegmentImpl(Path tableRootPath, String segmentName, OutputStream outStream) { this.tableRootPath = tableRootPath; @@ -41,21 +36,42 @@ public SegmentImpl(Path tableRootPath, String segmentName, OutputStream outStrea this.outStream = new DatabaseOutputStream(outStream); } - static Segment create(String segmentName, Path tableRootPath) throws DatabaseException { + private SegmentImpl(SegmentInitializationContext context, OutputStream outStream) { + this.tableRootPath = context.getSegmentPath(); + this.segmentName = context.getSegmentName(); + this.segmentIndex = context.getIndex(); + this.segmentSize = context.getCurrentSize(); + this.outStream = new DatabaseOutputStream(outStream); + } + + public static Segment create(String segmentName, Path tableRootPath) throws DatabaseException { + Path segmentRoot = Paths.get(tableRootPath.toString(), segmentName); boolean isCreated; - OutputStream outputStream; + OutputStream output; - try{ + try { isCreated = segmentRoot.toFile().createNewFile(); - outputStream = Files.newOutputStream(segmentRoot); - }catch(IOException ex){ + output = Files.newOutputStream(segmentRoot); + } catch (IOException ex) { throw new DatabaseException("Error while creating segment " + segmentName, ex); } - if(!isCreated){ + if (!isCreated) { throw new DatabaseException("Error while creating segment " + segmentName + "as it already exists"); } - return new SegmentImpl(segmentRoot, segmentName, outputStream); + return new SegmentImpl(segmentRoot, segmentName, output); + } + + public static Segment initializeFromContext(SegmentInitializationContext context) throws RuntimeException{ + + OutputStream output; + try { + output = Files.newOutputStream(context.getSegmentPath(), APPEND); + } catch (IOException ex) { + throw new RuntimeException("Error while newOpenFile in Segment initializeFromContext" , ex); + } + SegmentImpl newSegment = new SegmentImpl(context, output); + return newSegment; } static String createSegmentName(String tableName) { @@ -92,26 +108,25 @@ public Optional read(String objectKey) throws IOException { } long myOf = offsetInfo.get().getOffset(); - try (DatabaseInputStream in = new DatabaseInputStream(Files.newInputStream(tableRootPath))) { - long skipped = in.skip(myOf); + try (DatabaseInputStream input = new DatabaseInputStream(Files.newInputStream(tableRootPath))) { + long skipped = input.skip(myOf); if (skipped != myOf) { throw new IOException("Error while skipping bytes in segment called " + segmentName); } - Optional value = in.readDbUnit(); - + Optional value = input.readDbUnit(); if (value.isEmpty()) { return Optional.empty(); } - - return Optional.of(value.get().getValue()); - + return Optional.ofNullable(value.get().getValue()); } catch (IOException exception) { throw new IOException("Error while creating a Segment file " + segmentName, exception); } } @Override - public boolean isReadOnly() { return segmentSize >= sizeMaximum;} + public boolean isReadOnly() { + return segmentSize >= sizeMaximum; + } @Override public boolean delete(String objectKey) throws IOException { @@ -120,12 +135,6 @@ public boolean delete(String objectKey) throws IOException { outStream.close(); return false; } - - if (segmentIndex.searchForKey(objectKey).isEmpty()){ - outStream.close(); - return false; - } - RemoveDatabaseRecord newSeg = new RemoveDatabaseRecord(objectKey.getBytes()); segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); segmentSize += outStream.write(newSeg); diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java index 29dd3d46..7b6fda4c 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java @@ -15,6 +15,7 @@ public SetDatabaseRecord(byte[] key, byte[] value) { this.value = value; } + @Override public byte[] getKey() { return key; @@ -31,7 +32,9 @@ public long size() { } @Override - public boolean isValuePresented() { return true; } + public boolean isValuePresented() { + return true; + } @Override public int getKeySize() { diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index fff53bbe..c00b94c4 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -2,8 +2,8 @@ import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.index.impl.TableIndex; -import com.itmo.java.basics.logic.Segment; import com.itmo.java.basics.initialization.TableInitializationContext; +import com.itmo.java.basics.logic.Segment; import com.itmo.java.basics.logic.Table; import java.io.IOException; @@ -13,16 +13,10 @@ import java.util.Optional; public class TableImpl implements Table { - public static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { - return null; - } - - public static Table initializeFromContext(TableInitializationContext context) { - return null; - private String tableName; - private Path pathToDatabaseRoot; - private TableIndex tableIndex; + private final String tableName; + private final Path pathToDatabaseRoot; + private final TableIndex tableIndex; private Segment lastSegment; private TableImpl(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { @@ -32,28 +26,40 @@ private TableImpl(String tableName, Path pathToDatabaseRoot, TableIndex tableInd this.lastSegment = SegmentImpl.create(SegmentImpl.createSegmentName(tableName), pathToDatabaseRoot); } - static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { + private TableImpl(TableInitializationContext context) { + this.tableName = context.getTableName(); + this.lastSegment = context.getCurrentSegment(); + this.pathToDatabaseRoot = context.getTablePath().getParent(); + this.tableIndex = context.getTableIndex(); + } - if (tableName == null) + public static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { + if (tableName == null) { throw new DatabaseException("Why tableBase name is null?"); - + } Path pathToTableRoot = Paths.get(pathToDatabaseRoot.toString(), tableName); - try { Files.createDirectory(pathToTableRoot); } catch (IOException ex) { throw new DatabaseException("Error while creating a Table(" + tableName + ") directory"); } + TableImpl newTb = new TableImpl(tableName, pathToTableRoot, tableIndex); + return new CachingTable(newTb); + } + - return new TableImpl(tableName, pathToTableRoot, tableIndex); + public static Table initializeFromContext(TableInitializationContext context) { + return new CachingTable(new TableImpl(context)); } + @Override - public String getName() { return tableName; } + public String getName() { + return tableName; + } @Override public void write(String objectKey, byte[] objectValue) throws DatabaseException { - try { boolean canWewrite = lastSegment.write(objectKey, objectValue); @@ -63,40 +69,35 @@ public void write(String objectKey, byte[] objectValue) throws DatabaseException } tableIndex.onIndexedEntityUpdated(objectKey, lastSegment); } catch (IOException ex) { - throw new DatabaseException("Writing in database error " , ex); + throw new DatabaseException("Writing in database error ", ex); } } @Override public Optional read(String objectKey) throws DatabaseException { - try { Optional segmentRead = tableIndex.searchForKey(objectKey); if (segmentRead.isPresent()) { return segmentRead.get().read(objectKey); - } else return Optional.empty(); } catch (IOException ex) { - throw new DatabaseException("Reading in database error " , ex); + throw new DatabaseException("Reading in database error ", ex); } } @Override public void delete(String objectKey) throws DatabaseException { - try { boolean canDel = lastSegment.delete(objectKey); - if (!canDel) { lastSegment = SegmentImpl.create(SegmentImpl.createSegmentName(tableName), pathToDatabaseRoot); lastSegment.delete(objectKey); } - tableIndex.onIndexedEntityUpdated(objectKey, null); } catch (IOException ex) { throw new DatabaseException("Deleting error in Table"); } } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java index a18df289..008d4b5f 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java @@ -2,6 +2,7 @@ import com.itmo.java.basics.logic.DatabaseRecord; import com.itmo.java.basics.logic.WritableDatabaseRecord; +import com.itmo.java.basics.logic.impl.RemoveDatabaseRecord; import com.itmo.java.basics.logic.impl.SetDatabaseRecord; import java.io.DataInputStream; @@ -25,29 +26,21 @@ public DatabaseInputStream(InputStream inputStream) { * @return следующую запись, если она существует. {@link Optional#empty()} - если конец файла достигнут */ public Optional readDbUnit() throws IOException { - - if (available() <= 4) { - return Optional.empty(); - } - int keySize = readInt(); - - if (available() <= 0) { + try { + int keySize = readInt(); + byte[] key = readNBytes(keySize); + int valueSize = readInt(); + + if (valueSize != REMOVED_OBJECT_SIZE) { + byte[] value = readNBytes(valueSize); + Optional result = Optional.of(new SetDatabaseRecord(key, value)); + return result; + } else { + return Optional.of(new RemoveDatabaseRecord(key)); + } + } catch (IOException ex) { return Optional.empty(); } - byte[] key = readNBytes(keySize); - - if (available() <= 4) { - return Optional.empty(); - } - int valueSize = readInt(); - - if ((available() <= 0) && (valueSize == REMOVED_OBJECT_SIZE)) { - return Optional.empty(); - } - byte[] value = readNBytes(valueSize); - SetDatabaseRecord datarecord = new SetDatabaseRecord(key, value); - - return Optional.of(datarecord); } } diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java index a716e32c..5c46dfa5 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java @@ -40,11 +40,12 @@ public int write(WritableDatabaseRecord databaseRecord) throws IOException { write(databaseRecord.getKey()); writeInt(databaseRecord.getValueSize()); - if (databaseRecord.isValuePresented()) + if (databaseRecord.isValuePresented()) { write(databaseRecord.getValue()); + } flush(); - return databaseRecord.getKeySize() + databaseRecord.getValueSize() + 4 + 4; + return (int) databaseRecord.size(); } } \ No newline at end of file From d1df6e5f8602123035a6e8622d56175d20325705 Mon Sep 17 00:00:00 2001 From: Fredi Kats Date: Sat, 20 Feb 2021 23:33:34 +0300 Subject: [PATCH 027/378] init: add base code for first lab --- .../basics/exceptions/DatabaseException.java | 2 +- .../com/itmo/java/basics/index/KvsIndex.java | 4 +- .../java/basics/index/SegmentOffsetInfo.java | 2 +- .../basics/index/impl/MapBasedKvsIndex.java | 4 +- .../java/basics/index/impl/SegmentIndex.java | 4 +- .../index/impl/SegmentOffsetInfoImpl.java | 4 +- .../java/basics/index/impl/TableIndex.java | 4 +- .../com/itmo/java/basics/logic/Database.java | 10 +- .../java/basics/logic/DatabaseRecord.java | 2 +- .../com/itmo/java/basics/logic/Segment.java | 19 ++- .../com/itmo/java/basics/logic/Table.java | 8 +- .../basics/logic/WritableDatabaseRecord.java | 2 +- .../java/basics/logic/impl/DatabaseImpl.java | 86 ++---------- .../java/basics/logic/impl/SegmentImpl.java | 124 ++---------------- .../java/basics/logic/impl/TableImpl.java | 89 ++----------- .../basics/logic/io/DatabaseInputStream.java | 26 +--- .../basics/logic/io/DatabaseOutputStream.java | 21 +-- 17 files changed, 69 insertions(+), 342 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/exceptions/DatabaseException.java b/src/main/java/com/itmo/java/basics/exceptions/DatabaseException.java index 85a33133..07d921e7 100644 --- a/src/main/java/com/itmo/java/basics/exceptions/DatabaseException.java +++ b/src/main/java/com/itmo/java/basics/exceptions/DatabaseException.java @@ -1,4 +1,4 @@ -package com.itmo.java.basics.exceptions; +package main.java.com.itmo.java.basics.exceptions; public class DatabaseException extends Exception { public DatabaseException(String message) { diff --git a/src/main/java/com/itmo/java/basics/index/KvsIndex.java b/src/main/java/com/itmo/java/basics/index/KvsIndex.java index 15534257..5ea358f6 100644 --- a/src/main/java/com/itmo/java/basics/index/KvsIndex.java +++ b/src/main/java/com/itmo/java/basics/index/KvsIndex.java @@ -1,4 +1,4 @@ -package com.itmo.java.basics.index; +package main.java.com.itmo.java.basics.index; import java.util.Optional; @@ -6,7 +6,7 @@ public interface KvsIndex { /** * Оповещает индекс об обновлении значения по определенному ключу. * - * @param key ключ, который обновился + * @param key ключ, который обновился * @param value новое значение */ void onIndexedEntityUpdated(K key, V value); diff --git a/src/main/java/com/itmo/java/basics/index/SegmentOffsetInfo.java b/src/main/java/com/itmo/java/basics/index/SegmentOffsetInfo.java index 93921ecd..38230ed5 100644 --- a/src/main/java/com/itmo/java/basics/index/SegmentOffsetInfo.java +++ b/src/main/java/com/itmo/java/basics/index/SegmentOffsetInfo.java @@ -1,4 +1,4 @@ -package com.itmo.java.basics.index; +package main.java.com.itmo.java.basics.index; public interface SegmentOffsetInfo { long getOffset(); diff --git a/src/main/java/com/itmo/java/basics/index/impl/MapBasedKvsIndex.java b/src/main/java/com/itmo/java/basics/index/impl/MapBasedKvsIndex.java index ba102d65..caae3e48 100644 --- a/src/main/java/com/itmo/java/basics/index/impl/MapBasedKvsIndex.java +++ b/src/main/java/com/itmo/java/basics/index/impl/MapBasedKvsIndex.java @@ -1,6 +1,6 @@ -package com.itmo.java.basics.index.impl; +package main.java.com.itmo.java.basics.index.impl; -import com.itmo.java.basics.index.KvsIndex; +import main.java.com.itmo.java.basics.index.KvsIndex; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/com/itmo/java/basics/index/impl/SegmentIndex.java b/src/main/java/com/itmo/java/basics/index/impl/SegmentIndex.java index 7370c6d6..ee6b8e48 100644 --- a/src/main/java/com/itmo/java/basics/index/impl/SegmentIndex.java +++ b/src/main/java/com/itmo/java/basics/index/impl/SegmentIndex.java @@ -1,6 +1,6 @@ -package com.itmo.java.basics.index.impl; +package main.java.com.itmo.java.basics.index.impl; -import com.itmo.java.basics.index.SegmentOffsetInfo; +import main.java.com.itmo.java.basics.index.SegmentOffsetInfo; public class SegmentIndex extends MapBasedKvsIndex { } diff --git a/src/main/java/com/itmo/java/basics/index/impl/SegmentOffsetInfoImpl.java b/src/main/java/com/itmo/java/basics/index/impl/SegmentOffsetInfoImpl.java index 9ee2edc0..413cc58e 100644 --- a/src/main/java/com/itmo/java/basics/index/impl/SegmentOffsetInfoImpl.java +++ b/src/main/java/com/itmo/java/basics/index/impl/SegmentOffsetInfoImpl.java @@ -1,6 +1,6 @@ -package com.itmo.java.basics.index.impl; +package main.java.com.itmo.java.basics.index.impl; -import com.itmo.java.basics.index.SegmentOffsetInfo; +import main.java.com.itmo.java.basics.index.SegmentOffsetInfo; public class SegmentOffsetInfoImpl implements SegmentOffsetInfo { private final long offset; diff --git a/src/main/java/com/itmo/java/basics/index/impl/TableIndex.java b/src/main/java/com/itmo/java/basics/index/impl/TableIndex.java index eceaeea8..86eddfde 100644 --- a/src/main/java/com/itmo/java/basics/index/impl/TableIndex.java +++ b/src/main/java/com/itmo/java/basics/index/impl/TableIndex.java @@ -1,6 +1,6 @@ -package com.itmo.java.basics.index.impl; +package main.java.com.itmo.java.basics.index.impl; -import com.itmo.java.basics.logic.Segment; +import main.java.com.itmo.java.basics.logic.Segment; public class TableIndex extends MapBasedKvsIndex { } diff --git a/src/main/java/com/itmo/java/basics/logic/Database.java b/src/main/java/com/itmo/java/basics/logic/Database.java index 912a1536..7ec4e860 100644 --- a/src/main/java/com/itmo/java/basics/logic/Database.java +++ b/src/main/java/com/itmo/java/basics/logic/Database.java @@ -1,6 +1,6 @@ -package com.itmo.java.basics.logic; +package main.java.com.itmo.java.basics.logic; -import com.itmo.java.basics.exceptions.DatabaseException; +import main.java.com.itmo.java.basics.exceptions.DatabaseException; import java.util.Optional; @@ -23,8 +23,8 @@ public interface Database { /** * Записывает значение в указанную таблицу по переданному ключу. * - * @param tableName таблица, в которую нужно записать значение - * @param objectKey ключ, по которому нужно записать значение + * @param tableName таблица, в которую нужно записать значение + * @param objectKey ключ, по которому нужно записать значение * @param objectValue значение, которое нужно записать * @throws DatabaseException если указанная таблица не была найдена или если произошла ошибка ввода-вывода */ @@ -36,7 +36,7 @@ public interface Database { * @param tableName таблица, из которой нужно считать значение * @param objectKey ключ, по которому нужно получить значение * @return значение, которое находится по ключу - * @throws DatabaseException если не была найдена указанная таблица, или произошла ошибка ввода-вывода + * @throws DatabaseException если не была найдена указанная таблица, или если не была найдена запись по данному ключу, или произошла ошибка ввода-вывода */ Optional read(String tableName, String objectKey) throws DatabaseException, IOException; diff --git a/src/main/java/com/itmo/java/basics/logic/DatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/DatabaseRecord.java index ee4d17b0..4428875e 100644 --- a/src/main/java/com/itmo/java/basics/logic/DatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/DatabaseRecord.java @@ -1,4 +1,4 @@ -package com.itmo.java.basics.logic; +package main.java.com.itmo.java.basics.logic; /** * Представляет собой единицу хранения в БД diff --git a/src/main/java/com/itmo/java/basics/logic/Segment.java b/src/main/java/com/itmo/java/basics/logic/Segment.java index 6168fdcb..8fd3b4ca 100644 --- a/src/main/java/com/itmo/java/basics/logic/Segment.java +++ b/src/main/java/com/itmo/java/basics/logic/Segment.java @@ -1,15 +1,10 @@ -package com.itmo.java.basics.logic; +package main.java.com.itmo.java.basics.logic; + +import main.java.com.itmo.java.basics.exceptions.DatabaseException; import java.io.IOException; import java.util.Optional; -/** - * Сегмент - append-only файл, хранящий пары ключ-значение, разделенные специальным символом. - * - имеет ограниченный размер, большие значения (>100000) записываются в последний сегмент, если он не read-only - * - при превышении размера сегмента создается новый сегмент и дальнейшие операции записи производятся в него - * - именование файла-сегмента должно позволять установить очередность их появления - * - является неизменяемым после появления более нового сегмента - */ public interface Segment { /** * Возвращает имя сегмента. @@ -18,15 +13,19 @@ public interface Segment { */ String getName(); + // todo sukhoa in future may return something like SegmentWriteResult .. with report and error details? + // for new returns false if cannot allocate requested capacity + // exception is questionable /** * Записывает значение по указанному ключу в сегмент. * - * @param objectKey ключ, по которому нужно записать значение + * @param objectKey ключ, по которому нужно записать значение * @param objectValue значение, которое нужно записать * @return {@code true} - если значение записалось, {@code false} - если нет * @throws IOException если произошла ошибка ввода-вывода. + * @throws DatabaseException */ - boolean write(String objectKey, byte[] objectValue) throws IOException; + boolean write(String objectKey, byte[] objectValue) throws IOException, DatabaseException; /** * Считывает значение из сегмента по переданному ключу. diff --git a/src/main/java/com/itmo/java/basics/logic/Table.java b/src/main/java/com/itmo/java/basics/logic/Table.java index 37e82917..8e7c70c0 100644 --- a/src/main/java/com/itmo/java/basics/logic/Table.java +++ b/src/main/java/com/itmo/java/basics/logic/Table.java @@ -1,6 +1,6 @@ -package com.itmo.java.basics.logic; +package main.java.com.itmo.java.basics.logic; -import com.itmo.java.basics.exceptions.DatabaseException; +import main.java.com.itmo.java.basics.exceptions.DatabaseException; import java.util.Optional; @@ -24,7 +24,7 @@ public interface Table { /** * Записывает в таблицу переданное значение по указанному ключу. * - * @param objectKey ключ, по которому нужно записать значение + * @param objectKey ключ, по которому нужно записать значение * @param objectValue значение, которое нужно записать * @throws DatabaseException если произошла ошибка ввода-вывода */ @@ -35,7 +35,7 @@ public interface Table { * * @param objectKey ключ, по которому нужно получить значение * @return значение, которое находится по ключу - * @throws DatabaseException если произошла ошибка ввода-вывода + * @throws DatabaseException если не была найдена запись по данному ключу или произошла ошибка ввода-вывода */ Optional read(String objectKey) throws DatabaseException, IOException; diff --git a/src/main/java/com/itmo/java/basics/logic/WritableDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/WritableDatabaseRecord.java index f1f859c7..d1be1c27 100644 --- a/src/main/java/com/itmo/java/basics/logic/WritableDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/WritableDatabaseRecord.java @@ -1,4 +1,4 @@ -package com.itmo.java.basics.logic; +package main.java.com.itmo.java.basics.logic; /** * Содержит информацию о параметрах {@link DatabaseRecord} для хранения в БД diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index 69f8b702..cb6dca85 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -1,108 +1,38 @@ -package com.itmo.java.basics.logic.impl; +package main.java.com.itmo.java.basics.logic.impl; -import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.index.impl.TableIndex; -import com.itmo.java.basics.initialization.DatabaseInitializationContext; -import com.itmo.java.basics.logic.Database; -import com.itmo.java.basics.logic.Table; +import main.java.com.itmo.java.basics.exceptions.DatabaseException; +import main.java.com.itmo.java.basics.logic.Database; -import java.io.IOException; -import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.HashMap; -import java.util.Map; import java.util.Optional; public class DatabaseImpl implements Database { - - private final String dbName; - private final Path databaseRoot; - private Map tableDictionary = new HashMap(); - - private DatabaseImpl(String dbName, Path databaseRoot) { - this.dbName = dbName; - this.databaseRoot = databaseRoot; - } - - private DatabaseImpl(DatabaseInitializationContext context) { - this.dbName = context.getDbName(); - this.databaseRoot = context.getDatabasePath(); - this.tableDictionary = context.getTables(); - } - public static Database create(String dbName, Path databaseRoot) throws DatabaseException { - - if (dbName == null) { - throw new DatabaseException("Why dataBase name is null?"); - } - if (Files.exists(Paths.get(databaseRoot.toString(), dbName))) { - throw new DatabaseException("This" + dbName + "already exists"); - } - try { - Files.createDirectory(Paths.get(databaseRoot.toString(), dbName)); - } catch (IOException ex) { - throw new DatabaseException("Error while creating a DataBase(" + dbName + ") directory", ex); - } - return new DatabaseImpl(dbName, databaseRoot); - } - - public static Database initializeFromContext(DatabaseInitializationContext context) { - return new DatabaseImpl(context); + return null; } @Override public String getName() { - return dbName; + return null; } @Override public void createTableIfNotExists(String tableName) throws DatabaseException { - if (tableName == null) { - throw new DatabaseException("Why tableName name is null?"); - } - if ((tableDictionary.containsKey(tableName)) || (Files.exists(Paths.get(databaseRoot.toString(), dbName, tableName)))) { - throw new DatabaseException("We have " + tableName + " in " + dbName + "directory"); - } - TableIndex newTableIndex = new TableIndex(); - Path pathToTableRoot = Paths.get(databaseRoot.toString(), dbName); - Table newTable = TableImpl.create(tableName, pathToTableRoot, newTableIndex); - tableDictionary.put(tableName, newTable); } @Override public void write(String tableName, String objectKey, byte[] objectValue) throws DatabaseException { - if (tableName == null) { - throw new DatabaseException("Error while writing in , null name"); - } - if (!tableDictionary.containsKey(tableName)) { - throw new DatabaseException("Table " + tableName + " doesn't exist in database" + dbName); - } - - Table table = tableDictionary.get(tableName); - table.write(objectKey, objectValue); } @Override public Optional read(String tableName, String objectKey) throws DatabaseException { - Table table = tableDictionary.get(tableName); - if (tableName == null) { - throw new DatabaseException("Error while reading in database , null name"); - } - return table.read(objectKey); + return Optional.empty(); } @Override public void delete(String tableName, String objectKey) throws DatabaseException { - if (!tableDictionary.containsKey(tableName)) { - throw new DatabaseException("Table " + tableName + " doesnt exist in database" + dbName); - } - if (tableName == null) { - throw new DatabaseException("Writing in database error"); - } - Table tableImpl = tableDictionary.get(tableName); - tableImpl.delete(objectKey); + } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 406e4b93..b9318a5a 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -1,77 +1,15 @@ -package com.itmo.java.basics.logic.impl; +package main.java.com.itmo.java.basics.logic.impl; -import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.index.SegmentOffsetInfo; -import com.itmo.java.basics.index.impl.SegmentIndex; -import com.itmo.java.basics.index.impl.SegmentOffsetInfoImpl; -import com.itmo.java.basics.initialization.SegmentInitializationContext; -import com.itmo.java.basics.logic.DatabaseRecord; -import com.itmo.java.basics.logic.Segment; -import com.itmo.java.basics.logic.io.DatabaseInputStream; -import com.itmo.java.basics.logic.io.DatabaseOutputStream; +import main.java.com.itmo.java.basics.logic.Segment; +import main.java.com.itmo.java.basics.exceptions.DatabaseException; import java.io.IOException; -import java.io.OutputStream; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.Optional; -import static java.nio.file.StandardOpenOption.APPEND; - public class SegmentImpl implements Segment { - - private final Path tableRootPath; - private final String segmentName; - private final SegmentIndex segmentIndex; - private final long sizeMaximum = 100000; - private final DatabaseOutputStream outStream; - private long segmentSize = 0; - - public SegmentImpl(Path tableRootPath, String segmentName, OutputStream outStream) { - this.tableRootPath = tableRootPath; - this.segmentName = segmentName; - this.segmentIndex = new SegmentIndex(); - this.outStream = new DatabaseOutputStream(outStream); - } - - private SegmentImpl(SegmentInitializationContext context, OutputStream outStream) { - this.tableRootPath = context.getSegmentPath(); - this.segmentName = context.getSegmentName(); - this.segmentIndex = context.getIndex(); - this.segmentSize = context.getCurrentSize(); - this.outStream = new DatabaseOutputStream(outStream); - } - - public static Segment create(String segmentName, Path tableRootPath) throws DatabaseException { - - Path segmentRoot = Paths.get(tableRootPath.toString(), segmentName); - boolean isCreated; - OutputStream output; - - try { - isCreated = segmentRoot.toFile().createNewFile(); - output = Files.newOutputStream(segmentRoot); - } catch (IOException ex) { - throw new DatabaseException("Error while creating segment " + segmentName, ex); - } - if (!isCreated) { - throw new DatabaseException("Error while creating segment " + segmentName + "as it already exists"); - } - return new SegmentImpl(segmentRoot, segmentName, output); - } - - public static Segment initializeFromContext(SegmentInitializationContext context) throws RuntimeException{ - - OutputStream output; - try { - output = Files.newOutputStream(context.getSegmentPath(), APPEND); - } catch (IOException ex) { - throw new RuntimeException("Error while newOpenFile in Segment initializeFromContext" , ex); - } - SegmentImpl newSegment = new SegmentImpl(context, output); - return newSegment; + static Segment create(String segmentName, Path tableRootPath) throws DatabaseException { + throw new UnsupportedOperationException(); // todo implement } static String createSegmentName(String tableName) { @@ -80,64 +18,26 @@ static String createSegmentName(String tableName) { @Override public String getName() { - return segmentName; + return null; } @Override - public boolean write(String objectKey, byte[] objectValue) throws IOException { - - if (isReadOnly()) { - outStream.close(); - return false; - } - if (objectValue == null) { - return delete(objectKey); - } - SetDatabaseRecord newSeg = new SetDatabaseRecord(objectKey.getBytes(StandardCharsets.UTF_8), objectValue); - segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); - segmentSize += outStream.write(newSeg); - return true; + public boolean write(String objectKey, byte[] objectValue) throws IOException, DatabaseException { + return false; } @Override public Optional read(String objectKey) throws IOException { - - Optional offsetInfo = segmentIndex.searchForKey(objectKey); - if (offsetInfo.isEmpty()) { - return Optional.empty(); - } - - long myOf = offsetInfo.get().getOffset(); - try (DatabaseInputStream input = new DatabaseInputStream(Files.newInputStream(tableRootPath))) { - long skipped = input.skip(myOf); - if (skipped != myOf) { - throw new IOException("Error while skipping bytes in segment called " + segmentName); - } - Optional value = input.readDbUnit(); - if (value.isEmpty()) { - return Optional.empty(); - } - return Optional.ofNullable(value.get().getValue()); - } catch (IOException exception) { - throw new IOException("Error while creating a Segment file " + segmentName, exception); - } + return Optional.empty(); } @Override public boolean isReadOnly() { - return segmentSize >= sizeMaximum; + return false; } @Override public boolean delete(String objectKey) throws IOException { - - if (isReadOnly()) { - outStream.close(); - return false; - } - RemoveDatabaseRecord newSeg = new RemoveDatabaseRecord(objectKey.getBytes()); - segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); - segmentSize += outStream.write(newSeg); - return true; + return false; } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index c00b94c4..82db4cd0 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -1,103 +1,34 @@ -package com.itmo.java.basics.logic.impl; +package main.java.com.itmo.java.basics.logic.impl; -import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.index.impl.TableIndex; -import com.itmo.java.basics.initialization.TableInitializationContext; -import com.itmo.java.basics.logic.Segment; -import com.itmo.java.basics.logic.Table; +import main.java.com.itmo.java.basics.exceptions.DatabaseException; +import main.java.com.itmo.java.basics.index.impl.TableIndex; +import main.java.com.itmo.java.basics.logic.Table; -import java.io.IOException; -import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.Optional; public class TableImpl implements Table { - - private final String tableName; - private final Path pathToDatabaseRoot; - private final TableIndex tableIndex; - private Segment lastSegment; - - private TableImpl(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { - this.tableName = tableName; - this.pathToDatabaseRoot = pathToDatabaseRoot; - this.tableIndex = tableIndex; - this.lastSegment = SegmentImpl.create(SegmentImpl.createSegmentName(tableName), pathToDatabaseRoot); - } - - private TableImpl(TableInitializationContext context) { - this.tableName = context.getTableName(); - this.lastSegment = context.getCurrentSegment(); - this.pathToDatabaseRoot = context.getTablePath().getParent(); - this.tableIndex = context.getTableIndex(); - } - - public static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { - if (tableName == null) { - throw new DatabaseException("Why tableBase name is null?"); - } - Path pathToTableRoot = Paths.get(pathToDatabaseRoot.toString(), tableName); - try { - Files.createDirectory(pathToTableRoot); - } catch (IOException ex) { - throw new DatabaseException("Error while creating a Table(" + tableName + ") directory"); - } - TableImpl newTb = new TableImpl(tableName, pathToTableRoot, tableIndex); - return new CachingTable(newTb); + static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { + return null; } - - public static Table initializeFromContext(TableInitializationContext context) { - return new CachingTable(new TableImpl(context)); - } - - @Override public String getName() { - return tableName; + return null; } @Override public void write(String objectKey, byte[] objectValue) throws DatabaseException { - try { - boolean canWewrite = lastSegment.write(objectKey, objectValue); - if (!canWewrite) { - lastSegment = SegmentImpl.create(SegmentImpl.createSegmentName(tableName), pathToDatabaseRoot); - lastSegment.write(objectKey, objectValue); - } - tableIndex.onIndexedEntityUpdated(objectKey, lastSegment); - } catch (IOException ex) { - throw new DatabaseException("Writing in database error ", ex); - } } @Override public Optional read(String objectKey) throws DatabaseException { - try { - Optional segmentRead = tableIndex.searchForKey(objectKey); - - if (segmentRead.isPresent()) { - return segmentRead.get().read(objectKey); - } else - return Optional.empty(); - } catch (IOException ex) { - throw new DatabaseException("Reading in database error ", ex); - } + return Optional.empty(); } @Override public void delete(String objectKey) throws DatabaseException { - try { - boolean canDel = lastSegment.delete(objectKey); - if (!canDel) { - lastSegment = SegmentImpl.create(SegmentImpl.createSegmentName(tableName), pathToDatabaseRoot); - lastSegment.delete(objectKey); - } - tableIndex.onIndexedEntityUpdated(objectKey, null); - } catch (IOException ex) { - throw new DatabaseException("Deleting error in Table"); - } + } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java index 008d4b5f..2db39228 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java @@ -1,9 +1,7 @@ -package com.itmo.java.basics.logic.io; +package main.java.com.itmo.java.basics.logic.io; -import com.itmo.java.basics.logic.DatabaseRecord; -import com.itmo.java.basics.logic.WritableDatabaseRecord; -import com.itmo.java.basics.logic.impl.RemoveDatabaseRecord; -import com.itmo.java.basics.logic.impl.SetDatabaseRecord; +import main.java.com.itmo.java.basics.logic.DatabaseRecord; +import main.java.com.itmo.java.basics.logic.WritableDatabaseRecord; import java.io.DataInputStream; import java.io.IOException; @@ -22,25 +20,9 @@ public DatabaseInputStream(InputStream inputStream) { /** * Читает следующую запись (см {@link DatabaseOutputStream#write(WritableDatabaseRecord)}) - * * @return следующую запись, если она существует. {@link Optional#empty()} - если конец файла достигнут */ public Optional readDbUnit() throws IOException { - try { - int keySize = readInt(); - byte[] key = readNBytes(keySize); - int valueSize = readInt(); - - if (valueSize != REMOVED_OBJECT_SIZE) { - byte[] value = readNBytes(valueSize); - Optional result = Optional.of(new SetDatabaseRecord(key, value)); - return result; - } else { - return Optional.of(new RemoveDatabaseRecord(key)); - } - } catch (IOException ex) { - return Optional.empty(); - } + return null; } } - diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java index 5c46dfa5..68c15d7c 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java @@ -1,6 +1,6 @@ -package com.itmo.java.basics.logic.io; +package main.java.com.itmo.java.basics.logic.io; -import com.itmo.java.basics.logic.WritableDatabaseRecord; +import main.java.com.itmo.java.basics.logic.WritableDatabaseRecord; import java.io.DataOutputStream; import java.io.IOException; @@ -11,12 +11,8 @@ */ public class DatabaseOutputStream extends DataOutputStream { - private final OutputStream outputStream; - public DatabaseOutputStream(OutputStream outputStream) { - super(outputStream); - this.outputStream = outputStream; } /** @@ -35,17 +31,6 @@ public DatabaseOutputStream(OutputStream outputStream) { * @throws IOException если запись не удалась */ public int write(WritableDatabaseRecord databaseRecord) throws IOException { - - writeInt(databaseRecord.getKeySize()); - write(databaseRecord.getKey()); - writeInt(databaseRecord.getValueSize()); - - if (databaseRecord.isValuePresented()) { - write(databaseRecord.getValue()); - } - flush(); - - return (int) databaseRecord.size(); - + return 0; } } \ No newline at end of file From d5eaadec80fb2479d3aca7dcb7b31290cae6cadc Mon Sep 17 00:00:00 2001 From: asukhovitsky Date: Tue, 9 Mar 2021 12:57:08 +0300 Subject: [PATCH 028/378] update --- .../com/itmo/java/basics/logic/Segment.java | 3 +-- .../logic/impl/RemoveDatabaseRecord.java | 18 +++++----------- .../java/basics/logic/impl/SegmentImpl.java | 2 +- .../basics/logic/impl/SetDatabaseRecord.java | 21 ++++++------------- 4 files changed, 13 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/Segment.java b/src/main/java/com/itmo/java/basics/logic/Segment.java index 8fd3b4ca..f5d8f26f 100644 --- a/src/main/java/com/itmo/java/basics/logic/Segment.java +++ b/src/main/java/com/itmo/java/basics/logic/Segment.java @@ -23,9 +23,8 @@ public interface Segment { * @param objectValue значение, которое нужно записать * @return {@code true} - если значение записалось, {@code false} - если нет * @throws IOException если произошла ошибка ввода-вывода. - * @throws DatabaseException */ - boolean write(String objectKey, byte[] objectValue) throws IOException, DatabaseException; + boolean write(String objectKey, byte[] objectValue) throws IOException; /** * Считывает значение из сегмента по переданному ключу. diff --git a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java index 7406a93c..820c1c01 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java @@ -6,26 +6,19 @@ * Запись в БД, означающая удаление значения по ключу */ public class RemoveDatabaseRecord implements WritableDatabaseRecord { - private byte[] key; - private byte[] value; - - public RemoveDatabaseRecord(byte[] key) { - this.key = key; - } - @Override public byte[] getKey() { - return key; + return new byte[0]; } @Override public byte[] getValue() { - return null; + return new byte[0]; } @Override public long size() { - return getKeySize() + 4 + 4; + return 0; } @Override @@ -33,15 +26,14 @@ public boolean isValuePresented() { return false; } - @Override public int getKeySize() { - return key.length; + return 0; } @Override public int getValueSize() { - return -1; + return 0; } } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index b9318a5a..1a501041 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -22,7 +22,7 @@ public String getName() { } @Override - public boolean write(String objectKey, byte[] objectValue) throws IOException, DatabaseException { + public boolean write(String objectKey, byte[] objectValue) throws IOException { return false; } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java index 7b6fda4c..9164106b 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java @@ -7,42 +7,33 @@ */ public class SetDatabaseRecord implements WritableDatabaseRecord { - private byte[] key; - private byte[] value; - - public SetDatabaseRecord(byte[] key, byte[] value) { - this.key = key; - this.value = value; - } - - @Override public byte[] getKey() { - return key; + return new byte[0]; } @Override public byte[] getValue() { - return value; + return new byte[0]; } @Override public long size() { - return getKeySize() + getValueSize() + 4 + 4; + return 0; } @Override public boolean isValuePresented() { - return true; + return false; } @Override public int getKeySize() { - return key.length; + return 0; } @Override public int getValueSize() { - return value.length; + return 0; } } From 6f7aea4a024e45186c9542708a2146d6545f319d Mon Sep 17 00:00:00 2001 From: Fredi Kats Date: Thu, 1 Apr 2021 01:20:53 +0300 Subject: [PATCH 029/378] init: add base code for second lab --- .../java/basics/config/DatabaseConfig.java | 8 +-- .../impl/ExecutionEnvironmentImpl.java | 11 +--- .../DatabaseInitializationContextImpl.java | 15 ++---- .../impl/DatabaseInitializer.java | 40 ++------------- .../impl/DatabaseServerInitializer.java | 39 -------------- .../impl/InitializationContextImpl.java | 8 +-- .../SegmentInitializationContextImpl.java | 25 ++------- .../impl/SegmentInitializer.java | 51 ------------------- .../impl/TableInitializationContextImpl.java | 18 ++----- .../initialization/impl/TableInitializer.java | 38 +------------- .../java/basics/logic/impl/DatabaseImpl.java | 11 ++-- .../java/basics/logic/impl/SegmentImpl.java | 15 ++++-- .../java/basics/logic/impl/TableImpl.java | 15 ++++-- 13 files changed, 51 insertions(+), 243 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java b/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java index 6ae46737..485309b0 100644 --- a/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java +++ b/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java @@ -1,15 +1,9 @@ package com.itmo.java.basics.config; public class DatabaseConfig { - public static final String DEFAULT_WORKING_PATH = "db_files"; - private final String workingPath; - - public DatabaseConfig(String workingPath) { - this.workingPath = workingPath; - } public String getWorkingPath() { - return workingPath; + return null; } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java index 4f198006..e7ea7aa2 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java +++ b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java @@ -5,30 +5,23 @@ import com.itmo.java.basics.logic.Database; import java.nio.file.Path; -import java.util.HashMap; import java.util.Optional; public class ExecutionEnvironmentImpl implements ExecutionEnvironment { - - DatabaseConfig dbConfig; - HashMap dataBase = new HashMap(); - public ExecutionEnvironmentImpl(DatabaseConfig config) { - dbConfig = config; } @Override public Optional getDatabase(String name) { - return Optional.ofNullable(dataBase.get(name)); + return null; } @Override public void addDatabase(Database db) { - dataBase.put(db.getName(), db); } @Override public Path getWorkingPath() { - return Path.of(dbConfig.getWorkingPath()); + return null; } } diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java index 2c436c12..d71ca20b 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java @@ -4,38 +4,29 @@ import com.itmo.java.basics.logic.Table; import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.HashMap; import java.util.Map; public class DatabaseInitializationContextImpl implements DatabaseInitializationContext { - private final String dbName; - private final Path dbRoot; - private final Map tablesMap = new HashMap<>(); - public DatabaseInitializationContextImpl(String dbName, Path databaseRoot) { - this.dbName = dbName; - this.dbRoot = Path.of(databaseRoot.toString(), dbName); } @Override public String getDbName() { - return dbName; + return null; } @Override public Path getDatabasePath() { - return Paths.get(dbRoot.toString()); + return null; } @Override public Map getTables() { - return tablesMap; + return null; } @Override public void addTable(Table table) { - tablesMap.put(table.getName(), table); } } diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java index 9696500e..f9c36a06 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java @@ -1,56 +1,22 @@ package com.itmo.java.basics.initialization.impl; import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.index.impl.TableIndex; -import com.itmo.java.basics.initialization.DatabaseInitializationContext; import com.itmo.java.basics.initialization.InitializationContext; import com.itmo.java.basics.initialization.Initializer; -import com.itmo.java.basics.logic.Database; -import com.itmo.java.basics.logic.impl.DatabaseImpl; - -import java.io.File; -import java.nio.file.Files; public class DatabaseInitializer implements Initializer { - - private final TableInitializer tableInitializer; - public DatabaseInitializer(TableInitializer tableInitializer) { - this.tableInitializer = tableInitializer; } /** * Добавляет в контекст информацию об инициализируемой бд. * Запускает инициализацию всех таблиц это базы * - * @param context контекст с информацией об инициализируемой бд и об окружении + * @param initialContext контекст с информацией об инициализируемой бд и об окружении * @throws DatabaseException если в контексте лежит неправильный путь к базе, невозможно прочитать содержимого папки, - * или если возникла ошибка дочерних инициализаторов + * или если возникла ошибка дочерних инициализаторов */ @Override - public void perform(InitializationContext context) throws DatabaseException { - - if (context.executionEnvironment() == null) { - throw new DatabaseException("Context executionEnvironment is null"); - } - - DatabaseInitializationContext dbinitialContext = context.currentDbContext(); - if (!Files.exists(dbinitialContext.getDatabasePath())) { - throw new DatabaseException("We dont have this " + dbinitialContext.getDbName()); - } - - File curFile = new File(dbinitialContext.getDatabasePath().toString()); - - if (!curFile.exists()) { - throw new DatabaseException(dbinitialContext.getDbName() + " does not exist"); - } - - File[] directory = curFile.listFiles(); - for (File table : directory) { - TableInitializationContextImpl tableContext = new TableInitializationContextImpl(table.getName(), dbinitialContext.getDatabasePath(), new TableIndex()); - tableInitializer.perform(new InitializationContextImpl(context.executionEnvironment(), dbinitialContext, tableContext, null)); - } - Database database = DatabaseImpl.initializeFromContext(dbinitialContext); - context.executionEnvironment().addDatabase(database); + public void perform(InitializationContext initialContext) throws DatabaseException { } } diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java index 72f311d7..3d124324 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java @@ -1,20 +1,12 @@ package com.itmo.java.basics.initialization.impl; -import com.itmo.java.basics.console.ExecutionEnvironment; import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.initialization.InitializationContext; import com.itmo.java.basics.initialization.Initializer; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; - public class DatabaseServerInitializer implements Initializer { - private final Initializer databaseInitializer; public DatabaseServerInitializer(DatabaseInitializer databaseInitializer) { - this.databaseInitializer = databaseInitializer; } /** @@ -26,36 +18,5 @@ public DatabaseServerInitializer(DatabaseInitializer databaseInitializer) { */ @Override public void perform(InitializationContext context) throws DatabaseException { - - if (context.executionEnvironment() == null) { - throw new DatabaseException("Context executionEnvironment is null"); - } - - ExecutionEnvironment ExecutionEnvironment = context.executionEnvironment(); - Path path = ExecutionEnvironment.getWorkingPath(); - - if (!Files.exists(path)) { - try { - Files.createDirectory(path); - } catch (IOException ex) { - throw new DatabaseException("Error while creating " + path.toString(), ex); - } - } - File curFile = new File(path.toString()); - File[] directory = curFile.listFiles(); - if (directory == null) { - throw new DatabaseException("Error while working with" + curFile.toString()); - } - - for (File in : directory) { - DatabaseInitializationContextImpl dbContext = new DatabaseInitializationContextImpl(in.getName(), path); - databaseInitializer.perform(new InitializationContextImpl(context.executionEnvironment(), dbContext, null, null)); - } } } - - - - - - diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/InitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/InitializationContextImpl.java index 114e0dae..552ede30 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/InitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/InitializationContextImpl.java @@ -13,10 +13,10 @@ public class InitializationContextImpl implements InitializationContext { private final TableInitializationContext currentTableContext; private final SegmentInitializationContext currentSegmentContext; - public InitializationContextImpl(ExecutionEnvironment executionEnvironment, - DatabaseInitializationContext currentDatabaseContext, - TableInitializationContext currentTableContext, - SegmentInitializationContext currentSegmentContext) { + private InitializationContextImpl(ExecutionEnvironment executionEnvironment, + DatabaseInitializationContext currentDatabaseContext, + TableInitializationContext currentTableContext, + SegmentInitializationContext currentSegmentContext) { this.executionEnvironment = executionEnvironment; this.currentDatabaseContext = currentDatabaseContext; this.currentTableContext = currentTableContext; diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java index 84844e53..45ad02b5 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java @@ -4,46 +4,31 @@ import com.itmo.java.basics.initialization.SegmentInitializationContext; import java.nio.file.Path; -import java.nio.file.Paths; public class SegmentInitializationContextImpl implements SegmentInitializationContext { - - private final String segmentName; - private final Path segmentPath; - private final long currentSize; - private final SegmentIndex segmentIndex; - - public SegmentInitializationContextImpl(String segmentName, Path segmentPath, int currentSize, SegmentIndex index) { - this.segmentName = segmentName; - this.segmentPath = segmentPath; - this.currentSize = currentSize; - this.segmentIndex = index; + private SegmentInitializationContextImpl(String segmentName, Path segmentPath, int currentSize, SegmentIndex index) { } public SegmentInitializationContextImpl(String segmentName, Path tablePath, int currentSize) { - this.segmentName = segmentName; - this.segmentPath = Paths.get(tablePath.toString(), segmentName); - this.currentSize = currentSize; - this.segmentIndex = new SegmentIndex(); } @Override public String getSegmentName() { - return segmentName; + return null; } @Override public Path getSegmentPath() { - return segmentPath; + return null; } @Override public SegmentIndex getIndex() { - return segmentIndex; + return null; } @Override public long getCurrentSize() { - return currentSize; + return 0; } } diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java index 90409c2a..de935219 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java @@ -1,23 +1,8 @@ package com.itmo.java.basics.initialization.impl; import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.index.impl.SegmentIndex; -import com.itmo.java.basics.index.impl.SegmentOffsetInfoImpl; import com.itmo.java.basics.initialization.InitializationContext; import com.itmo.java.basics.initialization.Initializer; -import com.itmo.java.basics.initialization.SegmentInitializationContext; -import com.itmo.java.basics.logic.DatabaseRecord; -import com.itmo.java.basics.logic.Segment; -import com.itmo.java.basics.logic.impl.SegmentImpl; -import com.itmo.java.basics.logic.io.DatabaseInputStream; - -import java.io.FileInputStream; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; public class SegmentInitializer implements Initializer { @@ -32,41 +17,5 @@ public class SegmentInitializer implements Initializer { */ @Override public void perform(InitializationContext context) throws DatabaseException { - - if (context.currentSegmentContext() == null) { - throw new DatabaseException("Context segment is null"); - } - - int size = 0; - SegmentInitializationContext segmentinitialContext = context.currentSegmentContext(); - SegmentIndex segIndex = segmentinitialContext.getIndex(); - Path segPath = segmentinitialContext.getSegmentPath(); - Segment segment = SegmentImpl.initializeFromContext(segmentinitialContext); - List keys = new ArrayList<>(); - - if (!Files.exists(segPath)) { - throw new DatabaseException(segmentinitialContext.getSegmentName() + " does not exist"); - } - try (DatabaseInputStream InputStream = new DatabaseInputStream(new FileInputStream(segPath.toFile()))) { - Optional dbUnitOp = InputStream.readDbUnit(); - while (dbUnitOp.isPresent()) { - DatabaseRecord dbUnits = dbUnitOp.get(); - segIndex.onIndexedEntityUpdated(new String(dbUnits.getKey()), new SegmentOffsetInfoImpl(size)); - size += dbUnits.size(); - keys.add(new String(dbUnits.getKey())); - dbUnitOp = InputStream.readDbUnit(); - } - } catch (IOException ex) { - throw new DatabaseException("Error while initialisation segment", ex); - } - - Segment newSegment = SegmentImpl.initializeFromContext(new SegmentInitializationContextImpl(segmentinitialContext.getSegmentName(), segmentinitialContext.getSegmentPath(), size, segIndex)); - - for (String in : keys) { - context.currentTableContext().getTableIndex().onIndexedEntityUpdated(in, segment); - } - context.currentTableContext().updateCurrentSegment(newSegment); } } - - diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java index f757eca1..9d52528e 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java @@ -7,40 +7,30 @@ import java.nio.file.Path; public class TableInitializationContextImpl implements TableInitializationContext { - - private final String tableName; - private final Path databasePath; - private final TableIndex tableIndex; - private Segment lastSegment; - public TableInitializationContextImpl(String tableName, Path databasePath, TableIndex tableIndex) { - this.tableName = tableName; - this.databasePath = Path.of(databasePath.toString(), tableName); - this.tableIndex = tableIndex; } @Override public String getTableName() { - return tableName; + return null; } @Override public Path getTablePath() { - return databasePath; + return null; } @Override public TableIndex getTableIndex() { - return tableIndex; + return null; } @Override public Segment getCurrentSegment() { - return lastSegment; + return null; } @Override public void updateCurrentSegment(Segment segment) { - lastSegment = segment; } } diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java index 4162c1a8..c6c7c620 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java @@ -3,22 +3,10 @@ import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.initialization.InitializationContext; import com.itmo.java.basics.initialization.Initializer; -import com.itmo.java.basics.initialization.SegmentInitializationContext; -import com.itmo.java.basics.initialization.TableInitializationContext; -import com.itmo.java.basics.logic.Table; -import com.itmo.java.basics.logic.impl.TableImpl; - -import java.io.File; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; public class TableInitializer implements Initializer { - private final Initializer segmentInitializer; - public TableInitializer(SegmentInitializer segmentInitializer) { - this.segmentInitializer = segmentInitializer; } /** @@ -27,33 +15,9 @@ public TableInitializer(SegmentInitializer segmentInitializer) { * * @param context контекст с информацией об инициализируемой бд, окружении, таблицы * @throws DatabaseException если в контексте лежит неправильный путь к таблице, невозможно прочитать содержимого папки, - * или если возникла ошибка ошибка дочерних инициализаторов + * или если возникла ошибка ошибка дочерних инициализаторов */ @Override - public void perform(InitializationContext context) throws DatabaseException { - - if (context.currentDbContext() == null) { - throw new DatabaseException("Context Db is null"); - } - - TableInitializationContext tbinitalContext = context.currentTableContext(); - File curFile = new File(tbinitalContext.getTablePath().toString()); - - if (!curFile.exists()) { - throw new DatabaseException("Directory " + tbinitalContext.getTableName() + " does not exist"); - } - - File[] files = curFile.listFiles(); - List segments = Arrays.asList(files); - Collections.sort(segments); - - for (File seg : segments) { - SegmentInitializationContext segmentContext = new SegmentInitializationContextImpl(seg.getName(), tbinitalContext.getTablePath(), 0); - segmentInitializer.perform(new InitializationContextImpl(context.executionEnvironment(), context.currentDbContext(), context.currentTableContext(), segmentContext)); - } - - Table newTable = TableImpl.initializeFromContext(tbinitalContext); - context.currentDbContext().addTable(newTable); } } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index cb6dca85..2864e87d 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -1,7 +1,8 @@ -package main.java.com.itmo.java.basics.logic.impl; +package com.itmo.java.basics.logic.impl; -import main.java.com.itmo.java.basics.exceptions.DatabaseException; -import main.java.com.itmo.java.basics.logic.Database; +import com.itmo.java.basics.exceptions.DatabaseException; +import com.itmo.java.basics.initialization.DatabaseInitializationContext; +import com.itmo.java.basics.logic.Database; import java.nio.file.Path; import java.util.Optional; @@ -11,6 +12,10 @@ public static Database create(String dbName, Path databaseRoot) throws DatabaseE return null; } + public static Database initializeFromContext(DatabaseInitializationContext context) { + return null; + } + @Override public String getName() { return null; diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 1a501041..8152f75f 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -1,15 +1,20 @@ -package main.java.com.itmo.java.basics.logic.impl; +package com.itmo.java.basics.logic.impl; -import main.java.com.itmo.java.basics.logic.Segment; -import main.java.com.itmo.java.basics.exceptions.DatabaseException; +import com.itmo.java.basics.initialization.SegmentInitializationContext; +import com.itmo.java.basics.logic.Segment; +import com.itmo.java.basics.exceptions.DatabaseException; import java.io.IOException; import java.nio.file.Path; import java.util.Optional; public class SegmentImpl implements Segment { - static Segment create(String segmentName, Path tableRootPath) throws DatabaseException { - throw new UnsupportedOperationException(); // todo implement + public static Segment create(String segmentName, Path tableRootPath) throws DatabaseException { + throw new UnsupportedOperationException(); + } + + public static Segment initializeFromContext(SegmentInitializationContext context) { + return null; } static String createSegmentName(String tableName) { diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index 82db4cd0..16d8a872 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -1,14 +1,19 @@ -package main.java.com.itmo.java.basics.logic.impl; +package com.itmo.java.basics.logic.impl; -import main.java.com.itmo.java.basics.exceptions.DatabaseException; -import main.java.com.itmo.java.basics.index.impl.TableIndex; -import main.java.com.itmo.java.basics.logic.Table; +import com.itmo.java.basics.exceptions.DatabaseException; +import com.itmo.java.basics.index.impl.TableIndex; +import com.itmo.java.basics.initialization.TableInitializationContext; +import com.itmo.java.basics.logic.Table; import java.nio.file.Path; import java.util.Optional; public class TableImpl implements Table { - static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { + public static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { + return null; + } + + public static Table initializeFromContext(TableInitializationContext context) { return null; } From f61e767458d3f0bcfa9c61a53cdc00d87ae2b29c Mon Sep 17 00:00:00 2001 From: Fredi Kats Date: Sun, 25 Apr 2021 23:07:16 +0300 Subject: [PATCH 030/378] feat: update docs --- .../SegmentInitializationContextImpl.java | 11 ++++++-- .../java/basics/logic/impl/CachingTable.java | 2 +- .../basics/logic/impl/DatabaseCacheImpl.java | 25 ++++--------------- .../java/basics/logic/impl/DatabaseImpl.java | 4 +++ .../java/basics/logic/impl/SegmentImpl.java | 7 ++++++ .../java/basics/logic/impl/TableImpl.java | 9 +++++++ 6 files changed, 35 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java index 45ad02b5..127f71ca 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java @@ -6,10 +6,17 @@ import java.nio.file.Path; public class SegmentInitializationContextImpl implements SegmentInitializationContext { - private SegmentInitializationContextImpl(String segmentName, Path segmentPath, int currentSize, SegmentIndex index) { + public SegmentInitializationContextImpl(String segmentName, Path segmentPath, long currentSize, SegmentIndex index) { } - public SegmentInitializationContextImpl(String segmentName, Path tablePath, int currentSize) { + /** + * Не используйте этот конструктор. Оставлен для совместимости со старыми тестами. + */ + public SegmentInitializationContextImpl(String segmentName, Path tablePath, long currentSize) { + } + + public SegmentInitializationContextImpl(String segmentName, Path tablePath) { + this(segmentName, tablePath.resolve(segmentName), 0, new SegmentIndex()); } @Override diff --git a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java index 5907df77..40c8d66e 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java @@ -7,7 +7,7 @@ import java.util.Optional; /** - * Декоратор для таблицы. Кэширует данные + * Декторато для таблицы. Кэширует данные */ public class CachingTable implements Table { diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java index ef91ea58..8ec5e331 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java @@ -2,36 +2,21 @@ import com.itmo.java.basics.logic.DatabaseCache; -import java.util.LinkedHashMap; -import java.util.Map; - public class DatabaseCacheImpl implements DatabaseCache { - - private static final int dbCapacity = 5000; - private final Map dbCache; - - public DatabaseCacheImpl() { - - this.dbCache = new LinkedHashMap(dbCapacity, 1f, true) { - @Override - protected boolean removeEldestEntry(Map.Entry eldest) { - return size() > dbCapacity; - } - }; - } + private static final int CAPACITY = 5_000; @Override public byte[] get(String key) { - return dbCache.get(key); + return new byte[0]; } @Override public void set(String key, byte[] value) { - dbCache.put(key, value); + } @Override public void delete(String key) { - dbCache.remove(key); + } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index 2864e87d..d00df223 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -8,6 +8,10 @@ import java.util.Optional; public class DatabaseImpl implements Database { + /** + * @param databaseRoot путь к директории, которая может содержать несколько БД, + * поэтому при создании БД необходимо создать директорию внутри databaseRoot. + */ public static Database create(String dbName, Path databaseRoot) throws DatabaseException { return null; } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 8152f75f..8fcb0d21 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -8,6 +8,13 @@ import java.nio.file.Path; import java.util.Optional; +/** + * Сегмент - append-only файл, хранящий пары ключ-значение, разделенные специальным символом. + * - имеет ограниченный размер, большие значения (>100000) записываются в последний сегмент, если он не read-only + * - при превышении размера сегмента создается новый сегмент и дальнейшие операции записи производятся в него + * - именование файла-сегмента должно позволять установить очередность их появления + * - является неизменяемым после появления более нового сегмента + */ public class SegmentImpl implements Segment { public static Segment create(String segmentName, Path tableRootPath) throws DatabaseException { throw new UnsupportedOperationException(); diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index 16d8a872..428a3fa6 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -8,6 +8,15 @@ import java.nio.file.Path; import java.util.Optional; +/** + * Таблица - логическая сущность, представляющая собой набор файлов-сегментов, которые объединены одним + * именем и используются для хранения однотипных данных (данных, представляющих собой одну и ту же сущность, + * например, таблица "Пользователи") + *

+ * - имеет единый размер сегмента + * - представляет из себя директорию в файловой системе, именованную как таблица + * и хранящую файлы-сегменты данной таблицы + */ public class TableImpl implements Table { public static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { return null; From 8007a1cc85a60815969d84b9b7a90e3c8bba87a3 Mon Sep 17 00:00:00 2001 From: superpupervlad Date: Wed, 12 May 2021 09:01:54 +0300 Subject: [PATCH 031/378] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=BE=D0=BF=D0=B5=D1=87=D0=B0=D1=82=D0=BA=D0=B8?= =?UTF-8?q?=20(#3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basics/initialization/impl/DatabaseServerInitializer.java | 2 +- .../java/basics/initialization/impl/SegmentInitializer.java | 1 - .../java/com/itmo/java/basics/logic/WritableDatabaseRecord.java | 2 +- src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java | 2 +- .../com/itmo/java/basics/logic/io/DatabaseOutputStream.java | 2 +- 5 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java index 3d124324..592980e2 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java @@ -11,7 +11,7 @@ public DatabaseServerInitializer(DatabaseInitializer databaseInitializer) { /** * Если заданная в окружении директория не существует - создает ее - * Добавляет информацию о существующих в директории базах, нацинает их инициалиализацию + * Добавляет информацию о существующих в директории базах, начинает их инициализацию * * @param context контекст, содержащий информацию об окружении * @throws DatabaseException если произошла ошибка при создании директории, ее обходе или ошибка инициализации бд diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java index de935219..8174c145 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java @@ -4,7 +4,6 @@ import com.itmo.java.basics.initialization.InitializationContext; import com.itmo.java.basics.initialization.Initializer; - public class SegmentInitializer implements Initializer { /** diff --git a/src/main/java/com/itmo/java/basics/logic/WritableDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/WritableDatabaseRecord.java index d1be1c27..470be4a4 100644 --- a/src/main/java/com/itmo/java/basics/logic/WritableDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/WritableDatabaseRecord.java @@ -12,7 +12,7 @@ public interface WritableDatabaseRecord extends DatabaseRecord { /** - * Возвращает размер значения в байтах. -1, если значение отсутвует + * Возвращает размер значения в байтах. -1, если значение отсутствует */ int getValueSize(); } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java index 40c8d66e..5907df77 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java @@ -7,7 +7,7 @@ import java.util.Optional; /** - * Декторато для таблицы. Кэширует данные + * Декоратор для таблицы. Кэширует данные */ public class CachingTable implements Table { diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java index 68c15d7c..287083a2 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java @@ -17,7 +17,7 @@ public DatabaseOutputStream(OutputStream outputStream) { /** * Записывает в БД в следующем формате: - * - Размер ключа в байтахб используя {@link WritableDatabaseRecord#getKeySize()} + * - Размер ключа в байтах используя {@link WritableDatabaseRecord#getKeySize()} * - Ключ * - Размер записи в байтах {@link WritableDatabaseRecord#getValueSize()} * - Запись From f5e309d94edfc4706b2513ca8522bda55de72353 Mon Sep 17 00:00:00 2001 From: aftilion <59564484+aftilion@users.noreply.github.com> Date: Thu, 18 Mar 2021 22:06:20 +0300 Subject: [PATCH 032/378] Initial commit --- .../com/itmo/java/basics/logic/WritableDatabaseRecord.java | 2 +- .../java/com/itmo/java/basics/logic/impl/DatabaseImpl.java | 1 - src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java | 3 ++- .../com/itmo/java/basics/logic/io/DatabaseOutputStream.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/WritableDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/WritableDatabaseRecord.java index 470be4a4..d1be1c27 100644 --- a/src/main/java/com/itmo/java/basics/logic/WritableDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/WritableDatabaseRecord.java @@ -12,7 +12,7 @@ public interface WritableDatabaseRecord extends DatabaseRecord { /** - * Возвращает размер значения в байтах. -1, если значение отсутствует + * Возвращает размер значения в байтах. -1, если значение отсутвует */ int getValueSize(); } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index d00df223..80b4c1be 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -1,7 +1,6 @@ package com.itmo.java.basics.logic.impl; import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.initialization.DatabaseInitializationContext; import com.itmo.java.basics.logic.Database; import java.nio.file.Path; diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index 428a3fa6..b33f344d 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -2,12 +2,13 @@ import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.index.impl.TableIndex; -import com.itmo.java.basics.initialization.TableInitializationContext; import com.itmo.java.basics.logic.Table; import java.nio.file.Path; import java.util.Optional; +public class TableImpl implements Table { + static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { /** * Таблица - логическая сущность, представляющая собой набор файлов-сегментов, которые объединены одним * именем и используются для хранения однотипных данных (данных, представляющих собой одну и ту же сущность, diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java index 287083a2..68c15d7c 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java @@ -17,7 +17,7 @@ public DatabaseOutputStream(OutputStream outputStream) { /** * Записывает в БД в следующем формате: - * - Размер ключа в байтах используя {@link WritableDatabaseRecord#getKeySize()} + * - Размер ключа в байтахб используя {@link WritableDatabaseRecord#getKeySize()} * - Ключ * - Размер записи в байтах {@link WritableDatabaseRecord#getValueSize()} * - Запись From 4179475577814a4d4345f8d27bdfcd0b2bfe4b6d Mon Sep 17 00:00:00 2001 From: aftilion Date: Wed, 24 Mar 2021 22:11:19 +0300 Subject: [PATCH 033/378] lab1java lab1java.1 --- .../com/itmo/java/basics/logic/Database.java | 1 + .../com/itmo/java/basics/logic/Table.java | 1 + .../java/basics/logic/impl/DatabaseImpl.java | 85 ++++++++++++- .../logic/impl/RemoveDatabaseRecord.java | 29 +++-- .../java/basics/logic/impl/SegmentImpl.java | 118 ++++++++++++++++-- .../basics/logic/impl/SetDatabaseRecord.java | 33 +++-- .../java/basics/logic/impl/TableImpl.java | 105 +++++++++++++++- .../basics/logic/io/DatabaseInputStream.java | 41 +++++- .../basics/logic/io/DatabaseOutputStream.java | 19 ++- 9 files changed, 387 insertions(+), 45 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/Database.java b/src/main/java/com/itmo/java/basics/logic/Database.java index 7ec4e860..80b6755e 100644 --- a/src/main/java/com/itmo/java/basics/logic/Database.java +++ b/src/main/java/com/itmo/java/basics/logic/Database.java @@ -2,6 +2,7 @@ import main.java.com.itmo.java.basics.exceptions.DatabaseException; +import java.io.IOException; import java.util.Optional; public interface Database { diff --git a/src/main/java/com/itmo/java/basics/logic/Table.java b/src/main/java/com/itmo/java/basics/logic/Table.java index 8e7c70c0..df304d64 100644 --- a/src/main/java/com/itmo/java/basics/logic/Table.java +++ b/src/main/java/com/itmo/java/basics/logic/Table.java @@ -2,6 +2,7 @@ import main.java.com.itmo.java.basics.exceptions.DatabaseException; +import java.io.IOException; import java.util.Optional; /** diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index 80b4c1be..054d5b44 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -1,12 +1,53 @@ package com.itmo.java.basics.logic.impl; import com.itmo.java.basics.exceptions.DatabaseException; +import com.itmo.java.basics.index.impl.TableIndex; import com.itmo.java.basics.logic.Database; +import com.itmo.java.basics.logic.Table; +import javax.imageio.IIOException; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.Map; import java.util.Optional; public class DatabaseImpl implements Database { + + + public String dbName; + public Path databaseRoot; + + public static Map tableDictionary = new HashMap(); + + private DatabaseImpl(String dbName, Path databaseRoot) + { + this.dbName = dbName; + this.databaseRoot = databaseRoot; + } + + + public static Database create(String dbName, Path databaseRoot) throws DatabaseException, IOException { + + if (dbName == null) + throw new DatabaseException("Why dataBase name is null?"); + + if(Files.exists(Paths.get(databaseRoot.toString(),dbName))) + throw new DatabaseException("This" + dbName + "already exists"); + + try + { + Files.createDirectory(Paths.get(databaseRoot.toString(),dbName)); + } + catch(IOException ex) + { + throw new DatabaseException("Error while creating a DataBase("+dbName+") directory"); + } + + return new DatabaseImpl(dbName,databaseRoot); /** * @param databaseRoot путь к директории, которая может содержать несколько БД, * поэтому при создании БД необходимо создать директорию внутри databaseRoot. @@ -21,26 +62,58 @@ public static Database initializeFromContext(DatabaseInitializationContext conte @Override public String getName() { - return null; + + return dbName; } @Override - public void createTableIfNotExists(String tableName) throws DatabaseException { + public void createTableIfNotExists(String tableName) throws DatabaseException, IOException { + + if (tableName == null) + throw new DatabaseException("Why tableName name is null?"); + + if ((tableDictionary.containsKey(tableName)) || (Files.exists(Paths.get(databaseRoot.toString(),dbName , tableName)))) + throw new DatabaseException("We have " + tableName + " in " +dbName+ "directory"); + TableIndex newTableIndex = new TableIndex(); + Path pathToTableRoot = Paths.get(databaseRoot.toString() , dbName); + TableImpl newTable = (TableImpl) TableImpl.create(tableName , pathToTableRoot , newTableIndex); + + tableDictionary.put(tableName,newTable); } @Override - public void write(String tableName, String objectKey, byte[] objectValue) throws DatabaseException { + public void write(String tableName, String objectKey, byte[] objectValue) throws DatabaseException, IOException { + TableImpl tableimpl = tableDictionary.get(tableName); + + if (tableName == null) + throw new DatabaseException("Error while writing in database"); + tableimpl.write(objectKey , objectValue ); } @Override - public Optional read(String tableName, String objectKey) throws DatabaseException { - return Optional.empty(); + public Optional read(String tableName, String objectKey) throws DatabaseException, IOException { + + TableImpl tableimpl = tableDictionary.get(tableName); + + if (tableName == null) + throw new DatabaseException("Error while writing in database"); + + return tableimpl.read(objectKey); + + //return Optional.empty(); } @Override - public void delete(String tableName, String objectKey) throws DatabaseException { + public void delete(String tableName, String objectKey) throws DatabaseException, IOException { + + TableImpl tableimpl = tableDictionary.get(tableName); + + if (tableName == null) + throw new DatabaseException("Writing in database error"); + + tableimpl.delete(objectKey); } } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java index 820c1c01..a6f1046a 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java @@ -6,34 +6,45 @@ * Запись в БД, означающая удаление значения по ключу */ public class RemoveDatabaseRecord implements WritableDatabaseRecord { + public byte[] key; + public byte[] value; + + public RemoveDatabaseRecord(byte[] key){ this.key = key;} @Override - public byte[] getKey() { - return new byte[0]; + + + public byte[] getKey() + { + return key; } @Override - public byte[] getValue() { - return new byte[0]; + public byte[] getValue() + { + return null; } @Override public long size() { - return 0; + return getKeySize() + getValueSize() + 4 + 4; } @Override public boolean isValuePresented() { + //return ((getValue() == null ) && (getValueSize() == 0)); return false; } @Override - public int getKeySize() { - return 0; + public int getKeySize() + { + return key.length; } @Override - public int getValueSize() { - return 0; + public int getValueSize() + { + return -1; } } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 8fcb0d21..6627d0ed 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -1,11 +1,20 @@ package com.itmo.java.basics.logic.impl; -import com.itmo.java.basics.initialization.SegmentInitializationContext; +import com.itmo.java.basics.index.SegmentOffsetInfo; +import com.itmo.java.basics.index.impl.SegmentIndex; +import com.itmo.java.basics.index.impl.SegmentOffsetInfoImpl; +import com.itmo.java.basics.logic.DatabaseRecord; import com.itmo.java.basics.logic.Segment; import com.itmo.java.basics.exceptions.DatabaseException; +import com.itmo.java.basics.logic.io.DatabaseInputStream; +import com.itmo.java.basics.logic.io.DatabaseOutputStream; import java.io.IOException; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.util.Optional; /** @@ -16,6 +25,43 @@ * - является неизменяемым после появления более нового сегмента */ public class SegmentImpl implements Segment { + + public Path tableRootPath; + public String segmentName; + public SegmentIndex segmentIndex; + public final long size_M = 100000; + public long segmentSize ; + private final DatabaseOutputStream out; + + public SegmentImpl(Path tableRootPath, String segmentName, OutputStream out) { + + this.tableRootPath = tableRootPath; + this.segmentName = segmentName; + this.segmentIndex = new SegmentIndex(); + this.out = new DatabaseOutputStream(out); + + } + + static Segment create(String segmentName, Path tableRootPath) throws DatabaseException { + + Path segRoot = Paths.get(tableRootPath.toString(), segmentName); + boolean have; + OutputStream outputStream; + + try + { + have = tableRootPath.toFile().createNewFile(); + outputStream = Files.newOutputStream(segRoot); + + } + catch(IOException exception) + { + throw new DatabaseException("Creating Error " + segmentName); + } + if(!have) + { + throw new DatabaseException("Creating Error" + segmentName + "as it already exists"); + } public static Segment create(String segmentName, Path tableRootPath) throws DatabaseException { throw new UnsupportedOperationException(); } @@ -24,32 +70,88 @@ public static Segment initializeFromContext(SegmentInitializationContext context return null; } - static String createSegmentName(String tableName) { + return new SegmentImpl(segRoot, segmentName, outputStream); + } + + static String createSegmentName(String tableName) + { return tableName + "_" + System.currentTimeMillis(); } @Override - public String getName() { - return null; + public String getName() + { + return segmentName; } @Override public boolean write(String objectKey, byte[] objectValue) throws IOException { - return false; + + if(isReadOnly()) + { + out.close(); + return false; + } + + if(objectValue == null) + { + return delete(objectKey); + } + + SetDatabaseRecord newSeg= new SetDatabaseRecord(objectKey.getBytes(StandardCharsets.UTF_8), objectValue); + + segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); + segmentSize += out.write(newSeg); + return true; } @Override public Optional read(String objectKey) throws IOException { - return Optional.empty(); + + //if (segmentSize == 0) + // return Optional.empty(); + + Optional offsetInfo = segmentIndex.searchForKey(objectKey); + + if(offsetInfo.isEmpty()) + return Optional.empty(); + + + long myOf = offsetInfo.get().getOffset(); + + DatabaseInputStream input = new DatabaseInputStream(Files.newInputStream(tableRootPath)); + input.skip(myOf); + + Optional value = input.readDbUnit(); + + if(value.isEmpty()) + return Optional.empty(); + + input.close(); + return Optional.of(value.get().getValue()); } @Override public boolean isReadOnly() { - return false; + if (segmentSize >= size_M) + return true; + else + return false; } @Override public boolean delete(String objectKey) throws IOException { - return false; + + + if(isReadOnly()) + { + out.close(); + return false; + } + + RemoveDatabaseRecord newSeg = new RemoveDatabaseRecord(objectKey.getBytes()); + segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); + segmentSize += out.write(newSeg); + return true; } } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java index 9164106b..87aebf65 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java @@ -7,33 +7,46 @@ */ public class SetDatabaseRecord implements WritableDatabaseRecord { + public byte[] key; + public byte[] value; + + public SetDatabaseRecord(byte[] key , byte[] value) + { + this.key = key; + this.value =value; + } @Override - public byte[] getKey() { - return new byte[0]; + public byte[] getKey() + { + return key; } @Override - public byte[] getValue() { - return new byte[0]; + public byte[] getValue() + { + return value; } @Override public long size() { - return 0; + return getKeySize() + getValueSize() + 4 + 4; } @Override public boolean isValuePresented() { - return false; + // return ((getValue() == null ) && (getValueSize() == 0)); + return true; } @Override - public int getKeySize() { - return 0; + public int getKeySize() + { + return key.length; } @Override - public int getValueSize() { - return 0; + public int getValueSize() + { + return value.length; } } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index b33f344d..00f2d7f5 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -2,12 +2,55 @@ import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.index.impl.TableIndex; +import com.itmo.java.basics.logic.Segment; import com.itmo.java.basics.logic.Table; +import com.itmo.java.basics.logic.io.DatabaseOutputStream; +import javax.imageio.IIOException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.Map; import java.util.Optional; public class TableImpl implements Table { + + public String tableName; + public Path pathToDatabaseRoot; + public TableIndex tableIndex; + public SegmentImpl lastSegment; + + public static Map tableDictionary = new HashMap(); + + private TableImpl(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) + { + this.tableName = tableName; + this.pathToDatabaseRoot = pathToDatabaseRoot; + this.tableIndex = tableIndex; + } + + static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException, IOException { + + if (tableName == null) + throw new DatabaseException("Why tableBase name is null?"); + + Path pathToTableRoot = Paths.get(pathToDatabaseRoot.toString() , tableName); + + try + { + Files.createDirectory(pathToTableRoot); + } + catch(IOException ex) + { + throw new DatabaseException("Error while creating a Table("+tableName+") directory"); + } + + return new TableImpl(tableName , pathToTableRoot , tableIndex); + static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { /** * Таблица - логическая сущность, представляющая собой набор файлов-сегментов, которые объединены одним @@ -29,21 +72,73 @@ public static Table initializeFromContext(TableInitializationContext context) { @Override public String getName() { - return null; + + return tableName; } @Override - public void write(String objectKey, byte[] objectValue) throws DatabaseException { + public void write(String objectKey, byte[] objectValue) throws DatabaseException, IOException { + + try + { + boolean canWewrite = lastSegment.write(objectKey, objectValue); + + if (canWewrite) + { + + this.lastSegment = (SegmentImpl) SegmentImpl.create(SegmentImpl.createSegmentName(tableName),pathToDatabaseRoot); + this.lastSegment.write(objectKey ,objectValue); + } + tableIndex.onIndexedEntityUpdated(objectKey,lastSegment); + } + catch(IOException ex) + { + throw new DatabaseException("Writing in database error " + ex); + } + } @Override - public Optional read(String objectKey) throws DatabaseException { - return Optional.empty(); + public Optional read(String objectKey) throws DatabaseException, IOException { + + try + { + Optional segmentRead = tableIndex.searchForKey(objectKey); + + if(segmentRead.isPresent()) + { + return segmentRead.get().read(objectKey); + + } + + else + return Optional.empty(); + } + + catch (IOException ex) { + throw new DatabaseException("Reading in database error " + ex); + } } @Override - public void delete(String objectKey) throws DatabaseException { + public void delete(String objectKey) throws DatabaseException, IOException { + + try + { + boolean canDel = lastSegment.delete(objectKey); + + if(!canDel) + { + this.lastSegment = (SegmentImpl) SegmentImpl.create(SegmentImpl.createSegmentName(tableName),pathToDatabaseRoot); + this.lastSegment.delete(objectKey); + } + tableIndex.onIndexedEntityUpdated(objectKey , null); + } + catch(IOException ex) + { + throw new DatabaseException("Deleting error in Table"); + } } } diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java index 2db39228..ae2f3d72 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java @@ -1,11 +1,13 @@ -package main.java.com.itmo.java.basics.logic.io; +package com.itmo.java.basics.logic.io; -import main.java.com.itmo.java.basics.logic.DatabaseRecord; -import main.java.com.itmo.java.basics.logic.WritableDatabaseRecord; +import com.itmo.java.basics.logic.DatabaseRecord; +import com.itmo.java.basics.logic.WritableDatabaseRecord; +import com.itmo.java.basics.logic.impl.SetDatabaseRecord; import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; +import java.util.Arrays; import java.util.Optional; /** @@ -18,11 +20,38 @@ public DatabaseInputStream(InputStream inputStream) { super(inputStream); } - /** + /** * Читает следующую запись (см {@link DatabaseOutputStream#write(WritableDatabaseRecord)}) * @return следующую запись, если она существует. {@link Optional#empty()} - если конец файла достигнут */ public Optional readDbUnit() throws IOException { - return null; + + if (available() <= 4) + { + return Optional.empty(); + } + int keySize = readInt(); + if (available() <= 0) + { + return Optional.empty(); + } + byte[] key = readNBytes(keySize); + if (available() <= 4) + { + return Optional.empty(); + } + int valueSize = readInt(); + + if ((available() <= 0) && (valueSize == REMOVED_OBJECT_SIZE)) + { + return Optional.empty(); + } + + byte[] value = readNBytes(valueSize); + SetDatabaseRecord datarecord = new SetDatabaseRecord(key,value); + // datarecord.key = key; + // datarecord.value= value; + return Optional.of(datarecord); + } } -} + diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java index 68c15d7c..676dea86 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java @@ -3,6 +3,7 @@ import main.java.com.itmo.java.basics.logic.WritableDatabaseRecord; import java.io.DataOutputStream; +import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; @@ -11,8 +12,11 @@ */ public class DatabaseOutputStream extends DataOutputStream { + private OutputStream outputStream; public DatabaseOutputStream(OutputStream outputStream) { + super(outputStream); + this.outputStream = outputStream; } /** @@ -31,6 +35,19 @@ public DatabaseOutputStream(OutputStream outputStream) { * @throws IOException если запись не удалась */ public int write(WritableDatabaseRecord databaseRecord) throws IOException { - return 0; + //String DataBaseRecord = databaseRecord.getKeySize() + databaseRecord.getKey().toString() + databaseRecord.getValueSize() + databaseRecord.getValue().toString(); + // запихать в один write? + + + writeInt(databaseRecord.getKeySize()); + write(databaseRecord.getKey()); + writeInt(databaseRecord.getValueSize()); + if (databaseRecord.isValuePresented()) + write(databaseRecord.getValue()); + // just write mm, + flush(); + + return databaseRecord.getKeySize()+ databaseRecord.getValueSize() + 4 + 4; + } } \ No newline at end of file From 3d9eeae4d980d78c8cf127a69caf3f5b5c564fa3 Mon Sep 17 00:00:00 2001 From: aftilion Date: Sat, 27 Mar 2021 14:49:03 +0300 Subject: [PATCH 034/378] lab1 lab1.redact --- .../java/com/itmo/java/basics/MainTest.java | 68 ---------- .../com/itmo/java/basics/index/KvsIndex.java | 2 +- .../com/itmo/java/basics/logic/Database.java | 5 +- .../com/itmo/java/basics/logic/Segment.java | 2 +- .../com/itmo/java/basics/logic/Table.java | 3 +- .../java/basics/logic/impl/DatabaseImpl.java | 69 +++++----- .../logic/impl/RemoveDatabaseRecord.java | 24 ++-- .../java/basics/logic/impl/SegmentImpl.java | 77 +++++------ .../basics/logic/impl/SetDatabaseRecord.java | 23 ++-- .../java/basics/logic/impl/TableImpl.java | 125 ++++++------------ .../basics/logic/io/DatabaseInputStream.java | 36 +++-- .../basics/logic/io/DatabaseOutputStream.java | 21 ++- 12 files changed, 147 insertions(+), 308 deletions(-) delete mode 100644 src/main/java/com/itmo/java/basics/MainTest.java diff --git a/src/main/java/com/itmo/java/basics/MainTest.java b/src/main/java/com/itmo/java/basics/MainTest.java deleted file mode 100644 index eec8a891..00000000 --- a/src/main/java/com/itmo/java/basics/MainTest.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.itmo.java.basics; - -import com.itmo.java.basics.config.DatabaseConfig; -import com.itmo.java.basics.console.impl.ExecutionEnvironmentImpl; -import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.initialization.*; -import com.itmo.java.basics.initialization.impl.*; -import com.itmo.java.basics.logic.*; -import com.itmo.java.basics.logic.impl.*; - -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.*; -import java.nio.file.Path; -import java.util.Comparator; -import java.util.Optional; - -public class MainTest { - public static void main(String[] args) throws DatabaseException, IOException { -// Files.walk(Path.of("db", "anime")) -// .sorted(Comparator.reverseOrder()) -// .map(Path::toFile) -// .forEach(File::delete); - try { - Database db = DatabaseImpl.create("anime", Path.of("db")); - db.createTableIfNotExists("naruto"); - db.write("naruto", "key", "value".getBytes(StandardCharsets.UTF_8)); - db.write("naruto", "key", "value2".getBytes(StandardCharsets.UTF_8)); - db.write("naruto", "key", null); - db.write("naruto", "key1", "value1".getBytes(StandardCharsets.UTF_8)); - db.write("naruto", "key2", "".getBytes(StandardCharsets.UTF_8)); - } - catch (DatabaseException ex) - {throw new DatabaseException(ex);} -// System.out.printf( -// "get = %s expected = %s\n", -// new String(db.read("naruto", "saske").get()), -// "ora" -// ); -// db.write("naruto", "saske", null); -// db.delete("naruto", "saske"); -// System.out.printf( -// "get = %s expected = %s\n", -// db.read("naruto", "saske").toString(), -// Optional.empty().toString() -// ); -// db.write("naruto", "saske", "ora".getBytes(StandardCharsets.UTF_8)); -// System.out.printf( -// "get = %s expected = %s\n", -// new String(db.read("naruto", "saske").get()), -// "ora" -// ); - -// Initializer initializer = -// new DatabaseServerInitializer( -// new DatabaseInitializer( -// new TableInitializer( -// new SegmentInitializer()))); -// var execEnv = new ExecutionEnvironmentImpl( -// new DatabaseConfig("db") -// ); -// var context = new InitializationContextImpl( -// execEnv, null, null, null -// ); -// initializer.perform(context); - } -} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/index/KvsIndex.java b/src/main/java/com/itmo/java/basics/index/KvsIndex.java index 5ea358f6..9509f8a2 100644 --- a/src/main/java/com/itmo/java/basics/index/KvsIndex.java +++ b/src/main/java/com/itmo/java/basics/index/KvsIndex.java @@ -6,7 +6,7 @@ public interface KvsIndex { /** * Оповещает индекс об обновлении значения по определенному ключу. * - * @param key ключ, который обновился + * @param key ключ, который обновился * @param value новое значение */ void onIndexedEntityUpdated(K key, V value); diff --git a/src/main/java/com/itmo/java/basics/logic/Database.java b/src/main/java/com/itmo/java/basics/logic/Database.java index 80b6755e..76bfba28 100644 --- a/src/main/java/com/itmo/java/basics/logic/Database.java +++ b/src/main/java/com/itmo/java/basics/logic/Database.java @@ -2,7 +2,6 @@ import main.java.com.itmo.java.basics.exceptions.DatabaseException; -import java.io.IOException; import java.util.Optional; public interface Database { @@ -24,8 +23,8 @@ public interface Database { /** * Записывает значение в указанную таблицу по переданному ключу. * - * @param tableName таблица, в которую нужно записать значение - * @param objectKey ключ, по которому нужно записать значение + * @param tableName таблица, в которую нужно записать значение + * @param objectKey ключ, по которому нужно записать значение * @param objectValue значение, которое нужно записать * @throws DatabaseException если указанная таблица не была найдена или если произошла ошибка ввода-вывода */ diff --git a/src/main/java/com/itmo/java/basics/logic/Segment.java b/src/main/java/com/itmo/java/basics/logic/Segment.java index f5d8f26f..7d6008a9 100644 --- a/src/main/java/com/itmo/java/basics/logic/Segment.java +++ b/src/main/java/com/itmo/java/basics/logic/Segment.java @@ -19,7 +19,7 @@ public interface Segment { /** * Записывает значение по указанному ключу в сегмент. * - * @param objectKey ключ, по которому нужно записать значение + * @param objectKey ключ, по которому нужно записать значение * @param objectValue значение, которое нужно записать * @return {@code true} - если значение записалось, {@code false} - если нет * @throws IOException если произошла ошибка ввода-вывода. diff --git a/src/main/java/com/itmo/java/basics/logic/Table.java b/src/main/java/com/itmo/java/basics/logic/Table.java index df304d64..8f48055a 100644 --- a/src/main/java/com/itmo/java/basics/logic/Table.java +++ b/src/main/java/com/itmo/java/basics/logic/Table.java @@ -2,7 +2,6 @@ import main.java.com.itmo.java.basics.exceptions.DatabaseException; -import java.io.IOException; import java.util.Optional; /** @@ -25,7 +24,7 @@ public interface Table { /** * Записывает в таблицу переданное значение по указанному ключу. * - * @param objectKey ключ, по которому нужно записать значение + * @param objectKey ключ, по которому нужно записать значение * @param objectValue значение, которое нужно записать * @throws DatabaseException если произошла ошибка ввода-вывода */ diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index 054d5b44..c0cdda78 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -5,8 +5,6 @@ import com.itmo.java.basics.logic.Database; import com.itmo.java.basics.logic.Table; -import javax.imageio.IIOException; -import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -17,36 +15,30 @@ public class DatabaseImpl implements Database { - - public String dbName; - public Path databaseRoot; - - public static Map tableDictionary = new HashMap(); - - private DatabaseImpl(String dbName, Path databaseRoot) - { + public String dbName; + public Path databaseRoot; + public Map tableDictionary = new HashMap(); + private DatabaseImpl(String dbName, Path databaseRoot) { this.dbName = dbName; this.databaseRoot = databaseRoot; } - public static Database create(String dbName, Path databaseRoot) throws DatabaseException, IOException { + public static Database create(String dbName, Path databaseRoot) throws DatabaseException { if (dbName == null) throw new DatabaseException("Why dataBase name is null?"); - if(Files.exists(Paths.get(databaseRoot.toString(),dbName))) + if (Files.exists(Paths.get(databaseRoot.toString(), dbName))) throw new DatabaseException("This" + dbName + "already exists"); - try - { - Files.createDirectory(Paths.get(databaseRoot.toString(),dbName)); - } - catch(IOException ex) - { - throw new DatabaseException("Error while creating a DataBase("+dbName+") directory"); + try { + Files.createDirectory(Paths.get(databaseRoot.toString(), dbName)); + } catch (IOException ex) { + throw new DatabaseException("Error while creating a DataBase(" + dbName + ") directory"); } + return new DatabaseImpl(dbName, databaseRoot); return new DatabaseImpl(dbName,databaseRoot); /** * @param databaseRoot путь к директории, которая может содержать несколько БД, @@ -62,58 +54,61 @@ public static Database initializeFromContext(DatabaseInitializationContext conte @Override public String getName() { - return dbName; } @Override - public void createTableIfNotExists(String tableName) throws DatabaseException, IOException { + public void createTableIfNotExists(String tableName) throws DatabaseException { if (tableName == null) throw new DatabaseException("Why tableName name is null?"); - if ((tableDictionary.containsKey(tableName)) || (Files.exists(Paths.get(databaseRoot.toString(),dbName , tableName)))) - throw new DatabaseException("We have " + tableName + " in " +dbName+ "directory"); + if ((tableDictionary.containsKey(tableName)) || (Files.exists(Paths.get(databaseRoot.toString(), dbName, tableName)))) + throw new DatabaseException("We have " + tableName + " in " + dbName + "directory"); TableIndex newTableIndex = new TableIndex(); - Path pathToTableRoot = Paths.get(databaseRoot.toString() , dbName); - TableImpl newTable = (TableImpl) TableImpl.create(tableName , pathToTableRoot , newTableIndex); + Path pathToTableRoot = Paths.get(databaseRoot.toString(), dbName); + Table newTable = TableImpl.create(tableName, pathToTableRoot, newTableIndex); - tableDictionary.put(tableName,newTable); + tableDictionary.put(tableName, newTable); } @Override - public void write(String tableName, String objectKey, byte[] objectValue) throws DatabaseException, IOException { - TableImpl tableimpl = tableDictionary.get(tableName); + public void write(String tableName, String objectKey, byte[] objectValue) throws DatabaseException { + if (!tableDictionary.containsKey(tableName)) { + throw new DatabaseException("Table " + tableName + " doesn't exist in database" + dbName); + } if (tableName == null) throw new DatabaseException("Error while writing in database"); - tableimpl.write(objectKey , objectValue ); + Table table = tableDictionary.get(tableName); + table.write(objectKey, objectValue); } @Override - public Optional read(String tableName, String objectKey) throws DatabaseException, IOException { + public Optional read(String tableName, String objectKey) throws DatabaseException { - TableImpl tableimpl = tableDictionary.get(tableName); + Table table = tableDictionary.get(tableName); if (tableName == null) throw new DatabaseException("Error while writing in database"); - return tableimpl.read(objectKey); - - //return Optional.empty(); + return table.read(objectKey); } @Override - public void delete(String tableName, String objectKey) throws DatabaseException, IOException { + public void delete(String tableName, String objectKey) throws DatabaseException { - TableImpl tableimpl = tableDictionary.get(tableName); + if (!tableDictionary.containsKey(tableName)) { + throw new DatabaseException("Table " + tableName + " doesn't exist in database" + dbName); + } if (tableName == null) throw new DatabaseException("Writing in database error"); - tableimpl.delete(objectKey); + Table tableImpl = tableDictionary.get(tableName); + tableImpl.delete(objectKey); } } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java index a6f1046a..f046d1a6 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java @@ -9,18 +9,17 @@ public class RemoveDatabaseRecord implements WritableDatabaseRecord { public byte[] key; public byte[] value; - public RemoveDatabaseRecord(byte[] key){ this.key = key;} - @Override - + public RemoveDatabaseRecord(byte[] key) { + this.key = key; + } - public byte[] getKey() - { + @Override + public byte[] getKey() { return key; } @Override - public byte[] getValue() - { + public byte[] getValue() { return null; } @@ -30,20 +29,15 @@ public long size() { } @Override - public boolean isValuePresented() { - //return ((getValue() == null ) && (getValueSize() == 0)); - return false; - } + public boolean isValuePresented() { return false; } @Override - public int getKeySize() - { + public int getKeySize() { return key.length; } @Override - public int getValueSize() - { + public int getValueSize() { return -1; } } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 6627d0ed..7c47a2d4 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -1,11 +1,11 @@ package com.itmo.java.basics.logic.impl; +import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.index.SegmentOffsetInfo; import com.itmo.java.basics.index.impl.SegmentIndex; import com.itmo.java.basics.index.impl.SegmentOffsetInfoImpl; import com.itmo.java.basics.logic.DatabaseRecord; import com.itmo.java.basics.logic.Segment; -import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.logic.io.DatabaseInputStream; import com.itmo.java.basics.logic.io.DatabaseOutputStream; @@ -26,40 +26,34 @@ */ public class SegmentImpl implements Segment { - public Path tableRootPath; + public Path tableRootPath; public String segmentName; public SegmentIndex segmentIndex; - public final long size_M = 100000; - public long segmentSize ; - private final DatabaseOutputStream out; - - public SegmentImpl(Path tableRootPath, String segmentName, OutputStream out) { + public final long sizeMaximum = 100000; + public long segmentSize; + private final DatabaseOutputStream outStream; + public SegmentImpl(Path tableRootPath, String segmentName, OutputStream outStream) { this.tableRootPath = tableRootPath; this.segmentName = segmentName; this.segmentIndex = new SegmentIndex(); - this.out = new DatabaseOutputStream(out); - + this.outStream = new DatabaseOutputStream(outStream); } static Segment create(String segmentName, Path tableRootPath) throws DatabaseException { Path segRoot = Paths.get(tableRootPath.toString(), segmentName); - boolean have; + boolean fileExists; OutputStream outputStream; - try - { - have = tableRootPath.toFile().createNewFile(); + try { + fileExists = segRoot.toFile().createNewFile(); outputStream = Files.newOutputStream(segRoot); - } - catch(IOException exception) - { + } catch (IOException exception) { throw new DatabaseException("Creating Error " + segmentName); } - if(!have) - { + if (!fileExists) { throw new DatabaseException("Creating Error" + segmentName + "as it already exists"); } public static Segment create(String segmentName, Path tableRootPath) throws DatabaseException { @@ -73,50 +67,42 @@ public static Segment initializeFromContext(SegmentInitializationContext context return new SegmentImpl(segRoot, segmentName, outputStream); } - static String createSegmentName(String tableName) - { + static String createSegmentName(String tableName) { return tableName + "_" + System.currentTimeMillis(); } @Override - public String getName() - { + public String getName() { return segmentName; } @Override public boolean write(String objectKey, byte[] objectValue) throws IOException { - if(isReadOnly()) - { - out.close(); + if (isReadOnly()) { + outStream.close(); return false; } - if(objectValue == null) - { + if (objectValue == null) { return delete(objectKey); } - SetDatabaseRecord newSeg= new SetDatabaseRecord(objectKey.getBytes(StandardCharsets.UTF_8), objectValue); + SetDatabaseRecord newSeg = new SetDatabaseRecord(objectKey.getBytes(StandardCharsets.UTF_8), objectValue); segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); - segmentSize += out.write(newSeg); + segmentSize += outStream.write(newSeg); return true; } @Override public Optional read(String objectKey) throws IOException { - //if (segmentSize == 0) - // return Optional.empty(); - Optional offsetInfo = segmentIndex.searchForKey(objectKey); - if(offsetInfo.isEmpty()) + if (offsetInfo.isEmpty()) return Optional.empty(); - long myOf = offsetInfo.get().getOffset(); DatabaseInputStream input = new DatabaseInputStream(Files.newInputStream(tableRootPath)); @@ -124,34 +110,31 @@ public Optional read(String objectKey) throws IOException { Optional value = input.readDbUnit(); - if(value.isEmpty()) + if (value.isEmpty()) return Optional.empty(); input.close(); - return Optional.of(value.get().getValue()); + return Optional.of(value.get().getValue()); } @Override - public boolean isReadOnly() { - if (segmentSize >= size_M) - return true; - else - return false; - } + public boolean isReadOnly() { return segmentSize >= sizeMaximum;} @Override public boolean delete(String objectKey) throws IOException { - - if(isReadOnly()) - { - out.close(); + if (isReadOnly()) { + outStream.close(); return false; } + if (segmentIndex.searchForKey(objectKey).isPresent()){ + throw new IOException("Deleting error in Segment"); + } + RemoveDatabaseRecord newSeg = new RemoveDatabaseRecord(objectKey.getBytes()); segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); - segmentSize += out.write(newSeg); + segmentSize += outStream.write(newSeg); return true; } } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java index 87aebf65..5b103e03 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java @@ -10,20 +10,18 @@ public class SetDatabaseRecord implements WritableDatabaseRecord { public byte[] key; public byte[] value; - public SetDatabaseRecord(byte[] key , byte[] value) - { + public SetDatabaseRecord(byte[] key, byte[] value) { this.key = key; - this.value =value; + this.value = value; } + @Override - public byte[] getKey() - { + public byte[] getKey() { return key; } @Override - public byte[] getValue() - { + public byte[] getValue() { return value; } @@ -33,20 +31,15 @@ public long size() { } @Override - public boolean isValuePresented() { - // return ((getValue() == null ) && (getValueSize() == 0)); - return true; - } + public boolean isValuePresented() { return true; } @Override - public int getKeySize() - { + public int getKeySize() { return key.length; } @Override - public int getValueSize() - { + public int getValueSize() { return value.length; } } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index 00f2d7f5..f2854e1a 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -4,140 +4,91 @@ import com.itmo.java.basics.index.impl.TableIndex; import com.itmo.java.basics.logic.Segment; import com.itmo.java.basics.logic.Table; -import com.itmo.java.basics.logic.io.DatabaseOutputStream; -import javax.imageio.IIOException; -import java.io.FileOutputStream; import java.io.IOException; -import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.HashMap; -import java.util.Map; import java.util.Optional; public class TableImpl implements Table { - public String tableName; - public Path pathToDatabaseRoot; - public TableIndex tableIndex; - public SegmentImpl lastSegment; + public String tableName; + public Path pathToDatabaseRoot; + public TableIndex tableIndex; + public Segment lastSegment; - public static Map tableDictionary = new HashMap(); - - private TableImpl(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) - { + private TableImpl(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { this.tableName = tableName; this.pathToDatabaseRoot = pathToDatabaseRoot; this.tableIndex = tableIndex; + this.lastSegment = SegmentImpl.create(SegmentImpl.createSegmentName(tableName), pathToDatabaseRoot); } - static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException, IOException { + static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { if (tableName == null) throw new DatabaseException("Why tableBase name is null?"); - Path pathToTableRoot = Paths.get(pathToDatabaseRoot.toString() , tableName); + Path pathToTableRoot = Paths.get(pathToDatabaseRoot.toString(), tableName); - try - { + try { Files.createDirectory(pathToTableRoot); - } - catch(IOException ex) - { - throw new DatabaseException("Error while creating a Table("+tableName+") directory"); + } catch (IOException ex) { + throw new DatabaseException("Error while creating a Table(" + tableName + ") directory"); } - return new TableImpl(tableName , pathToTableRoot , tableIndex); - - static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { -/** - * Таблица - логическая сущность, представляющая собой набор файлов-сегментов, которые объединены одним - * именем и используются для хранения однотипных данных (данных, представляющих собой одну и ту же сущность, - * например, таблица "Пользователи") - *

- * - имеет единый размер сегмента - * - представляет из себя директорию в файловой системе, именованную как таблица - * и хранящую файлы-сегменты данной таблицы - */ -public class TableImpl implements Table { - public static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { - return null; - } - - public static Table initializeFromContext(TableInitializationContext context) { - return null; + return new TableImpl(tableName, pathToTableRoot, tableIndex); } @Override - public String getName() { - - return tableName; - } + public String getName() { return tableName; } @Override - public void write(String objectKey, byte[] objectValue) throws DatabaseException, IOException { + public void write(String objectKey, byte[] objectValue) throws DatabaseException { - try - { + try { boolean canWewrite = lastSegment.write(objectKey, objectValue); - if (canWewrite) - { - - this.lastSegment = (SegmentImpl) SegmentImpl.create(SegmentImpl.createSegmentName(tableName),pathToDatabaseRoot); - this.lastSegment.write(objectKey ,objectValue); + if (!canWewrite) { + lastSegment = SegmentImpl.create(SegmentImpl.createSegmentName(tableName), pathToDatabaseRoot); + lastSegment.write(objectKey, objectValue); } - tableIndex.onIndexedEntityUpdated(objectKey,lastSegment); + tableIndex.onIndexedEntityUpdated(objectKey, lastSegment); + } catch (IOException ex) { + throw new DatabaseException("Writing in database error " + ex); } - catch(IOException ex) - { - throw new DatabaseException("Writing in database error " + ex); - } - - } @Override - public Optional read(String objectKey) throws DatabaseException, IOException { + public Optional read(String objectKey) throws DatabaseException { - try - { + try { Optional segmentRead = tableIndex.searchForKey(objectKey); - if(segmentRead.isPresent()) - { - return segmentRead.get().read(objectKey); - - } - - else - return Optional.empty(); - } + if (segmentRead.isPresent()) { + return segmentRead.get().read(objectKey); - catch (IOException ex) { - throw new DatabaseException("Reading in database error " + ex); + } else + return Optional.empty(); + } catch (IOException ex) { + throw new DatabaseException("Reading in database error " + ex); } } @Override - public void delete(String objectKey) throws DatabaseException, IOException { + public void delete(String objectKey) throws DatabaseException { - try - { - boolean canDel = lastSegment.delete(objectKey); + try { + boolean canDel = lastSegment.delete(objectKey); - if(!canDel) - { - this.lastSegment = (SegmentImpl) SegmentImpl.create(SegmentImpl.createSegmentName(tableName),pathToDatabaseRoot); - this.lastSegment.delete(objectKey); - } + if (!canDel) { + this.lastSegment = SegmentImpl.create(SegmentImpl.createSegmentName(tableName), pathToDatabaseRoot); + this.lastSegment.delete(objectKey); + } - tableIndex.onIndexedEntityUpdated(objectKey , null); - } - catch(IOException ex) - { + tableIndex.onIndexedEntityUpdated(objectKey, null); + } catch (IOException ex) { throw new DatabaseException("Deleting error in Table"); } } diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java index ae2f3d72..a18df289 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java @@ -7,7 +7,6 @@ import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; -import java.util.Arrays; import java.util.Optional; /** @@ -20,38 +19,35 @@ public DatabaseInputStream(InputStream inputStream) { super(inputStream); } - /** + /** * Читает следующую запись (см {@link DatabaseOutputStream#write(WritableDatabaseRecord)}) + * * @return следующую запись, если она существует. {@link Optional#empty()} - если конец файла достигнут */ public Optional readDbUnit() throws IOException { - if (available() <= 4) - { - return Optional.empty(); + if (available() <= 4) { + return Optional.empty(); } - int keySize = readInt(); - if (available() <= 0) - { + int keySize = readInt(); + + if (available() <= 0) { return Optional.empty(); } - byte[] key = readNBytes(keySize); - if (available() <= 4) - { + byte[] key = readNBytes(keySize); + + if (available() <= 4) { return Optional.empty(); } - int valueSize = readInt(); + int valueSize = readInt(); - if ((available() <= 0) && (valueSize == REMOVED_OBJECT_SIZE)) - { + if ((available() <= 0) && (valueSize == REMOVED_OBJECT_SIZE)) { return Optional.empty(); } + byte[] value = readNBytes(valueSize); + SetDatabaseRecord datarecord = new SetDatabaseRecord(key, value); - byte[] value = readNBytes(valueSize); - SetDatabaseRecord datarecord = new SetDatabaseRecord(key,value); - // datarecord.key = key; - // datarecord.value= value; - return Optional.of(datarecord); - } + return Optional.of(datarecord); } +} diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java index 676dea86..8b0ce164 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java @@ -3,7 +3,6 @@ import main.java.com.itmo.java.basics.logic.WritableDatabaseRecord; import java.io.DataOutputStream; -import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; @@ -12,7 +11,8 @@ */ public class DatabaseOutputStream extends DataOutputStream { - private OutputStream outputStream; + private final OutputStream outputStream; + public DatabaseOutputStream(OutputStream outputStream) { super(outputStream); @@ -35,19 +35,16 @@ public DatabaseOutputStream(OutputStream outputStream) { * @throws IOException если запись не удалась */ public int write(WritableDatabaseRecord databaseRecord) throws IOException { - //String DataBaseRecord = databaseRecord.getKeySize() + databaseRecord.getKey().toString() + databaseRecord.getValueSize() + databaseRecord.getValue().toString(); - // запихать в один write? + writeInt(databaseRecord.getKeySize()); + write(databaseRecord.getKey()); + writeInt(databaseRecord.getValueSize()); - writeInt(databaseRecord.getKeySize()); - write(databaseRecord.getKey()); - writeInt(databaseRecord.getValueSize()); - if (databaseRecord.isValuePresented()) - write(databaseRecord.getValue()); - // just write mm, - flush(); + if (databaseRecord.isValuePresented()) + write(databaseRecord.getValue()); + flush(); - return databaseRecord.getKeySize()+ databaseRecord.getValueSize() + 4 + 4; + return databaseRecord.getKeySize() + databaseRecord.getValueSize() + 4 + 4; } } \ No newline at end of file From 0d9a59a0a7ae93ec5ed60a97d6be671bc8aed423 Mon Sep 17 00:00:00 2001 From: aftilion Date: Wed, 31 Mar 2021 20:21:01 +0300 Subject: [PATCH 035/378] lab1 fix --- .../java/basics/logic/impl/DatabaseImpl.java | 42 +++++++++---------- .../java/basics/logic/impl/SegmentImpl.java | 38 +++++++++-------- .../java/basics/logic/impl/TableImpl.java | 24 +++++------ .../basics/logic/io/DatabaseOutputStream.java | 7 ++-- 4 files changed, 53 insertions(+), 58 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index c0cdda78..d412b75c 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -26,18 +26,18 @@ private DatabaseImpl(String dbName, Path databaseRoot) { public static Database create(String dbName, Path databaseRoot) throws DatabaseException { - if (dbName == null) + if (dbName == null) { throw new DatabaseException("Why dataBase name is null?"); - - if (Files.exists(Paths.get(databaseRoot.toString(), dbName))) + } + if (Files.exists(Paths.get(databaseRoot.toString(), dbName))) { throw new DatabaseException("This" + dbName + "already exists"); + } try { Files.createDirectory(Paths.get(databaseRoot.toString(), dbName)); } catch (IOException ex) { - throw new DatabaseException("Error while creating a DataBase(" + dbName + ") directory"); + throw new DatabaseException("Error while creating a DataBase(" + dbName + ") directory" ,ex); } - return new DatabaseImpl(dbName, databaseRoot); return new DatabaseImpl(dbName,databaseRoot); /** @@ -60,28 +60,27 @@ public String getName() { @Override public void createTableIfNotExists(String tableName) throws DatabaseException { - if (tableName == null) + if (tableName == null) { throw new DatabaseException("Why tableName name is null?"); - - if ((tableDictionary.containsKey(tableName)) || (Files.exists(Paths.get(databaseRoot.toString(), dbName, tableName)))) + } + if ((tableDictionary.containsKey(tableName)) || (Files.exists(Paths.get(databaseRoot.toString(), dbName, tableName)))) { throw new DatabaseException("We have " + tableName + " in " + dbName + "directory"); - + } TableIndex newTableIndex = new TableIndex(); Path pathToTableRoot = Paths.get(databaseRoot.toString(), dbName); Table newTable = TableImpl.create(tableName, pathToTableRoot, newTableIndex); - tableDictionary.put(tableName, newTable); } @Override public void write(String tableName, String objectKey, byte[] objectValue) throws DatabaseException { + if (!tableDictionary.containsKey(tableName)) { throw new DatabaseException("Table " + tableName + " doesn't exist in database" + dbName); } - - if (tableName == null) - throw new DatabaseException("Error while writing in database"); - + if (tableName == null) { + throw new DatabaseException("Error while writing in database , why tableName name is null?"); + } Table table = tableDictionary.get(tableName); table.write(objectKey, objectValue); } @@ -90,10 +89,9 @@ public void write(String tableName, String objectKey, byte[] objectValue) throws public Optional read(String tableName, String objectKey) throws DatabaseException { Table table = tableDictionary.get(tableName); - - if (tableName == null) - throw new DatabaseException("Error while writing in database"); - + if (tableName == null) { + throw new DatabaseException("Error while writing in database , why tableName name is null?"); + } return table.read(objectKey); } @@ -103,12 +101,10 @@ public void delete(String tableName, String objectKey) throws DatabaseException if (!tableDictionary.containsKey(tableName)) { throw new DatabaseException("Table " + tableName + " doesn't exist in database" + dbName); } - - if (tableName == null) - throw new DatabaseException("Writing in database error"); - + if (tableName == null) { + throw new DatabaseException("Writing in database error , why tableName name is null?"); + } Table tableImpl = tableDictionary.get(tableName); - tableImpl.delete(objectKey); } } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 7c47a2d4..7906aa27 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -44,10 +44,18 @@ static Segment create(String segmentName, Path tableRootPath) throws DatabaseExc Path segRoot = Paths.get(tableRootPath.toString(), segmentName); boolean fileExists; - OutputStream outputStream; + // OutputStream outputStream; - try { + try( OutputStream outputStream = Files.newOutputStream(segRoot)) { fileExists = segRoot.toFile().createNewFile(); + if (!fileExists) { + throw new DatabaseException("Creating Error" + segmentName + "as it already exists"); + } + //outputStream = Files.newOutputStream(segRoot); + return new SegmentImpl(segRoot, segmentName, outputStream); + } catch (IOException ex) { + throw new DatabaseException("Creating Error " + segmentName , ex); + } outputStream = Files.newOutputStream(segRoot); } catch (IOException exception) { @@ -83,13 +91,10 @@ public boolean write(String objectKey, byte[] objectValue) throws IOException { outStream.close(); return false; } - if (objectValue == null) { return delete(objectKey); } - SetDatabaseRecord newSeg = new SetDatabaseRecord(objectKey.getBytes(StandardCharsets.UTF_8), objectValue); - segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); segmentSize += outStream.write(newSeg); return true; @@ -99,20 +104,20 @@ public boolean write(String objectKey, byte[] objectValue) throws IOException { public Optional read(String objectKey) throws IOException { Optional offsetInfo = segmentIndex.searchForKey(objectKey); - - if (offsetInfo.isEmpty()) + if (offsetInfo.isEmpty()) { return Optional.empty(); - + } long myOf = offsetInfo.get().getOffset(); - DatabaseInputStream input = new DatabaseInputStream(Files.newInputStream(tableRootPath)); input.skip(myOf); - + long skiped = input.skip(myOf); + if (skiped != myOf) { + throw new IOException("Error with skipping"); + } Optional value = input.readDbUnit(); - - if (value.isEmpty()) + if (value.isEmpty()) { return Optional.empty(); - + } input.close(); return Optional.of(value.get().getValue()); } @@ -127,11 +132,10 @@ public boolean delete(String objectKey) throws IOException { outStream.close(); return false; } - - if (segmentIndex.searchForKey(objectKey).isPresent()){ - throw new IOException("Deleting error in Segment"); + if (segmentIndex.searchForKey(objectKey).isEmpty()) { + outStream.close(); + return false; } - RemoveDatabaseRecord newSeg = new RemoveDatabaseRecord(objectKey.getBytes()); segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); segmentSize += outStream.write(newSeg); diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index f2854e1a..b8d67391 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -27,15 +27,15 @@ private TableImpl(String tableName, Path pathToDatabaseRoot, TableIndex tableInd static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { - if (tableName == null) + if (tableName == null) { throw new DatabaseException("Why tableBase name is null?"); - + } Path pathToTableRoot = Paths.get(pathToDatabaseRoot.toString(), tableName); try { Files.createDirectory(pathToTableRoot); } catch (IOException ex) { - throw new DatabaseException("Error while creating a Table(" + tableName + ") directory"); + throw new DatabaseException("Error while creating a Table(" + tableName + ") directory" ,ex); } return new TableImpl(tableName, pathToTableRoot, tableIndex); @@ -49,14 +49,13 @@ public void write(String objectKey, byte[] objectValue) throws DatabaseException try { boolean canWewrite = lastSegment.write(objectKey, objectValue); - if (!canWewrite) { lastSegment = SegmentImpl.create(SegmentImpl.createSegmentName(tableName), pathToDatabaseRoot); lastSegment.write(objectKey, objectValue); } tableIndex.onIndexedEntityUpdated(objectKey, lastSegment); } catch (IOException ex) { - throw new DatabaseException("Writing in database error " + ex); + throw new DatabaseException("Writing in database error " , ex); } } @@ -65,14 +64,13 @@ public Optional read(String objectKey) throws DatabaseException { try { Optional segmentRead = tableIndex.searchForKey(objectKey); - if (segmentRead.isPresent()) { return segmentRead.get().read(objectKey); - - } else + } else { return Optional.empty(); + } } catch (IOException ex) { - throw new DatabaseException("Reading in database error " + ex); + throw new DatabaseException("Reading in database error " , ex); } } @@ -81,15 +79,13 @@ public void delete(String objectKey) throws DatabaseException { try { boolean canDel = lastSegment.delete(objectKey); - if (!canDel) { - this.lastSegment = SegmentImpl.create(SegmentImpl.createSegmentName(tableName), pathToDatabaseRoot); - this.lastSegment.delete(objectKey); + lastSegment = SegmentImpl.create(SegmentImpl.createSegmentName(tableName), pathToDatabaseRoot); + lastSegment.delete(objectKey); } - tableIndex.onIndexedEntityUpdated(objectKey, null); } catch (IOException ex) { - throw new DatabaseException("Deleting error in Table"); + throw new DatabaseException("Deleting error in Table" , ex); } } } diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java index 8b0ce164..897a4ef8 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java @@ -39,12 +39,11 @@ public int write(WritableDatabaseRecord databaseRecord) throws IOException { writeInt(databaseRecord.getKeySize()); write(databaseRecord.getKey()); writeInt(databaseRecord.getValueSize()); - - if (databaseRecord.isValuePresented()) + if (databaseRecord.isValuePresented()) { write(databaseRecord.getValue()); + } flush(); - - return databaseRecord.getKeySize() + databaseRecord.getValueSize() + 4 + 4; + return databaseRecord.getKeySize() + databaseRecord.getValueSize() + 8; } } \ No newline at end of file From afe5c0e612ad70835f794d2ec59a7c4c378e6559 Mon Sep 17 00:00:00 2001 From: aftilion <59564484+aftilion@users.noreply.github.com> Date: Sun, 28 Mar 2021 18:28:05 +0300 Subject: [PATCH 036/378] Update SegmentImpl.java --- .../java/basics/logic/impl/SegmentImpl.java | 22 +++++-------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 7906aa27..c0df0d96 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -44,18 +44,10 @@ static Segment create(String segmentName, Path tableRootPath) throws DatabaseExc Path segRoot = Paths.get(tableRootPath.toString(), segmentName); boolean fileExists; - // OutputStream outputStream; + OutputStream outputStream; - try( OutputStream outputStream = Files.newOutputStream(segRoot)) { + try { fileExists = segRoot.toFile().createNewFile(); - if (!fileExists) { - throw new DatabaseException("Creating Error" + segmentName + "as it already exists"); - } - //outputStream = Files.newOutputStream(segRoot); - return new SegmentImpl(segRoot, segmentName, outputStream); - } catch (IOException ex) { - throw new DatabaseException("Creating Error " + segmentName , ex); - } outputStream = Files.newOutputStream(segRoot); } catch (IOException exception) { @@ -64,13 +56,6 @@ static Segment create(String segmentName, Path tableRootPath) throws DatabaseExc if (!fileExists) { throw new DatabaseException("Creating Error" + segmentName + "as it already exists"); } - public static Segment create(String segmentName, Path tableRootPath) throws DatabaseException { - throw new UnsupportedOperationException(); - } - - public static Segment initializeFromContext(SegmentInitializationContext context) { - return null; - } return new SegmentImpl(segRoot, segmentName, outputStream); } @@ -91,10 +76,13 @@ public boolean write(String objectKey, byte[] objectValue) throws IOException { outStream.close(); return false; } + if (objectValue == null) { return delete(objectKey); } + SetDatabaseRecord newSeg = new SetDatabaseRecord(objectKey.getBytes(StandardCharsets.UTF_8), objectValue); + segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); segmentSize += outStream.write(newSeg); return true; From 9e16332d652776fdcff2d856c3d968bf0f1f1554 Mon Sep 17 00:00:00 2001 From: aftilion Date: Wed, 31 Mar 2021 20:34:55 +0300 Subject: [PATCH 037/378] lab1 --- .../com/itmo/java/basics/logic/impl/SegmentImpl.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index c0df0d96..022870fc 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -48,15 +48,16 @@ static Segment create(String segmentName, Path tableRootPath) throws DatabaseExc try { fileExists = segRoot.toFile().createNewFile(); + outputStream = Files.newOutputStream(segRoot); - } catch (IOException exception) { - throw new DatabaseException("Creating Error " + segmentName); + } catch (IOException ex) { + throw new DatabaseException("Creating Error " + segmentName , ex); } + if (!fileExists) { throw new DatabaseException("Creating Error" + segmentName + "as it already exists"); } - return new SegmentImpl(segRoot, segmentName, outputStream); } @@ -76,13 +77,10 @@ public boolean write(String objectKey, byte[] objectValue) throws IOException { outStream.close(); return false; } - if (objectValue == null) { return delete(objectKey); } - SetDatabaseRecord newSeg = new SetDatabaseRecord(objectKey.getBytes(StandardCharsets.UTF_8), objectValue); - segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); segmentSize += outStream.write(newSeg); return true; From 3c90ebc07ed0e42df0a6a74aca7c0dd99ba239a6 Mon Sep 17 00:00:00 2001 From: aftilion Date: Thu, 1 Apr 2021 22:54:55 +0300 Subject: [PATCH 038/378] lab1 --- db2/table1/table1_1617306857629 | Bin 0 -> 31 bytes .../java/com/itmo/java/basics/MainTest.java | 34 ++++++++++++++ .../java/basics/logic/impl/DatabaseImpl.java | 44 ++++++++++-------- .../logic/impl/RemoveDatabaseRecord.java | 1 - .../java/basics/logic/impl/SegmentImpl.java | 33 +++++++------ .../basics/logic/impl/SetDatabaseRecord.java | 2 +- .../java/basics/logic/impl/TableImpl.java | 26 ++++++----- .../basics/logic/io/DatabaseInputStream.java | 3 +- .../basics/logic/io/DatabaseOutputStream.java | 5 +- 9 files changed, 97 insertions(+), 51 deletions(-) create mode 100644 db2/table1/table1_1617306857629 create mode 100644 src/main/java/com/itmo/java/basics/MainTest.java diff --git a/db2/table1/table1_1617306857629 b/db2/table1/table1_1617306857629 new file mode 100644 index 0000000000000000000000000000000000000000..ba4d766957f7e117619fb71f3dad900a4deaff63 GIT binary patch literal 31 ccmZQzU|=+4U|?V=Elw>0(u{`xfdI|`0A(2pQUCw| literal 0 HcmV?d00001 diff --git a/src/main/java/com/itmo/java/basics/MainTest.java b/src/main/java/com/itmo/java/basics/MainTest.java new file mode 100644 index 00000000..14ef5ceb --- /dev/null +++ b/src/main/java/com/itmo/java/basics/MainTest.java @@ -0,0 +1,34 @@ +package com.itmo.java.basics; + +import com.itmo.java.basics.exceptions.DatabaseException; +import com.itmo.java.basics.logic.Database; +import com.itmo.java.basics.logic.impl.DatabaseImpl; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Comparator; +import java.nio.charset.StandardCharsets; +import java.util.Optional; + +public class MainTest { + public static void main(String[] args){ + try { + Files.walk(Path.of("db2")).sorted(Comparator.reverseOrder()).map(Path::toFile).forEach(File::delete); + Database db1 = DatabaseImpl.create("db2", Path.of(".")); + db1.createTableIfNotExists("table1"); + + db1.write("table1", "1", "user".getBytes(StandardCharsets.UTF_8)); + System.out.println(new String(db1.read("table1", "1").get())); + db1.delete("table1", "1"); + System.out.println(new String(db1.read("table1", "1").toString())); + + db1.write("table1", "1", null); + + System.out.println(new String(db1.read("table1", "1").toString())); + }catch(DatabaseException | IOException exception){ + System.out.print("Error appeared with message : " + exception.getMessage()); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index d412b75c..5472d392 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -26,18 +26,18 @@ private DatabaseImpl(String dbName, Path databaseRoot) { public static Database create(String dbName, Path databaseRoot) throws DatabaseException { - if (dbName == null) { + if (dbName == null) throw new DatabaseException("Why dataBase name is null?"); - } - if (Files.exists(Paths.get(databaseRoot.toString(), dbName))) { + + if (Files.exists(Paths.get(databaseRoot.toString(), dbName))) throw new DatabaseException("This" + dbName + "already exists"); - } try { Files.createDirectory(Paths.get(databaseRoot.toString(), dbName)); } catch (IOException ex) { - throw new DatabaseException("Error while creating a DataBase(" + dbName + ") directory" ,ex); + throw new DatabaseException("Error while creating a DataBase(" + dbName + ") directory"); } + return new DatabaseImpl(dbName, databaseRoot); return new DatabaseImpl(dbName,databaseRoot); /** @@ -60,27 +60,28 @@ public String getName() { @Override public void createTableIfNotExists(String tableName) throws DatabaseException { - if (tableName == null) { + if (tableName == null) throw new DatabaseException("Why tableName name is null?"); - } - if ((tableDictionary.containsKey(tableName)) || (Files.exists(Paths.get(databaseRoot.toString(), dbName, tableName)))) { + + if ((tableDictionary.containsKey(tableName)) || (Files.exists(Paths.get(databaseRoot.toString(), dbName, tableName)))) throw new DatabaseException("We have " + tableName + " in " + dbName + "directory"); - } + TableIndex newTableIndex = new TableIndex(); Path pathToTableRoot = Paths.get(databaseRoot.toString(), dbName); Table newTable = TableImpl.create(tableName, pathToTableRoot, newTableIndex); + tableDictionary.put(tableName, newTable); } @Override public void write(String tableName, String objectKey, byte[] objectValue) throws DatabaseException { - if (!tableDictionary.containsKey(tableName)) { throw new DatabaseException("Table " + tableName + " doesn't exist in database" + dbName); } - if (tableName == null) { - throw new DatabaseException("Error while writing in database , why tableName name is null?"); - } + + if (tableName == null) + throw new DatabaseException("Error while writing in database"); + Table table = tableDictionary.get(tableName); table.write(objectKey, objectValue); } @@ -89,9 +90,10 @@ public void write(String tableName, String objectKey, byte[] objectValue) throws public Optional read(String tableName, String objectKey) throws DatabaseException { Table table = tableDictionary.get(tableName); - if (tableName == null) { - throw new DatabaseException("Error while writing in database , why tableName name is null?"); - } + + if (tableName == null) + throw new DatabaseException("Error while writing in database"); + return table.read(objectKey); } @@ -101,10 +103,12 @@ public void delete(String tableName, String objectKey) throws DatabaseException if (!tableDictionary.containsKey(tableName)) { throw new DatabaseException("Table " + tableName + " doesn't exist in database" + dbName); } - if (tableName == null) { - throw new DatabaseException("Writing in database error , why tableName name is null?"); - } + + if (tableName == null) + throw new DatabaseException("Writing in database error"); + Table tableImpl = tableDictionary.get(tableName); + tableImpl.delete(objectKey); } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java index f046d1a6..7ba81e62 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java @@ -41,4 +41,3 @@ public int getValueSize() { return -1; } } - diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 022870fc..1271d80a 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -48,16 +48,15 @@ static Segment create(String segmentName, Path tableRootPath) throws DatabaseExc try { fileExists = segRoot.toFile().createNewFile(); - outputStream = Files.newOutputStream(segRoot); - } catch (IOException ex) { - throw new DatabaseException("Creating Error " + segmentName , ex); + } catch (IOException exception) { + throw new DatabaseException("Creating Error " + segmentName); } - if (!fileExists) { throw new DatabaseException("Creating Error" + segmentName + "as it already exists"); } + return new SegmentImpl(segRoot, segmentName, outputStream); } @@ -77,10 +76,13 @@ public boolean write(String objectKey, byte[] objectValue) throws IOException { outStream.close(); return false; } + if (objectValue == null) { return delete(objectKey); } + SetDatabaseRecord newSeg = new SetDatabaseRecord(objectKey.getBytes(StandardCharsets.UTF_8), objectValue); + segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); segmentSize += outStream.write(newSeg); return true; @@ -90,20 +92,20 @@ public boolean write(String objectKey, byte[] objectValue) throws IOException { public Optional read(String objectKey) throws IOException { Optional offsetInfo = segmentIndex.searchForKey(objectKey); - if (offsetInfo.isEmpty()) { + + if (offsetInfo.isEmpty()) return Optional.empty(); - } + long myOf = offsetInfo.get().getOffset(); + DatabaseInputStream input = new DatabaseInputStream(Files.newInputStream(tableRootPath)); input.skip(myOf); - long skiped = input.skip(myOf); - if (skiped != myOf) { - throw new IOException("Error with skipping"); - } + Optional value = input.readDbUnit(); - if (value.isEmpty()) { + + if (value.isEmpty()) return Optional.empty(); - } + input.close(); return Optional.of(value.get().getValue()); } @@ -118,13 +120,16 @@ public boolean delete(String objectKey) throws IOException { outStream.close(); return false; } - if (segmentIndex.searchForKey(objectKey).isEmpty()) { + + if (segmentIndex.searchForKey(objectKey).isEmpty()){ outStream.close(); return false; } + + RemoveDatabaseRecord newSeg = new RemoveDatabaseRecord(objectKey.getBytes()); segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); segmentSize += outStream.write(newSeg); return true; } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java index 5b103e03..0ff43c24 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java @@ -42,4 +42,4 @@ public int getKeySize() { public int getValueSize() { return value.length; } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index b8d67391..f368c56c 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -27,15 +27,15 @@ private TableImpl(String tableName, Path pathToDatabaseRoot, TableIndex tableInd static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { - if (tableName == null) { + if (tableName == null) throw new DatabaseException("Why tableBase name is null?"); - } + Path pathToTableRoot = Paths.get(pathToDatabaseRoot.toString(), tableName); try { Files.createDirectory(pathToTableRoot); } catch (IOException ex) { - throw new DatabaseException("Error while creating a Table(" + tableName + ") directory" ,ex); + throw new DatabaseException("Error while creating a Table(" + tableName + ") directory"); } return new TableImpl(tableName, pathToTableRoot, tableIndex); @@ -49,13 +49,14 @@ public void write(String objectKey, byte[] objectValue) throws DatabaseException try { boolean canWewrite = lastSegment.write(objectKey, objectValue); + if (!canWewrite) { lastSegment = SegmentImpl.create(SegmentImpl.createSegmentName(tableName), pathToDatabaseRoot); lastSegment.write(objectKey, objectValue); } tableIndex.onIndexedEntityUpdated(objectKey, lastSegment); } catch (IOException ex) { - throw new DatabaseException("Writing in database error " , ex); + throw new DatabaseException("Writing in database error " + ex); } } @@ -64,13 +65,14 @@ public Optional read(String objectKey) throws DatabaseException { try { Optional segmentRead = tableIndex.searchForKey(objectKey); + if (segmentRead.isPresent()) { return segmentRead.get().read(objectKey); - } else { + + } else return Optional.empty(); - } } catch (IOException ex) { - throw new DatabaseException("Reading in database error " , ex); + throw new DatabaseException("Reading in database error " + ex); } } @@ -79,13 +81,15 @@ public void delete(String objectKey) throws DatabaseException { try { boolean canDel = lastSegment.delete(objectKey); + if (!canDel) { - lastSegment = SegmentImpl.create(SegmentImpl.createSegmentName(tableName), pathToDatabaseRoot); - lastSegment.delete(objectKey); + this.lastSegment = SegmentImpl.create(SegmentImpl.createSegmentName(tableName), pathToDatabaseRoot); + this.lastSegment.delete(objectKey); } + tableIndex.onIndexedEntityUpdated(objectKey, null); } catch (IOException ex) { - throw new DatabaseException("Deleting error in Table" , ex); + throw new DatabaseException("Deleting error in Table"); } } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java index a18df289..cdd01dc8 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java @@ -49,5 +49,4 @@ public Optional readDbUnit() throws IOException { return Optional.of(datarecord); } -} - +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java index 897a4ef8..955aaabc 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java @@ -39,10 +39,11 @@ public int write(WritableDatabaseRecord databaseRecord) throws IOException { writeInt(databaseRecord.getKeySize()); write(databaseRecord.getKey()); writeInt(databaseRecord.getValueSize()); - if (databaseRecord.isValuePresented()) { + + if (databaseRecord.isValuePresented()) write(databaseRecord.getValue()); - } flush(); + return databaseRecord.getKeySize() + databaseRecord.getValueSize() + 8; } From 6b8b2e10b65c20965e523ce1ba0d76f61d5e161b Mon Sep 17 00:00:00 2001 From: aftilion Date: Sun, 4 Apr 2021 13:36:43 +0300 Subject: [PATCH 039/378] lab1 end --- .../java/com/itmo/java/basics/MainTest.java | 34 ------------------ .../java/basics/logic/impl/DatabaseImpl.java | 35 +++++++++---------- .../java/basics/logic/impl/SegmentImpl.java | 17 ++++----- .../java/basics/logic/impl/TableImpl.java | 6 ++-- .../basics/logic/io/DatabaseOutputStream.java | 3 +- 5 files changed, 27 insertions(+), 68 deletions(-) delete mode 100644 src/main/java/com/itmo/java/basics/MainTest.java diff --git a/src/main/java/com/itmo/java/basics/MainTest.java b/src/main/java/com/itmo/java/basics/MainTest.java deleted file mode 100644 index 14ef5ceb..00000000 --- a/src/main/java/com/itmo/java/basics/MainTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.itmo.java.basics; - -import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.logic.Database; -import com.itmo.java.basics.logic.impl.DatabaseImpl; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Comparator; -import java.nio.charset.StandardCharsets; -import java.util.Optional; - -public class MainTest { - public static void main(String[] args){ - try { - Files.walk(Path.of("db2")).sorted(Comparator.reverseOrder()).map(Path::toFile).forEach(File::delete); - Database db1 = DatabaseImpl.create("db2", Path.of(".")); - db1.createTableIfNotExists("table1"); - - db1.write("table1", "1", "user".getBytes(StandardCharsets.UTF_8)); - System.out.println(new String(db1.read("table1", "1").get())); - db1.delete("table1", "1"); - System.out.println(new String(db1.read("table1", "1").toString())); - - db1.write("table1", "1", null); - - System.out.println(new String(db1.read("table1", "1").toString())); - }catch(DatabaseException | IOException exception){ - System.out.print("Error appeared with message : " + exception.getMessage()); - } - } -} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index 5472d392..71477630 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -26,18 +26,18 @@ private DatabaseImpl(String dbName, Path databaseRoot) { public static Database create(String dbName, Path databaseRoot) throws DatabaseException { - if (dbName == null) + if (dbName == null) { throw new DatabaseException("Why dataBase name is null?"); - - if (Files.exists(Paths.get(databaseRoot.toString(), dbName))) + } + if (Files.exists(Paths.get(databaseRoot.toString(), dbName))) { throw new DatabaseException("This" + dbName + "already exists"); + } try { Files.createDirectory(Paths.get(databaseRoot.toString(), dbName)); } catch (IOException ex) { throw new DatabaseException("Error while creating a DataBase(" + dbName + ") directory"); } - return new DatabaseImpl(dbName, databaseRoot); return new DatabaseImpl(dbName,databaseRoot); /** @@ -60,16 +60,16 @@ public String getName() { @Override public void createTableIfNotExists(String tableName) throws DatabaseException { - if (tableName == null) + if (tableName == null) { throw new DatabaseException("Why tableName name is null?"); - - if ((tableDictionary.containsKey(tableName)) || (Files.exists(Paths.get(databaseRoot.toString(), dbName, tableName)))) + } + if ((tableDictionary.containsKey(tableName)) || (Files.exists(Paths.get(databaseRoot.toString(), dbName, tableName)))) { throw new DatabaseException("We have " + tableName + " in " + dbName + "directory"); + } TableIndex newTableIndex = new TableIndex(); Path pathToTableRoot = Paths.get(databaseRoot.toString(), dbName); Table newTable = TableImpl.create(tableName, pathToTableRoot, newTableIndex); - tableDictionary.put(tableName, newTable); } @@ -78,10 +78,9 @@ public void write(String tableName, String objectKey, byte[] objectValue) throws if (!tableDictionary.containsKey(tableName)) { throw new DatabaseException("Table " + tableName + " doesn't exist in database" + dbName); } - - if (tableName == null) - throw new DatabaseException("Error while writing in database"); - + if (tableName == null) { + throw new DatabaseException("Error while writing in , null name"); + } Table table = tableDictionary.get(tableName); table.write(objectKey, objectValue); } @@ -91,9 +90,9 @@ public Optional read(String tableName, String objectKey) throws Database Table table = tableDictionary.get(tableName); - if (tableName == null) - throw new DatabaseException("Error while writing in database"); - + if (tableName == null) { + throw new DatabaseException("Error while reading in database , null name"); + } return table.read(objectKey); } @@ -103,12 +102,10 @@ public void delete(String tableName, String objectKey) throws DatabaseException if (!tableDictionary.containsKey(tableName)) { throw new DatabaseException("Table " + tableName + " doesn't exist in database" + dbName); } - - if (tableName == null) + if (tableName == null) { throw new DatabaseException("Writing in database error"); - + } Table tableImpl = tableDictionary.get(tableName); - tableImpl.delete(objectKey); } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 1271d80a..9bee5aec 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -50,13 +50,12 @@ static Segment create(String segmentName, Path tableRootPath) throws DatabaseExc fileExists = segRoot.toFile().createNewFile(); outputStream = Files.newOutputStream(segRoot); - } catch (IOException exception) { - throw new DatabaseException("Creating Error " + segmentName); + } catch (IOException ex) { + throw new DatabaseException("Creating Error " + segmentName + ex); } if (!fileExists) { throw new DatabaseException("Creating Error" + segmentName + "as it already exists"); } - return new SegmentImpl(segRoot, segmentName, outputStream); } @@ -82,7 +81,6 @@ public boolean write(String objectKey, byte[] objectValue) throws IOException { } SetDatabaseRecord newSeg = new SetDatabaseRecord(objectKey.getBytes(StandardCharsets.UTF_8), objectValue); - segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); segmentSize += outStream.write(newSeg); return true; @@ -93,20 +91,20 @@ public Optional read(String objectKey) throws IOException { Optional offsetInfo = segmentIndex.searchForKey(objectKey); - if (offsetInfo.isEmpty()) + if (offsetInfo.isEmpty()) { return Optional.empty(); - + } long myOf = offsetInfo.get().getOffset(); - DatabaseInputStream input = new DatabaseInputStream(Files.newInputStream(tableRootPath)); input.skip(myOf); Optional value = input.readDbUnit(); - if (value.isEmpty()) + if (value.isEmpty()) { return Optional.empty(); - + } input.close(); + return Optional.of(value.get().getValue()); } @@ -126,7 +124,6 @@ public boolean delete(String objectKey) throws IOException { return false; } - RemoveDatabaseRecord newSeg = new RemoveDatabaseRecord(objectKey.getBytes()); segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); segmentSize += outStream.write(newSeg); diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index f368c56c..419bc0d1 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -27,8 +27,9 @@ private TableImpl(String tableName, Path pathToDatabaseRoot, TableIndex tableInd static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { - if (tableName == null) + if (tableName == null) { throw new DatabaseException("Why tableBase name is null?"); + } Path pathToTableRoot = Paths.get(pathToDatabaseRoot.toString(), tableName); @@ -37,7 +38,6 @@ static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableI } catch (IOException ex) { throw new DatabaseException("Error while creating a Table(" + tableName + ") directory"); } - return new TableImpl(tableName, pathToTableRoot, tableIndex); } @@ -68,7 +68,6 @@ public Optional read(String objectKey) throws DatabaseException { if (segmentRead.isPresent()) { return segmentRead.get().read(objectKey); - } else return Optional.empty(); } catch (IOException ex) { @@ -86,7 +85,6 @@ public void delete(String objectKey) throws DatabaseException { this.lastSegment = SegmentImpl.create(SegmentImpl.createSegmentName(tableName), pathToDatabaseRoot); this.lastSegment.delete(objectKey); } - tableIndex.onIndexedEntityUpdated(objectKey, null); } catch (IOException ex) { throw new DatabaseException("Deleting error in Table"); diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java index 955aaabc..68c0455d 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java @@ -40,8 +40,9 @@ public int write(WritableDatabaseRecord databaseRecord) throws IOException { write(databaseRecord.getKey()); writeInt(databaseRecord.getValueSize()); - if (databaseRecord.isValuePresented()) + if (databaseRecord.isValuePresented()) { write(databaseRecord.getValue()); + } flush(); return databaseRecord.getKeySize() + databaseRecord.getValueSize() + 8; From 10c885b76ae2bc41ce05b0e10037c6ad76953382 Mon Sep 17 00:00:00 2001 From: aftilion Date: Thu, 15 Apr 2021 16:22:25 +0300 Subject: [PATCH 040/378] lab1 15/04 --- .../java/basics/logic/impl/DatabaseImpl.java | 8 +-- .../logic/impl/RemoveDatabaseRecord.java | 4 +- .../java/basics/logic/impl/SegmentImpl.java | 57 ++++++++++--------- .../basics/logic/impl/SetDatabaseRecord.java | 4 +- .../java/basics/logic/impl/TableImpl.java | 12 ++-- 5 files changed, 43 insertions(+), 42 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index 71477630..73011f74 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -15,9 +15,9 @@ public class DatabaseImpl implements Database { - public String dbName; - public Path databaseRoot; - public Map tableDictionary = new HashMap(); + private String dbName; + private Path databaseRoot; + private Map tableDictionary = new HashMap(); private DatabaseImpl(String dbName, Path databaseRoot) { this.dbName = dbName; this.databaseRoot = databaseRoot; @@ -36,7 +36,7 @@ public static Database create(String dbName, Path databaseRoot) throws DatabaseE try { Files.createDirectory(Paths.get(databaseRoot.toString(), dbName)); } catch (IOException ex) { - throw new DatabaseException("Error while creating a DataBase(" + dbName + ") directory"); + throw new DatabaseException("Error while creating a DataBase(" + dbName + ") directory" , ex); } return new DatabaseImpl(dbName, databaseRoot); return new DatabaseImpl(dbName,databaseRoot); diff --git a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java index 7ba81e62..a5f2c367 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java @@ -6,8 +6,8 @@ * Запись в БД, означающая удаление значения по ключу */ public class RemoveDatabaseRecord implements WritableDatabaseRecord { - public byte[] key; - public byte[] value; + private byte[] key; + private byte[] value; public RemoveDatabaseRecord(byte[] key) { this.key = key; diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 9bee5aec..4c70cd7d 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -26,11 +26,11 @@ */ public class SegmentImpl implements Segment { - public Path tableRootPath; - public String segmentName; - public SegmentIndex segmentIndex; - public final long sizeMaximum = 100000; - public long segmentSize; + private Path tableRootPath; + private String segmentName; + private SegmentIndex segmentIndex; + private final long sizeMaximum = 100000; + private long segmentSize; private final DatabaseOutputStream outStream; public SegmentImpl(Path tableRootPath, String segmentName, OutputStream outStream) { @@ -41,22 +41,20 @@ public SegmentImpl(Path tableRootPath, String segmentName, OutputStream outStrea } static Segment create(String segmentName, Path tableRootPath) throws DatabaseException { - - Path segRoot = Paths.get(tableRootPath.toString(), segmentName); - boolean fileExists; + Path segmentRoot = Paths.get(tableRootPath.toString(), segmentName); + boolean isCreated; OutputStream outputStream; - try { - fileExists = segRoot.toFile().createNewFile(); - outputStream = Files.newOutputStream(segRoot); - - } catch (IOException ex) { - throw new DatabaseException("Creating Error " + segmentName + ex); + try{ + isCreated = segmentRoot.toFile().createNewFile(); + outputStream = Files.newOutputStream(segmentRoot); + }catch(IOException ex){ + throw new DatabaseException("Error while creating segment " + segmentName, ex); } - if (!fileExists) { - throw new DatabaseException("Creating Error" + segmentName + "as it already exists"); + if(!isCreated){ + throw new DatabaseException("Error while creating segment " + segmentName + "as it already exists"); } - return new SegmentImpl(segRoot, segmentName, outputStream); + return new SegmentImpl(segmentRoot, segmentName, outputStream); } static String createSegmentName(String tableName) { @@ -75,11 +73,9 @@ public boolean write(String objectKey, byte[] objectValue) throws IOException { outStream.close(); return false; } - if (objectValue == null) { return delete(objectKey); } - SetDatabaseRecord newSeg = new SetDatabaseRecord(objectKey.getBytes(StandardCharsets.UTF_8), objectValue); segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); segmentSize += outStream.write(newSeg); @@ -90,22 +86,27 @@ public boolean write(String objectKey, byte[] objectValue) throws IOException { public Optional read(String objectKey) throws IOException { Optional offsetInfo = segmentIndex.searchForKey(objectKey); - if (offsetInfo.isEmpty()) { return Optional.empty(); } + long myOf = offsetInfo.get().getOffset(); - DatabaseInputStream input = new DatabaseInputStream(Files.newInputStream(tableRootPath)); - input.skip(myOf); + try (DatabaseInputStream in = new DatabaseInputStream(Files.newInputStream(tableRootPath))) { + long skipped = in.skip(myOf); + if (skipped != myOf) { + throw new IOException("Error while skipping bytes in segment called " + segmentName); + } + Optional value = in.readDbUnit(); - Optional value = input.readDbUnit(); + if (value.isEmpty()) { + return Optional.empty(); + } - if (value.isEmpty()) { - return Optional.empty(); - } - input.close(); + return Optional.of(value.get().getValue()); - return Optional.of(value.get().getValue()); + } catch (IOException exception) { + throw new IOException("Error while creating a Segment file " + segmentName, exception); + } } @Override diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java index 0ff43c24..0d8d75b7 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java @@ -7,8 +7,8 @@ */ public class SetDatabaseRecord implements WritableDatabaseRecord { - public byte[] key; - public byte[] value; + private byte[] key; + private byte[] value; public SetDatabaseRecord(byte[] key, byte[] value) { this.key = key; diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index 419bc0d1..8488d745 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -13,10 +13,10 @@ public class TableImpl implements Table { - public String tableName; - public Path pathToDatabaseRoot; - public TableIndex tableIndex; - public Segment lastSegment; + private String tableName; + private Path pathToDatabaseRoot; + private TableIndex tableIndex; + private Segment lastSegment; private TableImpl(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { this.tableName = tableName; @@ -56,7 +56,7 @@ public void write(String objectKey, byte[] objectValue) throws DatabaseException } tableIndex.onIndexedEntityUpdated(objectKey, lastSegment); } catch (IOException ex) { - throw new DatabaseException("Writing in database error " + ex); + throw new DatabaseException("Writing in database error " , ex); } } @@ -71,7 +71,7 @@ public Optional read(String objectKey) throws DatabaseException { } else return Optional.empty(); } catch (IOException ex) { - throw new DatabaseException("Reading in database error " + ex); + throw new DatabaseException("Reading in database error " , ex); } } From 6038aaa79875161e5424f81b065832b7abfaae3b Mon Sep 17 00:00:00 2001 From: Fredi Kats Date: Thu, 1 Apr 2021 01:20:53 +0300 Subject: [PATCH 041/378] init: add base code for second lab (cherry picked from commit 048b2e9026da74ec54d8b6fa1e2d7057384d3cb2) --- .../impl/DatabaseServerInitializer.java | 2 +- .../impl/SegmentInitializationContextImpl.java | 11 ++--------- .../initialization/impl/SegmentInitializer.java | 1 + .../com/itmo/java/basics/logic/impl/DatabaseImpl.java | 5 +++++ .../com/itmo/java/basics/logic/impl/SegmentImpl.java | 8 ++++++++ .../com/itmo/java/basics/logic/impl/TableImpl.java | 7 +++++++ 6 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java index 592980e2..3d124324 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java @@ -11,7 +11,7 @@ public DatabaseServerInitializer(DatabaseInitializer databaseInitializer) { /** * Если заданная в окружении директория не существует - создает ее - * Добавляет информацию о существующих в директории базах, начинает их инициализацию + * Добавляет информацию о существующих в директории базах, нацинает их инициалиализацию * * @param context контекст, содержащий информацию об окружении * @throws DatabaseException если произошла ошибка при создании директории, ее обходе или ошибка инициализации бд diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java index 127f71ca..45ad02b5 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java @@ -6,17 +6,10 @@ import java.nio.file.Path; public class SegmentInitializationContextImpl implements SegmentInitializationContext { - public SegmentInitializationContextImpl(String segmentName, Path segmentPath, long currentSize, SegmentIndex index) { + private SegmentInitializationContextImpl(String segmentName, Path segmentPath, int currentSize, SegmentIndex index) { } - /** - * Не используйте этот конструктор. Оставлен для совместимости со старыми тестами. - */ - public SegmentInitializationContextImpl(String segmentName, Path tablePath, long currentSize) { - } - - public SegmentInitializationContextImpl(String segmentName, Path tablePath) { - this(segmentName, tablePath.resolve(segmentName), 0, new SegmentIndex()); + public SegmentInitializationContextImpl(String segmentName, Path tablePath, int currentSize) { } @Override diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java index 8174c145..de935219 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java @@ -4,6 +4,7 @@ import com.itmo.java.basics.initialization.InitializationContext; import com.itmo.java.basics.initialization.Initializer; + public class SegmentInitializer implements Initializer { /** diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index 73011f74..3a17464e 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -2,6 +2,7 @@ import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.index.impl.TableIndex; +import com.itmo.java.basics.initialization.DatabaseInitializationContext; import com.itmo.java.basics.logic.Database; import com.itmo.java.basics.logic.Table; @@ -52,6 +53,10 @@ public static Database initializeFromContext(DatabaseInitializationContext conte return null; } + public static Database initializeFromContext(DatabaseInitializationContext context) { + return null; + } + @Override public String getName() { return dbName; diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 4c70cd7d..cf4a5d9e 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -1,5 +1,7 @@ package com.itmo.java.basics.logic.impl; +import com.itmo.java.basics.initialization.SegmentInitializationContext; +import com.itmo.java.basics.logic.Segment; import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.index.SegmentOffsetInfo; import com.itmo.java.basics.index.impl.SegmentIndex; @@ -25,6 +27,12 @@ * - является неизменяемым после появления более нового сегмента */ public class SegmentImpl implements Segment { + public static Segment create(String segmentName, Path tableRootPath) throws DatabaseException { + throw new UnsupportedOperationException(); + } + + public static Segment initializeFromContext(SegmentInitializationContext context) { + return null; private Path tableRootPath; private String segmentName; diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index 8488d745..cd20c1bb 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -3,6 +3,7 @@ import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.index.impl.TableIndex; import com.itmo.java.basics.logic.Segment; +import com.itmo.java.basics.initialization.TableInitializationContext; import com.itmo.java.basics.logic.Table; import java.io.IOException; @@ -12,6 +13,12 @@ import java.util.Optional; public class TableImpl implements Table { + public static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { + return null; + } + + public static Table initializeFromContext(TableInitializationContext context) { + return null; private String tableName; private Path pathToDatabaseRoot; From de0d5be9153d488573b615b0096e86e3527e584a Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 23 Apr 2021 20:28:24 +0300 Subject: [PATCH 042/378] lab2_start_commit --- .../java/basics/logic/impl/SegmentImpl.java | 12 +++++------ .../java/basics/logic/impl/TableImpl.java | 20 +++++++++---------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index cf4a5d9e..9003b490 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -27,12 +27,8 @@ * - является неизменяемым после появления более нового сегмента */ public class SegmentImpl implements Segment { - public static Segment create(String segmentName, Path tableRootPath) throws DatabaseException { - throw new UnsupportedOperationException(); - } - public static Segment initializeFromContext(SegmentInitializationContext context) { - return null; + private Path tableRootPath; private String segmentName; @@ -48,7 +44,7 @@ public SegmentImpl(Path tableRootPath, String segmentName, OutputStream outStrea this.outStream = new DatabaseOutputStream(outStream); } - static Segment create(String segmentName, Path tableRootPath) throws DatabaseException { + public static Segment create(String segmentName, Path tableRootPath) throws DatabaseException { Path segmentRoot = Paths.get(tableRootPath.toString(), segmentName); boolean isCreated; OutputStream outputStream; @@ -65,6 +61,10 @@ static Segment create(String segmentName, Path tableRootPath) throws DatabaseExc return new SegmentImpl(segmentRoot, segmentName, outputStream); } + public static Segment initializeFromContext(SegmentInitializationContext context) { + return null; + } + static String createSegmentName(String tableName) { return tableName + "_" + System.currentTimeMillis(); } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index cd20c1bb..5e784ba3 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -2,8 +2,8 @@ import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.index.impl.TableIndex; -import com.itmo.java.basics.logic.Segment; import com.itmo.java.basics.initialization.TableInitializationContext; +import com.itmo.java.basics.logic.Segment; import com.itmo.java.basics.logic.Table; import java.io.IOException; @@ -13,12 +13,6 @@ import java.util.Optional; public class TableImpl implements Table { - public static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { - return null; - } - - public static Table initializeFromContext(TableInitializationContext context) { - return null; private String tableName; private Path pathToDatabaseRoot; @@ -48,8 +42,14 @@ static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableI return new TableImpl(tableName, pathToTableRoot, tableIndex); } + public static Table initializeFromContext(TableInitializationContext context) { + return null; + } + @Override - public String getName() { return tableName; } + public String getName() { + return tableName; + } @Override public void write(String objectKey, byte[] objectValue) throws DatabaseException { @@ -63,7 +63,7 @@ public void write(String objectKey, byte[] objectValue) throws DatabaseException } tableIndex.onIndexedEntityUpdated(objectKey, lastSegment); } catch (IOException ex) { - throw new DatabaseException("Writing in database error " , ex); + throw new DatabaseException("Writing in database error ", ex); } } @@ -78,7 +78,7 @@ public Optional read(String objectKey) throws DatabaseException { } else return Optional.empty(); } catch (IOException ex) { - throw new DatabaseException("Reading in database error " , ex); + throw new DatabaseException("Reading in database error ", ex); } } From 8f2727b8a5138955ebfea35a7c50f2b535d9f564 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 23 Apr 2021 20:31:42 +0300 Subject: [PATCH 043/378] lab2_start_comiit2 --- src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index 5e784ba3..e76ad041 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -26,7 +26,7 @@ private TableImpl(String tableName, Path pathToDatabaseRoot, TableIndex tableInd this.lastSegment = SegmentImpl.create(SegmentImpl.createSegmentName(tableName), pathToDatabaseRoot); } - static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { + public static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { if (tableName == null) { throw new DatabaseException("Why tableBase name is null?"); From e937101e16712154ae71520db73799a0be9bcf94 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 24 Apr 2021 03:00:51 +0300 Subject: [PATCH 044/378] commit1 --- .../java/basics/config/DatabaseConfig.java | 8 +++- .../impl/ExecutionEnvironmentImpl.java | 11 ++++- .../DatabaseInitializationContextImpl.java | 15 +++++-- .../impl/DatabaseInitializer.java | 22 ++++++++++ .../impl/DatabaseServerInitializer.java | 30 ++++++++++++- .../impl/InitializationContextImpl.java | 3 +- .../SegmentInitializationContextImpl.java | 23 +++++++--- .../impl/SegmentInitializer.java | 42 ++++++++++++++++++- .../impl/TableInitializationContextImpl.java | 16 +++++-- .../initialization/impl/TableInitializer.java | 28 +++++++++++++ .../java/basics/logic/impl/CachingTable.java | 25 +++-------- .../basics/logic/impl/DatabaseCacheImpl.java | 16 ++++++- .../java/basics/logic/impl/DatabaseImpl.java | 5 +++ .../java/basics/logic/impl/SegmentImpl.java | 23 ++++++++-- .../java/basics/logic/impl/TableImpl.java | 9 +++- 15 files changed, 230 insertions(+), 46 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java b/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java index 485309b0..a2abf5b7 100644 --- a/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java +++ b/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java @@ -1,9 +1,15 @@ package com.itmo.java.basics.config; +import java.util.Objects; + public class DatabaseConfig { public static final String DEFAULT_WORKING_PATH = "db_files"; + private final String workingPath; + public DatabaseConfig(String workingPath) { + this.workingPath = Objects.requireNonNullElse(workingPath, DEFAULT_WORKING_PATH); + } public String getWorkingPath() { - return null; + return workingPath; } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java index e7ea7aa2..066de0fd 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java +++ b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java @@ -5,23 +5,30 @@ import com.itmo.java.basics.logic.Database; import java.nio.file.Path; +import java.util.HashMap; +import java.util.Map; import java.util.Optional; public class ExecutionEnvironmentImpl implements ExecutionEnvironment { + + private final Map dataBase = new HashMap<>(); + private final Path workingPath; public ExecutionEnvironmentImpl(DatabaseConfig config) { + this.workingPath = Path.of("" , config.getWorkingPath()); } @Override public Optional getDatabase(String name) { - return null; + return Optional.ofNullable(dataBase.get(name)); } @Override public void addDatabase(Database db) { + dataBase.put(db.getName(), db); } @Override public Path getWorkingPath() { - return null; + return workingPath; } } diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java index d71ca20b..3cfa9dae 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java @@ -4,29 +4,38 @@ import com.itmo.java.basics.logic.Table; import java.nio.file.Path; +import java.util.HashMap; import java.util.Map; public class DatabaseInitializationContextImpl implements DatabaseInitializationContext { + private final String dbName; + private final Path dbRoot; + private final Map tablesMap; + public DatabaseInitializationContextImpl(String dbName, Path databaseRoot) { + this.dbName = dbName; + this.dbRoot = databaseRoot; + this.tablesMap = new HashMap<>(); } @Override public String getDbName() { - return null; + return dbName; } @Override public Path getDatabasePath() { - return null; + return dbRoot; } @Override public Map getTables() { - return null; + return tablesMap; } @Override public void addTable(Table table) { + tablesMap.put(table.getName(), table); } } diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java index f9c36a06..bd922675 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java @@ -1,11 +1,17 @@ package com.itmo.java.basics.initialization.impl; import com.itmo.java.basics.exceptions.DatabaseException; +import com.itmo.java.basics.index.impl.TableIndex; import com.itmo.java.basics.initialization.InitializationContext; import com.itmo.java.basics.initialization.Initializer; +import com.itmo.java.basics.logic.impl.DatabaseImpl; + +import java.io.File; public class DatabaseInitializer implements Initializer { + private final Initializer tableInitializer; public DatabaseInitializer(TableInitializer tableInitializer) { + this.tableInitializer = tableInitializer; } /** @@ -18,5 +24,21 @@ public DatabaseInitializer(TableInitializer tableInitializer) { */ @Override public void perform(InitializationContext initialContext) throws DatabaseException { + if (initialContext.currentDbContext() == null) { + throw new DatabaseException("Error with ContextTable"+ initialContext.currentTableContext()); + } + File directory = initialContext.currentDbContext().getDatabasePath().toFile(); + if (directory.listFiles() == null) { + return; + } + File[] tables = directory.listFiles(); + for (File table : tables) { + InitializationContext init = new InitializationContextImpl(initialContext.executionEnvironment(), + initialContext.currentDbContext(), + new TableInitializationContextImpl(table.getName(), table.toPath(), new TableIndex()), + initialContext.currentSegmentContext()); + tableInitializer.perform(init); + } + initialContext.executionEnvironment().addDatabase(DatabaseImpl.initializeFromContext(initialContext.currentDbContext())); } } diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java index 3d124324..c709829e 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java @@ -1,12 +1,19 @@ package com.itmo.java.basics.initialization.impl; import com.itmo.java.basics.exceptions.DatabaseException; +import com.itmo.java.basics.index.impl.TableIndex; import com.itmo.java.basics.initialization.InitializationContext; import com.itmo.java.basics.initialization.Initializer; +import com.itmo.java.basics.logic.impl.DatabaseImpl; + +import java.io.File; +import java.io.IOException; public class DatabaseServerInitializer implements Initializer { + private final Initializer databaseInitializer; public DatabaseServerInitializer(DatabaseInitializer databaseInitializer) { + this.databaseInitializer = databaseInitializer; } /** @@ -18,5 +25,24 @@ public DatabaseServerInitializer(DatabaseInitializer databaseInitializer) { */ @Override public void perform(InitializationContext context) throws DatabaseException { - } -} + + if (context.currentDbContext() == null) { + throw new DatabaseException("Context Db is null"); + } + File dir = context.currentDbContext().getDatabasePath().toFile(); + if (dir.listFiles() == null) { + return; + } + File[] tablesDataBase = dir.listFiles(); + for (File table : tablesDataBase) { + InitializationContext init = new InitializationContextImpl(context.executionEnvironment(), + context.currentDbContext(), + new TableInitializationContextImpl(table.getName(), table.toPath(), new TableIndex()), + context.currentSegmentContext()); + databaseInitializer.perform(init); + } + context.executionEnvironment().addDatabase(DatabaseImpl.initializeFromContext(context.currentDbContext())); + } + } + + diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/InitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/InitializationContextImpl.java index 552ede30..c0a7c856 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/InitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/InitializationContextImpl.java @@ -5,7 +5,8 @@ import com.itmo.java.basics.initialization.InitializationContext; import com.itmo.java.basics.initialization.SegmentInitializationContext; import com.itmo.java.basics.initialization.TableInitializationContext; - +import lombok.Builder; +@Builder public class InitializationContextImpl implements InitializationContext { private final ExecutionEnvironment executionEnvironment; diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java index 45ad02b5..e413188d 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java @@ -4,31 +4,44 @@ import com.itmo.java.basics.initialization.SegmentInitializationContext; import java.nio.file.Path; +import java.nio.file.Paths; public class SegmentInitializationContextImpl implements SegmentInitializationContext { - private SegmentInitializationContextImpl(String segmentName, Path segmentPath, int currentSize, SegmentIndex index) { + private final String segmentName; + private final Path segmentPath; + private final int currentSize; + private final SegmentIndex segmentIndex; + public SegmentInitializationContextImpl(String segmentName, Path segmentPath, int currentSize, SegmentIndex index) { + this.segmentName = segmentName; + this.segmentPath = segmentPath; + this.currentSize = currentSize; + this.segmentIndex = index; } public SegmentInitializationContextImpl(String segmentName, Path tablePath, int currentSize) { + this.segmentName = segmentName; + this.segmentPath = Paths.get(tablePath + segmentName); + this.currentSize = currentSize; + this.segmentIndex = new SegmentIndex(); } @Override public String getSegmentName() { - return null; + return segmentName; } @Override public Path getSegmentPath() { - return null; + return segmentPath; } @Override public SegmentIndex getIndex() { - return null; + return segmentIndex; } @Override public long getCurrentSize() { - return 0; + return currentSize; } } diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java index de935219..b86e908d 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java @@ -1,12 +1,27 @@ package com.itmo.java.basics.initialization.impl; import com.itmo.java.basics.exceptions.DatabaseException; +import com.itmo.java.basics.index.impl.SegmentIndex; +import com.itmo.java.basics.index.impl.SegmentOffsetInfoImpl; import com.itmo.java.basics.initialization.InitializationContext; import com.itmo.java.basics.initialization.Initializer; +import com.itmo.java.basics.initialization.SegmentInitializationContext; +import com.itmo.java.basics.logic.DatabaseRecord; +import com.itmo.java.basics.logic.Segment; +import com.itmo.java.basics.logic.impl.SegmentImpl; +import com.itmo.java.basics.logic.io.DatabaseInputStream; +import com.itmo.java.basics.logic.io.DatabaseOutputStream; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.nio.file.Path; +import java.util.Optional; public class SegmentInitializer implements Initializer { + private DatabaseOutputStream outStream; /** * Добавляет в контекст информацию об инициализируемом сегменте. * Составляет индекс сегмента @@ -17,5 +32,30 @@ public class SegmentInitializer implements Initializer { */ @Override public void perform(InitializationContext context) throws DatabaseException { - } + SegmentInitializationContext segmentInContext = context.currentSegmentContext(); + Path segmentPath = segmentInContext.getSegmentPath(); + Segment segmentIn = SegmentImpl.initializeFromContext(segmentInContext); + SegmentIndex segmentIndex = segmentInContext.getIndex(); + int offSet = 0; + try (DatabaseInputStream inputStream = new DatabaseInputStream( new FileInputStream(segmentPath.toString()))) { + Optional dbUn = inputStream.readDbUnit(); + while(dbUn.isPresent()){ + DatabaseRecord databaseUnit = dbUn.get(); + if ( databaseUnit.isValuePresented()) { + segmentIndex.onIndexedEntityUpdated(new String(databaseUnit.getKey()), new SegmentOffsetInfoImpl(offSet)); + } + else { + segmentIndex.onIndexedEntityUpdated(new String(databaseUnit.getKey()) , null); + } + context.currentTableContext().getTableIndex().onIndexedEntityUpdated(new String(databaseUnit.getKey()) , segmentIn); + offSet += databaseUnit.size(); + dbUn = inputStream.readDbUnit(); + } + } + catch (IOException ex) { + throw new DatabaseException("Error while InitializationContext " , ex); + } + + } } + diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java index 9d52528e..177065f0 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java @@ -7,30 +7,38 @@ import java.nio.file.Path; public class TableInitializationContextImpl implements TableInitializationContext { + private final String tableName; + private final Path databasePath; + private final TableIndex tableIndex; + private Segment lastSegment; public TableInitializationContextImpl(String tableName, Path databasePath, TableIndex tableIndex) { + this.tableName = tableName; + this.databasePath = databasePath; + this.tableIndex = tableIndex; } @Override public String getTableName() { - return null; + return tableName; } @Override public Path getTablePath() { - return null; + return databasePath; } @Override public TableIndex getTableIndex() { - return null; + return tableIndex; } @Override public Segment getCurrentSegment() { - return null; + return lastSegment; } @Override public void updateCurrentSegment(Segment segment) { + this.lastSegment = segment; } } diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java index c6c7c620..19b0e514 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java @@ -1,12 +1,19 @@ package com.itmo.java.basics.initialization.impl; import com.itmo.java.basics.exceptions.DatabaseException; +import com.itmo.java.basics.index.impl.SegmentIndex; import com.itmo.java.basics.initialization.InitializationContext; import com.itmo.java.basics.initialization.Initializer; +import com.itmo.java.basics.logic.impl.TableImpl; + +import java.io.File; public class TableInitializer implements Initializer { + private final Initializer segmentInitializer; + public TableInitializer(SegmentInitializer segmentInitializer) { + this.segmentInitializer = segmentInitializer; } /** @@ -18,6 +25,27 @@ public TableInitializer(SegmentInitializer segmentInitializer) { * или если возникла ошибка ошибка дочерних инициализаторов */ @Override + public void perform(InitializationContext context) throws DatabaseException { + if (context.currentTableContext() == null) { + throw new DatabaseException("Error with ContextTable"+ context.currentTableContext()); + } + File directory = context.currentTableContext().getTablePath().toFile(); + if (directory.listFiles() == null) { + return; + } + File[] segments = directory.listFiles(); + for (File seg : segments) { + InitializationContext init = InitializationContextImpl.builder() + .executionEnvironment(context.executionEnvironment()) + .currentDatabaseContext(context.currentDbContext()) + .currentTableContext(context.currentTableContext()) + .currentSegmentContext(new SegmentInitializationContextImpl( + seg.getName(), seg.toPath(), (int)seg.length(), + new SegmentIndex())) + .build(); + segmentInitializer.perform(init); + } + context.currentDbContext().addTable(TableImpl.initializeFromContext(context.currentTableContext())); } } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java index 5907df77..eab5b26e 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java @@ -11,38 +11,23 @@ */ public class CachingTable implements Table { - private final Table cacheTable; - private final DatabaseCache dbCache; - - public CachingTable(Table myTable) { - this.cacheTable = myTable; - this.dbCache = new DatabaseCacheImpl(); - } - @Override public String getName() { - return cacheTable.getName(); + return null; } @Override public void write(String objectKey, byte[] objectValue) throws DatabaseException { - cacheTable.write(objectKey, objectValue); - dbCache.set(objectKey, objectValue); + } @Override public Optional read(String objectKey) throws DatabaseException { - byte[] reading = dbCache.get(objectKey); - if (reading != null) { - return Optional.of(reading); - } else { - return cacheTable.read(objectKey); - } + return Optional.empty(); } @Override public void delete(String objectKey) throws DatabaseException { - cacheTable.delete(objectKey); - dbCache.delete(objectKey); + } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java index 8ec5e331..6adf4e30 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java @@ -1,9 +1,21 @@ package com.itmo.java.basics.logic.impl; - +import java.util.LinkedHashMap; +import java.util.Map; import com.itmo.java.basics.logic.DatabaseCache; public class DatabaseCacheImpl implements DatabaseCache { - private static final int CAPACITY = 5_000; + + private static final int defineSize = 100_000; + private final LinkedHashMap cache; + + public DatabaseCacheImpl() { + cache = new LinkedHashMap<>(defineSize, 1f, true) { + @Override + protected boolean removeEldestEntry(Map.Entry eldest) { + return size() > defineSize; + } + }; + } @Override public byte[] get(String key) { diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index 3a17464e..47f13d3d 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -24,6 +24,11 @@ private DatabaseImpl(String dbName, Path databaseRoot) { this.databaseRoot = databaseRoot; } + private DatabaseImpl(DatabaseInitializationContext context){ + this.dbName = context.getDbName(); + this.databaseRoot = context.getDatabasePath(); + } + public static Database create(String dbName, Path databaseRoot) throws DatabaseException { diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 9003b490..39794326 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -1,6 +1,7 @@ package com.itmo.java.basics.logic.impl; import com.itmo.java.basics.initialization.SegmentInitializationContext; +import com.itmo.java.basics.initialization.TableInitializationContext; import com.itmo.java.basics.logic.Segment; import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.index.SegmentOffsetInfo; @@ -28,13 +29,12 @@ */ public class SegmentImpl implements Segment { - - private Path tableRootPath; private String segmentName; private SegmentIndex segmentIndex; private final long sizeMaximum = 100000; private long segmentSize; + private boolean ReadOnly; private final DatabaseOutputStream outStream; public SegmentImpl(Path tableRootPath, String segmentName, OutputStream outStream) { @@ -44,6 +44,13 @@ public SegmentImpl(Path tableRootPath, String segmentName, OutputStream outStrea this.outStream = new DatabaseOutputStream(outStream); } + private SegmentImpl(SegmentInitializationContext context , OutputStream outStream) { + this.tableRootPath = context.getSegmentPath(); + this.segmentName = context.getSegmentName(); + this.segmentIndex = context.getIndex(); + this.outStream = new DatabaseOutputStream(outStream); + } + public static Segment create(String segmentName, Path tableRootPath) throws DatabaseException { Path segmentRoot = Paths.get(tableRootPath.toString(), segmentName); boolean isCreated; @@ -61,8 +68,16 @@ public static Segment create(String segmentName, Path tableRootPath) throws Data return new SegmentImpl(segmentRoot, segmentName, outputStream); } - public static Segment initializeFromContext(SegmentInitializationContext context) { - return null; + public static Segment initializeFromContext(SegmentInitializationContext context) throws DatabaseException { + OutputStream outputStream; + try{ + outputStream = Files.newOutputStream(context.getSegmentPath()); + }catch(IOException ex){ + throw new DatabaseException("Error while creating segment " + context.getSegmentPath(), ex); + } + SegmentImpl newSegment = new SegmentImpl(context , outputStream); + newSegment.segmentSize = context.getCurrentSize(); + return newSegment; } static String createSegmentName(String tableName) { diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index e76ad041..1b176c5e 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -26,6 +26,13 @@ private TableImpl(String tableName, Path pathToDatabaseRoot, TableIndex tableInd this.lastSegment = SegmentImpl.create(SegmentImpl.createSegmentName(tableName), pathToDatabaseRoot); } + private TableImpl(TableInitializationContext context) { + this.tableName = context.getTableName(); + this.lastSegment = context.getCurrentSegment(); + this.pathToDatabaseRoot = context.getTablePath().getParent(); + this.tableIndex = context.getTableIndex(); + } + public static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { if (tableName == null) { @@ -43,7 +50,7 @@ public static Table create(String tableName, Path pathToDatabaseRoot, TableIndex } public static Table initializeFromContext(TableInitializationContext context) { - return null; + return new TableImpl(context); } @Override From 2b73b4368c89fc6d3dc1328c707b6f072665ad1f Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 24 Apr 2021 03:02:19 +0300 Subject: [PATCH 045/378] commit1 --- .../itmo/java/basics/initialization/impl/TableInitializer.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java index 19b0e514..b48f2ad5 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java @@ -7,7 +7,8 @@ import com.itmo.java.basics.logic.impl.TableImpl; import java.io.File; - +import lombok.Builder; +@Builder public class TableInitializer implements Initializer { private final Initializer segmentInitializer; From 54c8d0b431700214f034b195538db8d8fab27b3c Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 24 Apr 2021 03:07:39 +0300 Subject: [PATCH 046/378] commit2 --- .../impl/DatabaseServerInitializer.java | 37 ++++++++++--------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java index c709829e..e640e00d 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java @@ -8,7 +8,8 @@ import java.io.File; import java.io.IOException; - +import lombok.Builder; +@Builder public class DatabaseServerInitializer implements Initializer { private final Initializer databaseInitializer; @@ -25,24 +26,24 @@ public DatabaseServerInitializer(DatabaseInitializer databaseInitializer) { */ @Override public void perform(InitializationContext context) throws DatabaseException { - - if (context.currentDbContext() == null) { - throw new DatabaseException("Context Db is null"); - } - File dir = context.currentDbContext().getDatabasePath().toFile(); - if (dir.listFiles() == null) { - return; - } - File[] tablesDataBase = dir.listFiles(); - for (File table : tablesDataBase) { - InitializationContext init = new InitializationContextImpl(context.executionEnvironment(), - context.currentDbContext(), - new TableInitializationContextImpl(table.getName(), table.toPath(), new TableIndex()), - context.currentSegmentContext()); - databaseInitializer.perform(init); - } - context.executionEnvironment().addDatabase(DatabaseImpl.initializeFromContext(context.currentDbContext())); + if (context.executionEnvironment() == null) { + throw new DatabaseException("Context Env is null"); + } + File directory = context.executionEnvironment().getWorkingPath().toFile(); + if (directory.listFiles() == null) { + return; + } + File[] files = directory.listFiles(); + for (File file : files) { + if (file.isDirectory()) { + InitializationContext init = InitializationContextImpl.builder() + .executionEnvironment(context.executionEnvironment()) + .currentDatabaseContext(new DatabaseInitializationContextImpl(file.getName(), file.toPath())).build(); + databaseInitializer.perform(init); } } + } +} + From b7a512949f3c1a25203674d0851863b9a354767f Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 24 Apr 2021 03:17:25 +0300 Subject: [PATCH 047/378] commit 3 --- .../java/com/itmo/java/basics/MainTest.java | 64 +++++++++++++++++++ .../impl/DatabaseServerInitializer.java | 3 +- .../initialization/impl/TableInitializer.java | 2 - 3 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/itmo/java/basics/MainTest.java diff --git a/src/main/java/com/itmo/java/basics/MainTest.java b/src/main/java/com/itmo/java/basics/MainTest.java new file mode 100644 index 00000000..1e60e4a0 --- /dev/null +++ b/src/main/java/com/itmo/java/basics/MainTest.java @@ -0,0 +1,64 @@ +package com.itmo.java.basics; + +import com.itmo.java.basics.config.DatabaseConfig; +import com.itmo.java.basics.console.impl.ExecutionEnvironmentImpl; +import com.itmo.java.basics.exceptions.DatabaseException; +import com.itmo.java.basics.initialization.*; +import com.itmo.java.basics.initialization.impl.*; +import com.itmo.java.basics.logic.*; +import com.itmo.java.basics.logic.impl.*; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.*; +import java.nio.file.Path; +import java.util.Comparator; +import java.util.Optional; + +public class MainTest { + public static void main(String[] args) throws DatabaseException, IOException { + Files.walk(Path.of("db", "anime")) + .sorted(Comparator.reverseOrder()) + .map(Path::toFile) + .forEach(File::delete); + Database db = DatabaseImpl.create("anime", Path.of("db")); + db.createTableIfNotExists("naruto"); + db.write("naruto", "key", "value".getBytes(StandardCharsets.UTF_8)); + db.write("naruto", "key", "value2".getBytes(StandardCharsets.UTF_8)); + db.write("naruto", "key", null); + db.write("naruto", "key1", "value1".getBytes(StandardCharsets.UTF_8)); + db.write("naruto", "key2", "".getBytes(StandardCharsets.UTF_8)); +// System.out.printf( +// "get = %s expected = %s\n", +// new String(db.read("naruto", "saske").get()), +// "ora" +// ); +// db.write("naruto", "saske", null); +// db.delete("naruto", "saske"); +// System.out.printf( +// "get = %s expected = %s\n", +// db.read("naruto", "saske").toString(), +// Optional.empty().toString() +// ); +// db.write("naruto", "saske", "ora".getBytes(StandardCharsets.UTF_8)); +// System.out.printf( +// "get = %s expected = %s\n", +// new String(db.read("naruto", "saske").get()), +// "ora" +// ); + + Initializer initializer = + new DatabaseServerInitializer( + new DatabaseInitializer( + new TableInitializer( + new SegmentInitializer()))); + var execEnv = new ExecutionEnvironmentImpl( + new DatabaseConfig("db") + ); + var context = new InitializationContextImpl( + execEnv, null, null, null + ); + initializer.perform(context); + } +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java index e640e00d..9478cebb 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java @@ -8,8 +8,7 @@ import java.io.File; import java.io.IOException; -import lombok.Builder; -@Builder + public class DatabaseServerInitializer implements Initializer { private final Initializer databaseInitializer; diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java index b48f2ad5..a9b576b1 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java @@ -7,8 +7,6 @@ import com.itmo.java.basics.logic.impl.TableImpl; import java.io.File; -import lombok.Builder; -@Builder public class TableInitializer implements Initializer { private final Initializer segmentInitializer; From 0ee009f22576a96fdd9aea96027c6104a80c3f9e Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 24 Apr 2021 03:32:30 +0300 Subject: [PATCH 048/378] commit3 --- .../java/basics/logic/impl/CachingTable.java | 16 +++++++++++++++- .../basics/logic/impl/DatabaseCacheImpl.java | 7 ++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java index eab5b26e..aa5f8f59 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java @@ -11,13 +11,27 @@ */ public class CachingTable implements Table { + private final Table table; + private final DatabaseCache cache; + + public CachingTable(Table table) { + this.table = table; + this.cache = new DatabaseCacheImpl(); + } + + public CachingTable(Table table, DatabaseCache cache) { + this.table = table; + this.cache = cache; + } @Override public String getName() { - return null; + return table.getName(); } @Override public void write(String objectKey, byte[] objectValue) throws DatabaseException { + cache.set(objectKey ,objectValue); + table.write(objectKey ,objectValue); } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java index 6adf4e30..d85a0519 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java @@ -19,16 +19,17 @@ protected boolean removeEldestEntry(Map.Entry eldest) { @Override public byte[] get(String key) { - return new byte[0]; + return cache.get(key).getBytes(); } @Override public void set(String key, byte[] value) { - + cache.put(key, value.toString()); } @Override public void delete(String key) { - + cache.remove(key); + cache.put(key,null); } } From f991f84d96f3b1c59dc1ec13a078196cc5fc6837 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 24 Apr 2021 03:44:40 +0300 Subject: [PATCH 049/378] commit4 --- .../java/basics/initialization/impl/SegmentInitializer.java | 5 ++--- .../java/com/itmo/java/basics/logic/impl/SegmentImpl.java | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java index b86e908d..5302b9d2 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java @@ -21,7 +21,7 @@ public class SegmentInitializer implements Initializer { - private DatabaseOutputStream outStream; + /** * Добавляет в контекст информацию об инициализируемом сегменте. * Составляет индекс сегмента @@ -55,7 +55,6 @@ public void perform(InitializationContext context) throws DatabaseException { catch (IOException ex) { throw new DatabaseException("Error while InitializationContext " , ex); } - - } + } } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 39794326..931f74ed 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -68,12 +68,12 @@ public static Segment create(String segmentName, Path tableRootPath) throws Data return new SegmentImpl(segmentRoot, segmentName, outputStream); } - public static Segment initializeFromContext(SegmentInitializationContext context) throws DatabaseException { + public static Segment initializeFromContext(SegmentInitializationContext context) { OutputStream outputStream; try{ outputStream = Files.newOutputStream(context.getSegmentPath()); }catch(IOException ex){ - throw new DatabaseException("Error while creating segment " + context.getSegmentPath(), ex); + outputStream = null; } SegmentImpl newSegment = new SegmentImpl(context , outputStream); newSegment.segmentSize = context.getCurrentSize(); From 832c39a955f98d14fa35a3ecbbbd76c929ccdba5 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 24 Apr 2021 03:59:38 +0300 Subject: [PATCH 050/378] com --- .../java/basics/logic/impl/CachingTable.java | 17 ++--------------- .../basics/logic/impl/DatabaseCacheImpl.java | 18 ++++++------------ 2 files changed, 8 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java index aa5f8f59..dbcd206f 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java @@ -11,27 +11,14 @@ */ public class CachingTable implements Table { - private final Table table; - private final DatabaseCache cache; - - public CachingTable(Table table) { - this.table = table; - this.cache = new DatabaseCacheImpl(); - } - - public CachingTable(Table table, DatabaseCache cache) { - this.table = table; - this.cache = cache; - } @Override public String getName() { - return table.getName(); + return null; } @Override public void write(String objectKey, byte[] objectValue) throws DatabaseException { - cache.set(objectKey ,objectValue); - table.write(objectKey ,objectValue); + } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java index d85a0519..7a4f689c 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java @@ -5,31 +5,25 @@ public class DatabaseCacheImpl implements DatabaseCache { - private static final int defineSize = 100_000; - private final LinkedHashMap cache; + public DatabaseCacheImpl() { - cache = new LinkedHashMap<>(defineSize, 1f, true) { - @Override - protected boolean removeEldestEntry(Map.Entry eldest) { - return size() > defineSize; - } + }; - } + @Override public byte[] get(String key) { - return cache.get(key).getBytes(); + return null; } @Override public void set(String key, byte[] value) { - cache.put(key, value.toString()); + } @Override public void delete(String key) { - cache.remove(key); - cache.put(key,null); + } } From 18212deb196dfb9af43bfe13237405c42257ca16 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 24 Apr 2021 04:14:01 +0300 Subject: [PATCH 051/378] com --- .../impl/DatabaseServerInitializer.java | 2 ++ .../java/basics/logic/impl/CachingTable.java | 28 +++++++++++++++---- .../basics/logic/impl/DatabaseCacheImpl.java | 26 +++++++++++------ .../java/basics/logic/impl/TableImpl.java | 3 +- 4 files changed, 43 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java index 9478cebb..fe825c47 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java @@ -28,6 +28,7 @@ public void perform(InitializationContext context) throws DatabaseException { if (context.executionEnvironment() == null) { throw new DatabaseException("Context Env is null"); } + File directory = context.executionEnvironment().getWorkingPath().toFile(); if (directory.listFiles() == null) { return; @@ -41,6 +42,7 @@ public void perform(InitializationContext context) throws DatabaseException { databaseInitializer.perform(init); } } + } } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java index dbcd206f..2fe1a079 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java @@ -11,24 +11,40 @@ */ public class CachingTable implements Table { + private Table myTable; + private DatabaseCache myDataBaseCache; + + static final int MAX_CACHE_CAPACITY = 10000; + + public CachingTable(Table myTable) { + this.myTable = myTable; + this.myDataBaseCache = new DatabaseCacheImpl(MAX_CACHE_CAPACITY); + } + @Override public String getName() { - return null; + return myTable.getName(); } @Override public void write(String objectKey, byte[] objectValue) throws DatabaseException { - - + myTable.write(objectKey, objectValue); + myDataBaseCache.set(objectKey, objectValue); } @Override public Optional read(String objectKey) throws DatabaseException { - return Optional.empty(); + byte[] tryReadValueFromCache = myDataBaseCache.get(objectKey); + if (tryReadValueFromCache != null) { + return Optional.of(tryReadValueFromCache); + } else { + return myTable.read(objectKey); + } } @Override public void delete(String objectKey) throws DatabaseException { - + myTable.delete(objectKey); + myDataBaseCache.delete(objectKey); } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java index 7a4f689c..8095a1d2 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java @@ -1,29 +1,37 @@ package com.itmo.java.basics.logic.impl; + +import com.itmo.java.basics.logic.DatabaseCache; + import java.util.LinkedHashMap; import java.util.Map; -import com.itmo.java.basics.logic.DatabaseCache; public class DatabaseCacheImpl implements DatabaseCache { + private final int capacity; + private final Map myCache; - - public DatabaseCacheImpl() { - + public DatabaseCacheImpl(int maxCapacity) { + this.capacity = maxCapacity; + this.myCache = new LinkedHashMap(capacity, 1f, true) { + @Override + protected boolean removeEldestEntry(Map.Entry eldest) { + return size() > capacity; + } }; - + } @Override public byte[] get(String key) { - return null; + return myCache.get(key); } @Override public void set(String key, byte[] value) { - + myCache.put(key, value); } @Override public void delete(String key) { - + myCache.remove(key); } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index 1b176c5e..a993970f 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -46,7 +46,8 @@ public static Table create(String tableName, Path pathToDatabaseRoot, TableIndex } catch (IOException ex) { throw new DatabaseException("Error while creating a Table(" + tableName + ") directory"); } - return new TableImpl(tableName, pathToTableRoot, tableIndex); + TableImpl newTb = new TableImpl(tableName , pathToTableRoot , tableIndex); + return new CachingTable(newTb); } public static Table initializeFromContext(TableInitializationContext context) { From 8ba6269a7298a33b9ed70218def20292f3a6489c Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 30 Apr 2021 19:55:39 +0300 Subject: [PATCH 052/378] 30/04 --- .../basics/initialization/impl/SegmentInitializer.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java index 5302b9d2..85257c4a 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java @@ -32,6 +32,14 @@ public class SegmentInitializer implements Initializer { */ @Override public void perform(InitializationContext context) throws DatabaseException { + + if (context.currentSegmentContext() == null) { + throw new DatabaseException(""); + } + + if (context.currentDbContext() == null) { + throw new DatabaseException("Error with ContextTable"+ context.currentTableContext()); + } SegmentInitializationContext segmentInContext = context.currentSegmentContext(); Path segmentPath = segmentInContext.getSegmentPath(); Segment segmentIn = SegmentImpl.initializeFromContext(segmentInContext); From 5064d539b721ea01302c935ccbbce23b11f1d74c Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 30 Apr 2021 19:59:20 +0300 Subject: [PATCH 053/378] 30/04 --- .../java/basics/initialization/impl/SegmentInitializer.java | 3 --- .../itmo/java/basics/initialization/impl/TableInitializer.java | 3 +++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java index 85257c4a..1b27975c 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java @@ -37,9 +37,6 @@ public void perform(InitializationContext context) throws DatabaseException { throw new DatabaseException(""); } - if (context.currentDbContext() == null) { - throw new DatabaseException("Error with ContextTable"+ context.currentTableContext()); - } SegmentInitializationContext segmentInContext = context.currentSegmentContext(); Path segmentPath = segmentInContext.getSegmentPath(); Segment segmentIn = SegmentImpl.initializeFromContext(segmentInContext); diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java index a9b576b1..9e85137d 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java @@ -29,6 +29,9 @@ public void perform(InitializationContext context) throws DatabaseException { if (context.currentTableContext() == null) { throw new DatabaseException("Error with ContextTable"+ context.currentTableContext()); } + if (context.currentDbContext() == null) { + throw new DatabaseException("Error with ContextTable"+context.currentTableContext()); + } File directory = context.currentTableContext().getTablePath().toFile(); if (directory.listFiles() == null) { return; From 1da77adf71c8974139e4d9f514b6b145df73502c Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 30 Apr 2021 20:17:33 +0300 Subject: [PATCH 054/378] 30/04 --- .../impl/ExecutionEnvironmentImpl.java | 8 +++--- .../java/basics/logic/impl/CachingTable.java | 27 ++++++++++--------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java index 066de0fd..7d90b756 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java +++ b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java @@ -11,10 +11,10 @@ public class ExecutionEnvironmentImpl implements ExecutionEnvironment { - private final Map dataBase = new HashMap<>(); - private final Path workingPath; + private DatabaseConfig dbConfig; + private HashMap dataBase = new HashMap(); public ExecutionEnvironmentImpl(DatabaseConfig config) { - this.workingPath = Path.of("" , config.getWorkingPath()); + this.dbConfig = config; } @Override @@ -29,6 +29,6 @@ public void addDatabase(Database db) { @Override public Path getWorkingPath() { - return workingPath; + return Path.of(dbConfig.getWorkingPath()); } } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java index 2fe1a079..976a603d 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java @@ -11,40 +11,41 @@ */ public class CachingTable implements Table { - private Table myTable; - private DatabaseCache myDataBaseCache; + private final Table cacheTable; + private final DatabaseCache dbCache; - static final int MAX_CACHE_CAPACITY = 10000; + static final int maxCache = 100_000; public CachingTable(Table myTable) { - this.myTable = myTable; - this.myDataBaseCache = new DatabaseCacheImpl(MAX_CACHE_CAPACITY); + this.cacheTable = myTable; + this.dbCache = new DatabaseCacheImpl(maxCache); } @Override public String getName() { - return myTable.getName(); + return cacheTable.getName(); } @Override public void write(String objectKey, byte[] objectValue) throws DatabaseException { - myTable.write(objectKey, objectValue); - myDataBaseCache.set(objectKey, objectValue); + cacheTable.write(objectKey, objectValue); + dbCache.set(objectKey, objectValue); } @Override public Optional read(String objectKey) throws DatabaseException { - byte[] tryReadValueFromCache = myDataBaseCache.get(objectKey); + byte[] tryReadValueFromCache = dbCache.get(objectKey); if (tryReadValueFromCache != null) { return Optional.of(tryReadValueFromCache); - } else { - return myTable.read(objectKey); + } + else { + return cacheTable.read(objectKey); } } @Override public void delete(String objectKey) throws DatabaseException { - myTable.delete(objectKey); - myDataBaseCache.delete(objectKey); + cacheTable.delete(objectKey); + dbCache.delete(objectKey); } } \ No newline at end of file From 016c6ae4c10b66e538c39bd21ecaeab62e72253f Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 30 Apr 2021 20:29:11 +0300 Subject: [PATCH 055/378] 30/04 --- .../java/basics/logic/impl/CachingTable.java | 4 +--- .../basics/logic/impl/DatabaseCacheImpl.java | 17 ++++++++--------- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java index 976a603d..a56009e5 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java @@ -14,11 +14,9 @@ public class CachingTable implements Table { private final Table cacheTable; private final DatabaseCache dbCache; - static final int maxCache = 100_000; - public CachingTable(Table myTable) { this.cacheTable = myTable; - this.dbCache = new DatabaseCacheImpl(maxCache); + this.dbCache = new DatabaseCacheImpl(); } @Override diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java index 8095a1d2..6f860468 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java @@ -7,31 +7,30 @@ public class DatabaseCacheImpl implements DatabaseCache { - private final int capacity; - private final Map myCache; + private static final int dbCapacity = 5_000; + private final Map dbCache; - public DatabaseCacheImpl(int maxCapacity) { - this.capacity = maxCapacity; - this.myCache = new LinkedHashMap(capacity, 1f, true) { + public DatabaseCacheImpl() { + this.dbCache = new LinkedHashMap(dbCapacity, 1f, true) { @Override protected boolean removeEldestEntry(Map.Entry eldest) { - return size() > capacity; + return size() > dbCapacity; } }; } @Override public byte[] get(String key) { - return myCache.get(key); + return dbCache.get(key); } @Override public void set(String key, byte[] value) { - myCache.put(key, value); + dbCache.put(key, value); } @Override public void delete(String key) { - myCache.remove(key); + dbCache.remove(key); } } \ No newline at end of file From dd83036b5f208bd21456ace74bd3cf0ac1782a6e Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 30 Apr 2021 20:41:06 +0300 Subject: [PATCH 056/378] 30/04 --- .../com/itmo/java/basics/logic/impl/DatabaseImpl.java | 8 +++++--- .../java/com/itmo/java/basics/logic/impl/SegmentImpl.java | 3 +-- .../java/com/itmo/java/basics/logic/impl/TableImpl.java | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index 47f13d3d..94c9ee1d 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -27,6 +27,7 @@ private DatabaseImpl(String dbName, Path databaseRoot) { private DatabaseImpl(DatabaseInitializationContext context){ this.dbName = context.getDbName(); this.databaseRoot = context.getDatabasePath(); + this.tableDictionary = context.getTables(); } @@ -59,7 +60,7 @@ public static Database initializeFromContext(DatabaseInitializationContext conte } public static Database initializeFromContext(DatabaseInitializationContext context) { - return null; + return new DatabaseImpl(context); } @Override @@ -85,6 +86,7 @@ public void createTableIfNotExists(String tableName) throws DatabaseException { @Override public void write(String tableName, String objectKey, byte[] objectValue) throws DatabaseException { + if (!tableDictionary.containsKey(tableName)) { throw new DatabaseException("Table " + tableName + " doesn't exist in database" + dbName); } @@ -115,7 +117,7 @@ public void delete(String tableName, String objectKey) throws DatabaseException if (tableName == null) { throw new DatabaseException("Writing in database error"); } - Table tableImpl = tableDictionary.get(tableName); - tableImpl.delete(objectKey); + Table table = tableDictionary.get(tableName); + table.delete(objectKey); } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 931f74ed..42d1fd70 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -33,8 +33,7 @@ public class SegmentImpl implements Segment { private String segmentName; private SegmentIndex segmentIndex; private final long sizeMaximum = 100000; - private long segmentSize; - private boolean ReadOnly; + private long segmentSize = 0; private final DatabaseOutputStream outStream; public SegmentImpl(Path tableRootPath, String segmentName, OutputStream outStream) { diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index a993970f..18e5cdc5 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -51,7 +51,7 @@ public static Table create(String tableName, Path pathToDatabaseRoot, TableIndex } public static Table initializeFromContext(TableInitializationContext context) { - return new TableImpl(context); + return new CachingTable(new TableImpl(context)); } @Override From de94f7b80f1c3ccc9215ad43a16a678e365f0a78 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 30 Apr 2021 20:48:34 +0300 Subject: [PATCH 057/378] 30/04 --- .../java/basics/config/DatabaseConfig.java | 2 +- .../basics/logic/io/DatabaseInputStream.java | 47 ++++++++++--------- 2 files changed, 27 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java b/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java index a2abf5b7..3abab965 100644 --- a/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java +++ b/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java @@ -6,7 +6,7 @@ public class DatabaseConfig { public static final String DEFAULT_WORKING_PATH = "db_files"; private final String workingPath; public DatabaseConfig(String workingPath) { - this.workingPath = Objects.requireNonNullElse(workingPath, DEFAULT_WORKING_PATH); + this.workingPath = workingPath; } public String getWorkingPath() { diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java index cdd01dc8..89942c99 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java @@ -5,6 +5,7 @@ import com.itmo.java.basics.logic.impl.SetDatabaseRecord; import java.io.DataInputStream; +import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.util.Optional; @@ -26,27 +27,31 @@ public DatabaseInputStream(InputStream inputStream) { */ public Optional readDbUnit() throws IOException { - if (available() <= 4) { - return Optional.empty(); + try { + if (available() <= 4) { + return Optional.empty(); + } + int keySize = readInt(); + + if (available() <= 0) { + return Optional.empty(); + } + byte[] key = readNBytes(keySize); + + if (available() <= 4) { + return Optional.empty(); + } + int valueSize = readInt(); + + if ((available() <= 0) && (valueSize == REMOVED_OBJECT_SIZE)) { + return Optional.empty(); + } + byte[] value = readNBytes(valueSize); + SetDatabaseRecord datarecord = new SetDatabaseRecord(key, value); + + return Optional.of(datarecord); + } catch (EOFException ex) { + return Optional.empty(); } - int keySize = readInt(); - - if (available() <= 0) { - return Optional.empty(); - } - byte[] key = readNBytes(keySize); - - if (available() <= 4) { - return Optional.empty(); - } - int valueSize = readInt(); - - if ((available() <= 0) && (valueSize == REMOVED_OBJECT_SIZE)) { - return Optional.empty(); - } - byte[] value = readNBytes(valueSize); - SetDatabaseRecord datarecord = new SetDatabaseRecord(key, value); - - return Optional.of(datarecord); } } \ No newline at end of file From ef227f9209dd6af546bbda1e7121497c1bdc68b6 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 30 Apr 2021 20:54:20 +0300 Subject: [PATCH 058/378] 30/04 --- .../impl/DatabaseInitializationContextImpl.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java index 3cfa9dae..c2daf553 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java @@ -4,6 +4,7 @@ import com.itmo.java.basics.logic.Table; import java.nio.file.Path; +import java.nio.file.Paths; import java.util.HashMap; import java.util.Map; @@ -11,12 +12,11 @@ public class DatabaseInitializationContextImpl implements DatabaseInitialization private final String dbName; private final Path dbRoot; - private final Map tablesMap; + private Map tablesMap = new HashMap<>(); public DatabaseInitializationContextImpl(String dbName, Path databaseRoot) { this.dbName = dbName; this.dbRoot = databaseRoot; - this.tablesMap = new HashMap<>(); } @Override @@ -26,7 +26,7 @@ public String getDbName() { @Override public Path getDatabasePath() { - return dbRoot; + return Paths.get(dbRoot.toString(),dbName); } @Override From 78440d379cd0ab2209bd3294e4c69c27bd08cf11 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 30 Apr 2021 21:00:47 +0300 Subject: [PATCH 059/378] 30/04 --- .../initialization/impl/SegmentInitializationContextImpl.java | 4 +++- .../initialization/impl/TableInitializationContextImpl.java | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java index e413188d..330d0193 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java @@ -7,10 +7,12 @@ import java.nio.file.Paths; public class SegmentInitializationContextImpl implements SegmentInitializationContext { + private final String segmentName; private final Path segmentPath; private final int currentSize; private final SegmentIndex segmentIndex; + public SegmentInitializationContextImpl(String segmentName, Path segmentPath, int currentSize, SegmentIndex index) { this.segmentName = segmentName; this.segmentPath = segmentPath; @@ -20,7 +22,7 @@ public SegmentInitializationContextImpl(String segmentName, Path segmentPath, in public SegmentInitializationContextImpl(String segmentName, Path tablePath, int currentSize) { this.segmentName = segmentName; - this.segmentPath = Paths.get(tablePath + segmentName); + this.segmentPath = Paths.get(tablePath.toString(),segmentName); this.currentSize = currentSize; this.segmentIndex = new SegmentIndex(); } diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java index 177065f0..960b39ff 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java @@ -7,13 +7,15 @@ import java.nio.file.Path; public class TableInitializationContextImpl implements TableInitializationContext { + private final String tableName; private final Path databasePath; private final TableIndex tableIndex; private Segment lastSegment; + public TableInitializationContextImpl(String tableName, Path databasePath, TableIndex tableIndex) { this.tableName = tableName; - this.databasePath = databasePath; + this.databasePath = Path.of(databasePath.toString() ,tableName); this.tableIndex = tableIndex; } From 770b3f20b27ae9d8b857068cfceb8ffac37e9e24 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 30 Apr 2021 21:10:41 +0300 Subject: [PATCH 060/378] 30/04 --- .../initialization/impl/DatabaseInitializer.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java index bd922675..7ec088ee 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java @@ -2,11 +2,13 @@ import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.index.impl.TableIndex; +import com.itmo.java.basics.initialization.DatabaseInitializationContext; import com.itmo.java.basics.initialization.InitializationContext; import com.itmo.java.basics.initialization.Initializer; import com.itmo.java.basics.logic.impl.DatabaseImpl; import java.io.File; +import java.nio.file.Files; public class DatabaseInitializer implements Initializer { private final Initializer tableInitializer; @@ -24,9 +26,17 @@ public DatabaseInitializer(TableInitializer tableInitializer) { */ @Override public void perform(InitializationContext initialContext) throws DatabaseException { + + DatabaseInitializationContext dbInitializationContext = initialContext.currentDbContext(); + if(!Files.exists(dbInitializationContext.getDatabasePath())){ + throw new DatabaseException("We dont have this DataBase" + dbInitializationContext.getDbName()); + } + if (initialContext.currentDbContext() == null) { throw new DatabaseException("Error with ContextTable"+ initialContext.currentTableContext()); } + + File directory = initialContext.currentDbContext().getDatabasePath().toFile(); if (directory.listFiles() == null) { return; From 9616d4378725246bcbbf2d6048f25c4c701d36c0 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 30 Apr 2021 21:29:43 +0300 Subject: [PATCH 061/378] 30/04 --- .../initialization/impl/DatabaseInitializer.java | 12 ++++++++---- .../impl/TableInitializationContextImpl.java | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java index 7ec088ee..4e000265 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java @@ -31,17 +31,21 @@ public void perform(InitializationContext initialContext) throws DatabaseExcepti if(!Files.exists(dbInitializationContext.getDatabasePath())){ throw new DatabaseException("We dont have this DataBase" + dbInitializationContext.getDbName()); } - + File directory = new File(dbInitializationContext.getDatabasePath().toString()); if (initialContext.currentDbContext() == null) { throw new DatabaseException("Error with ContextTable"+ initialContext.currentTableContext()); } + if(!directory.exists()){ + throw new DatabaseException(dbInitializationContext.getDbName() + "doesnt exists"); + } + File[] tables = directory.listFiles(); + if(tables == null){ + throw new DatabaseException("Error with working" + directory.toString()); + } - - File directory = initialContext.currentDbContext().getDatabasePath().toFile(); if (directory.listFiles() == null) { return; } - File[] tables = directory.listFiles(); for (File table : tables) { InitializationContext init = new InitializationContextImpl(initialContext.executionEnvironment(), initialContext.currentDbContext(), diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java index 960b39ff..3b4e7f0d 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java @@ -19,6 +19,7 @@ public TableInitializationContextImpl(String tableName, Path databasePath, Table this.tableIndex = tableIndex; } + @Override public String getTableName() { return tableName; From cdda04e24f4b5c84ac4be792faf1fb807fc6c64c Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 30 Apr 2021 21:37:29 +0300 Subject: [PATCH 062/378] 30/04 --- .../initialization/impl/DatabaseInitializer.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java index 4e000265..8efcf851 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java @@ -5,6 +5,7 @@ import com.itmo.java.basics.initialization.DatabaseInitializationContext; import com.itmo.java.basics.initialization.InitializationContext; import com.itmo.java.basics.initialization.Initializer; +import com.itmo.java.basics.logic.Database; import com.itmo.java.basics.logic.impl.DatabaseImpl; import java.io.File; @@ -47,12 +48,10 @@ public void perform(InitializationContext initialContext) throws DatabaseExcepti return; } for (File table : tables) { - InitializationContext init = new InitializationContextImpl(initialContext.executionEnvironment(), - initialContext.currentDbContext(), - new TableInitializationContextImpl(table.getName(), table.toPath(), new TableIndex()), - initialContext.currentSegmentContext()); - tableInitializer.perform(init); + TableInitializationContextImpl tableContext = new TableInitializationContextImpl(table.getName(), dbInitializationContext.getDatabasePath(), new TableIndex()); + tableInitializer.perform(new InitializationContextImpl(initialContext.executionEnvironment(), dbInitializationContext, tableContext,null)); } - initialContext.executionEnvironment().addDatabase(DatabaseImpl.initializeFromContext(initialContext.currentDbContext())); + Database database = DatabaseImpl.initializeFromContext(dbInitializationContext); + initialContext.executionEnvironment().addDatabase(database); } } From 2f35c90195d945cfd3461d8842efe4ae2dccff20 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 30 Apr 2021 21:44:10 +0300 Subject: [PATCH 063/378] 30/04 --- .../impl/DatabaseServerInitializer.java | 46 ++++++++++++++----- 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java index fe825c47..b6440545 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java @@ -1,5 +1,6 @@ package com.itmo.java.basics.initialization.impl; +import com.itmo.java.basics.console.ExecutionEnvironment; import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.index.impl.TableIndex; import com.itmo.java.basics.initialization.InitializationContext; @@ -8,6 +9,8 @@ import java.io.File; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; public class DatabaseServerInitializer implements Initializer { private final Initializer databaseInitializer; @@ -25,26 +28,45 @@ public DatabaseServerInitializer(DatabaseInitializer databaseInitializer) { */ @Override public void perform(InitializationContext context) throws DatabaseException { + ExecutionEnvironment exEnvironment = context.executionEnvironment(); + Path path = exEnvironment.getWorkingPath(); if (context.executionEnvironment() == null) { throw new DatabaseException("Context Env is null"); } + if(!Files.exists(path)){ + try{ + Files.createDirectory(path); + }catch (IOException ex){ + throw new DatabaseException("Error while creating directory " + path.toString(), ex); + } + } + File curFile = new File(path.toString()); + File[] files = curFile.listFiles(); + if(files == null){ + throw new DatabaseException("Error while working with" + curFile.toString()); + } - File directory = context.executionEnvironment().getWorkingPath().toFile(); - if (directory.listFiles() == null) { - return; + for (File i : files) { + DatabaseInitializationContextImpl dbContext = new DatabaseInitializationContextImpl(i.getName(), path); + databaseInitializer.perform(new InitializationContextImpl(context.executionEnvironment(), dbContext, null, null)); } - File[] files = directory.listFiles(); - for (File file : files) { - if (file.isDirectory()) { - InitializationContext init = InitializationContextImpl.builder() - .executionEnvironment(context.executionEnvironment()) - .currentDatabaseContext(new DatabaseInitializationContextImpl(file.getName(), file.toPath())).build(); - databaseInitializer.perform(init); +// +// File directory = context.executionEnvironment().getWorkingPath().toFile(); +// if (directory.listFiles() == null) { +// return; +// } +// File[] files = directory.listFiles(); +// for (File file : files) { +// if (file.isDirectory()) { +// InitializationContext init = InitializationContextImpl.builder() +// .executionEnvironment(context.executionEnvironment()) +// .currentDatabaseContext(new DatabaseInitializationContextImpl(file.getName(), file.toPath())).build(); +// databaseInitializer.perform(init); } } - } -} + + From 1664f76c8ee97f49486eafce1fe85dfa3a9309ac Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 30 Apr 2021 21:54:13 +0300 Subject: [PATCH 064/378] 30/04 --- .../impl/SegmentInitializer.java | 77 +++++++++++++------ 1 file changed, 53 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java index 1b27975c..85e1fb68 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java @@ -15,7 +15,9 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.nio.file.Files; import java.nio.file.Path; +import java.util.ArrayList; import java.util.Optional; @@ -34,32 +36,59 @@ public class SegmentInitializer implements Initializer { public void perform(InitializationContext context) throws DatabaseException { if (context.currentSegmentContext() == null) { - throw new DatabaseException(""); + throw new DatabaseException("Why" + context.currentSegmentContext() + "is null?"); } - - SegmentInitializationContext segmentInContext = context.currentSegmentContext(); - Path segmentPath = segmentInContext.getSegmentPath(); - Segment segmentIn = SegmentImpl.initializeFromContext(segmentInContext); - SegmentIndex segmentIndex = segmentInContext.getIndex(); - int offSet = 0; - try (DatabaseInputStream inputStream = new DatabaseInputStream( new FileInputStream(segmentPath.toString()))) { - Optional dbUn = inputStream.readDbUnit(); - while(dbUn.isPresent()){ - DatabaseRecord databaseUnit = dbUn.get(); - if ( databaseUnit.isValuePresented()) { - segmentIndex.onIndexedEntityUpdated(new String(databaseUnit.getKey()), new SegmentOffsetInfoImpl(offSet)); - } - else { - segmentIndex.onIndexedEntityUpdated(new String(databaseUnit.getKey()) , null); - } - context.currentTableContext().getTableIndex().onIndexedEntityUpdated(new String(databaseUnit.getKey()) , segmentIn); - offSet += databaseUnit.size(); - dbUn = inputStream.readDbUnit(); - } + int offset = 0; + SegmentInitializationContext segmentinitialContext = context.currentSegmentContext(); + SegmentIndex segmentIndex = segmentinitialContext.getIndex(); + Path segmentPath = segmentinitialContext.getSegmentPath(); + Segment segment = SegmentImpl.initializeFromContext(segmentinitialContext); + if (!Files.exists(segmentPath)) { + throw new DatabaseException(segmentinitialContext.getSegmentName() + " does not exist"); + } + ArrayList keys= new ArrayList<>(); + try (DatabaseInputStream InputStream = new DatabaseInputStream(new FileInputStream(segmentPath.toFile()))) { + Optional dbUnitOptional = InputStream.readDbUnit(); + while (dbUnitOptional.isPresent()) { + DatabaseRecord dbUnit = dbUnitOptional.get(); + segmentIndex.onIndexedEntityUpdated(new String(dbUnit.getKey()), new SegmentOffsetInfoImpl(offset)); + offset += dbUnit.size(); + keys.add(new String(dbUnit.getKey())); + dbUnitOptional = InputStream.readDbUnit(); + } + } catch (IOException ex) { + throw new DatabaseException("Erro while initialisation segment", ex); } - catch (IOException ex) { - throw new DatabaseException("Error while InitializationContext " , ex); + Segment newSegment = SegmentImpl.initializeFromContext(new SegmentInitializationContextImpl(segmentinitialContext.getSegmentName(), + segmentinitialContext.getSegmentPath(), offset, segmentIndex)); + for (String key : keys){ + context.currentTableContext().getTableIndex().onIndexedEntityUpdated(key, segment); } + context.currentTableContext().updateCurrentSegment(newSegment); } -} +// SegmentInitializationContext segmentInContext = context.currentSegmentContext(); +// Path segmentPath = segmentInContext.getSegmentPath(); +// Segment segmentIn = SegmentImpl.initializeFromContext(segmentInContext); +// SegmentIndex segmentIndex = segmentInContext.getIndex(); +// int offSet = 0; +// try (DatabaseInputStream inputStream = new DatabaseInputStream( new FileInputStream(segmentPath.toString()))) { +// Optional dbUn = inputStream.readDbUnit(); +// while(dbUn.isPresent()){ +// DatabaseRecord databaseUnit = dbUn.get(); +// if ( databaseUnit.isValuePresented()) { +// segmentIndex.onIndexedEntityUpdated(new String(databaseUnit.getKey()), new SegmentOffsetInfoImpl(offSet)); +// } +// else { +// segmentIndex.onIndexedEntityUpdated(new String(databaseUnit.getKey()) , null); +// } +// context.currentTableContext().getTableIndex().onIndexedEntityUpdated(new String(databaseUnit.getKey()) , segmentIn); +// offSet += databaseUnit.size(); +// dbUn = inputStream.readDbUnit(); +// } +// } +// catch (IOException ex) { +// throw new DatabaseException("Error while InitializationContext " , ex); +// } + } + From 8514082ca09fea5f48fb42d1f3b58a5ee2fa8c8b Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 30 Apr 2021 22:03:35 +0300 Subject: [PATCH 065/378] 30/04 --- .../initialization/impl/TableInitializer.java | 50 +++++++++++++------ 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java index 9e85137d..e88c03cc 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java @@ -1,12 +1,18 @@ package com.itmo.java.basics.initialization.impl; import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.index.impl.SegmentIndex; import com.itmo.java.basics.initialization.InitializationContext; import com.itmo.java.basics.initialization.Initializer; +import com.itmo.java.basics.initialization.SegmentInitializationContext; +import com.itmo.java.basics.initialization.TableInitializationContext; +import com.itmo.java.basics.logic.Table; import com.itmo.java.basics.logic.impl.TableImpl; import java.io.File; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + public class TableInitializer implements Initializer { private final Initializer segmentInitializer; @@ -32,22 +38,34 @@ public void perform(InitializationContext context) throws DatabaseException { if (context.currentDbContext() == null) { throw new DatabaseException("Error with ContextTable"+context.currentTableContext()); } - File directory = context.currentTableContext().getTablePath().toFile(); - if (directory.listFiles() == null) { - return; + TableInitializationContext tbinitalContext = context.currentTableContext(); + File curFile = new File(tbinitalContext.getTablePath().toString()); + if(!curFile.exists()){ + throw new DatabaseException("Directory " + tbinitalContext.getTableName() + " does not exist"); + } + File[] files = curFile.listFiles(); + if(files == null){ + throw new DatabaseException("Error while working " + curFile.toString()); } - File[] segments = directory.listFiles(); - for (File seg : segments) { - InitializationContext init = InitializationContextImpl.builder() - .executionEnvironment(context.executionEnvironment()) - .currentDatabaseContext(context.currentDbContext()) - .currentTableContext(context.currentTableContext()) - .currentSegmentContext(new SegmentInitializationContextImpl( - seg.getName(), seg.toPath(), (int)seg.length(), - new SegmentIndex())) - .build(); - segmentInitializer.perform(init); + List filesList = Arrays.asList(files); + Collections.sort(filesList); + for (File i : filesList){ + SegmentInitializationContext segmentContext = new SegmentInitializationContextImpl(i.getName(), tbinitalContext.getTablePath(), 0); + segmentInitializer.perform(new InitializationContextImpl(context.executionEnvironment(), context.currentDbContext(), context.currentTableContext(), segmentContext)); } - context.currentDbContext().addTable(TableImpl.initializeFromContext(context.currentTableContext())); + Table table = TableImpl.initializeFromContext(tbinitalContext); + context.currentDbContext().addTable(table); +// for (File seg : segments) { +// InitializationContext init = InitializationContextImpl.builder() +// .executionEnvironment(context.executionEnvironment()) +// .currentDatabaseContext(context.currentDbContext()) +// .currentTableContext(context.currentTableContext()) +// .currentSegmentContext(new SegmentInitializationContextImpl( +// seg.getName(), seg.toPath(), (int)seg.length(), +// new SegmentIndex())) +// .build(); +// segmentInitializer.perform(init); +// } +// context.currentDbContext().addTable(TableImpl.initializeFromContext(context.currentTableContext())); } } From 37f32f602ac8bbee6b850e9b427edb2c2c0f1ec8 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 30 Apr 2021 22:12:41 +0300 Subject: [PATCH 066/378] 30/04 --- .../java/basics/config/DatabaseConfig.java | 1 + .../impl/ExecutionEnvironmentImpl.java | 2 +- .../impl/SegmentInitializer.java | 25 +------------------ .../initialization/impl/TableInitializer.java | 13 +--------- .../basics/logic/io/DatabaseInputStream.java | 11 +++++--- 5 files changed, 11 insertions(+), 41 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java b/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java index 3abab965..7c810caf 100644 --- a/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java +++ b/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java @@ -5,6 +5,7 @@ public class DatabaseConfig { public static final String DEFAULT_WORKING_PATH = "db_files"; private final String workingPath; + public DatabaseConfig(String workingPath) { this.workingPath = workingPath; } diff --git a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java index 7d90b756..da977e48 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java +++ b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java @@ -14,7 +14,7 @@ public class ExecutionEnvironmentImpl implements ExecutionEnvironment { private DatabaseConfig dbConfig; private HashMap dataBase = new HashMap(); public ExecutionEnvironmentImpl(DatabaseConfig config) { - this.dbConfig = config; + dbConfig = config; } @Override diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java index 85e1fb68..c4d572ef 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java @@ -66,29 +66,6 @@ public void perform(InitializationContext context) throws DatabaseException { } context.currentTableContext().updateCurrentSegment(newSegment); } -// SegmentInitializationContext segmentInContext = context.currentSegmentContext(); -// Path segmentPath = segmentInContext.getSegmentPath(); -// Segment segmentIn = SegmentImpl.initializeFromContext(segmentInContext); -// SegmentIndex segmentIndex = segmentInContext.getIndex(); -// int offSet = 0; -// try (DatabaseInputStream inputStream = new DatabaseInputStream( new FileInputStream(segmentPath.toString()))) { -// Optional dbUn = inputStream.readDbUnit(); -// while(dbUn.isPresent()){ -// DatabaseRecord databaseUnit = dbUn.get(); -// if ( databaseUnit.isValuePresented()) { -// segmentIndex.onIndexedEntityUpdated(new String(databaseUnit.getKey()), new SegmentOffsetInfoImpl(offSet)); -// } -// else { -// segmentIndex.onIndexedEntityUpdated(new String(databaseUnit.getKey()) , null); -// } -// context.currentTableContext().getTableIndex().onIndexedEntityUpdated(new String(databaseUnit.getKey()) , segmentIn); -// offSet += databaseUnit.size(); -// dbUn = inputStream.readDbUnit(); -// } -// } -// catch (IOException ex) { -// throw new DatabaseException("Error while InitializationContext " , ex); -// } - } +} diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java index e88c03cc..624bf15f 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java @@ -55,17 +55,6 @@ public void perform(InitializationContext context) throws DatabaseException { } Table table = TableImpl.initializeFromContext(tbinitalContext); context.currentDbContext().addTable(table); -// for (File seg : segments) { -// InitializationContext init = InitializationContextImpl.builder() -// .executionEnvironment(context.executionEnvironment()) -// .currentDatabaseContext(context.currentDbContext()) -// .currentTableContext(context.currentTableContext()) -// .currentSegmentContext(new SegmentInitializationContextImpl( -// seg.getName(), seg.toPath(), (int)seg.length(), -// new SegmentIndex())) -// .build(); -// segmentInitializer.perform(init); -// } -// context.currentDbContext().addTable(TableImpl.initializeFromContext(context.currentTableContext())); + } } diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java index 89942c99..f879c517 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java @@ -46,10 +46,13 @@ public Optional readDbUnit() throws IOException { if ((available() <= 0) && (valueSize == REMOVED_OBJECT_SIZE)) { return Optional.empty(); } - byte[] value = readNBytes(valueSize); - SetDatabaseRecord datarecord = new SetDatabaseRecord(key, value); - - return Optional.of(datarecord); + if (valueSize != REMOVED_OBJECT_SIZE) { + byte[] value = readNBytes(valueSize); + Optional res = Optional.of(new SetDatabaseRecord(key, value)); + return res; + } else { + return Optional.empty(); + } } catch (EOFException ex) { return Optional.empty(); } From 295b0fbfccad42ac0d4cd72391f052352bf1dee5 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 30 Apr 2021 22:19:32 +0300 Subject: [PATCH 067/378] 30/04 --- .../initialization/impl/SegmentInitializer.java | 5 +---- .../java/basics/logic/io/DatabaseInputStream.java | 11 ++++------- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java index c4d572ef..d9893895 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java @@ -35,9 +35,6 @@ public class SegmentInitializer implements Initializer { @Override public void perform(InitializationContext context) throws DatabaseException { - if (context.currentSegmentContext() == null) { - throw new DatabaseException("Why" + context.currentSegmentContext() + "is null?"); - } int offset = 0; SegmentInitializationContext segmentinitialContext = context.currentSegmentContext(); SegmentIndex segmentIndex = segmentinitialContext.getIndex(); @@ -57,7 +54,7 @@ public void perform(InitializationContext context) throws DatabaseException { dbUnitOptional = InputStream.readDbUnit(); } } catch (IOException ex) { - throw new DatabaseException("Erro while initialisation segment", ex); + throw new DatabaseException("Error while initialisation segment", ex); } Segment newSegment = SegmentImpl.initializeFromContext(new SegmentInitializationContextImpl(segmentinitialContext.getSegmentName(), segmentinitialContext.getSegmentPath(), offset, segmentIndex)); diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java index f879c517..89942c99 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java @@ -46,13 +46,10 @@ public Optional readDbUnit() throws IOException { if ((available() <= 0) && (valueSize == REMOVED_OBJECT_SIZE)) { return Optional.empty(); } - if (valueSize != REMOVED_OBJECT_SIZE) { - byte[] value = readNBytes(valueSize); - Optional res = Optional.of(new SetDatabaseRecord(key, value)); - return res; - } else { - return Optional.empty(); - } + byte[] value = readNBytes(valueSize); + SetDatabaseRecord datarecord = new SetDatabaseRecord(key, value); + + return Optional.of(datarecord); } catch (EOFException ex) { return Optional.empty(); } From 6cdaeed086e28db8f8545a3f76ccaad23f4d65a2 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 30 Apr 2021 22:38:12 +0300 Subject: [PATCH 068/378] 30/04 --- .../com/itmo/java/basics/logic/impl/CachingTable.java | 9 +++++---- .../itmo/java/basics/logic/impl/DatabaseCacheImpl.java | 5 +++-- .../java/com/itmo/java/basics/logic/impl/TableImpl.java | 7 ++++++- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java index a56009e5..4c470539 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java @@ -13,10 +13,11 @@ public class CachingTable implements Table { private final Table cacheTable; private final DatabaseCache dbCache; + private final int maxCache = 10000; public CachingTable(Table myTable) { this.cacheTable = myTable; - this.dbCache = new DatabaseCacheImpl(); + this.dbCache = new DatabaseCacheImpl(maxCache); } @Override @@ -32,9 +33,9 @@ public void write(String objectKey, byte[] objectValue) throws DatabaseException @Override public Optional read(String objectKey) throws DatabaseException { - byte[] tryReadValueFromCache = dbCache.get(objectKey); - if (tryReadValueFromCache != null) { - return Optional.of(tryReadValueFromCache); + byte[] tryRead = dbCache.get(objectKey); + if (tryRead != null) { + return Optional.of(tryRead); } else { return cacheTable.read(objectKey); diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java index 6f860468..29d9740d 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java @@ -7,10 +7,11 @@ public class DatabaseCacheImpl implements DatabaseCache { - private static final int dbCapacity = 5_000; + private final int dbCapacity ; private final Map dbCache; - public DatabaseCacheImpl() { + public DatabaseCacheImpl(int dbCapacity) { + this.dbCapacity = dbCapacity; this.dbCache = new LinkedHashMap(dbCapacity, 1f, true) { @Override protected boolean removeEldestEntry(Map.Entry eldest) { diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index 18e5cdc5..1b129113 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -51,9 +51,14 @@ public static Table create(String tableName, Path pathToDatabaseRoot, TableIndex } public static Table initializeFromContext(TableInitializationContext context) { - return new CachingTable(new TableImpl(context)); + try { + return new CachingTable(new TableImpl(context)); + }catch (Exception ex) { + return null; + } } + @Override public String getName() { return tableName; From 215b9369ff44694525c675b8243fab1dada63e20 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 30 Apr 2021 22:50:47 +0300 Subject: [PATCH 069/378] 30/04 --- .../impl/DatabaseServerInitializer.java | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java index b6440545..ac431aca 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java @@ -50,20 +50,8 @@ public void perform(InitializationContext context) throws DatabaseException { DatabaseInitializationContextImpl dbContext = new DatabaseInitializationContextImpl(i.getName(), path); databaseInitializer.perform(new InitializationContextImpl(context.executionEnvironment(), dbContext, null, null)); } -// -// File directory = context.executionEnvironment().getWorkingPath().toFile(); -// if (directory.listFiles() == null) { -// return; -// } -// File[] files = directory.listFiles(); -// for (File file : files) { -// if (file.isDirectory()) { -// InitializationContext init = InitializationContextImpl.builder() -// .executionEnvironment(context.executionEnvironment()) -// .currentDatabaseContext(new DatabaseInitializationContextImpl(file.getName(), file.toPath())).build(); -// databaseInitializer.perform(init); - } - } + } +} From 21d99d9657ce33c62ccdd9317353f0c9e039430a Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 30 Apr 2021 22:51:31 +0300 Subject: [PATCH 070/378] 30/04 --- .../impl/DatabaseInitializer.java | 18 ++++++------------ .../initialization/impl/TableInitializer.java | 7 +------ 2 files changed, 7 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java index 8efcf851..4e76694b 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java @@ -21,21 +21,19 @@ public DatabaseInitializer(TableInitializer tableInitializer) { * Добавляет в контекст информацию об инициализируемой бд. * Запускает инициализацию всех таблиц это базы * - * @param initialContext контекст с информацией об инициализируемой бд и об окружении + * @param context контекст с информацией об инициализируемой бд и об окружении * @throws DatabaseException если в контексте лежит неправильный путь к базе, невозможно прочитать содержимого папки, * или если возникла ошибка дочерних инициализаторов */ @Override - public void perform(InitializationContext initialContext) throws DatabaseException { + public void perform(InitializationContext context) throws DatabaseException { - DatabaseInitializationContext dbInitializationContext = initialContext.currentDbContext(); + DatabaseInitializationContext dbInitializationContext = context.currentDbContext(); if(!Files.exists(dbInitializationContext.getDatabasePath())){ throw new DatabaseException("We dont have this DataBase" + dbInitializationContext.getDbName()); } File directory = new File(dbInitializationContext.getDatabasePath().toString()); - if (initialContext.currentDbContext() == null) { - throw new DatabaseException("Error with ContextTable"+ initialContext.currentTableContext()); - } + if(!directory.exists()){ throw new DatabaseException(dbInitializationContext.getDbName() + "doesnt exists"); } @@ -43,15 +41,11 @@ public void perform(InitializationContext initialContext) throws DatabaseExcepti if(tables == null){ throw new DatabaseException("Error with working" + directory.toString()); } - - if (directory.listFiles() == null) { - return; - } for (File table : tables) { TableInitializationContextImpl tableContext = new TableInitializationContextImpl(table.getName(), dbInitializationContext.getDatabasePath(), new TableIndex()); - tableInitializer.perform(new InitializationContextImpl(initialContext.executionEnvironment(), dbInitializationContext, tableContext,null)); + tableInitializer.perform(new InitializationContextImpl(context.executionEnvironment(), dbInitializationContext, tableContext,null)); } Database database = DatabaseImpl.initializeFromContext(dbInitializationContext); - initialContext.executionEnvironment().addDatabase(database); + context.executionEnvironment().addDatabase(database); } } diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java index 624bf15f..b58de00e 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java @@ -32,12 +32,7 @@ public TableInitializer(SegmentInitializer segmentInitializer) { @Override public void perform(InitializationContext context) throws DatabaseException { - if (context.currentTableContext() == null) { - throw new DatabaseException("Error with ContextTable"+ context.currentTableContext()); - } - if (context.currentDbContext() == null) { - throw new DatabaseException("Error with ContextTable"+context.currentTableContext()); - } + TableInitializationContext tbinitalContext = context.currentTableContext(); File curFile = new File(tbinitalContext.getTablePath().toString()); if(!curFile.exists()){ From c485dd1253a4265fcb6a00d4af559b425e0eeead Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 30 Apr 2021 22:53:38 +0300 Subject: [PATCH 071/378] 30/04 --- .../impl/DatabaseInitializer.java | 19 +++++++++++++------ .../impl/SegmentInitializer.java | 5 ++++- .../initialization/impl/TableInitializer.java | 7 ++++++- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java index 4e76694b..535372f7 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java @@ -21,19 +21,21 @@ public DatabaseInitializer(TableInitializer tableInitializer) { * Добавляет в контекст информацию об инициализируемой бд. * Запускает инициализацию всех таблиц это базы * - * @param context контекст с информацией об инициализируемой бд и об окружении + * @param initialContext контекст с информацией об инициализируемой бд и об окружении * @throws DatabaseException если в контексте лежит неправильный путь к базе, невозможно прочитать содержимого папки, * или если возникла ошибка дочерних инициализаторов */ @Override - public void perform(InitializationContext context) throws DatabaseException { + public void perform(InitializationContext initialContext) throws DatabaseException { - DatabaseInitializationContext dbInitializationContext = context.currentDbContext(); + DatabaseInitializationContext dbInitializationContext = initialContext.currentDbContext(); if(!Files.exists(dbInitializationContext.getDatabasePath())){ throw new DatabaseException("We dont have this DataBase" + dbInitializationContext.getDbName()); } File directory = new File(dbInitializationContext.getDatabasePath().toString()); - + if (initialContext.currentDbContext() == null) { + throw new DatabaseException("Error with ContextTable"+ initialContext.currentTableContext()); + } if(!directory.exists()){ throw new DatabaseException(dbInitializationContext.getDbName() + "doesnt exists"); } @@ -41,11 +43,16 @@ public void perform(InitializationContext context) throws DatabaseException { if(tables == null){ throw new DatabaseException("Error with working" + directory.toString()); } + + if (directory.listFiles() == null) { + return; + } for (File table : tables) { TableInitializationContextImpl tableContext = new TableInitializationContextImpl(table.getName(), dbInitializationContext.getDatabasePath(), new TableIndex()); - tableInitializer.perform(new InitializationContextImpl(context.executionEnvironment(), dbInitializationContext, tableContext,null)); + tableInitializer.perform(new InitializationContextImpl(initialContext.executionEnvironment(), dbInitializationContext, tableContext,null)); + } Database database = DatabaseImpl.initializeFromContext(dbInitializationContext); - context.executionEnvironment().addDatabase(database); + initialContext.executionEnvironment().addDatabase(database); } } diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java index d9893895..c4d572ef 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java @@ -35,6 +35,9 @@ public class SegmentInitializer implements Initializer { @Override public void perform(InitializationContext context) throws DatabaseException { + if (context.currentSegmentContext() == null) { + throw new DatabaseException("Why" + context.currentSegmentContext() + "is null?"); + } int offset = 0; SegmentInitializationContext segmentinitialContext = context.currentSegmentContext(); SegmentIndex segmentIndex = segmentinitialContext.getIndex(); @@ -54,7 +57,7 @@ public void perform(InitializationContext context) throws DatabaseException { dbUnitOptional = InputStream.readDbUnit(); } } catch (IOException ex) { - throw new DatabaseException("Error while initialisation segment", ex); + throw new DatabaseException("Erro while initialisation segment", ex); } Segment newSegment = SegmentImpl.initializeFromContext(new SegmentInitializationContextImpl(segmentinitialContext.getSegmentName(), segmentinitialContext.getSegmentPath(), offset, segmentIndex)); diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java index b58de00e..624bf15f 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java @@ -32,7 +32,12 @@ public TableInitializer(SegmentInitializer segmentInitializer) { @Override public void perform(InitializationContext context) throws DatabaseException { - + if (context.currentTableContext() == null) { + throw new DatabaseException("Error with ContextTable"+ context.currentTableContext()); + } + if (context.currentDbContext() == null) { + throw new DatabaseException("Error with ContextTable"+context.currentTableContext()); + } TableInitializationContext tbinitalContext = context.currentTableContext(); File curFile = new File(tbinitalContext.getTablePath().toString()); if(!curFile.exists()){ From 69058039c2693ae4fcc3da6d1e64ad205f86f32c Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 30 Apr 2021 22:58:57 +0300 Subject: [PATCH 072/378] 30/04 --- .../initialization/impl/DatabaseServerInitializer.java | 4 +--- .../java/basics/initialization/impl/SegmentInitializer.java | 3 ++- .../java/com/itmo/java/basics/logic/impl/DatabaseImpl.java | 5 ++--- .../java/com/itmo/java/basics/logic/impl/SegmentImpl.java | 1 + 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java index ac431aca..66a31182 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java @@ -30,9 +30,7 @@ public DatabaseServerInitializer(DatabaseInitializer databaseInitializer) { public void perform(InitializationContext context) throws DatabaseException { ExecutionEnvironment exEnvironment = context.executionEnvironment(); Path path = exEnvironment.getWorkingPath(); - if (context.executionEnvironment() == null) { - throw new DatabaseException("Context Env is null"); - } + if(!Files.exists(path)){ try{ Files.createDirectory(path); diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java index c4d572ef..6c9c02a5 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java @@ -66,6 +66,7 @@ public void perform(InitializationContext context) throws DatabaseException { } context.currentTableContext().updateCurrentSegment(newSegment); } -} + + } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index 94c9ee1d..1a2e4882 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -86,7 +86,6 @@ public void createTableIfNotExists(String tableName) throws DatabaseException { @Override public void write(String tableName, String objectKey, byte[] objectValue) throws DatabaseException { - if (!tableDictionary.containsKey(tableName)) { throw new DatabaseException("Table " + tableName + " doesn't exist in database" + dbName); } @@ -117,7 +116,7 @@ public void delete(String tableName, String objectKey) throws DatabaseException if (tableName == null) { throw new DatabaseException("Writing in database error"); } - Table table = tableDictionary.get(tableName); - table.delete(objectKey); + Table tableImpl = tableDictionary.get(tableName); + tableImpl.delete(objectKey); } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 42d1fd70..a1297112 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -34,6 +34,7 @@ public class SegmentImpl implements Segment { private SegmentIndex segmentIndex; private final long sizeMaximum = 100000; private long segmentSize = 0; + private final DatabaseOutputStream outStream; public SegmentImpl(Path tableRootPath, String segmentName, OutputStream outStream) { From f2ce1ea401e3233aae5d9a8ba96da93446569923 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 30 Apr 2021 23:06:20 +0300 Subject: [PATCH 073/378] 30/04 --- .../initialization/impl/DatabaseInitializationContextImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java index c2daf553..c6baf7c0 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java @@ -16,7 +16,7 @@ public class DatabaseInitializationContextImpl implements DatabaseInitialization public DatabaseInitializationContextImpl(String dbName, Path databaseRoot) { this.dbName = dbName; - this.dbRoot = databaseRoot; + this.dbRoot = Path.of(databaseRoot.toString(),dbName); } @Override From 5445d054db1ab8b38a1e682afce5c75496b18455 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 30 Apr 2021 23:06:31 +0300 Subject: [PATCH 074/378] 30/04 --- .../java/basics/initialization/impl/SegmentInitializer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java index 6c9c02a5..1577430f 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java @@ -38,11 +38,11 @@ public void perform(InitializationContext context) throws DatabaseException { if (context.currentSegmentContext() == null) { throw new DatabaseException("Why" + context.currentSegmentContext() + "is null?"); } - int offset = 0; SegmentInitializationContext segmentinitialContext = context.currentSegmentContext(); SegmentIndex segmentIndex = segmentinitialContext.getIndex(); Path segmentPath = segmentinitialContext.getSegmentPath(); Segment segment = SegmentImpl.initializeFromContext(segmentinitialContext); + int offset = 0; if (!Files.exists(segmentPath)) { throw new DatabaseException(segmentinitialContext.getSegmentName() + " does not exist"); } @@ -57,7 +57,7 @@ public void perform(InitializationContext context) throws DatabaseException { dbUnitOptional = InputStream.readDbUnit(); } } catch (IOException ex) { - throw new DatabaseException("Erro while initialisation segment", ex); + throw new DatabaseException("Error while initialisation segment", ex); } Segment newSegment = SegmentImpl.initializeFromContext(new SegmentInitializationContextImpl(segmentinitialContext.getSegmentName(), segmentinitialContext.getSegmentPath(), offset, segmentIndex)); From 9543a09f8b438fce0bee58401767d3ac272dd958 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 30 Apr 2021 23:10:43 +0300 Subject: [PATCH 075/378] 30/04 --- src/main/java/com/itmo/java/basics/config/DatabaseConfig.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java b/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java index 7c810caf..a2abf5b7 100644 --- a/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java +++ b/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java @@ -5,9 +5,8 @@ public class DatabaseConfig { public static final String DEFAULT_WORKING_PATH = "db_files"; private final String workingPath; - public DatabaseConfig(String workingPath) { - this.workingPath = workingPath; + this.workingPath = Objects.requireNonNullElse(workingPath, DEFAULT_WORKING_PATH); } public String getWorkingPath() { From 14ab20e69b8f20a0026971b1a884f90a22ce2d4f Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 30 Apr 2021 23:14:26 +0300 Subject: [PATCH 076/378] 30/04 --- src/main/java/com/itmo/java/basics/config/DatabaseConfig.java | 2 +- .../initialization/impl/DatabaseInitializationContextImpl.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java b/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java index a2abf5b7..7f657092 100644 --- a/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java +++ b/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java @@ -6,7 +6,7 @@ public class DatabaseConfig { public static final String DEFAULT_WORKING_PATH = "db_files"; private final String workingPath; public DatabaseConfig(String workingPath) { - this.workingPath = Objects.requireNonNullElse(workingPath, DEFAULT_WORKING_PATH); + this.workingPath =workingPath; } public String getWorkingPath() { diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java index c6baf7c0..c2daf553 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java @@ -16,7 +16,7 @@ public class DatabaseInitializationContextImpl implements DatabaseInitialization public DatabaseInitializationContextImpl(String dbName, Path databaseRoot) { this.dbName = dbName; - this.dbRoot = Path.of(databaseRoot.toString(),dbName); + this.dbRoot = databaseRoot; } @Override From 8e2b00d1c4df8302c3c2d325edbe298a0b10b65f Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 30 Apr 2021 23:15:31 +0300 Subject: [PATCH 077/378] 30/04 --- .../initialization/impl/DatabaseInitializationContextImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java index c2daf553..625d99f5 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java @@ -17,6 +17,7 @@ public class DatabaseInitializationContextImpl implements DatabaseInitialization public DatabaseInitializationContextImpl(String dbName, Path databaseRoot) { this.dbName = dbName; this.dbRoot = databaseRoot; + } @Override From 6b9c1886d29728d7034c54073c62559817da4716 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 30 Apr 2021 23:17:32 +0300 Subject: [PATCH 078/378] 30/04 --- .../basics/initialization/impl/DatabaseServerInitializer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java index 66a31182..5cc4d469 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java @@ -30,7 +30,7 @@ public DatabaseServerInitializer(DatabaseInitializer databaseInitializer) { public void perform(InitializationContext context) throws DatabaseException { ExecutionEnvironment exEnvironment = context.executionEnvironment(); Path path = exEnvironment.getWorkingPath(); - + if(!Files.exists(path)){ try{ Files.createDirectory(path); @@ -41,7 +41,7 @@ public void perform(InitializationContext context) throws DatabaseException { File curFile = new File(path.toString()); File[] files = curFile.listFiles(); if(files == null){ - throw new DatabaseException("Error while working with" + curFile.toString()); + return; } for (File i : files) { From 8145ec2d3b9611a10035154110815445586bb120 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 30 Apr 2021 23:22:09 +0300 Subject: [PATCH 079/378] 30/04 --- .../initialization/impl/DatabaseServerInitializer.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java index 5cc4d469..7c68b5c8 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java @@ -28,9 +28,13 @@ public DatabaseServerInitializer(DatabaseInitializer databaseInitializer) { */ @Override public void perform(InitializationContext context) throws DatabaseException { + + if (context.executionEnvironment() == null) { + throw new DatabaseException("Context Env is null"); + } ExecutionEnvironment exEnvironment = context.executionEnvironment(); Path path = exEnvironment.getWorkingPath(); - + if(!Files.exists(path)){ try{ Files.createDirectory(path); @@ -41,7 +45,7 @@ public void perform(InitializationContext context) throws DatabaseException { File curFile = new File(path.toString()); File[] files = curFile.listFiles(); if(files == null){ - return; + throw new DatabaseException("Error while working with" + curFile.toString()); } for (File i : files) { From e7cc7c0b197df1f1c05f797c099111dc0fec6b77 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 30 Apr 2021 23:24:47 +0300 Subject: [PATCH 080/378] 30/04 --- .../initialization/impl/DatabaseServerInitializer.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java index 7c68b5c8..d1ff245b 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java @@ -29,9 +29,6 @@ public DatabaseServerInitializer(DatabaseInitializer databaseInitializer) { @Override public void perform(InitializationContext context) throws DatabaseException { - if (context.executionEnvironment() == null) { - throw new DatabaseException("Context Env is null"); - } ExecutionEnvironment exEnvironment = context.executionEnvironment(); Path path = exEnvironment.getWorkingPath(); @@ -42,7 +39,7 @@ public void perform(InitializationContext context) throws DatabaseException { throw new DatabaseException("Error while creating directory " + path.toString(), ex); } } - File curFile = new File(path.toString()); + File curFile = context.executionEnvironment().getWorkingPath().toFile(); File[] files = curFile.listFiles(); if(files == null){ throw new DatabaseException("Error while working with" + curFile.toString()); From ef45d9386eaf277d4c74411f8cab2bf788003e30 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 30 Apr 2021 23:29:10 +0300 Subject: [PATCH 081/378] 30/04 --- .../impl/DatabaseServerInitializer.java | 39 ++++++++++++------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java index d1ff245b..9d8b303c 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java @@ -29,25 +29,34 @@ public DatabaseServerInitializer(DatabaseInitializer databaseInitializer) { @Override public void perform(InitializationContext context) throws DatabaseException { - ExecutionEnvironment exEnvironment = context.executionEnvironment(); - Path path = exEnvironment.getWorkingPath(); - - if(!Files.exists(path)){ - try{ - Files.createDirectory(path); - }catch (IOException ex){ - throw new DatabaseException("Error while creating directory " + path.toString(), ex); + if (context.executionEnvironment() == null) { + throw new DatabaseException("Context Env is null"); + } + + if (!Files.exists(context.executionEnvironment().getWorkingPath())) { + try { + Files.createDirectory(context.executionEnvironment().getWorkingPath()); + } catch (Exception ex) { + throw new DatabaseException("Error while creating directory"); } } - File curFile = context.executionEnvironment().getWorkingPath().toFile(); - File[] files = curFile.listFiles(); - if(files == null){ - throw new DatabaseException("Error while working with" + curFile.toString()); + + File dir = context.executionEnvironment().getWorkingPath().toFile(); + + if (dir.listFiles() == null) { + return; } - for (File i : files) { - DatabaseInitializationContextImpl dbContext = new DatabaseInitializationContextImpl(i.getName(), path); - databaseInitializer.perform(new InitializationContextImpl(context.executionEnvironment(), dbContext, null, null)); + File[] files = dir.listFiles(); + for (File file : files) { + if (file.isDirectory()) { + InitializationContext init = InitializationContextImpl.builder() + .executionEnvironment(context.executionEnvironment()) + .currentDatabaseContext(new DatabaseInitializationContextImpl(file.getName(), context.executionEnvironment().getWorkingPath())).build(); + + + databaseInitializer.perform(init); + } } } } From b686f4a5102ef9fd7a2485aca50178c583ccd4fb Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 30 Apr 2021 23:30:48 +0300 Subject: [PATCH 082/378] 30/04 --- .../impl/DatabaseServerInitializer.java | 39 +++++++------------ 1 file changed, 15 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java index 9d8b303c..e2054361 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java @@ -29,34 +29,25 @@ public DatabaseServerInitializer(DatabaseInitializer databaseInitializer) { @Override public void perform(InitializationContext context) throws DatabaseException { - if (context.executionEnvironment() == null) { - throw new DatabaseException("Context Env is null"); - } - - if (!Files.exists(context.executionEnvironment().getWorkingPath())) { - try { - Files.createDirectory(context.executionEnvironment().getWorkingPath()); - } catch (Exception ex) { - throw new DatabaseException("Error while creating directory"); + ExecutionEnvironment exEnvironment = context.executionEnvironment(); + Path path = exEnvironment.getWorkingPath(); + + if(!Files.exists(path)){ + try{ + Files.createDirectory(path); + }catch (IOException ex){ + throw new DatabaseException("Error while creating directory " + path.toString(), ex); } } - - File dir = context.executionEnvironment().getWorkingPath().toFile(); - - if (dir.listFiles() == null) { - return; + File curFile = new File(path.toString()); + File[] files = curFile.listFiles(); + if(files == null){ + throw new DatabaseException("Error while working with" + curFile.toString()); } - File[] files = dir.listFiles(); - for (File file : files) { - if (file.isDirectory()) { - InitializationContext init = InitializationContextImpl.builder() - .executionEnvironment(context.executionEnvironment()) - .currentDatabaseContext(new DatabaseInitializationContextImpl(file.getName(), context.executionEnvironment().getWorkingPath())).build(); - - - databaseInitializer.perform(init); - } + for (File i : files) { + DatabaseInitializationContextImpl dbContext = new DatabaseInitializationContextImpl(i.getName(), path); + databaseInitializer.perform(new InitializationContextImpl(context.executionEnvironment(), dbContext, null, null)); } } } From 4468e6fbaf2d581fb098cfc6883659743e959dbb Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 30 Apr 2021 23:34:23 +0300 Subject: [PATCH 083/378] 30/04 --- .../impl/DatabaseInitializationContextImpl.java | 3 +-- .../initialization/impl/DatabaseServerInitializer.java | 5 ++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java index 625d99f5..70cc54b0 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java @@ -16,8 +16,7 @@ public class DatabaseInitializationContextImpl implements DatabaseInitialization public DatabaseInitializationContextImpl(String dbName, Path databaseRoot) { this.dbName = dbName; - this.dbRoot = databaseRoot; - + this.dbRoot = Path.of(databaseRoot.toString(), dbName); } @Override diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java index e2054361..1333236a 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java @@ -44,9 +44,8 @@ public void perform(InitializationContext context) throws DatabaseException { if(files == null){ throw new DatabaseException("Error while working with" + curFile.toString()); } - - for (File i : files) { - DatabaseInitializationContextImpl dbContext = new DatabaseInitializationContextImpl(i.getName(), path); + for (File in : files) { + DatabaseInitializationContextImpl dbContext = new DatabaseInitializationContextImpl(in.getName(), path); databaseInitializer.perform(new InitializationContextImpl(context.executionEnvironment(), dbContext, null, null)); } } From 8b998ff0e110d1bd936a779eeda8e42b2a5f4cf6 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 30 Apr 2021 23:38:34 +0300 Subject: [PATCH 084/378] 30/04 --- src/main/java/com/itmo/java/basics/config/DatabaseConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java b/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java index 7f657092..eafa9246 100644 --- a/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java +++ b/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java @@ -6,7 +6,7 @@ public class DatabaseConfig { public static final String DEFAULT_WORKING_PATH = "db_files"; private final String workingPath; public DatabaseConfig(String workingPath) { - this.workingPath =workingPath; + this.workingPath =DEFAULT_WORKING_PATH + workingPath; } public String getWorkingPath() { From bdf3f2efd7808c27bb2d9c42c1f2d1d3b3db0e9b Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 30 Apr 2021 23:42:14 +0300 Subject: [PATCH 085/378] 30/04 --- src/main/java/com/itmo/java/basics/config/DatabaseConfig.java | 2 +- .../initialization/impl/DatabaseInitializationContextImpl.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java b/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java index eafa9246..7f657092 100644 --- a/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java +++ b/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java @@ -6,7 +6,7 @@ public class DatabaseConfig { public static final String DEFAULT_WORKING_PATH = "db_files"; private final String workingPath; public DatabaseConfig(String workingPath) { - this.workingPath =DEFAULT_WORKING_PATH + workingPath; + this.workingPath =workingPath; } public String getWorkingPath() { diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java index 70cc54b0..c2daf553 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java @@ -16,7 +16,7 @@ public class DatabaseInitializationContextImpl implements DatabaseInitialization public DatabaseInitializationContextImpl(String dbName, Path databaseRoot) { this.dbName = dbName; - this.dbRoot = Path.of(databaseRoot.toString(), dbName); + this.dbRoot = databaseRoot; } @Override From 20837e3fbab6ea84626d395d081cd5b9efc1675f Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 30 Apr 2021 23:47:36 +0300 Subject: [PATCH 086/378] 30/04 --- .../java/basics/console/impl/ExecutionEnvironmentImpl.java | 4 ++-- .../impl/DatabaseInitializationContextImpl.java | 4 ++-- .../initialization/impl/SegmentInitializationContextImpl.java | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java index da977e48..f2ef4219 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java +++ b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java @@ -11,8 +11,8 @@ public class ExecutionEnvironmentImpl implements ExecutionEnvironment { - private DatabaseConfig dbConfig; - private HashMap dataBase = new HashMap(); + DatabaseConfig dbConfig; + HashMap dataBase = new HashMap(); public ExecutionEnvironmentImpl(DatabaseConfig config) { dbConfig = config; } diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java index c2daf553..3ffb0d01 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java @@ -14,9 +14,9 @@ public class DatabaseInitializationContextImpl implements DatabaseInitialization private final Path dbRoot; private Map tablesMap = new HashMap<>(); - public DatabaseInitializationContextImpl(String dbName, Path databaseRoot) { + public DatabaseInitializationContextImpl(String dbName, Path dbRoot) { this.dbName = dbName; - this.dbRoot = databaseRoot; + this.dbRoot = Paths.get(dbRoot.toString(),dbName); } @Override diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java index 330d0193..2cb042cf 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java @@ -10,7 +10,7 @@ public class SegmentInitializationContextImpl implements SegmentInitializationCo private final String segmentName; private final Path segmentPath; - private final int currentSize; + private final long currentSize; private final SegmentIndex segmentIndex; public SegmentInitializationContextImpl(String segmentName, Path segmentPath, int currentSize, SegmentIndex index) { From bf6e3bb71a44e8f1238306d707b2e25d7ef5c149 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 00:00:40 +0300 Subject: [PATCH 087/378] 1/05 --- .../DatabaseInitializationContextImpl.java | 12 ++--- .../impl/DatabaseInitializer.java | 44 +++++++++---------- .../impl/DatabaseServerInitializer.java | 8 ++-- 3 files changed, 30 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java index 3ffb0d01..ada2d97d 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java @@ -10,13 +10,13 @@ public class DatabaseInitializationContextImpl implements DatabaseInitializationContext { - private final String dbName; - private final Path dbRoot; - private Map tablesMap = new HashMap<>(); + private String dbName; + private Path dbRoot; + private Map tablesMap = new HashMap<>(); - public DatabaseInitializationContextImpl(String dbName, Path dbRoot) { + public DatabaseInitializationContextImpl(String dbName, Path databaseRoot) { this.dbName = dbName; - this.dbRoot = Paths.get(dbRoot.toString(),dbName); + this.dbRoot = Path.of(databaseRoot.toString(), dbName); } @Override @@ -26,7 +26,7 @@ public String getDbName() { @Override public Path getDatabasePath() { - return Paths.get(dbRoot.toString(),dbName); + return Paths.get(dbRoot.toString()); } @Override diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java index 535372f7..5dae8d47 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java @@ -12,7 +12,9 @@ import java.nio.file.Files; public class DatabaseInitializer implements Initializer { - private final Initializer tableInitializer; + + private final TableInitializer tableInitializer; + public DatabaseInitializer(TableInitializer tableInitializer) { this.tableInitializer = tableInitializer; } @@ -21,38 +23,32 @@ public DatabaseInitializer(TableInitializer tableInitializer) { * Добавляет в контекст информацию об инициализируемой бд. * Запускает инициализацию всех таблиц это базы * - * @param initialContext контекст с информацией об инициализируемой бд и об окружении + * @param context контекст с информацией об инициализируемой бд и об окружении * @throws DatabaseException если в контексте лежит неправильный путь к базе, невозможно прочитать содержимого папки, - * или если возникла ошибка дочерних инициализаторов + * или если возникла ошибка дочерних инициализаторов */ @Override - public void perform(InitializationContext initialContext) throws DatabaseException { + public void perform(InitializationContext context) throws DatabaseException { - DatabaseInitializationContext dbInitializationContext = initialContext.currentDbContext(); - if(!Files.exists(dbInitializationContext.getDatabasePath())){ - throw new DatabaseException("We dont have this DataBase" + dbInitializationContext.getDbName()); - } - File directory = new File(dbInitializationContext.getDatabasePath().toString()); - if (initialContext.currentDbContext() == null) { - throw new DatabaseException("Error with ContextTable"+ initialContext.currentTableContext()); + DatabaseInitializationContext dbinitialContext = context.currentDbContext(); + if(!Files.exists(dbinitialContext.getDatabasePath())){ + throw new DatabaseException("We dont have this " + dbinitialContext.getDbName()); } - if(!directory.exists()){ - throw new DatabaseException(dbInitializationContext.getDbName() + "doesnt exists"); + File curFile = new File(dbinitialContext.getDatabasePath().toString()); + if(!curFile.exists()){ + throw new DatabaseException(dbinitialContext.getDbName() + " does not exist"); } - File[] tables = directory.listFiles(); - if(tables == null){ - throw new DatabaseException("Error with working" + directory.toString()); - } + File[] directory = curFile.listFiles(); - if (directory.listFiles() == null) { - return; + if(directory == null){ + throw new DatabaseException("Error while working with " + curFile.toString()); } - for (File table : tables) { - TableInitializationContextImpl tableContext = new TableInitializationContextImpl(table.getName(), dbInitializationContext.getDatabasePath(), new TableIndex()); - tableInitializer.perform(new InitializationContextImpl(initialContext.executionEnvironment(), dbInitializationContext, tableContext,null)); + for (File table : directory) { + TableInitializationContextImpl tableContext = new TableInitializationContextImpl(table.getName(), dbinitialContext.getDatabasePath(), new TableIndex()); + tableInitializer.perform(new InitializationContextImpl(context.executionEnvironment(), dbinitialContext, tableContext,null)); } - Database database = DatabaseImpl.initializeFromContext(dbInitializationContext); - initialContext.executionEnvironment().addDatabase(database); + Database database = DatabaseImpl.initializeFromContext(dbinitialContext); + context.executionEnvironment().addDatabase(database); } } diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java index 1333236a..1b7cf919 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java @@ -29,14 +29,14 @@ public DatabaseServerInitializer(DatabaseInitializer databaseInitializer) { @Override public void perform(InitializationContext context) throws DatabaseException { - ExecutionEnvironment exEnvironment = context.executionEnvironment(); - Path path = exEnvironment.getWorkingPath(); + ExecutionEnvironment ExecutionEnvironment = context.executionEnvironment(); + Path path = ExecutionEnvironment.getWorkingPath(); if(!Files.exists(path)){ try{ Files.createDirectory(path); - }catch (IOException ex){ - throw new DatabaseException("Error while creating directory " + path.toString(), ex); + }catch (IOException e){ + throw new DatabaseException("Problems occurred while creating directory " + path.toString(), e); } } File curFile = new File(path.toString()); From 25c63b48083572aa7cfc9f4fd73d03af22c01844 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 00:06:25 +0300 Subject: [PATCH 088/378] 1/05/1 --- .../initialization/impl/SegmentInitializer.java | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java index 1577430f..3a36d12d 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java @@ -35,18 +35,16 @@ public class SegmentInitializer implements Initializer { @Override public void perform(InitializationContext context) throws DatabaseException { - if (context.currentSegmentContext() == null) { - throw new DatabaseException("Why" + context.currentSegmentContext() + "is null?"); - } SegmentInitializationContext segmentinitialContext = context.currentSegmentContext(); SegmentIndex segmentIndex = segmentinitialContext.getIndex(); Path segmentPath = segmentinitialContext.getSegmentPath(); Segment segment = SegmentImpl.initializeFromContext(segmentinitialContext); int offset = 0; + if (!Files.exists(segmentPath)) { throw new DatabaseException(segmentinitialContext.getSegmentName() + " does not exist"); } - ArrayList keys= new ArrayList<>(); + ArrayList keys = new ArrayList<>(); try (DatabaseInputStream InputStream = new DatabaseInputStream(new FileInputStream(segmentPath.toFile()))) { Optional dbUnitOptional = InputStream.readDbUnit(); while (dbUnitOptional.isPresent()) { @@ -59,14 +57,12 @@ public void perform(InitializationContext context) throws DatabaseException { } catch (IOException ex) { throw new DatabaseException("Error while initialisation segment", ex); } - Segment newSegment = SegmentImpl.initializeFromContext(new SegmentInitializationContextImpl(segmentinitialContext.getSegmentName(), - segmentinitialContext.getSegmentPath(), offset, segmentIndex)); - for (String key : keys){ - context.currentTableContext().getTableIndex().onIndexedEntityUpdated(key, segment); + Segment newSegment = SegmentImpl.initializeFromContext(new SegmentInitializationContextImpl(segmentinitialContext.getSegmentName(), segmentinitialContext.getSegmentPath(), offset, segmentIndex)); + for (String i : keys){ + context.currentTableContext().getTableIndex().onIndexedEntityUpdated(i, segment); } context.currentTableContext().updateCurrentSegment(newSegment); } - - } +} From 045c06fa248cf079c9d73c82ec1cef52504d8495 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 00:10:49 +0300 Subject: [PATCH 089/378] 1/05/2 --- .../impl/TableInitializationContextImpl.java | 2 +- .../initialization/impl/TableInitializer.java | 23 ++++++++----------- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java index 3b4e7f0d..39b54c26 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java @@ -42,6 +42,6 @@ public Segment getCurrentSegment() { @Override public void updateCurrentSegment(Segment segment) { - this.lastSegment = segment; + lastSegment = segment; } } diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java index 624bf15f..afccb0ad 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java @@ -27,34 +27,31 @@ public TableInitializer(SegmentInitializer segmentInitializer) { * * @param context контекст с информацией об инициализируемой бд, окружении, таблицы * @throws DatabaseException если в контексте лежит неправильный путь к таблице, невозможно прочитать содержимого папки, - * или если возникла ошибка ошибка дочерних инициализаторов + * или если возникла ошибка ошибка дочерних инициализаторов */ @Override public void perform(InitializationContext context) throws DatabaseException { - if (context.currentTableContext() == null) { - throw new DatabaseException("Error with ContextTable"+ context.currentTableContext()); - } - if (context.currentDbContext() == null) { - throw new DatabaseException("Error with ContextTable"+context.currentTableContext()); - } TableInitializationContext tbinitalContext = context.currentTableContext(); File curFile = new File(tbinitalContext.getTablePath().toString()); - if(!curFile.exists()){ + + if (!curFile.exists()) { throw new DatabaseException("Directory " + tbinitalContext.getTableName() + " does not exist"); } File[] files = curFile.listFiles(); - if(files == null){ + + if (files == null) { throw new DatabaseException("Error while working " + curFile.toString()); } + List filesList = Arrays.asList(files); Collections.sort(filesList); - for (File i : filesList){ + + for (File i : filesList) { SegmentInitializationContext segmentContext = new SegmentInitializationContextImpl(i.getName(), tbinitalContext.getTablePath(), 0); segmentInitializer.perform(new InitializationContextImpl(context.executionEnvironment(), context.currentDbContext(), context.currentTableContext(), segmentContext)); } - Table table = TableImpl.initializeFromContext(tbinitalContext); - context.currentDbContext().addTable(table); - + Table newTable = TableImpl.initializeFromContext(tbinitalContext); + context.currentDbContext().addTable(newTable); } } From 8f59a8abd3ab68a952dc36d23e6d03cb409e02fa Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 00:30:06 +0300 Subject: [PATCH 090/378] 1/05/3 --- .../java/com/itmo/java/basics/logic/impl/SegmentImpl.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index a1297112..75eaed40 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -29,9 +29,9 @@ */ public class SegmentImpl implements Segment { - private Path tableRootPath; - private String segmentName; - private SegmentIndex segmentIndex; + private final Path tableRootPath; + private final String segmentName; + private final SegmentIndex segmentIndex; private final long sizeMaximum = 100000; private long segmentSize = 0; From 60bd4e11af2a90d631e23debdce0dfeca96abdfa Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 00:42:05 +0300 Subject: [PATCH 091/378] 1/05/04 --- .../initialization/impl/DatabaseInitializationContextImpl.java | 2 +- .../basics/initialization/impl/DatabaseServerInitializer.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java index ada2d97d..2beffca5 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java @@ -16,7 +16,7 @@ public class DatabaseInitializationContextImpl implements DatabaseInitialization public DatabaseInitializationContextImpl(String dbName, Path databaseRoot) { this.dbName = dbName; - this.dbRoot = Path.of(databaseRoot.toString(), dbName); + this.dbRoot = databaseRoot; } @Override diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java index 1b7cf919..a15c9e43 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java @@ -36,7 +36,7 @@ public void perform(InitializationContext context) throws DatabaseException { try{ Files.createDirectory(path); }catch (IOException e){ - throw new DatabaseException("Problems occurred while creating directory " + path.toString(), e); + throw new DatabaseException("Error while creating " + path.toString(), e); } } File curFile = new File(path.toString()); From 3d06607a21686deb8fb25857fa059950dc2125ef Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 00:43:20 +0300 Subject: [PATCH 092/378] 1 --- .../initialization/impl/DatabaseInitializationContextImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java index 2beffca5..ada2d97d 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java @@ -16,7 +16,7 @@ public class DatabaseInitializationContextImpl implements DatabaseInitialization public DatabaseInitializationContextImpl(String dbName, Path databaseRoot) { this.dbName = dbName; - this.dbRoot = databaseRoot; + this.dbRoot = Path.of(databaseRoot.toString(), dbName); } @Override From dfc38341cf0b6490fabfdeb71df933d0c653b3e9 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 00:44:04 +0300 Subject: [PATCH 093/378] 1 --- .../initialization/impl/DatabaseInitializationContextImpl.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java index ada2d97d..2794adbd 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java @@ -14,6 +14,8 @@ public class DatabaseInitializationContextImpl implements DatabaseInitialization private Path dbRoot; private Map tablesMap = new HashMap<>(); + + public DatabaseInitializationContextImpl(String dbName, Path databaseRoot) { this.dbName = dbName; this.dbRoot = Path.of(databaseRoot.toString(), dbName); From 63c8fe1b6c1a47476c6c5e0c4fe94fb47ddeca9d Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 00:47:10 +0300 Subject: [PATCH 094/378] kkk --- .../java/com/itmo/java/basics/config/DatabaseConfig.java | 2 ++ .../java/basics/console/impl/ExecutionEnvironmentImpl.java | 2 ++ .../impl/DatabaseInitializationContextImpl.java | 5 ++++- .../java/basics/initialization/impl/DatabaseInitializer.java | 2 ++ .../initialization/impl/DatabaseServerInitializer.java | 2 ++ .../impl/SegmentInitializationContextImpl.java | 2 ++ .../java/basics/initialization/impl/SegmentInitializer.java | 3 +++ .../initialization/impl/TableInitializationContextImpl.java | 2 ++ .../java/basics/initialization/impl/TableInitializer.java | 2 ++ .../java/com/itmo/java/basics/logic/impl/CachingTable.java | 2 ++ .../com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java | 2 ++ .../itmo/java/basics/logic/impl/RemoveDatabaseRecord.java | 2 ++ .../java/com/itmo/java/basics/logic/impl/SegmentImpl.java | 2 ++ src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java | 2 ++ 14 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java b/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java index 7f657092..cf89ef57 100644 --- a/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java +++ b/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java @@ -9,6 +9,8 @@ public DatabaseConfig(String workingPath) { this.workingPath =workingPath; } + + public String getWorkingPath() { return workingPath; } diff --git a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java index f2ef4219..3038946b 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java +++ b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java @@ -17,6 +17,8 @@ public ExecutionEnvironmentImpl(DatabaseConfig config) { dbConfig = config; } + + @Override public Optional getDatabase(String name) { return Optional.ofNullable(dataBase.get(name)); diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java index 2794adbd..dc42499f 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java @@ -14,7 +14,10 @@ public class DatabaseInitializationContextImpl implements DatabaseInitialization private Path dbRoot; private Map tablesMap = new HashMap<>(); - + + + + public DatabaseInitializationContextImpl(String dbName, Path databaseRoot) { this.dbName = dbName; diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java index 5dae8d47..3dc48566 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java @@ -30,6 +30,8 @@ public DatabaseInitializer(TableInitializer tableInitializer) { @Override public void perform(InitializationContext context) throws DatabaseException { + + DatabaseInitializationContext dbinitialContext = context.currentDbContext(); if(!Files.exists(dbinitialContext.getDatabasePath())){ throw new DatabaseException("We dont have this " + dbinitialContext.getDbName()); diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java index a15c9e43..1a92b699 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java @@ -29,6 +29,8 @@ public DatabaseServerInitializer(DatabaseInitializer databaseInitializer) { @Override public void perform(InitializationContext context) throws DatabaseException { + + ExecutionEnvironment ExecutionEnvironment = context.executionEnvironment(); Path path = ExecutionEnvironment.getWorkingPath(); diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java index 2cb042cf..a1d5ed47 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java @@ -20,6 +20,8 @@ public SegmentInitializationContextImpl(String segmentName, Path segmentPath, in this.segmentIndex = index; } + + public SegmentInitializationContextImpl(String segmentName, Path tablePath, int currentSize) { this.segmentName = segmentName; this.segmentPath = Paths.get(tablePath.toString(),segmentName); diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java index 3a36d12d..fffba091 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java @@ -61,6 +61,9 @@ public void perform(InitializationContext context) throws DatabaseException { for (String i : keys){ context.currentTableContext().getTableIndex().onIndexedEntityUpdated(i, segment); } + + + context.currentTableContext().updateCurrentSegment(newSegment); } } diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java index 39b54c26..17828108 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java @@ -20,6 +20,8 @@ public TableInitializationContextImpl(String tableName, Path databasePath, Table } + + @Override public String getTableName() { return tableName; diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java index afccb0ad..b0428efc 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java @@ -31,6 +31,8 @@ public TableInitializer(SegmentInitializer segmentInitializer) { */ @Override + + public void perform(InitializationContext context) throws DatabaseException { TableInitializationContext tbinitalContext = context.currentTableContext(); File curFile = new File(tbinitalContext.getTablePath().toString()); diff --git a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java index 4c470539..9e17e3a6 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java @@ -11,6 +11,8 @@ */ public class CachingTable implements Table { + + private final Table cacheTable; private final DatabaseCache dbCache; private final int maxCache = 10000; diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java index 29d9740d..6981f06b 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java @@ -20,6 +20,8 @@ protected boolean removeEldestEntry(Map.Entry eldest) { }; } + + @Override public byte[] get(String key) { return dbCache.get(key); diff --git a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java index a5f2c367..89bc5d6d 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java @@ -31,6 +31,8 @@ public long size() { @Override public boolean isValuePresented() { return false; } + + @Override public int getKeySize() { return key.length; diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 75eaed40..ad1842fe 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -51,6 +51,8 @@ private SegmentImpl(SegmentInitializationContext context , OutputStream outStrea this.outStream = new DatabaseOutputStream(outStream); } + + public static Segment create(String segmentName, Path tableRootPath) throws DatabaseException { Path segmentRoot = Paths.get(tableRootPath.toString(), segmentName); boolean isCreated; diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index 1b129113..21f557aa 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -50,6 +50,8 @@ public static Table create(String tableName, Path pathToDatabaseRoot, TableIndex return new CachingTable(newTb); } + + public static Table initializeFromContext(TableInitializationContext context) { try { return new CachingTable(new TableImpl(context)); From a676b7f06e961dee6781cc8365b1868a8bacb6fb Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 00:47:17 +0300 Subject: [PATCH 095/378] kkk --- src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java | 2 ++ .../java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index 1a2e4882..5b587421 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -63,6 +63,8 @@ public static Database initializeFromContext(DatabaseInitializationContext conte return new DatabaseImpl(context); } + + @Override public String getName() { return dbName; diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java index 0d8d75b7..eeb55aa2 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java @@ -15,6 +15,8 @@ public SetDatabaseRecord(byte[] key, byte[] value) { this.value = value; } + + @Override public byte[] getKey() { return key; From 6e1732f1e175cac8a5c219aa9fb7c1c6a099cdba Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 00:51:02 +0300 Subject: [PATCH 096/378] k --- .../itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java | 2 +- src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java index 3038946b..bd56d391 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java +++ b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java @@ -18,7 +18,7 @@ public ExecutionEnvironmentImpl(DatabaseConfig config) { } - + @Override public Optional getDatabase(String name) { return Optional.ofNullable(dataBase.get(name)); diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index ad1842fe..411954f1 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -73,7 +73,7 @@ public static Segment create(String segmentName, Path tableRootPath) throws Data public static Segment initializeFromContext(SegmentInitializationContext context) { OutputStream outputStream; try{ - outputStream = Files.newOutputStream(context.getSegmentPath()); + outputStream = Files.newOutputStream(context.getSegmentPath(),APPEND); }catch(IOException ex){ outputStream = null; } From adf824cec971ea3d2711e977d79d8c8582c57ed8 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 00:55:55 +0300 Subject: [PATCH 097/378] k --- .../com/itmo/java/basics/logic/impl/CachingTable.java | 2 +- .../com/itmo/java/basics/logic/impl/SegmentImpl.java | 9 +-------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java index 9e17e3a6..1842cb6f 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java @@ -3,7 +3,7 @@ import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.logic.DatabaseCache; import com.itmo.java.basics.logic.Table; - +import static java.nio.file.StandardOpenOption.APPEND; import java.util.Optional; /** diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 411954f1..cc1613e8 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -19,14 +19,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.Optional; - -/** - * Сегмент - append-only файл, хранящий пары ключ-значение, разделенные специальным символом. - * - имеет ограниченный размер, большие значения (>100000) записываются в последний сегмент, если он не read-only - * - при превышении размера сегмента создается новый сегмент и дальнейшие операции записи производятся в него - * - именование файла-сегмента должно позволять установить очередность их появления - * - является неизменяемым после появления более нового сегмента - */ +import static java.nio.file.StandardOpenOption.APPEND; public class SegmentImpl implements Segment { private final Path tableRootPath; From 3917cb15d8c708844977d49864f22a42530410ca Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 01:00:57 +0300 Subject: [PATCH 098/378] kkk --- .../java/basics/initialization/impl/SegmentInitializer.java | 4 +--- .../java/com/itmo/java/basics/logic/impl/SegmentImpl.java | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java index fffba091..9b3df02b 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java @@ -61,9 +61,7 @@ public void perform(InitializationContext context) throws DatabaseException { for (String i : keys){ context.currentTableContext().getTableIndex().onIndexedEntityUpdated(i, segment); } - - - + context.currentTableContext().updateCurrentSegment(newSegment); } } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index cc1613e8..0abdee69 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -120,7 +120,7 @@ public Optional read(String objectKey) throws IOException { return Optional.empty(); } - return Optional.of(value.get().getValue()); + return Optional.ofNullable(value.get().getValue()); } catch (IOException exception) { throw new IOException("Error while creating a Segment file " + segmentName, exception); From 53c463f08d070f9e862b27d695ea66490e165e22 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 01:02:35 +0300 Subject: [PATCH 099/378] 1 --- .../java/basics/initialization/impl/SegmentInitializer.java | 2 +- src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java index 9b3df02b..25b7cfd2 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java @@ -61,7 +61,7 @@ public void perform(InitializationContext context) throws DatabaseException { for (String i : keys){ context.currentTableContext().getTableIndex().onIndexedEntityUpdated(i, segment); } - + context.currentTableContext().updateCurrentSegment(newSegment); } } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 0abdee69..cc1613e8 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -120,7 +120,7 @@ public Optional read(String objectKey) throws IOException { return Optional.empty(); } - return Optional.ofNullable(value.get().getValue()); + return Optional.of(value.get().getValue()); } catch (IOException exception) { throw new IOException("Error while creating a Segment file " + segmentName, exception); From 1ec9c179f84f460426b2812e187c61885de95d0d Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 01:05:05 +0300 Subject: [PATCH 100/378] 1 --- .../java/basics/logic/impl/SegmentImpl.java | 2 +- .../basics/logic/io/DatabaseInputStream.java | 28 ++++++------------- 2 files changed, 10 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index cc1613e8..0abdee69 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -120,7 +120,7 @@ public Optional read(String objectKey) throws IOException { return Optional.empty(); } - return Optional.of(value.get().getValue()); + return Optional.ofNullable(value.get().getValue()); } catch (IOException exception) { throw new IOException("Error while creating a Segment file " + segmentName, exception); diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java index 89942c99..2287f704 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java @@ -2,6 +2,7 @@ import com.itmo.java.basics.logic.DatabaseRecord; import com.itmo.java.basics.logic.WritableDatabaseRecord; +import com.itmo.java.basics.logic.impl.RemoveDatabaseRecord; import com.itmo.java.basics.logic.impl.SetDatabaseRecord; import java.io.DataInputStream; @@ -28,30 +29,19 @@ public DatabaseInputStream(InputStream inputStream) { public Optional readDbUnit() throws IOException { try { - if (available() <= 4) { - return Optional.empty(); - } int keySize = readInt(); - - if (available() <= 0) { - return Optional.empty(); - } byte[] key = readNBytes(keySize); - - if (available() <= 4) { - return Optional.empty(); - } int valueSize = readInt(); - if ((available() <= 0) && (valueSize == REMOVED_OBJECT_SIZE)) { - return Optional.empty(); + if (valueSize != REMOVED_OBJECT_SIZE) { + byte[] value = readNBytes(valueSize); + Optional res = Optional.of(new SetDatabaseRecord(key, value)); + return res; + } else { + return Optional.of(new RemoveDatabaseRecord(key)); } - byte[] value = readNBytes(valueSize); - SetDatabaseRecord datarecord = new SetDatabaseRecord(key, value); - - return Optional.of(datarecord); - } catch (EOFException ex) { - return Optional.empty(); + } catch (EOFException e) { + return Optional.empty(); } } } \ No newline at end of file From e6d958a8c9792ec83596f2026862bab5ce08464c Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 01:48:05 +0300 Subject: [PATCH 101/378] 1 --- db2/table1/table1_1617306857629 | Bin 31 -> 0 bytes .../java/com/itmo/java/basics/MainTest.java | 50 ++++++++++-------- .../java/basics/logic/impl/SegmentImpl.java | 6 +-- .../java/basics/logic/impl/TableImpl.java | 7 ++- 4 files changed, 33 insertions(+), 30 deletions(-) delete mode 100644 db2/table1/table1_1617306857629 diff --git a/db2/table1/table1_1617306857629 b/db2/table1/table1_1617306857629 deleted file mode 100644 index ba4d766957f7e117619fb71f3dad900a4deaff63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31 ccmZQzU|=+4U|?V=Elw>0(u{`xfdI|`0A(2pQUCw| diff --git a/src/main/java/com/itmo/java/basics/MainTest.java b/src/main/java/com/itmo/java/basics/MainTest.java index 1e60e4a0..eec8a891 100644 --- a/src/main/java/com/itmo/java/basics/MainTest.java +++ b/src/main/java/com/itmo/java/basics/MainTest.java @@ -18,17 +18,21 @@ public class MainTest { public static void main(String[] args) throws DatabaseException, IOException { - Files.walk(Path.of("db", "anime")) - .sorted(Comparator.reverseOrder()) - .map(Path::toFile) - .forEach(File::delete); - Database db = DatabaseImpl.create("anime", Path.of("db")); - db.createTableIfNotExists("naruto"); - db.write("naruto", "key", "value".getBytes(StandardCharsets.UTF_8)); - db.write("naruto", "key", "value2".getBytes(StandardCharsets.UTF_8)); - db.write("naruto", "key", null); - db.write("naruto", "key1", "value1".getBytes(StandardCharsets.UTF_8)); - db.write("naruto", "key2", "".getBytes(StandardCharsets.UTF_8)); +// Files.walk(Path.of("db", "anime")) +// .sorted(Comparator.reverseOrder()) +// .map(Path::toFile) +// .forEach(File::delete); + try { + Database db = DatabaseImpl.create("anime", Path.of("db")); + db.createTableIfNotExists("naruto"); + db.write("naruto", "key", "value".getBytes(StandardCharsets.UTF_8)); + db.write("naruto", "key", "value2".getBytes(StandardCharsets.UTF_8)); + db.write("naruto", "key", null); + db.write("naruto", "key1", "value1".getBytes(StandardCharsets.UTF_8)); + db.write("naruto", "key2", "".getBytes(StandardCharsets.UTF_8)); + } + catch (DatabaseException ex) + {throw new DatabaseException(ex);} // System.out.printf( // "get = %s expected = %s\n", // new String(db.read("naruto", "saske").get()), @@ -48,17 +52,17 @@ public static void main(String[] args) throws DatabaseException, IOException { // "ora" // ); - Initializer initializer = - new DatabaseServerInitializer( - new DatabaseInitializer( - new TableInitializer( - new SegmentInitializer()))); - var execEnv = new ExecutionEnvironmentImpl( - new DatabaseConfig("db") - ); - var context = new InitializationContextImpl( - execEnv, null, null, null - ); - initializer.perform(context); +// Initializer initializer = +// new DatabaseServerInitializer( +// new DatabaseInitializer( +// new TableInitializer( +// new SegmentInitializer()))); +// var execEnv = new ExecutionEnvironmentImpl( +// new DatabaseConfig("db") +// ); +// var context = new InitializationContextImpl( +// execEnv, null, null, null +// ); +// initializer.perform(context); } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 0abdee69..742f95de 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -54,11 +54,11 @@ public static Segment create(String segmentName, Path tableRootPath) throws Data try{ isCreated = segmentRoot.toFile().createNewFile(); outputStream = Files.newOutputStream(segmentRoot); - }catch(IOException ex){ - throw new DatabaseException("Error while creating segment " + segmentName, ex); + }catch(IOException exception){ + throw new DatabaseException("Error while creating a Segment file " + segmentName, exception); } if(!isCreated){ - throw new DatabaseException("Error while creating segment " + segmentName + "as it already exists"); + throw new DatabaseException("Error while creating a Segment file " + segmentName + "as it already exists"); } return new SegmentImpl(segmentRoot, segmentName, outputStream); } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index 21f557aa..d1ede7da 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -33,7 +33,7 @@ private TableImpl(TableInitializationContext context) { this.tableIndex = context.getTableIndex(); } - public static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { + public static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { if (tableName == null) { throw new DatabaseException("Why tableBase name is null?"); @@ -46,16 +46,15 @@ public static Table create(String tableName, Path pathToDatabaseRoot, TableIndex } catch (IOException ex) { throw new DatabaseException("Error while creating a Table(" + tableName + ") directory"); } - TableImpl newTb = new TableImpl(tableName , pathToTableRoot , tableIndex); + TableImpl newTb = new TableImpl(tableName, pathToTableRoot, tableIndex); return new CachingTable(newTb); } - public static Table initializeFromContext(TableInitializationContext context) { try { return new CachingTable(new TableImpl(context)); - }catch (Exception ex) { + } catch (Exception ex) { return null; } } From a50283e264917d23d68867f13444546767cbc848 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 01:53:40 +0300 Subject: [PATCH 102/378] 1 --- .../com/itmo/java/basics/logic/io/DatabaseOutputStream.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java index 68c0455d..b3bb0fbf 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java @@ -45,7 +45,7 @@ public int write(WritableDatabaseRecord databaseRecord) throws IOException { } flush(); - return databaseRecord.getKeySize() + databaseRecord.getValueSize() + 8; + return (int) databaseRecord.size(); } } \ No newline at end of file From 60fc41c70cc8ef8c1a170c158917841b20c95e53 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 01:53:49 +0300 Subject: [PATCH 103/378] 1 --- .../java/com/itmo/java/basics/logic/impl/SegmentImpl.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 742f95de..8bfc3800 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -137,12 +137,7 @@ public boolean delete(String objectKey) throws IOException { outStream.close(); return false; } - - if (segmentIndex.searchForKey(objectKey).isEmpty()){ - outStream.close(); - return false; - } - + RemoveDatabaseRecord newSeg = new RemoveDatabaseRecord(objectKey.getBytes()); segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); segmentSize += outStream.write(newSeg); From e77eed3b2be7bb681b70e232797f5abba5d1366d Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 01:56:36 +0300 Subject: [PATCH 104/378] 1 --- .../java/com/itmo/java/basics/logic/impl/SegmentImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 8bfc3800..74430b34 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -120,7 +120,7 @@ public Optional read(String objectKey) throws IOException { return Optional.empty(); } - return Optional.ofNullable(value.get().getValue()); + return Optional.of(value.get().getValue()); } catch (IOException exception) { throw new IOException("Error while creating a Segment file " + segmentName, exception); @@ -137,7 +137,7 @@ public boolean delete(String objectKey) throws IOException { outStream.close(); return false; } - + RemoveDatabaseRecord newSeg = new RemoveDatabaseRecord(objectKey.getBytes()); segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); segmentSize += outStream.write(newSeg); From f8aa68e3df070c5e23970f116868f1a9ce5a5c4e Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 01:56:51 +0300 Subject: [PATCH 105/378] 1 --- src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 74430b34..e32bfa91 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -120,7 +120,7 @@ public Optional read(String objectKey) throws IOException { return Optional.empty(); } - return Optional.of(value.get().getValue()); + return Optional.ofNullable(value.get().getValue()); } catch (IOException exception) { throw new IOException("Error while creating a Segment file " + segmentName, exception); From d800a877f42f68c29e6591948ede1f2b2be5fc51 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 01:57:05 +0300 Subject: [PATCH 106/378] 1 --- src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index e32bfa91..74430b34 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -120,7 +120,7 @@ public Optional read(String objectKey) throws IOException { return Optional.empty(); } - return Optional.ofNullable(value.get().getValue()); + return Optional.of(value.get().getValue()); } catch (IOException exception) { throw new IOException("Error while creating a Segment file " + segmentName, exception); From 1dbdeea60dd56eb96fef649c96a9478e1f4648f7 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 01:58:29 +0300 Subject: [PATCH 107/378] 1 --- src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 74430b34..e32bfa91 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -120,7 +120,7 @@ public Optional read(String objectKey) throws IOException { return Optional.empty(); } - return Optional.of(value.get().getValue()); + return Optional.ofNullable(value.get().getValue()); } catch (IOException exception) { throw new IOException("Error while creating a Segment file " + segmentName, exception); From dd9f861eb90809804ebcf8917eaea7c72dc1b58a Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 02:07:12 +0300 Subject: [PATCH 108/378] 1 --- .../java/com/itmo/java/basics/logic/impl/CachingTable.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java index 1842cb6f..5a6404d1 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java @@ -3,7 +3,6 @@ import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.logic.DatabaseCache; import com.itmo.java.basics.logic.Table; -import static java.nio.file.StandardOpenOption.APPEND; import java.util.Optional; /** @@ -13,9 +12,9 @@ public class CachingTable implements Table { - private final Table cacheTable; - private final DatabaseCache dbCache; - private final int maxCache = 10000; + private Table cacheTable; + private DatabaseCache dbCache; + static private final int maxCache = 10000; public CachingTable(Table myTable) { this.cacheTable = myTable; From 7ab47ffed61cd71c6f6d10520432707859f39c29 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 02:07:16 +0300 Subject: [PATCH 109/378] Update RemoveDatabaseRecord.java --- .../com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java index 89bc5d6d..269014dd 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java @@ -25,7 +25,7 @@ public byte[] getValue() { @Override public long size() { - return getKeySize() + getValueSize() + 4 + 4; + return getKeySize() + 4 + 4; } @Override From 91c327b27615dc66e49c60e3023c7cf931ff293b Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 03:24:09 +0300 Subject: [PATCH 110/378] ends --- .../java/basics/config/DatabaseConfig.java | 8 ++--- .../impl/ExecutionEnvironmentImpl.java | 8 ++--- .../DatabaseInitializationContextImpl.java | 5 --- .../impl/DatabaseInitializer.java | 33 +++++++++---------- .../impl/DatabaseServerInitializer.java | 13 +++----- .../SegmentInitializationContextImpl.java | 4 +-- .../impl/SegmentInitializer.java | 25 +++++++------- .../impl/TableInitializationContextImpl.java | 5 +-- .../initialization/impl/TableInitializer.java | 8 ++--- 9 files changed, 44 insertions(+), 65 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java b/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java index cf89ef57..6ae46737 100644 --- a/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java +++ b/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java @@ -1,16 +1,14 @@ package com.itmo.java.basics.config; -import java.util.Objects; - public class DatabaseConfig { + public static final String DEFAULT_WORKING_PATH = "db_files"; private final String workingPath; + public DatabaseConfig(String workingPath) { - this.workingPath =workingPath; + this.workingPath = workingPath; } - - public String getWorkingPath() { return workingPath; } diff --git a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java index bd56d391..4f198006 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java +++ b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java @@ -6,19 +6,17 @@ import java.nio.file.Path; import java.util.HashMap; -import java.util.Map; import java.util.Optional; public class ExecutionEnvironmentImpl implements ExecutionEnvironment { - DatabaseConfig dbConfig; - HashMap dataBase = new HashMap(); + DatabaseConfig dbConfig; + HashMap dataBase = new HashMap(); + public ExecutionEnvironmentImpl(DatabaseConfig config) { dbConfig = config; } - - @Override public Optional getDatabase(String name) { return Optional.ofNullable(dataBase.get(name)); diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java index dc42499f..ada2d97d 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java @@ -14,11 +14,6 @@ public class DatabaseInitializationContextImpl implements DatabaseInitialization private Path dbRoot; private Map tablesMap = new HashMap<>(); - - - - - public DatabaseInitializationContextImpl(String dbName, Path databaseRoot) { this.dbName = dbName; this.dbRoot = Path.of(databaseRoot.toString(), dbName); diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java index 3dc48566..80160890 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java @@ -29,28 +29,25 @@ public DatabaseInitializer(TableInitializer tableInitializer) { */ @Override public void perform(InitializationContext context) throws DatabaseException { - - - - DatabaseInitializationContext dbinitialContext = context.currentDbContext(); - if(!Files.exists(dbinitialContext.getDatabasePath())){ - throw new DatabaseException("We dont have this " + dbinitialContext.getDbName()); + if (context.currentDbContext() == null) { + throw new DatabaseException("Context Db is null"); } - File curFile = new File(dbinitialContext.getDatabasePath().toString()); - if(!curFile.exists()){ - throw new DatabaseException(dbinitialContext.getDbName() + " does not exist"); - } - File[] directory = curFile.listFiles(); + File dir = context.currentDbContext().getDatabasePath().toFile(); - if(directory == null){ - throw new DatabaseException("Error while working with " + curFile.toString()); + if (dir.listFiles() == null) { + return; } - for (File table : directory) { - TableInitializationContextImpl tableContext = new TableInitializationContextImpl(table.getName(), dbinitialContext.getDatabasePath(), new TableIndex()); - tableInitializer.perform(new InitializationContextImpl(context.executionEnvironment(), dbinitialContext, tableContext,null)); + File[] tables = dir.listFiles(); + for (File table : tables) { + InitializationContext init = new InitializationContextImpl(context.executionEnvironment(), + context.currentDbContext(), + new TableInitializationContextImpl(table.getName(), table.toPath(), new TableIndex()), + context.currentSegmentContext()); + + tableInitializer.perform(init); } - Database database = DatabaseImpl.initializeFromContext(dbinitialContext); - context.executionEnvironment().addDatabase(database); + + context.executionEnvironment().addDatabase(DatabaseImpl.initializeFromContext(context.currentDbContext())); } } diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java index 1a92b699..8f032d34 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java @@ -2,10 +2,8 @@ import com.itmo.java.basics.console.ExecutionEnvironment; import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.index.impl.TableIndex; import com.itmo.java.basics.initialization.InitializationContext; import com.itmo.java.basics.initialization.Initializer; -import com.itmo.java.basics.logic.impl.DatabaseImpl; import java.io.File; import java.io.IOException; @@ -29,21 +27,18 @@ public DatabaseServerInitializer(DatabaseInitializer databaseInitializer) { @Override public void perform(InitializationContext context) throws DatabaseException { - - ExecutionEnvironment ExecutionEnvironment = context.executionEnvironment(); Path path = ExecutionEnvironment.getWorkingPath(); - - if(!Files.exists(path)){ - try{ + if (!Files.exists(path)) { + try { Files.createDirectory(path); - }catch (IOException e){ + } catch (IOException e) { throw new DatabaseException("Error while creating " + path.toString(), e); } } File curFile = new File(path.toString()); File[] files = curFile.listFiles(); - if(files == null){ + if (files == null) { throw new DatabaseException("Error while working with" + curFile.toString()); } for (File in : files) { diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java index a1d5ed47..84844e53 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java @@ -20,11 +20,9 @@ public SegmentInitializationContextImpl(String segmentName, Path segmentPath, in this.segmentIndex = index; } - - public SegmentInitializationContextImpl(String segmentName, Path tablePath, int currentSize) { this.segmentName = segmentName; - this.segmentPath = Paths.get(tablePath.toString(),segmentName); + this.segmentPath = Paths.get(tablePath.toString(), segmentName); this.currentSize = currentSize; this.segmentIndex = new SegmentIndex(); } diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java index 25b7cfd2..b07dfa66 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java @@ -35,33 +35,34 @@ public class SegmentInitializer implements Initializer { @Override public void perform(InitializationContext context) throws DatabaseException { + int size = 0; SegmentInitializationContext segmentinitialContext = context.currentSegmentContext(); SegmentIndex segmentIndex = segmentinitialContext.getIndex(); Path segmentPath = segmentinitialContext.getSegmentPath(); Segment segment = SegmentImpl.initializeFromContext(segmentinitialContext); - int offset = 0; + ArrayList keys = new ArrayList<>(); if (!Files.exists(segmentPath)) { throw new DatabaseException(segmentinitialContext.getSegmentName() + " does not exist"); } - ArrayList keys = new ArrayList<>(); try (DatabaseInputStream InputStream = new DatabaseInputStream(new FileInputStream(segmentPath.toFile()))) { - Optional dbUnitOptional = InputStream.readDbUnit(); - while (dbUnitOptional.isPresent()) { - DatabaseRecord dbUnit = dbUnitOptional.get(); - segmentIndex.onIndexedEntityUpdated(new String(dbUnit.getKey()), new SegmentOffsetInfoImpl(offset)); - offset += dbUnit.size(); + Optional dbUnitOp = InputStream.readDbUnit(); + while (dbUnitOp.isPresent()) { + DatabaseRecord dbUnit = dbUnitOp.get(); + segmentIndex.onIndexedEntityUpdated(new String(dbUnit.getKey()), new SegmentOffsetInfoImpl(size)); + size += dbUnit.size(); keys.add(new String(dbUnit.getKey())); - dbUnitOptional = InputStream.readDbUnit(); + dbUnitOp = InputStream.readDbUnit(); } } catch (IOException ex) { throw new DatabaseException("Error while initialisation segment", ex); } - Segment newSegment = SegmentImpl.initializeFromContext(new SegmentInitializationContextImpl(segmentinitialContext.getSegmentName(), segmentinitialContext.getSegmentPath(), offset, segmentIndex)); - for (String i : keys){ - context.currentTableContext().getTableIndex().onIndexedEntityUpdated(i, segment); - } + Segment newSegment = SegmentImpl.initializeFromContext(new SegmentInitializationContextImpl(segmentinitialContext.getSegmentName(), segmentinitialContext.getSegmentPath(), size, segmentIndex)); + + for (String in : keys){ + context.currentTableContext().getTableIndex().onIndexedEntityUpdated(in, segment); + } context.currentTableContext().updateCurrentSegment(newSegment); } } diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java index 17828108..f757eca1 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializationContextImpl.java @@ -15,13 +15,10 @@ public class TableInitializationContextImpl implements TableInitializationContex public TableInitializationContextImpl(String tableName, Path databasePath, TableIndex tableIndex) { this.tableName = tableName; - this.databasePath = Path.of(databasePath.toString() ,tableName); + this.databasePath = Path.of(databasePath.toString(), tableName); this.tableIndex = tableIndex; } - - - @Override public String getTableName() { return tableName; diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java index b0428efc..f567bafe 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java @@ -46,11 +46,11 @@ public void perform(InitializationContext context) throws DatabaseException { throw new DatabaseException("Error while working " + curFile.toString()); } - List filesList = Arrays.asList(files); - Collections.sort(filesList); + List segments = Arrays.asList(files); + Collections.sort(segments); - for (File i : filesList) { - SegmentInitializationContext segmentContext = new SegmentInitializationContextImpl(i.getName(), tbinitalContext.getTablePath(), 0); + for (File seg : segments) { + SegmentInitializationContext segmentContext = new SegmentInitializationContextImpl(seg.getName(), tbinitalContext.getTablePath(), 0); segmentInitializer.perform(new InitializationContextImpl(context.executionEnvironment(), context.currentDbContext(), context.currentTableContext(), segmentContext)); } Table newTable = TableImpl.initializeFromContext(tbinitalContext); From f63d33c950a1e818975fe656a76afaeee3da23db Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 03:26:17 +0300 Subject: [PATCH 111/378] a --- .../impl/DatabaseInitializer.java | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java index 80160890..5739e922 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java @@ -29,25 +29,26 @@ public DatabaseInitializer(TableInitializer tableInitializer) { */ @Override public void perform(InitializationContext context) throws DatabaseException { - if (context.currentDbContext() == null) { - throw new DatabaseException("Context Db is null"); - } - File dir = context.currentDbContext().getDatabasePath().toFile(); - if (dir.listFiles() == null) { - return; + DatabaseInitializationContext dbinitialContext = context.currentDbContext(); + if (!Files.exists(dbinitialContext.getDatabasePath())) { + throw new DatabaseException("We dont have this " + dbinitialContext.getDbName()); + } + File curFile = new File(dbinitialContext.getDatabasePath().toString()); + if (!curFile.exists()) { + throw new DatabaseException(dbinitialContext.getDbName() + " does not exist"); } - File[] tables = dir.listFiles(); - for (File table : tables) { - InitializationContext init = new InitializationContextImpl(context.executionEnvironment(), - context.currentDbContext(), - new TableInitializationContextImpl(table.getName(), table.toPath(), new TableIndex()), - context.currentSegmentContext()); + File[] directory = curFile.listFiles(); - tableInitializer.perform(init); + if (directory == null) { + throw new DatabaseException("Error while working with " + curFile.toString()); } - - context.executionEnvironment().addDatabase(DatabaseImpl.initializeFromContext(context.currentDbContext())); + for (File table : directory) { + TableInitializationContextImpl tableContext = new TableInitializationContextImpl(table.getName(), dbinitialContext.getDatabasePath(), new TableIndex()); + tableInitializer.perform(new InitializationContextImpl(context.executionEnvironment(), dbinitialContext, tableContext, null)); + } + Database database = DatabaseImpl.initializeFromContext(dbinitialContext); + context.executionEnvironment().addDatabase(database); } } From b370dd2560d03c35cee2779dbd9b63e3da523216 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 03:29:55 +0300 Subject: [PATCH 112/378] good --- .../com/itmo/java/basics/logic/impl/CachingTable.java | 8 +++----- .../itmo/java/basics/logic/impl/DatabaseCacheImpl.java | 6 +++--- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java index 5a6404d1..928e4937 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java @@ -11,14 +11,12 @@ public class CachingTable implements Table { - - private Table cacheTable; - private DatabaseCache dbCache; - static private final int maxCache = 10000; + private final Table cacheTable; + private final DatabaseCache dbCache; public CachingTable(Table myTable) { this.cacheTable = myTable; - this.dbCache = new DatabaseCacheImpl(maxCache); + this.dbCache = new DatabaseCacheImpl(); } @Override diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java index 6981f06b..0e9575fa 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java @@ -7,11 +7,11 @@ public class DatabaseCacheImpl implements DatabaseCache { - private final int dbCapacity ; + private static final int dbCapacity = 5000; private final Map dbCache; - public DatabaseCacheImpl(int dbCapacity) { - this.dbCapacity = dbCapacity; + public DatabaseCacheImpl() { + this.dbCache = new LinkedHashMap(dbCapacity, 1f, true) { @Override protected boolean removeEldestEntry(Map.Entry eldest) { From fbe220d21a5aa44974fc6226ac99e507c38ff94b Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 03:43:17 +0300 Subject: [PATCH 113/378] good? --- .../java/basics/logic/impl/CachingTable.java | 11 +++--- .../java/basics/logic/impl/DatabaseImpl.java | 7 +--- .../basics/logic/io/DatabaseInputStream.java | 35 +++++++++++-------- 3 files changed, 27 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java index 928e4937..5907df77 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java @@ -3,6 +3,7 @@ import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.logic.DatabaseCache; import com.itmo.java.basics.logic.Table; + import java.util.Optional; /** @@ -10,7 +11,6 @@ */ public class CachingTable implements Table { - private final Table cacheTable; private final DatabaseCache dbCache; @@ -32,11 +32,10 @@ public void write(String objectKey, byte[] objectValue) throws DatabaseException @Override public Optional read(String objectKey) throws DatabaseException { - byte[] tryRead = dbCache.get(objectKey); - if (tryRead != null) { - return Optional.of(tryRead); - } - else { + byte[] reading = dbCache.get(objectKey); + if (reading != null) { + return Optional.of(reading); + } else { return cacheTable.read(objectKey); } } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index 5b587421..07b098aa 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -19,6 +19,7 @@ public class DatabaseImpl implements Database { private String dbName; private Path databaseRoot; private Map tableDictionary = new HashMap(); + private DatabaseImpl(String dbName, Path databaseRoot) { this.dbName = dbName; this.databaseRoot = databaseRoot; @@ -30,7 +31,6 @@ private DatabaseImpl(DatabaseInitializationContext context){ this.tableDictionary = context.getTables(); } - public static Database create(String dbName, Path databaseRoot) throws DatabaseException { if (dbName == null) { @@ -39,7 +39,6 @@ public static Database create(String dbName, Path databaseRoot) throws DatabaseE if (Files.exists(Paths.get(databaseRoot.toString(), dbName))) { throw new DatabaseException("This" + dbName + "already exists"); } - try { Files.createDirectory(Paths.get(databaseRoot.toString(), dbName)); } catch (IOException ex) { @@ -79,7 +78,6 @@ public void createTableIfNotExists(String tableName) throws DatabaseException { if ((tableDictionary.containsKey(tableName)) || (Files.exists(Paths.get(databaseRoot.toString(), dbName, tableName)))) { throw new DatabaseException("We have " + tableName + " in " + dbName + "directory"); } - TableIndex newTableIndex = new TableIndex(); Path pathToTableRoot = Paths.get(databaseRoot.toString(), dbName); Table newTable = TableImpl.create(tableName, pathToTableRoot, newTableIndex); @@ -100,9 +98,7 @@ public void write(String tableName, String objectKey, byte[] objectValue) throws @Override public Optional read(String tableName, String objectKey) throws DatabaseException { - Table table = tableDictionary.get(tableName); - if (tableName == null) { throw new DatabaseException("Error while reading in database , null name"); } @@ -111,7 +107,6 @@ public Optional read(String tableName, String objectKey) throws Database @Override public void delete(String tableName, String objectKey) throws DatabaseException { - if (!tableDictionary.containsKey(tableName)) { throw new DatabaseException("Table " + tableName + " doesn't exist in database" + dbName); } diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java index 2287f704..52cedc78 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java @@ -28,20 +28,27 @@ public DatabaseInputStream(InputStream inputStream) { */ public Optional readDbUnit() throws IOException { - try { - int keySize = readInt(); - byte[] key = readNBytes(keySize); - int valueSize = readInt(); - - if (valueSize != REMOVED_OBJECT_SIZE) { - byte[] value = readNBytes(valueSize); - Optional res = Optional.of(new SetDatabaseRecord(key, value)); - return res; - } else { - return Optional.of(new RemoveDatabaseRecord(key)); - } - } catch (EOFException e) { + if (available() <= 4) { return Optional.empty(); } + int keySize = readInt(); + + if (available() <= 0) { + return Optional.empty(); + } + byte[] key = readNBytes(keySize); + + if (available() <= 4) { + return Optional.empty(); + } + int valueSize = readInt(); + + if ((available() <= 0) && (valueSize == REMOVED_OBJECT_SIZE)) { + return Optional.empty(); + } + byte[] value = readNBytes(valueSize); + SetDatabaseRecord datarecord = new SetDatabaseRecord(key, value); + + return Optional.of(datarecord); } -} \ No newline at end of file +} From 6ab609af646cdb808c2d6f426709d60066a1af93 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 03:44:32 +0300 Subject: [PATCH 114/378] g --- .../basics/logic/io/DatabaseInputStream.java | 35 ++++++++----------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java index 52cedc78..2287f704 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java @@ -28,27 +28,20 @@ public DatabaseInputStream(InputStream inputStream) { */ public Optional readDbUnit() throws IOException { - if (available() <= 4) { + try { + int keySize = readInt(); + byte[] key = readNBytes(keySize); + int valueSize = readInt(); + + if (valueSize != REMOVED_OBJECT_SIZE) { + byte[] value = readNBytes(valueSize); + Optional res = Optional.of(new SetDatabaseRecord(key, value)); + return res; + } else { + return Optional.of(new RemoveDatabaseRecord(key)); + } + } catch (EOFException e) { return Optional.empty(); } - int keySize = readInt(); - - if (available() <= 0) { - return Optional.empty(); - } - byte[] key = readNBytes(keySize); - - if (available() <= 4) { - return Optional.empty(); - } - int valueSize = readInt(); - - if ((available() <= 0) && (valueSize == REMOVED_OBJECT_SIZE)) { - return Optional.empty(); - } - byte[] value = readNBytes(valueSize); - SetDatabaseRecord datarecord = new SetDatabaseRecord(key, value); - - return Optional.of(datarecord); } -} +} \ No newline at end of file From 4eed470f93c53b98ee809d4f2c565892bb57e3ee Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 03:46:46 +0300 Subject: [PATCH 115/378] good&& --- .../basics/logic/io/DatabaseInputStream.java | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java index 2287f704..31006d77 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java @@ -29,17 +29,27 @@ public DatabaseInputStream(InputStream inputStream) { public Optional readDbUnit() throws IOException { try { + if (available() <= 4) { + return Optional.empty(); + } int keySize = readInt(); + + if (available() <= 0) { + return Optional.empty(); + } byte[] key = readNBytes(keySize); + + if (available() <= 4) { + return Optional.empty(); + } int valueSize = readInt(); - if (valueSize != REMOVED_OBJECT_SIZE) { - byte[] value = readNBytes(valueSize); - Optional res = Optional.of(new SetDatabaseRecord(key, value)); - return res; - } else { - return Optional.of(new RemoveDatabaseRecord(key)); + if ((available() <= 0) && (valueSize == REMOVED_OBJECT_SIZE)) { + return Optional.empty(); } + byte[] value = readNBytes(valueSize); + SetDatabaseRecord datarecord = new SetDatabaseRecord(key, value); + return Optional.of(datarecord); } catch (EOFException e) { return Optional.empty(); } From 8032bdded39a3f44f338a79c390a311d07ac9301 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 03:48:14 +0300 Subject: [PATCH 116/378] good?? --- .../itmo/java/basics/logic/io/DatabaseInputStream.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java index 31006d77..39c12b07 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java @@ -47,9 +47,13 @@ public Optional readDbUnit() throws IOException { if ((available() <= 0) && (valueSize == REMOVED_OBJECT_SIZE)) { return Optional.empty(); } - byte[] value = readNBytes(valueSize); - SetDatabaseRecord datarecord = new SetDatabaseRecord(key, value); - return Optional.of(datarecord); + if (valueSize != REMOVED_OBJECT_SIZE) { + byte[] value = readNBytes(valueSize); + Optional res = Optional.of(new SetDatabaseRecord(key, value)); + return res; + } else { + return Optional.of(new RemoveDatabaseRecord(key)); + } } catch (EOFException e) { return Optional.empty(); } From 0951a05099af9b8cd2af435067c0ed1aba8eeb81 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 03:49:29 +0300 Subject: [PATCH 117/378] good --- .../java/basics/logic/io/DatabaseInputStream.java | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java index 39c12b07..2287f704 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java @@ -29,24 +29,10 @@ public DatabaseInputStream(InputStream inputStream) { public Optional readDbUnit() throws IOException { try { - if (available() <= 4) { - return Optional.empty(); - } int keySize = readInt(); - - if (available() <= 0) { - return Optional.empty(); - } byte[] key = readNBytes(keySize); - - if (available() <= 4) { - return Optional.empty(); - } int valueSize = readInt(); - if ((available() <= 0) && (valueSize == REMOVED_OBJECT_SIZE)) { - return Optional.empty(); - } if (valueSize != REMOVED_OBJECT_SIZE) { byte[] value = readNBytes(valueSize); Optional res = Optional.of(new SetDatabaseRecord(key, value)); From e4faad1604021066ea3d3fa414b43cafcdbfcf74 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 03:55:14 +0300 Subject: [PATCH 118/378] 1 --- .../com/itmo/java/basics/logic/io/DatabaseInputStream.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java index 2287f704..2de49fba 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java @@ -27,7 +27,6 @@ public DatabaseInputStream(InputStream inputStream) { * @return следующую запись, если она существует. {@link Optional#empty()} - если конец файла достигнут */ public Optional readDbUnit() throws IOException { - try { int keySize = readInt(); byte[] key = readNBytes(keySize); @@ -35,12 +34,12 @@ public Optional readDbUnit() throws IOException { if (valueSize != REMOVED_OBJECT_SIZE) { byte[] value = readNBytes(valueSize); - Optional res = Optional.of(new SetDatabaseRecord(key, value)); - return res; + Optional result = Optional.of(new SetDatabaseRecord(key, value)); + return result; } else { return Optional.of(new RemoveDatabaseRecord(key)); } - } catch (EOFException e) { + } catch (EOFException ex) { return Optional.empty(); } } From ef94519ee830ef0ec7669853cde60fc15593bf34 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 03:55:18 +0300 Subject: [PATCH 119/378] 1 --- .../java/com/itmo/java/basics/logic/impl/SegmentImpl.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index e32bfa91..9b462422 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -138,6 +138,11 @@ public boolean delete(String objectKey) throws IOException { return false; } + if (segmentIndex.searchForKey(objectKey).isEmpty()){ + outStream.close(); + return false; + } + RemoveDatabaseRecord newSeg = new RemoveDatabaseRecord(objectKey.getBytes()); segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); segmentSize += outStream.write(newSeg); From 88a1f361598478bc23158f6c0505e386b0d37999 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 03:56:36 +0300 Subject: [PATCH 120/378] 1 --- .../java/com/itmo/java/basics/logic/impl/SegmentImpl.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 9b462422..f677145d 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -137,12 +137,6 @@ public boolean delete(String objectKey) throws IOException { outStream.close(); return false; } - - if (segmentIndex.searchForKey(objectKey).isEmpty()){ - outStream.close(); - return false; - } - RemoveDatabaseRecord newSeg = new RemoveDatabaseRecord(objectKey.getBytes()); segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); segmentSize += outStream.write(newSeg); From 05a5fcc51211d94af538ce7070e85e284411add4 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 04:06:05 +0300 Subject: [PATCH 121/378] a --- .../java/basics/logic/impl/SegmentImpl.java | 30 +++++++++---------- .../java/basics/logic/impl/TableImpl.java | 7 ----- 2 files changed, 14 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index f677145d..e566d3c7 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -49,28 +49,29 @@ private SegmentImpl(SegmentInitializationContext context , OutputStream outStrea public static Segment create(String segmentName, Path tableRootPath) throws DatabaseException { Path segmentRoot = Paths.get(tableRootPath.toString(), segmentName); boolean isCreated; - OutputStream outputStream; + OutputStream output; try{ isCreated = segmentRoot.toFile().createNewFile(); - outputStream = Files.newOutputStream(segmentRoot); - }catch(IOException exception){ - throw new DatabaseException("Error while creating a Segment file " + segmentName, exception); + output = Files.newOutputStream(segmentRoot); + }catch(IOException ex){ + throw new DatabaseException("Error while creating segment " + segmentName, ex); } if(!isCreated){ - throw new DatabaseException("Error while creating a Segment file " + segmentName + "as it already exists"); + throw new DatabaseException("Error while creating segment " + segmentName + "as it already exists"); } - return new SegmentImpl(segmentRoot, segmentName, outputStream); + return new SegmentImpl(segmentRoot, segmentName, output); } public static Segment initializeFromContext(SegmentInitializationContext context) { - OutputStream outputStream; + OutputStream output; try{ - outputStream = Files.newOutputStream(context.getSegmentPath(),APPEND); + output = Files.newOutputStream(context.getSegmentPath(),APPEND); }catch(IOException ex){ - outputStream = null; + output = null; } - SegmentImpl newSegment = new SegmentImpl(context , outputStream); + + SegmentImpl newSegment = new SegmentImpl(context ,output); newSegment.segmentSize = context.getCurrentSize(); return newSegment; } @@ -109,19 +110,16 @@ public Optional read(String objectKey) throws IOException { } long myOf = offsetInfo.get().getOffset(); - try (DatabaseInputStream in = new DatabaseInputStream(Files.newInputStream(tableRootPath))) { - long skipped = in.skip(myOf); + try (DatabaseInputStream input = new DatabaseInputStream(Files.newInputStream(tableRootPath))) { + long skipped = input.skip(myOf); if (skipped != myOf) { throw new IOException("Error while skipping bytes in segment called " + segmentName); } - Optional value = in.readDbUnit(); - + Optional value = input.readDbUnit(); if (value.isEmpty()) { return Optional.empty(); } - return Optional.ofNullable(value.get().getValue()); - } catch (IOException exception) { throw new IOException("Error while creating a Segment file " + segmentName, exception); } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index d1ede7da..3c5cd54c 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -34,13 +34,10 @@ private TableImpl(TableInitializationContext context) { } public static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { - if (tableName == null) { throw new DatabaseException("Why tableBase name is null?"); } - Path pathToTableRoot = Paths.get(pathToDatabaseRoot.toString(), tableName); - try { Files.createDirectory(pathToTableRoot); } catch (IOException ex) { @@ -67,7 +64,6 @@ public String getName() { @Override public void write(String objectKey, byte[] objectValue) throws DatabaseException { - try { boolean canWewrite = lastSegment.write(objectKey, objectValue); @@ -83,7 +79,6 @@ public void write(String objectKey, byte[] objectValue) throws DatabaseException @Override public Optional read(String objectKey) throws DatabaseException { - try { Optional segmentRead = tableIndex.searchForKey(objectKey); @@ -98,10 +93,8 @@ public Optional read(String objectKey) throws DatabaseException { @Override public void delete(String objectKey) throws DatabaseException { - try { boolean canDel = lastSegment.delete(objectKey); - if (!canDel) { this.lastSegment = SegmentImpl.create(SegmentImpl.createSegmentName(tableName), pathToDatabaseRoot); this.lastSegment.delete(objectKey); From c64290a6b7b4aa5b723c4e1593b012eb5a143b4f Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 04:06:10 +0300 Subject: [PATCH 122/378] a --- .../java/basics/logic/io/DatabaseInputStream.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java index 2de49fba..e68dba91 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java @@ -28,10 +28,20 @@ public DatabaseInputStream(InputStream inputStream) { */ public Optional readDbUnit() throws IOException { try { + if (available() <= 4) { + return Optional.empty(); + } int keySize = readInt(); + + if (available() <= 0) { + return Optional.empty(); + } byte[] key = readNBytes(keySize); - int valueSize = readInt(); + if (available() <= 4) { + return Optional.empty(); + } + int valueSize = readInt(); if (valueSize != REMOVED_OBJECT_SIZE) { byte[] value = readNBytes(valueSize); Optional result = Optional.of(new SetDatabaseRecord(key, value)); From 13f9dcf285f09045947ac7022faf509bb100da32 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 04:07:25 +0300 Subject: [PATCH 123/378] q --- .../java/basics/logic/io/DatabaseInputStream.java | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java index e68dba91..2de49fba 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java @@ -28,20 +28,10 @@ public DatabaseInputStream(InputStream inputStream) { */ public Optional readDbUnit() throws IOException { try { - if (available() <= 4) { - return Optional.empty(); - } int keySize = readInt(); - - if (available() <= 0) { - return Optional.empty(); - } byte[] key = readNBytes(keySize); - - if (available() <= 4) { - return Optional.empty(); - } int valueSize = readInt(); + if (valueSize != REMOVED_OBJECT_SIZE) { byte[] value = readNBytes(valueSize); Optional result = Optional.of(new SetDatabaseRecord(key, value)); From d4ed77e94576b8ff81cb5293e6e28cd675502afb Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 04:20:10 +0300 Subject: [PATCH 124/378] good --- .../impl/DatabaseInitializationContextImpl.java | 6 +++--- .../initialization/impl/DatabaseInitializer.java | 2 ++ .../impl/DatabaseServerInitializer.java | 8 +++++--- .../initialization/impl/SegmentInitializer.java | 15 ++++++++------- .../initialization/impl/TableInitializer.java | 3 +++ .../itmo/java/basics/logic/impl/DatabaseImpl.java | 4 ++-- .../itmo/java/basics/logic/impl/TableImpl.java | 6 +++--- 7 files changed, 26 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java index ada2d97d..2c436c12 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializationContextImpl.java @@ -10,9 +10,9 @@ public class DatabaseInitializationContextImpl implements DatabaseInitializationContext { - private String dbName; - private Path dbRoot; - private Map tablesMap = new HashMap<>(); + private final String dbName; + private final Path dbRoot; + private final Map tablesMap = new HashMap<>(); public DatabaseInitializationContextImpl(String dbName, Path databaseRoot) { this.dbName = dbName; diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java index 5739e922..4128a1ea 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java @@ -34,7 +34,9 @@ public void perform(InitializationContext context) throws DatabaseException { if (!Files.exists(dbinitialContext.getDatabasePath())) { throw new DatabaseException("We dont have this " + dbinitialContext.getDbName()); } + File curFile = new File(dbinitialContext.getDatabasePath().toString()); + if (!curFile.exists()) { throw new DatabaseException(dbinitialContext.getDbName() + " does not exist"); } diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java index 8f032d34..0a374733 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java @@ -29,6 +29,7 @@ public void perform(InitializationContext context) throws DatabaseException { ExecutionEnvironment ExecutionEnvironment = context.executionEnvironment(); Path path = ExecutionEnvironment.getWorkingPath(); + if (!Files.exists(path)) { try { Files.createDirectory(path); @@ -37,11 +38,12 @@ public void perform(InitializationContext context) throws DatabaseException { } } File curFile = new File(path.toString()); - File[] files = curFile.listFiles(); - if (files == null) { + File[] directory = curFile.listFiles(); + if (directory == null) { throw new DatabaseException("Error while working with" + curFile.toString()); } - for (File in : files) { + + for (File in : directory) { DatabaseInitializationContextImpl dbContext = new DatabaseInitializationContextImpl(in.getName(), path); databaseInitializer.perform(new InitializationContextImpl(context.executionEnvironment(), dbContext, null, null)); } diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java index b07dfa66..83611857 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java @@ -18,6 +18,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; +import java.util.List; import java.util.Optional; @@ -37,19 +38,19 @@ public void perform(InitializationContext context) throws DatabaseException { int size = 0; SegmentInitializationContext segmentinitialContext = context.currentSegmentContext(); - SegmentIndex segmentIndex = segmentinitialContext.getIndex(); - Path segmentPath = segmentinitialContext.getSegmentPath(); + SegmentIndex segIndex = segmentinitialContext.getIndex(); + Path segPath = segmentinitialContext.getSegmentPath(); Segment segment = SegmentImpl.initializeFromContext(segmentinitialContext); - ArrayList keys = new ArrayList<>(); + List keys = new ArrayList<>(); - if (!Files.exists(segmentPath)) { + if (!Files.exists(segPath)) { throw new DatabaseException(segmentinitialContext.getSegmentName() + " does not exist"); } - try (DatabaseInputStream InputStream = new DatabaseInputStream(new FileInputStream(segmentPath.toFile()))) { + try (DatabaseInputStream InputStream = new DatabaseInputStream(new FileInputStream(segPath.toFile()))) { Optional dbUnitOp = InputStream.readDbUnit(); while (dbUnitOp.isPresent()) { DatabaseRecord dbUnit = dbUnitOp.get(); - segmentIndex.onIndexedEntityUpdated(new String(dbUnit.getKey()), new SegmentOffsetInfoImpl(size)); + segIndex.onIndexedEntityUpdated(new String(dbUnit.getKey()), new SegmentOffsetInfoImpl(size)); size += dbUnit.size(); keys.add(new String(dbUnit.getKey())); dbUnitOp = InputStream.readDbUnit(); @@ -58,7 +59,7 @@ public void perform(InitializationContext context) throws DatabaseException { throw new DatabaseException("Error while initialisation segment", ex); } - Segment newSegment = SegmentImpl.initializeFromContext(new SegmentInitializationContextImpl(segmentinitialContext.getSegmentName(), segmentinitialContext.getSegmentPath(), size, segmentIndex)); + Segment newSegment = SegmentImpl.initializeFromContext(new SegmentInitializationContextImpl(segmentinitialContext.getSegmentName(), segmentinitialContext.getSegmentPath(), size, segIndex)); for (String in : keys){ context.currentTableContext().getTableIndex().onIndexedEntityUpdated(in, segment); diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java index f567bafe..76f43ca7 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java @@ -34,12 +34,14 @@ public TableInitializer(SegmentInitializer segmentInitializer) { public void perform(InitializationContext context) throws DatabaseException { + TableInitializationContext tbinitalContext = context.currentTableContext(); File curFile = new File(tbinitalContext.getTablePath().toString()); if (!curFile.exists()) { throw new DatabaseException("Directory " + tbinitalContext.getTableName() + " does not exist"); } + File[] files = curFile.listFiles(); if (files == null) { @@ -53,6 +55,7 @@ public void perform(InitializationContext context) throws DatabaseException { SegmentInitializationContext segmentContext = new SegmentInitializationContextImpl(seg.getName(), tbinitalContext.getTablePath(), 0); segmentInitializer.perform(new InitializationContextImpl(context.executionEnvironment(), context.currentDbContext(), context.currentTableContext(), segmentContext)); } + Table newTable = TableImpl.initializeFromContext(tbinitalContext); context.currentDbContext().addTable(newTable); } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index 07b098aa..0412c347 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -16,8 +16,8 @@ public class DatabaseImpl implements Database { - private String dbName; - private Path databaseRoot; + private final String dbName; + private final Path databaseRoot; private Map tableDictionary = new HashMap(); private DatabaseImpl(String dbName, Path databaseRoot) { diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index 3c5cd54c..b727db17 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -14,9 +14,9 @@ public class TableImpl implements Table { - private String tableName; - private Path pathToDatabaseRoot; - private TableIndex tableIndex; + private final String tableName; + private final Path pathToDatabaseRoot; + private final TableIndex tableIndex; private Segment lastSegment; private TableImpl(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { From aad4ca15cf8e960b77a4ded1a037883182485c85 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 04:39:57 +0300 Subject: [PATCH 125/378] kekw --- .../initialization/impl/DatabaseInitializer.java | 10 +++++++--- .../initialization/impl/SegmentInitializer.java | 4 ++++ .../basics/initialization/impl/TableInitializer.java | 12 ++++++++---- .../itmo/java/basics/logic/impl/DatabaseImpl.java | 12 ++++++------ .../com/itmo/java/basics/logic/impl/SegmentImpl.java | 9 ++++----- .../java/basics/logic/io/DatabaseInputStream.java | 2 +- 6 files changed, 30 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java index 4128a1ea..f8df0498 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java @@ -30,6 +30,10 @@ public DatabaseInitializer(TableInitializer tableInitializer) { @Override public void perform(InitializationContext context) throws DatabaseException { + if (context.executionEnvironment() == null) { + throw new DatabaseException("Context executionEnvironment is null"); + } + DatabaseInitializationContext dbinitialContext = context.currentDbContext(); if (!Files.exists(dbinitialContext.getDatabasePath())) { throw new DatabaseException("We dont have this " + dbinitialContext.getDbName()); @@ -43,9 +47,9 @@ public void perform(InitializationContext context) throws DatabaseException { File[] directory = curFile.listFiles(); - if (directory == null) { - throw new DatabaseException("Error while working with " + curFile.toString()); - } +// if (directory == null) { +// throw new DatabaseException("Error while working with " + curFile.toString()); +// } for (File table : directory) { TableInitializationContextImpl tableContext = new TableInitializationContextImpl(table.getName(), dbinitialContext.getDatabasePath(), new TableIndex()); tableInitializer.perform(new InitializationContextImpl(context.executionEnvironment(), dbinitialContext, tableContext, null)); diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java index 83611857..28225823 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java @@ -36,6 +36,10 @@ public class SegmentInitializer implements Initializer { @Override public void perform(InitializationContext context) throws DatabaseException { + if (context.currentSegmentContext() == null) { + throw new DatabaseException("Context segment is null"); + } + int size = 0; SegmentInitializationContext segmentinitialContext = context.currentSegmentContext(); SegmentIndex segIndex = segmentinitialContext.getIndex(); diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java index 76f43ca7..28de51eb 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java @@ -35,6 +35,10 @@ public TableInitializer(SegmentInitializer segmentInitializer) { public void perform(InitializationContext context) throws DatabaseException { + if (context.currentDbContext() == null) { + throw new DatabaseException("Context Db is null"); + } + TableInitializationContext tbinitalContext = context.currentTableContext(); File curFile = new File(tbinitalContext.getTablePath().toString()); @@ -44,9 +48,9 @@ public void perform(InitializationContext context) throws DatabaseException { File[] files = curFile.listFiles(); - if (files == null) { - throw new DatabaseException("Error while working " + curFile.toString()); - } +// if (files == null) { +// throw new DatabaseException("Error while working " + curFile.toString()); +// } List segments = Arrays.asList(files); Collections.sort(segments); @@ -55,7 +59,7 @@ public void perform(InitializationContext context) throws DatabaseException { SegmentInitializationContext segmentContext = new SegmentInitializationContextImpl(seg.getName(), tbinitalContext.getTablePath(), 0); segmentInitializer.perform(new InitializationContextImpl(context.executionEnvironment(), context.currentDbContext(), context.currentTableContext(), segmentContext)); } - + Table newTable = TableImpl.initializeFromContext(tbinitalContext); context.currentDbContext().addTable(newTable); } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index 0412c347..8c8ac9d5 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -62,8 +62,6 @@ public static Database initializeFromContext(DatabaseInitializationContext conte return new DatabaseImpl(context); } - - @Override public String getName() { return dbName; @@ -86,12 +84,14 @@ public void createTableIfNotExists(String tableName) throws DatabaseException { @Override public void write(String tableName, String objectKey, byte[] objectValue) throws DatabaseException { - if (!tableDictionary.containsKey(tableName)) { - throw new DatabaseException("Table " + tableName + " doesn't exist in database" + dbName); - } + if (tableName == null) { throw new DatabaseException("Error while writing in , null name"); } + if (!tableDictionary.containsKey(tableName)) { + throw new DatabaseException("Table " + tableName + " doesn't exist in database" + dbName); + } + Table table = tableDictionary.get(tableName); table.write(objectKey, objectValue); } @@ -108,7 +108,7 @@ public Optional read(String tableName, String objectKey) throws Database @Override public void delete(String tableName, String objectKey) throws DatabaseException { if (!tableDictionary.containsKey(tableName)) { - throw new DatabaseException("Table " + tableName + " doesn't exist in database" + dbName); + throw new DatabaseException("Table " + tableName + " doesnt exist in database" + dbName); } if (tableName == null) { throw new DatabaseException("Writing in database error"); diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index e566d3c7..a91e5a2f 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -26,9 +26,8 @@ public class SegmentImpl implements Segment { private final String segmentName; private final SegmentIndex segmentIndex; private final long sizeMaximum = 100000; - private long segmentSize = 0; - private final DatabaseOutputStream outStream; + private long segmentSize = 0; public SegmentImpl(Path tableRootPath, String segmentName, OutputStream outStream) { this.tableRootPath = tableRootPath; @@ -44,9 +43,8 @@ private SegmentImpl(SegmentInitializationContext context , OutputStream outStrea this.outStream = new DatabaseOutputStream(outStream); } - - public static Segment create(String segmentName, Path tableRootPath) throws DatabaseException { + Path segmentRoot = Paths.get(tableRootPath.toString(), segmentName); boolean isCreated; OutputStream output; @@ -63,7 +61,8 @@ public static Segment create(String segmentName, Path tableRootPath) throws Data return new SegmentImpl(segmentRoot, segmentName, output); } - public static Segment initializeFromContext(SegmentInitializationContext context) { + public static Segment initializeFromContext(SegmentInitializationContext context) { + OutputStream output; try{ output = Files.newOutputStream(context.getSegmentPath(),APPEND); diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java index 2de49fba..e88d02cd 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java @@ -39,7 +39,7 @@ public Optional readDbUnit() throws IOException { } else { return Optional.of(new RemoveDatabaseRecord(key)); } - } catch (EOFException ex) { + } catch (IOException ex) { return Optional.empty(); } } From d4753713dc597facfc5c1da633af985532a0f35d Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 04:44:42 +0300 Subject: [PATCH 126/378] end --- .../basics/initialization/impl/DatabaseInitializer.java | 4 ---- .../initialization/impl/DatabaseServerInitializer.java | 8 ++++++-- .../basics/initialization/impl/SegmentInitializer.java | 8 ++++---- .../java/basics/initialization/impl/TableInitializer.java | 5 ----- 4 files changed, 10 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java index f8df0498..9696500e 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseInitializer.java @@ -46,10 +46,6 @@ public void perform(InitializationContext context) throws DatabaseException { } File[] directory = curFile.listFiles(); - -// if (directory == null) { -// throw new DatabaseException("Error while working with " + curFile.toString()); -// } for (File table : directory) { TableInitializationContextImpl tableContext = new TableInitializationContextImpl(table.getName(), dbinitialContext.getDatabasePath(), new TableIndex()); tableInitializer.perform(new InitializationContextImpl(context.executionEnvironment(), dbinitialContext, tableContext, null)); diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java index 0a374733..72f311d7 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java @@ -27,14 +27,18 @@ public DatabaseServerInitializer(DatabaseInitializer databaseInitializer) { @Override public void perform(InitializationContext context) throws DatabaseException { + if (context.executionEnvironment() == null) { + throw new DatabaseException("Context executionEnvironment is null"); + } + ExecutionEnvironment ExecutionEnvironment = context.executionEnvironment(); Path path = ExecutionEnvironment.getWorkingPath(); if (!Files.exists(path)) { try { Files.createDirectory(path); - } catch (IOException e) { - throw new DatabaseException("Error while creating " + path.toString(), e); + } catch (IOException ex) { + throw new DatabaseException("Error while creating " + path.toString(), ex); } } File curFile = new File(path.toString()); diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java index 28225823..5e2d5607 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java @@ -53,10 +53,10 @@ public void perform(InitializationContext context) throws DatabaseException { try (DatabaseInputStream InputStream = new DatabaseInputStream(new FileInputStream(segPath.toFile()))) { Optional dbUnitOp = InputStream.readDbUnit(); while (dbUnitOp.isPresent()) { - DatabaseRecord dbUnit = dbUnitOp.get(); - segIndex.onIndexedEntityUpdated(new String(dbUnit.getKey()), new SegmentOffsetInfoImpl(size)); - size += dbUnit.size(); - keys.add(new String(dbUnit.getKey())); + DatabaseRecord dbUnits = dbUnitOp.get(); + segIndex.onIndexedEntityUpdated(new String(dbUnits.getKey()), new SegmentOffsetInfoImpl(size)); + size += dbUnits.size(); + keys.add(new String(dbUnits.getKey())); dbUnitOp = InputStream.readDbUnit(); } } catch (IOException ex) { diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java index 28de51eb..e098a81e 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java @@ -47,11 +47,6 @@ public void perform(InitializationContext context) throws DatabaseException { } File[] files = curFile.listFiles(); - -// if (files == null) { -// throw new DatabaseException("Error while working " + curFile.toString()); -// } - List segments = Arrays.asList(files); Collections.sort(segments); From 0c0bed39a3b8efd49b893598e2cde7bba0b9a3fd Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 08:51:39 +0300 Subject: [PATCH 127/378] delete imports --- .../basics/initialization/impl/InitializationContextImpl.java | 3 +-- .../java/basics/initialization/impl/SegmentInitializer.java | 2 -- src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java | 2 -- .../com/itmo/java/basics/logic/io/DatabaseInputStream.java | 1 - 4 files changed, 1 insertion(+), 7 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/InitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/InitializationContextImpl.java index c0a7c856..552ede30 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/InitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/InitializationContextImpl.java @@ -5,8 +5,7 @@ import com.itmo.java.basics.initialization.InitializationContext; import com.itmo.java.basics.initialization.SegmentInitializationContext; import com.itmo.java.basics.initialization.TableInitializationContext; -import lombok.Builder; -@Builder + public class InitializationContextImpl implements InitializationContext { private final ExecutionEnvironment executionEnvironment; diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java index 5e2d5607..9570bd9d 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java @@ -10,9 +10,7 @@ import com.itmo.java.basics.logic.Segment; import com.itmo.java.basics.logic.impl.SegmentImpl; import com.itmo.java.basics.logic.io.DatabaseInputStream; -import com.itmo.java.basics.logic.io.DatabaseOutputStream; -import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.nio.file.Files; diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index a91e5a2f..2538c569 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -1,14 +1,12 @@ package com.itmo.java.basics.logic.impl; import com.itmo.java.basics.initialization.SegmentInitializationContext; -import com.itmo.java.basics.initialization.TableInitializationContext; import com.itmo.java.basics.logic.Segment; import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.index.SegmentOffsetInfo; import com.itmo.java.basics.index.impl.SegmentIndex; import com.itmo.java.basics.index.impl.SegmentOffsetInfoImpl; import com.itmo.java.basics.logic.DatabaseRecord; -import com.itmo.java.basics.logic.Segment; import com.itmo.java.basics.logic.io.DatabaseInputStream; import com.itmo.java.basics.logic.io.DatabaseOutputStream; diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java index e88d02cd..3e3bc895 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java @@ -6,7 +6,6 @@ import com.itmo.java.basics.logic.impl.SetDatabaseRecord; import java.io.DataInputStream; -import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.util.Optional; From d5d01abbc0fedd41f898708b6ec7e9a5fd3a10ef Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 1 May 2021 09:10:09 +0300 Subject: [PATCH 128/378] cntrlaltl --- .../impl/InitializationContextImpl.java | 8 ++--- .../impl/SegmentInitializer.java | 5 ++- .../initialization/impl/TableInitializer.java | 2 -- .../basics/logic/impl/DatabaseCacheImpl.java | 2 -- .../java/basics/logic/impl/DatabaseImpl.java | 4 +-- .../logic/impl/RemoveDatabaseRecord.java | 5 +-- .../java/basics/logic/impl/SegmentImpl.java | 32 +++++++++++-------- .../basics/logic/impl/SetDatabaseRecord.java | 5 +-- 8 files changed, 32 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/InitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/InitializationContextImpl.java index 552ede30..114e0dae 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/InitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/InitializationContextImpl.java @@ -13,10 +13,10 @@ public class InitializationContextImpl implements InitializationContext { private final TableInitializationContext currentTableContext; private final SegmentInitializationContext currentSegmentContext; - private InitializationContextImpl(ExecutionEnvironment executionEnvironment, - DatabaseInitializationContext currentDatabaseContext, - TableInitializationContext currentTableContext, - SegmentInitializationContext currentSegmentContext) { + public InitializationContextImpl(ExecutionEnvironment executionEnvironment, + DatabaseInitializationContext currentDatabaseContext, + TableInitializationContext currentTableContext, + SegmentInitializationContext currentSegmentContext) { this.executionEnvironment = executionEnvironment; this.currentDatabaseContext = currentDatabaseContext; this.currentTableContext = currentTableContext; diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java index 9570bd9d..90409c2a 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java @@ -22,7 +22,6 @@ public class SegmentInitializer implements Initializer { - /** * Добавляет в контекст информацию об инициализируемом сегменте. * Составляет индекс сегмента @@ -43,7 +42,7 @@ public void perform(InitializationContext context) throws DatabaseException { SegmentIndex segIndex = segmentinitialContext.getIndex(); Path segPath = segmentinitialContext.getSegmentPath(); Segment segment = SegmentImpl.initializeFromContext(segmentinitialContext); - List keys = new ArrayList<>(); + List keys = new ArrayList<>(); if (!Files.exists(segPath)) { throw new DatabaseException(segmentinitialContext.getSegmentName() + " does not exist"); @@ -63,7 +62,7 @@ public void perform(InitializationContext context) throws DatabaseException { Segment newSegment = SegmentImpl.initializeFromContext(new SegmentInitializationContextImpl(segmentinitialContext.getSegmentName(), segmentinitialContext.getSegmentPath(), size, segIndex)); - for (String in : keys){ + for (String in : keys) { context.currentTableContext().getTableIndex().onIndexedEntityUpdated(in, segment); } context.currentTableContext().updateCurrentSegment(newSegment); diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java index e098a81e..4162c1a8 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/TableInitializer.java @@ -31,8 +31,6 @@ public TableInitializer(SegmentInitializer segmentInitializer) { */ @Override - - public void perform(InitializationContext context) throws DatabaseException { if (context.currentDbContext() == null) { diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java index 0e9575fa..ef91ea58 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java @@ -20,8 +20,6 @@ protected boolean removeEldestEntry(Map.Entry eldest) { }; } - - @Override public byte[] get(String key) { return dbCache.get(key); diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index 8c8ac9d5..4bad1418 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -25,7 +25,7 @@ private DatabaseImpl(String dbName, Path databaseRoot) { this.databaseRoot = databaseRoot; } - private DatabaseImpl(DatabaseInitializationContext context){ + private DatabaseImpl(DatabaseInitializationContext context) { this.dbName = context.getDbName(); this.databaseRoot = context.getDatabasePath(); this.tableDictionary = context.getTables(); @@ -42,7 +42,7 @@ public static Database create(String dbName, Path databaseRoot) throws DatabaseE try { Files.createDirectory(Paths.get(databaseRoot.toString(), dbName)); } catch (IOException ex) { - throw new DatabaseException("Error while creating a DataBase(" + dbName + ") directory" , ex); + throw new DatabaseException("Error while creating a DataBase(" + dbName + ") directory", ex); } return new DatabaseImpl(dbName, databaseRoot); return new DatabaseImpl(dbName,databaseRoot); diff --git a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java index 269014dd..6d09b739 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java @@ -29,8 +29,9 @@ public long size() { } @Override - public boolean isValuePresented() { return false; } - + public boolean isValuePresented() { + return false; + } @Override diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 2538c569..9ede84ea 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -1,12 +1,12 @@ package com.itmo.java.basics.logic.impl; -import com.itmo.java.basics.initialization.SegmentInitializationContext; -import com.itmo.java.basics.logic.Segment; import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.index.SegmentOffsetInfo; import com.itmo.java.basics.index.impl.SegmentIndex; import com.itmo.java.basics.index.impl.SegmentOffsetInfoImpl; +import com.itmo.java.basics.initialization.SegmentInitializationContext; import com.itmo.java.basics.logic.DatabaseRecord; +import com.itmo.java.basics.logic.Segment; import com.itmo.java.basics.logic.io.DatabaseInputStream; import com.itmo.java.basics.logic.io.DatabaseOutputStream; @@ -17,12 +17,14 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.Optional; + import static java.nio.file.StandardOpenOption.APPEND; + public class SegmentImpl implements Segment { private final Path tableRootPath; - private final String segmentName; - private final SegmentIndex segmentIndex; + private final String segmentName; + private final SegmentIndex segmentIndex; private final long sizeMaximum = 100000; private final DatabaseOutputStream outStream; private long segmentSize = 0; @@ -34,7 +36,7 @@ public SegmentImpl(Path tableRootPath, String segmentName, OutputStream outStrea this.outStream = new DatabaseOutputStream(outStream); } - private SegmentImpl(SegmentInitializationContext context , OutputStream outStream) { + private SegmentImpl(SegmentInitializationContext context, OutputStream outStream) { this.tableRootPath = context.getSegmentPath(); this.segmentName = context.getSegmentName(); this.segmentIndex = context.getIndex(); @@ -47,13 +49,13 @@ public static Segment create(String segmentName, Path tableRootPath) throws Data boolean isCreated; OutputStream output; - try{ + try { isCreated = segmentRoot.toFile().createNewFile(); output = Files.newOutputStream(segmentRoot); - }catch(IOException ex){ + } catch (IOException ex) { throw new DatabaseException("Error while creating segment " + segmentName, ex); } - if(!isCreated){ + if (!isCreated) { throw new DatabaseException("Error while creating segment " + segmentName + "as it already exists"); } return new SegmentImpl(segmentRoot, segmentName, output); @@ -62,13 +64,13 @@ public static Segment create(String segmentName, Path tableRootPath) throws Data public static Segment initializeFromContext(SegmentInitializationContext context) { OutputStream output; - try{ - output = Files.newOutputStream(context.getSegmentPath(),APPEND); - }catch(IOException ex){ - output = null; + try { + output = Files.newOutputStream(context.getSegmentPath(), APPEND); + } catch (IOException ex) { + output = null; } - SegmentImpl newSegment = new SegmentImpl(context ,output); + SegmentImpl newSegment = new SegmentImpl(context, output); newSegment.segmentSize = context.getCurrentSize(); return newSegment; } @@ -123,7 +125,9 @@ public Optional read(String objectKey) throws IOException { } @Override - public boolean isReadOnly() { return segmentSize >= sizeMaximum;} + public boolean isReadOnly() { + return segmentSize >= sizeMaximum; + } @Override public boolean delete(String objectKey) throws IOException { diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java index eeb55aa2..38ced136 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java @@ -16,7 +16,6 @@ public SetDatabaseRecord(byte[] key, byte[] value) { } - @Override public byte[] getKey() { return key; @@ -33,7 +32,9 @@ public long size() { } @Override - public boolean isValuePresented() { return true; } + public boolean isValuePresented() { + return true; + } @Override public int getKeySize() { From c04b2e5c37aa77f032dc2d0df75c5e22225959c3 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 13 May 2021 23:01:09 +0300 Subject: [PATCH 129/378] Update TableImpl.java --- src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index b727db17..4fc0be8f 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -49,11 +49,7 @@ public static Table create(String tableName, Path pathToDatabaseRoot, TableIndex public static Table initializeFromContext(TableInitializationContext context) { - try { - return new CachingTable(new TableImpl(context)); - } catch (Exception ex) { return null; - } } From 765f44758d8859363d22c4b3c1d82bc6f76b6b29 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 13 May 2021 23:04:25 +0300 Subject: [PATCH 130/378] Update TableImpl.java --- src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index 4fc0be8f..c1a346d8 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -49,7 +49,7 @@ public static Table create(String tableName, Path pathToDatabaseRoot, TableIndex public static Table initializeFromContext(TableInitializationContext context) { - return null; + return new CachingTable(new TableImpl(context)); } From b5fd75603634cc61ede4aeb473d2c246208ad078 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 13 May 2021 23:17:39 +0300 Subject: [PATCH 131/378] Update SegmentImpl.java --- src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 9ede84ea..114cbabb 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -40,6 +40,7 @@ private SegmentImpl(SegmentInitializationContext context, OutputStream outStream this.tableRootPath = context.getSegmentPath(); this.segmentName = context.getSegmentName(); this.segmentIndex = context.getIndex(); + this.segmentSize = context.getCurrentSize(); this.outStream = new DatabaseOutputStream(outStream); } @@ -69,9 +70,7 @@ public static Segment initializeFromContext(SegmentInitializationContext context } catch (IOException ex) { output = null; } - SegmentImpl newSegment = new SegmentImpl(context, output); - newSegment.segmentSize = context.getCurrentSize(); return newSegment; } From f8d208722c8eb3c7079d833e588cc0ee4955b9fe Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 15 May 2021 18:50:32 +0300 Subject: [PATCH 132/378] Update SegmentImpl.java --- .../java/com/itmo/java/basics/logic/impl/SegmentImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 114cbabb..063b9c33 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -62,13 +62,13 @@ public static Segment create(String segmentName, Path tableRootPath) throws Data return new SegmentImpl(segmentRoot, segmentName, output); } - public static Segment initializeFromContext(SegmentInitializationContext context) { + public static Segment initializeFromContext(SegmentInitializationContext context) throws RuntimeException{ OutputStream output; try { output = Files.newOutputStream(context.getSegmentPath(), APPEND); } catch (IOException ex) { - output = null; + throw new RuntimeException("Error while newOpenFile in Segment initializeFromContext"); } SegmentImpl newSegment = new SegmentImpl(context, output); return newSegment; From 933ea8608b0baa02338efd61b4fc3c9cce71f5b7 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sat, 15 May 2021 18:52:49 +0300 Subject: [PATCH 133/378] Update SegmentImpl.java --- src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 063b9c33..406e4b93 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -68,7 +68,7 @@ public static Segment initializeFromContext(SegmentInitializationContext context try { output = Files.newOutputStream(context.getSegmentPath(), APPEND); } catch (IOException ex) { - throw new RuntimeException("Error while newOpenFile in Segment initializeFromContext"); + throw new RuntimeException("Error while newOpenFile in Segment initializeFromContext" , ex); } SegmentImpl newSegment = new SegmentImpl(context, output); return newSegment; From c5165f7fe48cbb5609660726993d25345cbce802 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sun, 16 May 2021 13:45:40 +0300 Subject: [PATCH 134/378] Update DatabaseImpl.java --- .../com/itmo/java/basics/logic/impl/DatabaseImpl.java | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index 4bad1418..69f8b702 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -45,17 +45,6 @@ public static Database create(String dbName, Path databaseRoot) throws DatabaseE throw new DatabaseException("Error while creating a DataBase(" + dbName + ") directory", ex); } return new DatabaseImpl(dbName, databaseRoot); - return new DatabaseImpl(dbName,databaseRoot); - /** - * @param databaseRoot путь к директории, которая может содержать несколько БД, - * поэтому при создании БД необходимо создать директорию внутри databaseRoot. - */ - public static Database create(String dbName, Path databaseRoot) throws DatabaseException { - return null; - } - - public static Database initializeFromContext(DatabaseInitializationContext context) { - return null; } public static Database initializeFromContext(DatabaseInitializationContext context) { From 464610ef2fbdf737ef09842940b7df90c13bd82f Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sun, 16 May 2021 14:22:01 +0300 Subject: [PATCH 135/378] Update pom.xml --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c00befa3..54c242ea 100644 --- a/pom.xml +++ b/pom.xml @@ -53,4 +53,4 @@ https://repo1.maven.org/maven2/ - + \ No newline at end of file From cf00777cfa10e7083b257fb2e779842687537114 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sun, 16 May 2021 23:19:27 +0300 Subject: [PATCH 136/378] ProtocolModel --- .../itmo/java/protocol/model/RespArray.java | 23 ++++++++++++------- .../java/protocol/model/RespBulkString.java | 18 ++++++++------- .../java/protocol/model/RespCommandId.java | 20 +++++++++++----- .../itmo/java/protocol/model/RespError.java | 14 ++++++----- 4 files changed, 47 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/model/RespArray.java b/src/main/java/com/itmo/java/protocol/model/RespArray.java index 7ea1d934..978e285b 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespArray.java +++ b/src/main/java/com/itmo/java/protocol/model/RespArray.java @@ -2,7 +2,10 @@ import java.io.IOException; import java.io.OutputStream; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; /** * Массив RESP объектов @@ -13,9 +16,10 @@ public class RespArray implements RespObject { * Код объекта */ public static final byte CODE = '*'; + private final List objects; - public RespArray(RespObject... objects) { - //TODO implement + public RespArray(RespObject... obj) { + objects = Arrays.asList(obj); } /** @@ -35,17 +39,20 @@ public boolean isError() { */ @Override public String asString() { - //TODO implement - return null; + return objects.stream().map(object -> asString()).collect(Collectors.joining(" ")); } @Override - public void write(OutputStream os) throws IOException { - //TODO implement + public void write(OutputStream output) throws IOException { + output.write(CODE); + output.write(Integer.toString(objects.size()).getBytes(StandardCharsets.UTF_8)); + output.write(CRLF); + for (RespObject obj : objects) { + obj.write(output); + } } public List getObjects() { - //TODO implement - return null; + return objects; } } diff --git a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java index d1cba566..f36b722f 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java +++ b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java @@ -2,6 +2,7 @@ import java.io.IOException; import java.io.OutputStream; +import java.nio.charset.StandardCharsets; /** * Строка @@ -11,13 +12,12 @@ public class RespBulkString implements RespObject { * Код объекта */ public static final byte CODE = '$'; - public static final int NULL_STRING_SIZE = -1; + private final byte[] data; - public static final RespBulkString NULL_STRING = new RespBulkString(null); - public RespBulkString(byte[] data) { - //TODO implement + public RespBulkString(byte[] inform) { + data = inform; } /** @@ -37,12 +37,14 @@ public boolean isError() { */ @Override public String asString() { - //TODO implement - return null; + return new String(data); } @Override - public void write(OutputStream os) throws IOException { - //TODO implement + public void write(OutputStream output) throws IOException { + output.write(CODE); + output.write(Integer.toString(data.length).getBytes(StandardCharsets.UTF_8)); + output.write(CRLF); + output.write(data); } } diff --git a/src/main/java/com/itmo/java/protocol/model/RespCommandId.java b/src/main/java/com/itmo/java/protocol/model/RespCommandId.java index 40327cd4..d077f659 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespCommandId.java +++ b/src/main/java/com/itmo/java/protocol/model/RespCommandId.java @@ -2,6 +2,7 @@ import java.io.IOException; import java.io.OutputStream; +import java.nio.charset.StandardCharsets; /** * Id @@ -12,9 +13,10 @@ public class RespCommandId implements RespObject { * Код объекта */ public static final byte CODE = '!'; + private final int commandId; - public RespCommandId(int commandId) { - //TODO implement + public RespCommandId(int comId) { + commandId = comId; } /** @@ -29,12 +31,18 @@ public boolean isError() { @Override public String asString() { - //TODO implement - return null; + return Integer.toString(commandId); } @Override - public void write(OutputStream os) throws IOException { - //TODO implement + public void write(OutputStream output) throws IOException { + output.write(CODE); + int commandByte = commandId; + output.write((commandByte >>> 24) & 0xFF); + output.write((commandByte >>> 16) & 0xFF); + output.write((commandByte >>> 8) & 0xFF); + output.write(commandByte &0xFF); + output.write(CRLF); + } } diff --git a/src/main/java/com/itmo/java/protocol/model/RespError.java b/src/main/java/com/itmo/java/protocol/model/RespError.java index f998c07f..87e64d08 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespError.java +++ b/src/main/java/com/itmo/java/protocol/model/RespError.java @@ -12,9 +12,10 @@ public class RespError implements RespObject { * Код объекта */ public static final byte CODE = '-'; + public byte[] message; - public RespError(byte[] message) { - //TODO implement + public RespError(byte[] mes) { + message = mes; } /** @@ -29,12 +30,13 @@ public boolean isError() { @Override public String asString() { - //TODO implement - return null; + return new String(message); } @Override - public void write(OutputStream os) throws IOException { - //TODO implement + public void write(OutputStream output) throws IOException { + output.write(CODE); + output.write(message); + output.write(CRLF); } } From 4890748e11d8a9fd4c0272d31d18c149c7890753 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Sun, 16 May 2021 23:32:13 +0300 Subject: [PATCH 137/378] UpdateRespBulkString --- .../com/itmo/java/protocol/model/RespBulkString.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java index f36b722f..5dcc621d 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java +++ b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java @@ -43,8 +43,14 @@ public String asString() { @Override public void write(OutputStream output) throws IOException { output.write(CODE); - output.write(Integer.toString(data.length).getBytes(StandardCharsets.UTF_8)); + if (data == null) { + output.write(Integer.toString(NULL_STRING_SIZE).getBytes(StandardCharsets.UTF_8)); + } + else { + output.write(Integer.toString(data.length).getBytes(StandardCharsets.UTF_8)); + output.write(CRLF); + output.write(data); + } output.write(CRLF); - output.write(data); } } From 7d8804ea69679fa79d5b8a62dedc5fbc7a82a3c8 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Mon, 17 May 2021 00:54:29 +0300 Subject: [PATCH 138/378] Create+Result in Console --- .../console/impl/CreateDatabaseCommand.java | 30 ++++++++++++--- .../console/impl/CreateTableCommand.java | 38 ++++++++++++++++--- .../impl/FailedDatabaseCommandResult.java | 15 +++++--- .../impl/SuccessDatabaseCommandResult.java | 16 +++++--- 4 files changed, 77 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java index 97e45650..3177f11e 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java @@ -4,9 +4,11 @@ import com.itmo.java.basics.console.DatabaseCommandArgPositions; import com.itmo.java.basics.console.DatabaseCommandResult; import com.itmo.java.basics.console.ExecutionEnvironment; +import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.logic.DatabaseFactory; import com.itmo.java.protocol.model.RespObject; +import java.nio.charset.StandardCharsets; import java.util.List; /** @@ -14,6 +16,11 @@ */ public class CreateDatabaseCommand implements DatabaseCommand { + private final ExecutionEnvironment environment; + private final DatabaseFactory dbfactory; + private final List commandargs; + private static final int numberOfAgrguments = 3; + /** * Создает команду. *
@@ -21,12 +28,17 @@ public class CreateDatabaseCommand implements DatabaseCommand { * * @param env env * @param factory функция создания базы данных (пример: DatabaseImpl::create) - * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. * Id команды, имя команды, имя создаваемой бд * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public CreateDatabaseCommand(ExecutionEnvironment env, DatabaseFactory factory, List commandArgs) { - //TODO implement + public CreateDatabaseCommand(ExecutionEnvironment env, DatabaseFactory factory, List comArgs) { + if (comArgs.size() != numberOfAgrguments){ + throw new IllegalArgumentException("Why " + comArgs.size()+"!= 3 , in CreateDataBaseCommand" ); + } + environment = env; + dbfactory = factory; + commandargs = comArgs; } /** @@ -36,7 +48,15 @@ public CreateDatabaseCommand(ExecutionEnvironment env, DatabaseFactory factory, */ @Override public DatabaseCommandResult execute() { - //TODO implement - return null; + try{ + String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + if(dbName == null){ + throw new DatabaseException("Why dbname null? "); + } + environment.addDatabase(dbfactory.createNonExistent(dbName,environment.getWorkingPath())); + return DatabaseCommandResult.success(("Success add " + dbName).getBytes(StandardCharsets.UTF_8)); + } catch (DatabaseException ex){ + return new FailedDatabaseCommandResult(ex.getMessage()); + } } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java index 7965480b..9f202ceb 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java @@ -4,27 +4,39 @@ import com.itmo.java.basics.console.DatabaseCommandArgPositions; import com.itmo.java.basics.console.DatabaseCommandResult; import com.itmo.java.basics.console.ExecutionEnvironment; +import com.itmo.java.basics.exceptions.DatabaseException; +import com.itmo.java.basics.logic.Database; +import com.itmo.java.basics.logic.DatabaseFactory; import com.itmo.java.protocol.model.RespObject; +import java.nio.charset.StandardCharsets; import java.util.List; +import java.util.Optional; /** * Команда для создания базы таблицы */ public class CreateTableCommand implements DatabaseCommand { + private final ExecutionEnvironment environment; + private final List commandargs; + private static final int numberOfAgrguments = 4; /** * Создает команду *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * * @param env env - * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. * Id команды, имя команды, имя бд, имя таблицы * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public CreateTableCommand(ExecutionEnvironment env, List commandArgs) { - //TODO implement + public CreateTableCommand(ExecutionEnvironment env, List comArgs) { + if (comArgs.size() != numberOfAgrguments){ + throw new IllegalArgumentException("Why " + comArgs.size()+"!= 3 , in CreateTableCommand" ); + } + environment = env; + commandargs = comArgs; } /** @@ -34,7 +46,23 @@ public CreateTableCommand(ExecutionEnvironment env, List commandArgs */ @Override public DatabaseCommandResult execute() { - //TODO implement - return null; + try{ + String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + if(dbName == null){ + throw new DatabaseException("Why dbname null?"); + } + String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + if(tbName == null){ + throw new DatabaseException("Why tbName null?"); + } + Optional dataBase = environment.getDatabase(dbName); + if(dataBase.isEmpty()){ + throw new DatabaseException("We dont have"+ dbName); + } + dataBase.get().createTableIfNotExists(tbName); + return DatabaseCommandResult.success(("Success add " + dbName + tbName).getBytes(StandardCharsets.UTF_8)); + } catch (DatabaseException ex){ + return new FailedDatabaseCommandResult(ex.getMessage()); + } } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java b/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java index cd54a9ab..344b4dd7 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java +++ b/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java @@ -4,13 +4,18 @@ import com.itmo.java.protocol.model.RespError; import com.itmo.java.protocol.model.RespObject; +import java.nio.charset.StandardCharsets; + /** * Зафейленная команда */ public class FailedDatabaseCommandResult implements DatabaseCommandResult { - public FailedDatabaseCommandResult(String payload) { - //TODO implement + + private final String payLoad; + + public FailedDatabaseCommandResult(String pload) { + payLoad = pload; } /** @@ -18,8 +23,7 @@ public FailedDatabaseCommandResult(String payload) { */ @Override public String getPayLoad() { - //TODO implement - return null; + return payLoad; } @Override @@ -32,7 +36,6 @@ public boolean isSuccess() { */ @Override public RespObject serialize() { - //TODO implement - return null; + return new RespError(payLoad.getBytes(StandardCharsets.UTF_8)); } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java b/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java index d7b998db..ae8fad44 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java +++ b/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java @@ -9,14 +9,19 @@ */ public class SuccessDatabaseCommandResult implements DatabaseCommandResult { - public SuccessDatabaseCommandResult(byte[] payload) { - //TODO implement + private final byte[] payLoad; + + public SuccessDatabaseCommandResult(byte[] pload) { + payLoad = pload; } @Override public String getPayLoad() { - //TODO implement - return null; + if(payLoad != null) { + return new String(payLoad); + } else { + return null; + } } @Override @@ -29,7 +34,6 @@ public boolean isSuccess() { */ @Override public RespObject serialize() { - //TODO implement - return null; + return new RespBulkString(payLoad); } } From 6b35a6b05fda0829d7bb4d319596f92038f83cf2 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Mon, 17 May 2021 01:18:11 +0300 Subject: [PATCH 139/378] Console --- .../console/impl/CreateDatabaseCommand.java | 2 +- .../console/impl/CreateTableCommand.java | 6 +-- .../basics/console/impl/DeleteKeyCommand.java | 41 ++++++++++++++--- .../basics/console/impl/GetKeyCommand.java | 44 ++++++++++++++++--- .../basics/console/impl/SetKeyCommand.java | 42 +++++++++++++++--- 5 files changed, 116 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java index 3177f11e..8e0038af 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java @@ -51,7 +51,7 @@ public DatabaseCommandResult execute() { try{ String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); if(dbName == null){ - throw new DatabaseException("Why dbname null? "); + throw new DatabaseException("Why dbname is null? "); } environment.addDatabase(dbfactory.createNonExistent(dbName,environment.getWorkingPath())); return DatabaseCommandResult.success(("Success add " + dbName).getBytes(StandardCharsets.UTF_8)); diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java index 9f202ceb..db47438f 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java @@ -33,7 +33,7 @@ public class CreateTableCommand implements DatabaseCommand { */ public CreateTableCommand(ExecutionEnvironment env, List comArgs) { if (comArgs.size() != numberOfAgrguments){ - throw new IllegalArgumentException("Why " + comArgs.size()+"!= 3 , in CreateTableCommand" ); + throw new IllegalArgumentException("Why " + comArgs.size()+"!= 4 , in CreateTableCommand" ); } environment = env; commandargs = comArgs; @@ -49,11 +49,11 @@ public DatabaseCommandResult execute() { try{ String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); if(dbName == null){ - throw new DatabaseException("Why dbname null?"); + throw new DatabaseException("Why dbname is null?"); } String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); if(tbName == null){ - throw new DatabaseException("Why tbName null?"); + throw new DatabaseException("Why tbName is null?"); } Optional dataBase = environment.getDatabase(dbName); if(dataBase.isEmpty()){ diff --git a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java index ccb52507..261dca7e 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java @@ -4,27 +4,38 @@ import com.itmo.java.basics.console.DatabaseCommandArgPositions; import com.itmo.java.basics.console.DatabaseCommandResult; import com.itmo.java.basics.console.ExecutionEnvironment; +import com.itmo.java.basics.exceptions.DatabaseException; +import com.itmo.java.basics.logic.Database; import com.itmo.java.protocol.model.RespObject; +import java.nio.charset.StandardCharsets; import java.util.List; +import java.util.Optional; /** * Команда для создания удаления значения по ключу */ public class DeleteKeyCommand implements DatabaseCommand { + private final ExecutionEnvironment environment; + private final List commandargs; + private static final int numberOfAgrguments = 5; /** * Создает команду. *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * * @param env env - * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. * Id команды, имя команды, имя бд, таблицы, ключ * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public DeleteKeyCommand(ExecutionEnvironment env, List commandArgs) { - //TODO implement + public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { + if (comArgs.size() != numberOfAgrguments){ + throw new IllegalArgumentException("Why " + comArgs.size()+"!= 5 , in CreateTableCommand" ); + } + environment = env; + commandargs = comArgs; } /** @@ -34,7 +45,27 @@ public DeleteKeyCommand(ExecutionEnvironment env, List commandArgs) */ @Override public DatabaseCommandResult execute() { - //TODO implement - return null; + try{ + String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + if(dbName == null){ + throw new DatabaseException("Why dbname is null?"); + } + String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + if(tbName == null){ + throw new DatabaseException("Why tbName is null?"); + } + String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); + if(key == null){ + throw new DatabaseException("Why key is null?"); + } + Optional dataBase = environment.getDatabase(dbName); + if(dataBase.isEmpty()){ + throw new DatabaseException("We dont have"+ dbName); + } + dataBase.get().delete(tbName,key); + return DatabaseCommandResult.success(("Success del " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); + } catch (DatabaseException ex){ + return new FailedDatabaseCommandResult(ex.getMessage()); + } } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java index 6c91c7e1..7a89f035 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java @@ -4,27 +4,38 @@ import com.itmo.java.basics.console.DatabaseCommandArgPositions; import com.itmo.java.basics.console.DatabaseCommandResult; import com.itmo.java.basics.console.ExecutionEnvironment; +import com.itmo.java.basics.exceptions.DatabaseException; +import com.itmo.java.basics.logic.Database; import com.itmo.java.protocol.model.RespObject; +import java.nio.charset.StandardCharsets; import java.util.List; +import java.util.Optional; /** * Команда для чтения данных по ключу */ public class GetKeyCommand implements DatabaseCommand { + private final ExecutionEnvironment environment; + private final List commandargs; + private static final int numberOfAgrguments = 5; /** * Создает команду. *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * * @param env env - * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. * Id команды, имя команды, имя бд, таблицы, ключ * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public GetKeyCommand(ExecutionEnvironment env, List commandArgs) { - //TODO implement + public GetKeyCommand(ExecutionEnvironment env, List comArgs) { + if (comArgs.size() != numberOfAgrguments){ + throw new IllegalArgumentException("Why " + comArgs.size()+"!= 5 , in CreateTableCommand" ); + } + environment = env; + commandargs = comArgs; } /** @@ -34,7 +45,30 @@ public GetKeyCommand(ExecutionEnvironment env, List commandArgs) { */ @Override public DatabaseCommandResult execute() { - //TODO implement - return null; + try{ + String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + if(dbName == null){ + throw new DatabaseException("Why dbname is null?"); + } + String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + if(tbName == null){ + throw new DatabaseException("Why tbName is null?"); + } + String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); + if(key == null){ + throw new DatabaseException("Why key is null?"); + } + Optional dataBase = environment.getDatabase(dbName); + if(dataBase.isEmpty()){ + throw new DatabaseException("We dont have"+ dbName); + } + Optional value = dataBase.get().read(tbName,key); + if(value.isEmpty()){ + throw new DatabaseException("We dont have"+ dbName + tbName + key); + } + return DatabaseCommandResult.success(value.get()); + } catch (DatabaseException ex){ + return new FailedDatabaseCommandResult(ex.getMessage()); + } } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java index debef1c0..39776339 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java @@ -4,27 +4,38 @@ import com.itmo.java.basics.console.DatabaseCommandArgPositions; import com.itmo.java.basics.console.DatabaseCommandResult; import com.itmo.java.basics.console.ExecutionEnvironment; +import com.itmo.java.basics.exceptions.DatabaseException; +import com.itmo.java.basics.logic.Database; import com.itmo.java.protocol.model.RespObject; +import java.nio.charset.StandardCharsets; import java.util.List; +import java.util.Optional; /** * Команда для создания записи значения */ public class SetKeyCommand implements DatabaseCommand { + private final ExecutionEnvironment environment; + private final List commandargs; + private static final int numberOfAgrguments = 6; /** * Создает команду. *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * * @param env env - * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. * Id команды, имя команды, имя бд, таблицы, ключ, значение * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public SetKeyCommand(ExecutionEnvironment env, List commandArgs) { - //TODO implement + public SetKeyCommand(ExecutionEnvironment env, List comArgs) { + if (comArgs.size() != numberOfAgrguments){ + throw new IllegalArgumentException("Why " + comArgs.size()+"!= 5 , in CreateTableCommand" ); + } + environment = env; + commandargs = comArgs; } /** @@ -34,7 +45,28 @@ public SetKeyCommand(ExecutionEnvironment env, List commandArgs) { */ @Override public DatabaseCommandResult execute() { - //TODO implement - return null; + try{ + String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + if(dbName == null){ + throw new DatabaseException("Why dbname is null?"); + } + String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + if(tbName == null){ + throw new DatabaseException("Why tbName is null?"); + } + String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); + if(key == null){ + throw new DatabaseException("Why key is null?"); + } + Optional dataBase = environment.getDatabase(dbName); + if(dataBase.isEmpty()){ + throw new DatabaseException("We dont have"+ dbName); + } + byte[] value = commandargs.get(DatabaseCommandArgPositions.VALUE.getPositionIndex()).asString().getBytes(StandardCharsets.UTF_8); + dataBase.get().write(tbName,key,value); + return DatabaseCommandResult.success(("Success add key " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); + } catch (DatabaseException ex){ + return new FailedDatabaseCommandResult(ex.getMessage()); + } } } From de67279aa50ea27573e973953aec4d9efc635744 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Mon, 17 May 2021 01:28:57 +0300 Subject: [PATCH 140/378] add databasecommand enum --- .../java/basics/console/DatabaseCommands.java | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/DatabaseCommands.java b/src/main/java/com/itmo/java/basics/console/DatabaseCommands.java index 30268987..6a5b68c3 100644 --- a/src/main/java/com/itmo/java/basics/console/DatabaseCommands.java +++ b/src/main/java/com/itmo/java/basics/console/DatabaseCommands.java @@ -1,5 +1,7 @@ package com.itmo.java.basics.console; +import com.itmo.java.basics.console.impl.*; +import com.itmo.java.basics.logic.impl.DatabaseImpl; import com.itmo.java.protocol.model.RespObject; import java.util.List; @@ -13,36 +15,31 @@ public enum DatabaseCommands { CREATE_DATABASE { @Override public DatabaseCommand getCommand(ExecutionEnvironment env, List commandArgs) { - //TODO implement - return null; + return new CreateDatabaseCommand(env, DatabaseImpl::create ,commandArgs); } }, CREATE_TABLE { @Override public DatabaseCommand getCommand(ExecutionEnvironment env, List commandArgs) { - //TODO implement - return null; + return new CreateTableCommand(env,commandArgs); } }, SET_KEY { @Override public DatabaseCommand getCommand(ExecutionEnvironment env, List commandArgs) { - //TODO implement - return null; + return new SetKeyCommand(env,commandArgs); } }, GET_KEY { @Override public DatabaseCommand getCommand(ExecutionEnvironment env, List commandArgs) { - //TODO implement - return null; + return new GetKeyCommand(env,commandArgs); } }, DELETE_KEY { @Override public DatabaseCommand getCommand(ExecutionEnvironment env, List commandArgs) { - //TODO implement - return null; + return new DeleteKeyCommand(env,commandArgs); } }; From e74c7723e47512867d9a01924858003f3262711a Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Mon, 17 May 2021 03:14:26 +0300 Subject: [PATCH 141/378] command+client --- .../java/client/client/SimpleKvsClient.java | 69 ++++++++++++++++--- .../command/CreateDatabaseKvsCommand.java | 16 +++-- 2 files changed, 69 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java b/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java index 646e8db5..c9347c9c 100644 --- a/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java +++ b/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java @@ -1,12 +1,18 @@ package com.itmo.java.client.client; +import com.itmo.java.basics.console.DatabaseCommandResult; +import com.itmo.java.client.command.*; import com.itmo.java.client.connection.KvsConnection; +import com.itmo.java.client.exception.ConnectionException; import com.itmo.java.client.exception.DatabaseExecutionException; +import com.itmo.java.protocol.model.RespObject; import java.util.function.Supplier; public class SimpleKvsClient implements KvsClient { + private final String dbName; + private final KvsConnection connectionSupplier; /** * Конструктор * @@ -14,36 +20,77 @@ public class SimpleKvsClient implements KvsClient { * @param connectionSupplier метод создания подключения к базе */ public SimpleKvsClient(String databaseName, Supplier connectionSupplier) { - //TODO implement + dbName = databaseName; + this.connectionSupplier = connectionSupplier.get(); } @Override public String createDatabase() throws DatabaseExecutionException { - //TODO implement - return null; + try { + CreateDatabaseKvsCommand dbKvsCom = new CreateDatabaseKvsCommand(dbName); + RespObject obj = connectionSupplier.send(dbKvsCom.getCommandId(), dbKvsCom.serialize()); + if(obj.isError()){ + throw new DatabaseExecutionException(obj.asString()); + } + return obj.asString(); + } catch(ConnectionException ex){ + return DatabaseCommandResult.error(ex).getPayLoad(); + } } @Override public String createTable(String tableName) throws DatabaseExecutionException { - //TODO implement - return null; + try { + CreateTableKvsCommand tbKvsCom = new CreateTableKvsCommand(dbName,tableName); + RespObject obj = connectionSupplier.send(tbKvsCom.getCommandId(), tbKvsCom.serialize()); + if(obj.isError()){ + throw new DatabaseExecutionException(obj.asString()); + } + return obj.asString(); + } catch(ConnectionException ex){ + return DatabaseCommandResult.error(ex).getPayLoad(); + } } @Override public String get(String tableName, String key) throws DatabaseExecutionException { - //TODO implement - return null; + try { + GetKvsCommand getKvsCom = new GetKvsCommand(dbName,tableName,key); + RespObject obj = connectionSupplier.send(getKvsCom .getCommandId(), getKvsCom .serialize()); + if(obj.isError()){ + throw new DatabaseExecutionException(obj.asString()); + } + return obj.asString(); + } catch(ConnectionException ex){ + return DatabaseCommandResult.error(ex).getPayLoad(); + } } @Override public String set(String tableName, String key, String value) throws DatabaseExecutionException { - //TODO implement - return null; + try { + SetKvsCommand setKvsCom = new SetKvsCommand(dbName,tableName,key,value); + RespObject obj = connectionSupplier.send(setKvsCom .getCommandId(), setKvsCom .serialize()); + if(obj.isError()){ + throw new DatabaseExecutionException(obj.asString()); + } + return obj.asString(); + } catch(ConnectionException ex){ + return DatabaseCommandResult.error(ex).getPayLoad(); + } } @Override public String delete(String tableName, String key) throws DatabaseExecutionException { - //TODO implement - return null; + try { + DeleteKvsCommand delKvsCom = new DeleteKvsCommand(dbName,tableName,key); + RespObject obj = connectionSupplier.send(delKvsCom .getCommandId(), delKvsCom .serialize()); + if(obj.isError()){ + throw new DatabaseExecutionException(obj.asString()); + } + return obj.asString(); + } catch(ConnectionException ex){ + return DatabaseCommandResult.error(ex).getPayLoad(); + } } } diff --git a/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java b/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java index b01c9c9a..ab601fa2 100644 --- a/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java @@ -4,11 +4,16 @@ import com.itmo.java.protocol.model.RespBulkString; import com.itmo.java.protocol.model.RespCommandId; +import java.nio.charset.StandardCharsets; + /** * Команда для создания бд */ public class CreateDatabaseKvsCommand implements KvsCommand { + private static final String COMMAND_NAME = "CREATE_DATABASE"; + private final String dbName; + private final int dbID; /** * Создает объект @@ -16,7 +21,8 @@ public class CreateDatabaseKvsCommand implements KvsCommand { * @param databaseName имя базы данных */ public CreateDatabaseKvsCommand(String databaseName) { - //TODO implement + dbID = idGen.get(); + dbName = databaseName; } /** @@ -26,13 +32,13 @@ public CreateDatabaseKvsCommand(String databaseName) { */ @Override public RespArray serialize() { - //TODO implement - return null; + return new RespArray(new RespCommandId(dbID), + new RespBulkString(COMMAND_NAME.getBytes(StandardCharsets.UTF_8)), + new RespBulkString(dbName.getBytes(StandardCharsets.UTF_8))); } @Override public int getCommandId() { - //TODO implement - return 0; + return dbID; } } From 59ffeb6c14c9ba43fa8c8edb7dfa87ce20ada690 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Mon, 17 May 2021 03:14:37 +0300 Subject: [PATCH 142/378] command+client --- .../client/command/CreateTableKvsCommand.java | 19 ++++++++++---- .../java/client/command/DeleteKvsCommand.java | 21 ++++++++++++---- .../java/client/command/GetKvsCommand.java | 21 ++++++++++++---- .../java/client/command/SetKvsCommand.java | 25 +++++++++++++++---- 4 files changed, 66 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java b/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java index 45b1642d..ebb543fd 100644 --- a/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java @@ -4,14 +4,22 @@ import com.itmo.java.protocol.model.RespBulkString; import com.itmo.java.protocol.model.RespCommandId; +import java.nio.charset.StandardCharsets; + /** * Команда для создания таблицы */ public class CreateTableKvsCommand implements KvsCommand { private static final String COMMAND_NAME = "CREATE_TABLE"; + private final String dbName; + private final int tbID; + private final String tbName; + public CreateTableKvsCommand(String databaseName, String tableName) { - //TODO implement + dbName = databaseName; + tbName = tableName; + tbID = idGen.get(); } /** @@ -21,13 +29,14 @@ public CreateTableKvsCommand(String databaseName, String tableName) { */ @Override public RespArray serialize() { - //TODO implement - return null; + return new RespArray(new RespCommandId(tbID), + new RespBulkString(COMMAND_NAME.getBytes(StandardCharsets.UTF_8)), + new RespBulkString(dbName.getBytes(StandardCharsets.UTF_8)), + new RespBulkString(tbName.getBytes(StandardCharsets.UTF_8))); } @Override public int getCommandId() { - //TODO implement - return 0; + return tbID; } } diff --git a/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java b/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java index 4278ce85..23601402 100644 --- a/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java @@ -4,12 +4,21 @@ import com.itmo.java.protocol.model.RespBulkString; import com.itmo.java.protocol.model.RespCommandId; +import java.nio.charset.StandardCharsets; + public class DeleteKvsCommand implements KvsCommand { private static final String COMMAND_NAME = "DELETE_KEY"; + private final String dbName; + private final String tbName; + private final String Key; + private final int delID ; public DeleteKvsCommand(String databaseName, String tableName, String key) { - //TODO implement + dbName =databaseName; + tbName = tableName; + Key = key; + delID = idGen.get(); } /** @@ -19,13 +28,15 @@ public DeleteKvsCommand(String databaseName, String tableName, String key) { */ @Override public RespArray serialize() { - //TODO implement - return null; + return new RespArray(new RespCommandId(delID), + new RespBulkString(COMMAND_NAME.getBytes(StandardCharsets.UTF_8)), + new RespBulkString(dbName.getBytes(StandardCharsets.UTF_8)), + new RespBulkString(tbName.getBytes(StandardCharsets.UTF_8)), + new RespBulkString(Key.getBytes(StandardCharsets.UTF_8))); } @Override public int getCommandId() { - //TODO implement - return 0; + return delID; } } diff --git a/src/main/java/com/itmo/java/client/command/GetKvsCommand.java b/src/main/java/com/itmo/java/client/command/GetKvsCommand.java index 6933c9f9..c7ed3625 100644 --- a/src/main/java/com/itmo/java/client/command/GetKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/GetKvsCommand.java @@ -4,12 +4,21 @@ import com.itmo.java.protocol.model.RespBulkString; import com.itmo.java.protocol.model.RespCommandId; +import java.nio.charset.StandardCharsets; + public class GetKvsCommand implements KvsCommand { private static final String COMMAND_NAME = "GET_KEY"; + private final String dbName; + private final String tbName; + private final String Key; + private final int getID ; public GetKvsCommand(String databaseName, String tableName, String key) { - //TODO implement + dbName =databaseName; + tbName = tableName; + Key = key; + getID = idGen.get(); } /** @@ -19,13 +28,15 @@ public GetKvsCommand(String databaseName, String tableName, String key) { */ @Override public RespArray serialize() { - //TODO implement - return null; + return new RespArray(new RespCommandId(getID), + new RespBulkString(COMMAND_NAME.getBytes(StandardCharsets.UTF_8)), + new RespBulkString(dbName.getBytes(StandardCharsets.UTF_8)), + new RespBulkString(tbName.getBytes(StandardCharsets.UTF_8)), + new RespBulkString(Key.getBytes(StandardCharsets.UTF_8))); } @Override public int getCommandId() { - //TODO implement - return 0; + return getID; } } diff --git a/src/main/java/com/itmo/java/client/command/SetKvsCommand.java b/src/main/java/com/itmo/java/client/command/SetKvsCommand.java index 7e913ba4..03ff1d26 100644 --- a/src/main/java/com/itmo/java/client/command/SetKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/SetKvsCommand.java @@ -4,12 +4,24 @@ import com.itmo.java.protocol.model.RespBulkString; import com.itmo.java.protocol.model.RespCommandId; +import java.nio.charset.StandardCharsets; + public class SetKvsCommand implements KvsCommand { private static final String COMMAND_NAME = "SET_KEY"; + private final String dbName; + private final String tbName; + private final String Key; + private final int setID ; + private final String Value; + public SetKvsCommand(String databaseName, String tableName, String key, String value) { - //TODO implement + dbName =databaseName; + tbName = tableName; + Key = key; + setID = idGen.get(); + Value = value; } /** @@ -19,13 +31,16 @@ public SetKvsCommand(String databaseName, String tableName, String key, String v */ @Override public RespArray serialize() { - //TODO implement - return null; + return new RespArray(new RespCommandId(setID), + new RespBulkString(COMMAND_NAME.getBytes(StandardCharsets.UTF_8)), + new RespBulkString(dbName.getBytes(StandardCharsets.UTF_8)), + new RespBulkString(tbName.getBytes(StandardCharsets.UTF_8)), + new RespBulkString(Key.getBytes(StandardCharsets.UTF_8)), + new RespBulkString(Value.getBytes(StandardCharsets.UTF_8))); } @Override public int getCommandId() { - //TODO implement - return 0; + return setID; } } From aa7e763725eea1f12bd31600aefaefbc49733bbd Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Mon, 17 May 2021 03:28:28 +0300 Subject: [PATCH 143/378] server --- .../com/itmo/java/basics/DatabaseServer.java | 22 +++++++++---------- .../DirectReferenceKvsConnection.java | 13 ++++++++--- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/DatabaseServer.java b/src/main/java/com/itmo/java/basics/DatabaseServer.java index 4155872b..04bac4d0 100644 --- a/src/main/java/com/itmo/java/basics/DatabaseServer.java +++ b/src/main/java/com/itmo/java/basics/DatabaseServer.java @@ -1,10 +1,9 @@ package com.itmo.java.basics; -import com.itmo.java.basics.console.DatabaseCommand; -import com.itmo.java.basics.console.DatabaseCommandResult; -import com.itmo.java.basics.console.ExecutionEnvironment; +import com.itmo.java.basics.console.*; import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.initialization.impl.DatabaseServerInitializer; +import com.itmo.java.basics.initialization.impl.InitializationContextImpl; import com.itmo.java.protocol.model.RespArray; import java.util.concurrent.CompletableFuture; @@ -14,7 +13,7 @@ public class DatabaseServer { private ExecutorService executorService = Executors.newSingleThreadExecutor(); - + private final ExecutionEnvironment environment; /** * Конструктор * @@ -22,21 +21,20 @@ public class DatabaseServer { * @param initializer готовый чейн инициализации * @throws DatabaseException если произошла ошибка инициализации */ + private DatabaseServer(ExecutionEnvironment env){ + environment = env; + } public static DatabaseServer initialize(ExecutionEnvironment env, DatabaseServerInitializer initializer) throws DatabaseException { - //TODO implement - return null; + initializer.perform(new InitializationContextImpl(env,null,null,null)); + return new DatabaseServer(env); } public CompletableFuture executeNextCommand(RespArray message) { - return CompletableFuture.supplyAsync(() -> { - // code here... - return null; - }, executorService); + return CompletableFuture.supplyAsync(() -> DatabaseCommands.valueOf(message.getObjects().get(DatabaseCommandArgPositions.COMMAND_NAME.getPositionIndex()).asString()).getCommand(environment, message.getObjects()).execute(), executorService); } public CompletableFuture executeNextCommand(DatabaseCommand command) { - //TODO implement - return null; + return CompletableFuture.supplyAsync(command::execute,executorService); } public ExecutionEnvironment getEnv() { diff --git a/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java b/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java index cdd7f271..fcb017e0 100644 --- a/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java @@ -5,20 +5,27 @@ import com.itmo.java.protocol.model.RespArray; import com.itmo.java.protocol.model.RespObject; +import java.util.concurrent.ExecutionException; + /** * Реализация подключения, когда есть прямая ссылка на объект * (пока еще нет реализации сокетов) */ public class DirectReferenceKvsConnection implements KvsConnection { + private final DatabaseServer dbServer; + public DirectReferenceKvsConnection(DatabaseServer databaseServer) { - //TODO implement + dbServer = databaseServer; } @Override public RespObject send(int commandId, RespArray command) throws ConnectionException { - //TODO implement - return null; + try{ + return dbServer.executeNextCommand(command).get().serialize(); + } catch(ExecutionException | InterruptedException ex){ + throw new ConnectionException(ex.getMessage(), ex.getCause()); + } } /** From 4ecf3b6b226fc85995547bc3db650d94ba7276bb Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Mon, 17 May 2021 03:38:26 +0300 Subject: [PATCH 144/378] //test --- .../console/impl/CreateDatabaseCommand.java | 6 +++--- .../console/impl/CreateTableCommand.java | 12 ++++++------ .../basics/console/impl/DeleteKeyCommand.java | 18 +++++++++--------- .../basics/console/impl/GetKeyCommand.java | 18 +++++++++--------- .../basics/console/impl/SetKeyCommand.java | 18 +++++++++--------- 5 files changed, 36 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java index 8e0038af..0ee0b207 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java @@ -50,9 +50,9 @@ public CreateDatabaseCommand(ExecutionEnvironment env, DatabaseFactory factory, public DatabaseCommandResult execute() { try{ String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - if(dbName == null){ - throw new DatabaseException("Why dbname is null? "); - } +// if(dbName == null){ +// throw new DatabaseException("Why dbname is null? "); +// } environment.addDatabase(dbfactory.createNonExistent(dbName,environment.getWorkingPath())); return DatabaseCommandResult.success(("Success add " + dbName).getBytes(StandardCharsets.UTF_8)); } catch (DatabaseException ex){ diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java index db47438f..f981a01f 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java @@ -48,13 +48,13 @@ public CreateTableCommand(ExecutionEnvironment env, List comArgs) { public DatabaseCommandResult execute() { try{ String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - if(dbName == null){ - throw new DatabaseException("Why dbname is null?"); - } +// if(dbName == null){ +// throw new DatabaseException("Why dbname is null?"); +// } String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); - if(tbName == null){ - throw new DatabaseException("Why tbName is null?"); - } +// if(tbName == null){ +// throw new DatabaseException("Why tbName is null?"); +// } Optional dataBase = environment.getDatabase(dbName); if(dataBase.isEmpty()){ throw new DatabaseException("We dont have"+ dbName); diff --git a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java index 261dca7e..baa35601 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java @@ -47,17 +47,17 @@ public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { public DatabaseCommandResult execute() { try{ String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - if(dbName == null){ - throw new DatabaseException("Why dbname is null?"); - } +// if(dbName == null){ +// throw new DatabaseException("Why dbname is null?"); +// } String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); - if(tbName == null){ - throw new DatabaseException("Why tbName is null?"); - } +// if(tbName == null){ +// throw new DatabaseException("Why tbName is null?"); +// } String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); - if(key == null){ - throw new DatabaseException("Why key is null?"); - } +// if(key == null){ +// throw new DatabaseException("Why key is null?"); +// } Optional dataBase = environment.getDatabase(dbName); if(dataBase.isEmpty()){ throw new DatabaseException("We dont have"+ dbName); diff --git a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java index 7a89f035..3b8f5791 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java @@ -47,17 +47,17 @@ public GetKeyCommand(ExecutionEnvironment env, List comArgs) { public DatabaseCommandResult execute() { try{ String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - if(dbName == null){ - throw new DatabaseException("Why dbname is null?"); - } +// if(dbName == null){ +// throw new DatabaseException("Why dbname is null?"); +// } String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); - if(tbName == null){ - throw new DatabaseException("Why tbName is null?"); - } +// if(tbName == null){ +// throw new DatabaseException("Why tbName is null?"); +// } String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); - if(key == null){ - throw new DatabaseException("Why key is null?"); - } +// if(key == null){ +// throw new DatabaseException("Why key is null?"); +// } Optional dataBase = environment.getDatabase(dbName); if(dataBase.isEmpty()){ throw new DatabaseException("We dont have"+ dbName); diff --git a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java index 39776339..2a10076f 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java @@ -47,17 +47,17 @@ public SetKeyCommand(ExecutionEnvironment env, List comArgs) { public DatabaseCommandResult execute() { try{ String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - if(dbName == null){ - throw new DatabaseException("Why dbname is null?"); - } +// if(dbName == null){ +// throw new DatabaseException("Why dbname is null?"); +// } String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); - if(tbName == null){ - throw new DatabaseException("Why tbName is null?"); - } +// if(tbName == null){ +// throw new DatabaseException("Why tbName is null?"); +// } String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); - if(key == null){ - throw new DatabaseException("Why key is null?"); - } +// if(key == null){ +// throw new DatabaseException("Why key is null?"); +// } Optional dataBase = environment.getDatabase(dbName); if(dataBase.isEmpty()){ throw new DatabaseException("We dont have"+ dbName); From 27f0f09612d647ad25caa8873ab12feba1294a78 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Mon, 17 May 2021 03:44:23 +0300 Subject: [PATCH 145/378] Update ExecutionEnvironmentImpl.java --- .../java/basics/console/impl/ExecutionEnvironmentImpl.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java index 4f198006..2251831b 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java +++ b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java @@ -6,15 +6,18 @@ import java.nio.file.Path; import java.util.HashMap; +import java.util.Map; import java.util.Optional; public class ExecutionEnvironmentImpl implements ExecutionEnvironment { - DatabaseConfig dbConfig; - HashMap dataBase = new HashMap(); + private final DatabaseConfig dbConfig; + private final Map dataBase ; public ExecutionEnvironmentImpl(DatabaseConfig config) { + dbConfig = config; + dataBase = new HashMap<>(); } @Override From 59992008d691b2de33e8407babd042efc4628844 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Mon, 17 May 2021 03:54:28 +0300 Subject: [PATCH 146/378] test --- .../basics/console/impl/SetKeyCommand.java | 45 +++++++++---------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java index 2a10076f..b18ed571 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java @@ -12,14 +12,16 @@ import java.util.List; import java.util.Optional; + /** * Команда для создания записи значения */ public class SetKeyCommand implements DatabaseCommand { - private final ExecutionEnvironment environment; - private final List commandargs; + private final ExecutionEnvironment enviroment; + private final List commandargs; private static final int numberOfAgrguments = 6; + /** * Создает команду. *
@@ -31,11 +33,11 @@ public class SetKeyCommand implements DatabaseCommand { * @throws IllegalArgumentException если передано неправильное количество аргументов */ public SetKeyCommand(ExecutionEnvironment env, List comArgs) { - if (comArgs.size() != numberOfAgrguments){ - throw new IllegalArgumentException("Why " + comArgs.size()+"!= 5 , in CreateTableCommand" ); + this.enviroment = env; + this.commandargs = comArgs; + if (comArgs.size() != numberOfAgrguments) { + throw new IllegalArgumentException(String.format("Wrong number of arguments - you need %d but given %d")); } - environment = env; - commandargs = comArgs; } /** @@ -45,28 +47,21 @@ public SetKeyCommand(ExecutionEnvironment env, List comArgs) { */ @Override public DatabaseCommandResult execute() { - try{ + try { String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); -// if(dbName == null){ -// throw new DatabaseException("Why dbname is null?"); -// } String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); -// if(tbName == null){ -// throw new DatabaseException("Why tbName is null?"); -// } String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); -// if(key == null){ -// throw new DatabaseException("Why key is null?"); -// } - Optional dataBase = environment.getDatabase(dbName); - if(dataBase.isEmpty()){ - throw new DatabaseException("We dont have"+ dbName); - } byte[] value = commandargs.get(DatabaseCommandArgPositions.VALUE.getPositionIndex()).asString().getBytes(StandardCharsets.UTF_8); - dataBase.get().write(tbName,key,value); - return DatabaseCommandResult.success(("Success add key " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); - } catch (DatabaseException ex){ - return new FailedDatabaseCommandResult(ex.getMessage()); + Optional database = enviroment.getDatabase(dbName); + if (database.isEmpty()) { + throw new DatabaseException(String.format("There is no database with name %s", dbName)); + } + database.get().write(tbName, key, value); + return DatabaseCommandResult.success(String.format("Key %s was successfully added in table %s in database %s", key, tbName, dbName) + .getBytes(StandardCharsets.UTF_8)); + + } catch (DatabaseException e) { + return new FailedDatabaseCommandResult(e.getMessage()); } } -} +} \ No newline at end of file From 8bcefdf3a9160f455dfd4fa5b131d0efe2b3d0e9 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Mon, 17 May 2021 03:54:34 +0300 Subject: [PATCH 147/378] test --- .../basics/console/impl/GetKeyCommand.java | 46 ++++++++----------- 1 file changed, 19 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java index 3b8f5791..33de3512 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java @@ -8,7 +8,6 @@ import com.itmo.java.basics.logic.Database; import com.itmo.java.protocol.model.RespObject; -import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Optional; @@ -17,25 +16,26 @@ */ public class GetKeyCommand implements DatabaseCommand { - private final ExecutionEnvironment environment; - private final List commandargs; + private final ExecutionEnvironment enviroment; + private final List commandargs; private static final int numberOfAgrguments = 5; + /** * Создает команду. *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * * @param env env - * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. * Id команды, имя команды, имя бд, таблицы, ключ * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public GetKeyCommand(ExecutionEnvironment env, List comArgs) { - if (comArgs.size() != numberOfAgrguments){ - throw new IllegalArgumentException("Why " + comArgs.size()+"!= 5 , in CreateTableCommand" ); + public GetKeyCommand(ExecutionEnvironment env, List commandArgs) { + this.enviroment = env; + this.commandargs = commandArgs; + if (commandArgs.size() != numberOfAgrguments) { + throw new IllegalArgumentException(String.format("Wrong number of arguments - you need %d but given %d", numberOfAgrguments, commandArgs.size())); } - environment = env; - commandargs = comArgs; } /** @@ -45,30 +45,22 @@ public GetKeyCommand(ExecutionEnvironment env, List comArgs) { */ @Override public DatabaseCommandResult execute() { - try{ + try { String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); -// if(dbName == null){ -// throw new DatabaseException("Why dbname is null?"); -// } String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); -// if(tbName == null){ -// throw new DatabaseException("Why tbName is null?"); -// } String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); -// if(key == null){ -// throw new DatabaseException("Why key is null?"); -// } - Optional dataBase = environment.getDatabase(dbName); - if(dataBase.isEmpty()){ - throw new DatabaseException("We dont have"+ dbName); + Optional database = enviroment.getDatabase(dbName); + if (database.isEmpty()) { + throw new DatabaseException(String.format("There is no database with name %s", dbName)); } - Optional value = dataBase.get().read(tbName,key); - if(value.isEmpty()){ - throw new DatabaseException("We dont have"+ dbName + tbName + key); + Optional value = database.get().read(tbName, key); + if (value.isEmpty()) { + throw new DatabaseException(String.format("Value for key %s in table %s in database %s is absent", key, tbName, tbName)); } return DatabaseCommandResult.success(value.get()); - } catch (DatabaseException ex){ - return new FailedDatabaseCommandResult(ex.getMessage()); + + } catch (DatabaseException e) { + return new FailedDatabaseCommandResult(e.getMessage()); } } } From 5b8599d2fe75c5f80e7b32fe9549369a62182912 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Mon, 17 May 2021 04:02:52 +0300 Subject: [PATCH 148/378] test --- .../console/impl/CreateDatabaseCommand.java | 5 +- .../console/impl/CreateTableCommand.java | 4 +- .../basics/console/impl/DeleteKeyCommand.java | 4 +- .../impl/FailedDatabaseCommandResult.java | 1 - .../basics/console/impl/GetKeyCommand.java | 46 +++++++++++-------- .../basics/console/impl/SetKeyCommand.java | 45 ++++++++++-------- .../impl/SuccessDatabaseCommandResult.java | 6 +-- 7 files changed, 60 insertions(+), 51 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java index 0ee0b207..e0393fe7 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java @@ -33,11 +33,12 @@ public class CreateDatabaseCommand implements DatabaseCommand { * @throws IllegalArgumentException если передано неправильное количество аргументов */ public CreateDatabaseCommand(ExecutionEnvironment env, DatabaseFactory factory, List comArgs) { + + environment = env; + dbfactory = factory; if (comArgs.size() != numberOfAgrguments){ throw new IllegalArgumentException("Why " + comArgs.size()+"!= 3 , in CreateDataBaseCommand" ); } - environment = env; - dbfactory = factory; commandargs = comArgs; } diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java index f981a01f..9f954876 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java @@ -32,11 +32,11 @@ public class CreateTableCommand implements DatabaseCommand { * @throws IllegalArgumentException если передано неправильное количество аргументов */ public CreateTableCommand(ExecutionEnvironment env, List comArgs) { + environment = env; + commandargs = comArgs; if (comArgs.size() != numberOfAgrguments){ throw new IllegalArgumentException("Why " + comArgs.size()+"!= 4 , in CreateTableCommand" ); } - environment = env; - commandargs = comArgs; } /** diff --git a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java index baa35601..0aa319e5 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java @@ -31,11 +31,11 @@ public class DeleteKeyCommand implements DatabaseCommand { * @throws IllegalArgumentException если передано неправильное количество аргументов */ public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { + environment = env; + commandargs = comArgs; if (comArgs.size() != numberOfAgrguments){ throw new IllegalArgumentException("Why " + comArgs.size()+"!= 5 , in CreateTableCommand" ); } - environment = env; - commandargs = comArgs; } /** diff --git a/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java b/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java index 344b4dd7..a242a8dd 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java +++ b/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java @@ -11,7 +11,6 @@ */ public class FailedDatabaseCommandResult implements DatabaseCommandResult { - private final String payLoad; public FailedDatabaseCommandResult(String pload) { diff --git a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java index 33de3512..3b8f5791 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java @@ -8,6 +8,7 @@ import com.itmo.java.basics.logic.Database; import com.itmo.java.protocol.model.RespObject; +import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Optional; @@ -16,26 +17,25 @@ */ public class GetKeyCommand implements DatabaseCommand { - private final ExecutionEnvironment enviroment; - private final List commandargs; + private final ExecutionEnvironment environment; + private final List commandargs; private static final int numberOfAgrguments = 5; - /** * Создает команду. *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * * @param env env - * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. * Id команды, имя команды, имя бд, таблицы, ключ * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public GetKeyCommand(ExecutionEnvironment env, List commandArgs) { - this.enviroment = env; - this.commandargs = commandArgs; - if (commandArgs.size() != numberOfAgrguments) { - throw new IllegalArgumentException(String.format("Wrong number of arguments - you need %d but given %d", numberOfAgrguments, commandArgs.size())); + public GetKeyCommand(ExecutionEnvironment env, List comArgs) { + if (comArgs.size() != numberOfAgrguments){ + throw new IllegalArgumentException("Why " + comArgs.size()+"!= 5 , in CreateTableCommand" ); } + environment = env; + commandargs = comArgs; } /** @@ -45,22 +45,30 @@ public GetKeyCommand(ExecutionEnvironment env, List commandArgs) { */ @Override public DatabaseCommandResult execute() { - try { + try{ String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); +// if(dbName == null){ +// throw new DatabaseException("Why dbname is null?"); +// } String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); +// if(tbName == null){ +// throw new DatabaseException("Why tbName is null?"); +// } String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); - Optional database = enviroment.getDatabase(dbName); - if (database.isEmpty()) { - throw new DatabaseException(String.format("There is no database with name %s", dbName)); +// if(key == null){ +// throw new DatabaseException("Why key is null?"); +// } + Optional dataBase = environment.getDatabase(dbName); + if(dataBase.isEmpty()){ + throw new DatabaseException("We dont have"+ dbName); } - Optional value = database.get().read(tbName, key); - if (value.isEmpty()) { - throw new DatabaseException(String.format("Value for key %s in table %s in database %s is absent", key, tbName, tbName)); + Optional value = dataBase.get().read(tbName,key); + if(value.isEmpty()){ + throw new DatabaseException("We dont have"+ dbName + tbName + key); } return DatabaseCommandResult.success(value.get()); - - } catch (DatabaseException e) { - return new FailedDatabaseCommandResult(e.getMessage()); + } catch (DatabaseException ex){ + return new FailedDatabaseCommandResult(ex.getMessage()); } } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java index b18ed571..2a10076f 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java @@ -12,16 +12,14 @@ import java.util.List; import java.util.Optional; - /** * Команда для создания записи значения */ public class SetKeyCommand implements DatabaseCommand { - private final ExecutionEnvironment enviroment; - private final List commandargs; + private final ExecutionEnvironment environment; + private final List commandargs; private static final int numberOfAgrguments = 6; - /** * Создает команду. *
@@ -33,11 +31,11 @@ public class SetKeyCommand implements DatabaseCommand { * @throws IllegalArgumentException если передано неправильное количество аргументов */ public SetKeyCommand(ExecutionEnvironment env, List comArgs) { - this.enviroment = env; - this.commandargs = comArgs; - if (comArgs.size() != numberOfAgrguments) { - throw new IllegalArgumentException(String.format("Wrong number of arguments - you need %d but given %d")); + if (comArgs.size() != numberOfAgrguments){ + throw new IllegalArgumentException("Why " + comArgs.size()+"!= 5 , in CreateTableCommand" ); } + environment = env; + commandargs = comArgs; } /** @@ -47,21 +45,28 @@ public SetKeyCommand(ExecutionEnvironment env, List comArgs) { */ @Override public DatabaseCommandResult execute() { - try { + try{ String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); +// if(dbName == null){ +// throw new DatabaseException("Why dbname is null?"); +// } String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); +// if(tbName == null){ +// throw new DatabaseException("Why tbName is null?"); +// } String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); - byte[] value = commandargs.get(DatabaseCommandArgPositions.VALUE.getPositionIndex()).asString().getBytes(StandardCharsets.UTF_8); - Optional database = enviroment.getDatabase(dbName); - if (database.isEmpty()) { - throw new DatabaseException(String.format("There is no database with name %s", dbName)); +// if(key == null){ +// throw new DatabaseException("Why key is null?"); +// } + Optional dataBase = environment.getDatabase(dbName); + if(dataBase.isEmpty()){ + throw new DatabaseException("We dont have"+ dbName); } - database.get().write(tbName, key, value); - return DatabaseCommandResult.success(String.format("Key %s was successfully added in table %s in database %s", key, tbName, dbName) - .getBytes(StandardCharsets.UTF_8)); - - } catch (DatabaseException e) { - return new FailedDatabaseCommandResult(e.getMessage()); + byte[] value = commandargs.get(DatabaseCommandArgPositions.VALUE.getPositionIndex()).asString().getBytes(StandardCharsets.UTF_8); + dataBase.get().write(tbName,key,value); + return DatabaseCommandResult.success(("Success add key " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); + } catch (DatabaseException ex){ + return new FailedDatabaseCommandResult(ex.getMessage()); } } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java b/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java index ae8fad44..0116dea2 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java +++ b/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java @@ -17,11 +17,7 @@ public SuccessDatabaseCommandResult(byte[] pload) { @Override public String getPayLoad() { - if(payLoad != null) { - return new String(payLoad); - } else { - return null; - } + return payLoad !=null ? new String(payLoad) : null; } @Override From 92477642416683571fb22fa79493d57941f645f7 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Mon, 17 May 2021 04:09:13 +0300 Subject: [PATCH 149/378] test --- .../java/client/client/SimpleKvsClient.java | 17 +---------------- .../java/protocol/model/RespBulkString.java | 8 ++++---- 2 files changed, 5 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java b/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java index c9347c9c..89e319f1 100644 --- a/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java +++ b/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java @@ -20,7 +20,7 @@ public class SimpleKvsClient implements KvsClient { * @param connectionSupplier метод создания подключения к базе */ public SimpleKvsClient(String databaseName, Supplier connectionSupplier) { - dbName = databaseName; + dbName = databaseName; this.connectionSupplier = connectionSupplier.get(); } @@ -29,9 +29,6 @@ public String createDatabase() throws DatabaseExecutionException { try { CreateDatabaseKvsCommand dbKvsCom = new CreateDatabaseKvsCommand(dbName); RespObject obj = connectionSupplier.send(dbKvsCom.getCommandId(), dbKvsCom.serialize()); - if(obj.isError()){ - throw new DatabaseExecutionException(obj.asString()); - } return obj.asString(); } catch(ConnectionException ex){ return DatabaseCommandResult.error(ex).getPayLoad(); @@ -43,9 +40,6 @@ public String createTable(String tableName) throws DatabaseExecutionException { try { CreateTableKvsCommand tbKvsCom = new CreateTableKvsCommand(dbName,tableName); RespObject obj = connectionSupplier.send(tbKvsCom.getCommandId(), tbKvsCom.serialize()); - if(obj.isError()){ - throw new DatabaseExecutionException(obj.asString()); - } return obj.asString(); } catch(ConnectionException ex){ return DatabaseCommandResult.error(ex).getPayLoad(); @@ -57,9 +51,6 @@ public String get(String tableName, String key) throws DatabaseExecutionExceptio try { GetKvsCommand getKvsCom = new GetKvsCommand(dbName,tableName,key); RespObject obj = connectionSupplier.send(getKvsCom .getCommandId(), getKvsCom .serialize()); - if(obj.isError()){ - throw new DatabaseExecutionException(obj.asString()); - } return obj.asString(); } catch(ConnectionException ex){ return DatabaseCommandResult.error(ex).getPayLoad(); @@ -71,9 +62,6 @@ public String set(String tableName, String key, String value) throws DatabaseExe try { SetKvsCommand setKvsCom = new SetKvsCommand(dbName,tableName,key,value); RespObject obj = connectionSupplier.send(setKvsCom .getCommandId(), setKvsCom .serialize()); - if(obj.isError()){ - throw new DatabaseExecutionException(obj.asString()); - } return obj.asString(); } catch(ConnectionException ex){ return DatabaseCommandResult.error(ex).getPayLoad(); @@ -85,9 +73,6 @@ public String delete(String tableName, String key) throws DatabaseExecutionExcep try { DeleteKvsCommand delKvsCom = new DeleteKvsCommand(dbName,tableName,key); RespObject obj = connectionSupplier.send(delKvsCom .getCommandId(), delKvsCom .serialize()); - if(obj.isError()){ - throw new DatabaseExecutionException(obj.asString()); - } return obj.asString(); } catch(ConnectionException ex){ return DatabaseCommandResult.error(ex).getPayLoad(); diff --git a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java index 5dcc621d..bfa1f230 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java +++ b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java @@ -43,14 +43,14 @@ public String asString() { @Override public void write(OutputStream output) throws IOException { output.write(CODE); - if (data == null) { - output.write(Integer.toString(NULL_STRING_SIZE).getBytes(StandardCharsets.UTF_8)); - } - else { + if (data != null) { output.write(Integer.toString(data.length).getBytes(StandardCharsets.UTF_8)); output.write(CRLF); output.write(data); } + else { + output.write(Integer.toString(NULL_STRING_SIZE).getBytes(StandardCharsets.UTF_8)); + } output.write(CRLF); } } From 0ef12024f7dfbe6c3de99188592ad38add5a8950 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Mon, 17 May 2021 04:13:58 +0300 Subject: [PATCH 150/378] Update SimpleKvsClient.java --- .../java/client/client/SimpleKvsClient.java | 64 +++++++------------ 1 file changed, 23 insertions(+), 41 deletions(-) diff --git a/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java b/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java index 89e319f1..7b2d69e0 100644 --- a/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java +++ b/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java @@ -1,6 +1,6 @@ package com.itmo.java.client.client; -import com.itmo.java.basics.console.DatabaseCommandResult; + import com.itmo.java.client.command.*; import com.itmo.java.client.connection.KvsConnection; import com.itmo.java.client.exception.ConnectionException; @@ -10,72 +10,54 @@ import java.util.function.Supplier; public class SimpleKvsClient implements KvsClient { + private final String databaseName; + private final KvsConnection connection; - private final String dbName; - private final KvsConnection connectionSupplier; /** - * Конструктор + * Констурктор * * @param databaseName имя базы, с которой работает - * @param connectionSupplier метод создания подключения к базе + * @param connectionSupplier метод создания коннекшена к базе */ public SimpleKvsClient(String databaseName, Supplier connectionSupplier) { - dbName = databaseName; - this.connectionSupplier = connectionSupplier.get(); + this.databaseName = databaseName; + connection = connectionSupplier.get(); } @Override public String createDatabase() throws DatabaseExecutionException { - try { - CreateDatabaseKvsCommand dbKvsCom = new CreateDatabaseKvsCommand(dbName); - RespObject obj = connectionSupplier.send(dbKvsCom.getCommandId(), dbKvsCom.serialize()); - return obj.asString(); - } catch(ConnectionException ex){ - return DatabaseCommandResult.error(ex).getPayLoad(); - } + return sendCommand(new CreateDatabaseKvsCommand(databaseName)); } @Override public String createTable(String tableName) throws DatabaseExecutionException { - try { - CreateTableKvsCommand tbKvsCom = new CreateTableKvsCommand(dbName,tableName); - RespObject obj = connectionSupplier.send(tbKvsCom.getCommandId(), tbKvsCom.serialize()); - return obj.asString(); - } catch(ConnectionException ex){ - return DatabaseCommandResult.error(ex).getPayLoad(); - } + return sendCommand(new CreateTableKvsCommand(databaseName, tableName)); } @Override public String get(String tableName, String key) throws DatabaseExecutionException { - try { - GetKvsCommand getKvsCom = new GetKvsCommand(dbName,tableName,key); - RespObject obj = connectionSupplier.send(getKvsCom .getCommandId(), getKvsCom .serialize()); - return obj.asString(); - } catch(ConnectionException ex){ - return DatabaseCommandResult.error(ex).getPayLoad(); - } + return sendCommand(new GetKvsCommand(databaseName, tableName, key)); } @Override public String set(String tableName, String key, String value) throws DatabaseExecutionException { - try { - SetKvsCommand setKvsCom = new SetKvsCommand(dbName,tableName,key,value); - RespObject obj = connectionSupplier.send(setKvsCom .getCommandId(), setKvsCom .serialize()); - return obj.asString(); - } catch(ConnectionException ex){ - return DatabaseCommandResult.error(ex).getPayLoad(); - } + return sendCommand(new SetKvsCommand(databaseName, tableName, key, value)); } @Override public String delete(String tableName, String key) throws DatabaseExecutionException { + return sendCommand(new DeleteKvsCommand(databaseName, tableName, key)); + } + + private String sendCommand(KvsCommand command) throws DatabaseExecutionException { try { - DeleteKvsCommand delKvsCom = new DeleteKvsCommand(dbName,tableName,key); - RespObject obj = connectionSupplier.send(delKvsCom .getCommandId(), delKvsCom .serialize()); - return obj.asString(); - } catch(ConnectionException ex){ - return DatabaseCommandResult.error(ex).getPayLoad(); + RespObject object = connection.send(command.getCommandId(), command.serialize()); + if (object.isError()) { + throw new DatabaseExecutionException(object.asString()); + } + return object.asString(); + } catch (ConnectionException e) { + throw new DatabaseExecutionException(String.format("Error with connection: %s", e.getMessage())); } } -} +} \ No newline at end of file From 5535260344d06832fac7635fec8b939983f5ab68 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Mon, 17 May 2021 04:20:20 +0300 Subject: [PATCH 151/378] ser --- .../com/itmo/java/basics/DatabaseServer.java | 25 +++--- .../java/client/client/SimpleKvsClient.java | 77 +++++++++++++------ 2 files changed, 68 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/DatabaseServer.java b/src/main/java/com/itmo/java/basics/DatabaseServer.java index 04bac4d0..59b69668 100644 --- a/src/main/java/com/itmo/java/basics/DatabaseServer.java +++ b/src/main/java/com/itmo/java/basics/DatabaseServer.java @@ -2,8 +2,7 @@ import com.itmo.java.basics.console.*; import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.initialization.impl.DatabaseServerInitializer; -import com.itmo.java.basics.initialization.impl.InitializationContextImpl; +import com.itmo.java.basics.initialization.impl.*; import com.itmo.java.protocol.model.RespArray; import java.util.concurrent.CompletableFuture; @@ -12,29 +11,31 @@ public class DatabaseServer { - private ExecutorService executorService = Executors.newSingleThreadExecutor(); - private final ExecutionEnvironment environment; + private final ExecutorService executorService = Executors.newSingleThreadExecutor(); + private final ExecutionEnvironment enviroment; + /** - * Конструктор + * Con structor * - * @param env env для инициализации. Далее работа происходит с заполненным объектом + * @param env env для инициализации. Далее работа происходит с заполненым объектом * @param initializer готовый чейн инициализации * @throws DatabaseException если произошла ошибка инициализации */ - private DatabaseServer(ExecutionEnvironment env){ - environment = env; - } public static DatabaseServer initialize(ExecutionEnvironment env, DatabaseServerInitializer initializer) throws DatabaseException { - initializer.perform(new InitializationContextImpl(env,null,null,null)); + initializer.perform(new InitializationContextImpl(env, null, null, null)); return new DatabaseServer(env); } + private DatabaseServer(ExecutionEnvironment env) { + this.enviroment = env; + } + public CompletableFuture executeNextCommand(RespArray message) { - return CompletableFuture.supplyAsync(() -> DatabaseCommands.valueOf(message.getObjects().get(DatabaseCommandArgPositions.COMMAND_NAME.getPositionIndex()).asString()).getCommand(environment, message.getObjects()).execute(), executorService); + return CompletableFuture.supplyAsync(() -> DatabaseCommands.valueOf(message.getObjects().get(DatabaseCommandArgPositions.COMMAND_NAME.getPositionIndex()).asString()).getCommand(enviroment, message.getObjects()).execute(), executorService); } public CompletableFuture executeNextCommand(DatabaseCommand command) { - return CompletableFuture.supplyAsync(command::execute,executorService); + return CompletableFuture.supplyAsync(command::execute, executorService); } public ExecutionEnvironment getEnv() { diff --git a/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java b/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java index 7b2d69e0..c9347c9c 100644 --- a/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java +++ b/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java @@ -1,6 +1,6 @@ package com.itmo.java.client.client; - +import com.itmo.java.basics.console.DatabaseCommandResult; import com.itmo.java.client.command.*; import com.itmo.java.client.connection.KvsConnection; import com.itmo.java.client.exception.ConnectionException; @@ -10,54 +10,87 @@ import java.util.function.Supplier; public class SimpleKvsClient implements KvsClient { - private final String databaseName; - private final KvsConnection connection; + private final String dbName; + private final KvsConnection connectionSupplier; /** - * Констурктор + * Конструктор * * @param databaseName имя базы, с которой работает - * @param connectionSupplier метод создания коннекшена к базе + * @param connectionSupplier метод создания подключения к базе */ public SimpleKvsClient(String databaseName, Supplier connectionSupplier) { - this.databaseName = databaseName; - connection = connectionSupplier.get(); + dbName = databaseName; + this.connectionSupplier = connectionSupplier.get(); } @Override public String createDatabase() throws DatabaseExecutionException { - return sendCommand(new CreateDatabaseKvsCommand(databaseName)); + try { + CreateDatabaseKvsCommand dbKvsCom = new CreateDatabaseKvsCommand(dbName); + RespObject obj = connectionSupplier.send(dbKvsCom.getCommandId(), dbKvsCom.serialize()); + if(obj.isError()){ + throw new DatabaseExecutionException(obj.asString()); + } + return obj.asString(); + } catch(ConnectionException ex){ + return DatabaseCommandResult.error(ex).getPayLoad(); + } } @Override public String createTable(String tableName) throws DatabaseExecutionException { - return sendCommand(new CreateTableKvsCommand(databaseName, tableName)); + try { + CreateTableKvsCommand tbKvsCom = new CreateTableKvsCommand(dbName,tableName); + RespObject obj = connectionSupplier.send(tbKvsCom.getCommandId(), tbKvsCom.serialize()); + if(obj.isError()){ + throw new DatabaseExecutionException(obj.asString()); + } + return obj.asString(); + } catch(ConnectionException ex){ + return DatabaseCommandResult.error(ex).getPayLoad(); + } } @Override public String get(String tableName, String key) throws DatabaseExecutionException { - return sendCommand(new GetKvsCommand(databaseName, tableName, key)); + try { + GetKvsCommand getKvsCom = new GetKvsCommand(dbName,tableName,key); + RespObject obj = connectionSupplier.send(getKvsCom .getCommandId(), getKvsCom .serialize()); + if(obj.isError()){ + throw new DatabaseExecutionException(obj.asString()); + } + return obj.asString(); + } catch(ConnectionException ex){ + return DatabaseCommandResult.error(ex).getPayLoad(); + } } @Override public String set(String tableName, String key, String value) throws DatabaseExecutionException { - return sendCommand(new SetKvsCommand(databaseName, tableName, key, value)); + try { + SetKvsCommand setKvsCom = new SetKvsCommand(dbName,tableName,key,value); + RespObject obj = connectionSupplier.send(setKvsCom .getCommandId(), setKvsCom .serialize()); + if(obj.isError()){ + throw new DatabaseExecutionException(obj.asString()); + } + return obj.asString(); + } catch(ConnectionException ex){ + return DatabaseCommandResult.error(ex).getPayLoad(); + } } @Override public String delete(String tableName, String key) throws DatabaseExecutionException { - return sendCommand(new DeleteKvsCommand(databaseName, tableName, key)); - } - - private String sendCommand(KvsCommand command) throws DatabaseExecutionException { try { - RespObject object = connection.send(command.getCommandId(), command.serialize()); - if (object.isError()) { - throw new DatabaseExecutionException(object.asString()); + DeleteKvsCommand delKvsCom = new DeleteKvsCommand(dbName,tableName,key); + RespObject obj = connectionSupplier.send(delKvsCom .getCommandId(), delKvsCom .serialize()); + if(obj.isError()){ + throw new DatabaseExecutionException(obj.asString()); } - return object.asString(); - } catch (ConnectionException e) { - throw new DatabaseExecutionException(String.format("Error with connection: %s", e.getMessage())); + return obj.asString(); + } catch(ConnectionException ex){ + return DatabaseCommandResult.error(ex).getPayLoad(); } } -} \ No newline at end of file +} From 4597aa785c732c813c0ff8510e7ad1188a68bcc9 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Mon, 17 May 2021 04:22:59 +0300 Subject: [PATCH 152/378] test --- .../console/impl/CreateDatabaseCommand.java | 46 ++++++++--------- .../console/impl/CreateTableCommand.java | 50 +++++++++---------- 2 files changed, 46 insertions(+), 50 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java index e0393fe7..fbe5e141 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java @@ -16,10 +16,11 @@ */ public class CreateDatabaseCommand implements DatabaseCommand { - private final ExecutionEnvironment environment; - private final DatabaseFactory dbfactory; - private final List commandargs; - private static final int numberOfAgrguments = 3; + private static final int ARGUMENTS_QUANTITY = 3; + private final ExecutionEnvironment env; + private final DatabaseFactory factory; + private final List commandArgs; + /** * Создает команду. @@ -28,18 +29,17 @@ public class CreateDatabaseCommand implements DatabaseCommand { * * @param env env * @param factory функция создания базы данных (пример: DatabaseImpl::create) - * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. * Id команды, имя команды, имя создаваемой бд * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public CreateDatabaseCommand(ExecutionEnvironment env, DatabaseFactory factory, List comArgs) { - - environment = env; - dbfactory = factory; - if (comArgs.size() != numberOfAgrguments){ - throw new IllegalArgumentException("Why " + comArgs.size()+"!= 3 , in CreateDataBaseCommand" ); + public CreateDatabaseCommand(ExecutionEnvironment env, DatabaseFactory factory, List commandArgs) { + this.env = env; + this.factory = factory; + if (commandArgs.size() != ARGUMENTS_QUANTITY) { + throw new IllegalArgumentException(String.format("Wrong number of arguments - you need %d but given %d", ARGUMENTS_QUANTITY, commandArgs.size())); } - commandargs = comArgs; + this.commandArgs = commandArgs; } /** @@ -49,15 +49,15 @@ public CreateDatabaseCommand(ExecutionEnvironment env, DatabaseFactory factory, */ @Override public DatabaseCommandResult execute() { - try{ - String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); -// if(dbName == null){ -// throw new DatabaseException("Why dbname is null? "); -// } - environment.addDatabase(dbfactory.createNonExistent(dbName,environment.getWorkingPath())); - return DatabaseCommandResult.success(("Success add " + dbName).getBytes(StandardCharsets.UTF_8)); - } catch (DatabaseException ex){ - return new FailedDatabaseCommandResult(ex.getMessage()); - } + try { + String databaseName = commandArgs + .get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()) + .asString(); + env.addDatabase(factory.createNonExistent(databaseName, env.getWorkingPath())); + return DatabaseCommandResult.success(String.format("Database with name %s successfully added", databaseName) + .getBytes(StandardCharsets.UTF_8)); + } catch (DatabaseException e) { + return new FailedDatabaseCommandResult(e.getMessage()); + } } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java index 9f954876..a43f69cf 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java @@ -6,7 +6,6 @@ import com.itmo.java.basics.console.ExecutionEnvironment; import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.logic.Database; -import com.itmo.java.basics.logic.DatabaseFactory; import com.itmo.java.protocol.model.RespObject; import java.nio.charset.StandardCharsets; @@ -18,24 +17,25 @@ */ public class CreateTableCommand implements DatabaseCommand { - private final ExecutionEnvironment environment; - private final List commandargs; - private static final int numberOfAgrguments = 4; + private static final int ARGUMENTS_QUANTITY = 4; + private final ExecutionEnvironment env; + private final List commandArgs; + /** * Создает команду *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * * @param env env - * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. * Id команды, имя команды, имя бд, имя таблицы * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public CreateTableCommand(ExecutionEnvironment env, List comArgs) { - environment = env; - commandargs = comArgs; - if (comArgs.size() != numberOfAgrguments){ - throw new IllegalArgumentException("Why " + comArgs.size()+"!= 4 , in CreateTableCommand" ); + public CreateTableCommand(ExecutionEnvironment env, List commandArgs) { + this.env = env; + this.commandArgs = commandArgs; + if (commandArgs.size() != ARGUMENTS_QUANTITY) { + throw new IllegalArgumentException(String.format("Wrong number of arguments - you need %d but given %d", ARGUMENTS_QUANTITY, commandArgs.size())); } } @@ -46,23 +46,19 @@ public CreateTableCommand(ExecutionEnvironment env, List comArgs) { */ @Override public DatabaseCommandResult execute() { - try{ - String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); -// if(dbName == null){ -// throw new DatabaseException("Why dbname is null?"); -// } - String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); -// if(tbName == null){ -// throw new DatabaseException("Why tbName is null?"); -// } - Optional dataBase = environment.getDatabase(dbName); - if(dataBase.isEmpty()){ - throw new DatabaseException("We dont have"+ dbName); + try { + String databaseName = commandArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + String tableName = commandArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + Optional database = env.getDatabase(databaseName); + if (database.isEmpty()) { + throw new DatabaseException(String.format("There is no database with name %s", databaseName)); } - dataBase.get().createTableIfNotExists(tbName); - return DatabaseCommandResult.success(("Success add " + dbName + tbName).getBytes(StandardCharsets.UTF_8)); - } catch (DatabaseException ex){ - return new FailedDatabaseCommandResult(ex.getMessage()); + database.get().createTableIfNotExists(tableName); + return DatabaseCommandResult.success(String.format("Table with name %s successfully added into database %s", tableName, databaseName) + .getBytes(StandardCharsets.UTF_8)); + + } catch (DatabaseException e) { + return new FailedDatabaseCommandResult(e.getMessage()); } } -} +} \ No newline at end of file From 76d455c3e792ee93af8389c2b916d5e0516e0609 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Mon, 17 May 2021 04:26:01 +0300 Subject: [PATCH 153/378] s --- .../java/basics/console/DatabaseCommands.java | 12 ++-- .../basics/console/impl/DeleteKeyCommand.java | 54 ++++++++---------- .../impl/ExecutionEnvironmentImpl.java | 19 +++---- .../impl/FailedDatabaseCommandResult.java | 13 ++--- .../basics/console/impl/GetKeyCommand.java | 56 ++++++++---------- .../basics/console/impl/SetKeyCommand.java | 57 +++++++++---------- .../impl/SuccessDatabaseCommandResult.java | 13 ++--- 7 files changed, 101 insertions(+), 123 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/DatabaseCommands.java b/src/main/java/com/itmo/java/basics/console/DatabaseCommands.java index 6a5b68c3..b54c7473 100644 --- a/src/main/java/com/itmo/java/basics/console/DatabaseCommands.java +++ b/src/main/java/com/itmo/java/basics/console/DatabaseCommands.java @@ -15,31 +15,31 @@ public enum DatabaseCommands { CREATE_DATABASE { @Override public DatabaseCommand getCommand(ExecutionEnvironment env, List commandArgs) { - return new CreateDatabaseCommand(env, DatabaseImpl::create ,commandArgs); + return new CreateDatabaseCommand(env, DatabaseImpl::create, commandArgs); } }, CREATE_TABLE { @Override public DatabaseCommand getCommand(ExecutionEnvironment env, List commandArgs) { - return new CreateTableCommand(env,commandArgs); + return new CreateTableCommand(env, commandArgs); } }, SET_KEY { @Override public DatabaseCommand getCommand(ExecutionEnvironment env, List commandArgs) { - return new SetKeyCommand(env,commandArgs); + return new SetKeyCommand(env, commandArgs); } }, GET_KEY { @Override public DatabaseCommand getCommand(ExecutionEnvironment env, List commandArgs) { - return new GetKeyCommand(env,commandArgs); + return new GetKeyCommand(env, commandArgs); } }, DELETE_KEY { @Override public DatabaseCommand getCommand(ExecutionEnvironment env, List commandArgs) { - return new DeleteKeyCommand(env,commandArgs); + return new DeleteKeyCommand(env, commandArgs); } }; @@ -47,4 +47,4 @@ public DatabaseCommand getCommand(ExecutionEnvironment env, List com * Возвращает созданную команду. Каждый элемент перечисления создается со своей реализацией этого метода */ public abstract DatabaseCommand getCommand(ExecutionEnvironment env, List commandArgs); -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java index 0aa319e5..d042b5df 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java @@ -17,24 +17,25 @@ */ public class DeleteKeyCommand implements DatabaseCommand { - private final ExecutionEnvironment environment; - private final List commandargs; - private static final int numberOfAgrguments = 5; + private static final int ARGUMENTS_QUANTITY = 5; + private final ExecutionEnvironment env; + private final List commandArgs; + /** * Создает команду. *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * * @param env env - * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. * Id команды, имя команды, имя бд, таблицы, ключ * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { - environment = env; - commandargs = comArgs; - if (comArgs.size() != numberOfAgrguments){ - throw new IllegalArgumentException("Why " + comArgs.size()+"!= 5 , in CreateTableCommand" ); + public DeleteKeyCommand(ExecutionEnvironment env, List commandArgs) { + this.env = env; + this.commandArgs = commandArgs; + if (commandArgs.size() != ARGUMENTS_QUANTITY) { + throw new IllegalArgumentException(String.format("Wrong number of arguments - you need %d but given %d", ARGUMENTS_QUANTITY, commandArgs.size())); } } @@ -45,27 +46,20 @@ public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { */ @Override public DatabaseCommandResult execute() { - try{ - String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); -// if(dbName == null){ -// throw new DatabaseException("Why dbname is null?"); -// } - String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); -// if(tbName == null){ -// throw new DatabaseException("Why tbName is null?"); -// } - String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); -// if(key == null){ -// throw new DatabaseException("Why key is null?"); -// } - Optional dataBase = environment.getDatabase(dbName); - if(dataBase.isEmpty()){ - throw new DatabaseException("We dont have"+ dbName); + try { + String databaseName = commandArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + String tableName = commandArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + String key = commandArgs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); + Optional database = env.getDatabase(databaseName); + if (database.isEmpty()) { + throw new DatabaseException(String.format("There is no database with name %s", databaseName)); } - dataBase.get().delete(tbName,key); - return DatabaseCommandResult.success(("Success del " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); - } catch (DatabaseException ex){ - return new FailedDatabaseCommandResult(ex.getMessage()); + database.get().delete(tableName, key); + return DatabaseCommandResult.success(String.format("Key %s was succesfully deleted from table %s in database %s", key, tableName, databaseName) + .getBytes(StandardCharsets.UTF_8)); + + } catch (DatabaseException e) { + return new FailedDatabaseCommandResult(e.getMessage()); } } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java index 2251831b..3a5d09ad 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java +++ b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java @@ -5,33 +5,32 @@ import com.itmo.java.basics.logic.Database; import java.nio.file.Path; +import java.nio.file.Paths; import java.util.HashMap; import java.util.Map; import java.util.Optional; public class ExecutionEnvironmentImpl implements ExecutionEnvironment { - - private final DatabaseConfig dbConfig; - private final Map dataBase ; + private final DatabaseConfig config; + private final Map databases; public ExecutionEnvironmentImpl(DatabaseConfig config) { - - dbConfig = config; - dataBase = new HashMap<>(); + this.config = config; + databases = new HashMap<>(); } @Override public Optional getDatabase(String name) { - return Optional.ofNullable(dataBase.get(name)); + return Optional.ofNullable(databases.get(name)); } @Override public void addDatabase(Database db) { - dataBase.put(db.getName(), db); + databases.put(db.getName(), db); } @Override public Path getWorkingPath() { - return Path.of(dbConfig.getWorkingPath()); + return Paths.get(config.getWorkingPath()); } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java b/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java index a242a8dd..1fe8de1a 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java +++ b/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java @@ -10,11 +10,10 @@ * Зафейленная команда */ public class FailedDatabaseCommandResult implements DatabaseCommandResult { + private final String payload; - private final String payLoad; - - public FailedDatabaseCommandResult(String pload) { - payLoad = pload; + public FailedDatabaseCommandResult(String payload) { + this.payload = payload; } /** @@ -22,7 +21,7 @@ public FailedDatabaseCommandResult(String pload) { */ @Override public String getPayLoad() { - return payLoad; + return payload; } @Override @@ -35,6 +34,6 @@ public boolean isSuccess() { */ @Override public RespObject serialize() { - return new RespError(payLoad.getBytes(StandardCharsets.UTF_8)); + return new RespError(payload.getBytes(StandardCharsets.UTF_8)); } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java index 3b8f5791..84d170a8 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java @@ -8,7 +8,6 @@ import com.itmo.java.basics.logic.Database; import com.itmo.java.protocol.model.RespObject; -import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Optional; @@ -17,25 +16,26 @@ */ public class GetKeyCommand implements DatabaseCommand { - private final ExecutionEnvironment environment; - private final List commandargs; - private static final int numberOfAgrguments = 5; + private static final int ARGUMENTS_QUANTITY = 5; + private final ExecutionEnvironment env; + private final List commandArgs; + /** * Создает команду. *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * * @param env env - * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. * Id команды, имя команды, имя бд, таблицы, ключ * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public GetKeyCommand(ExecutionEnvironment env, List comArgs) { - if (comArgs.size() != numberOfAgrguments){ - throw new IllegalArgumentException("Why " + comArgs.size()+"!= 5 , in CreateTableCommand" ); + public GetKeyCommand(ExecutionEnvironment env, List commandArgs) { + this.env = env; + this.commandArgs = commandArgs; + if (commandArgs.size() != ARGUMENTS_QUANTITY) { + throw new IllegalArgumentException(String.format("Wrong number of arguments - you need %d but given %d", ARGUMENTS_QUANTITY, commandArgs.size())); } - environment = env; - commandargs = comArgs; } /** @@ -45,30 +45,22 @@ public GetKeyCommand(ExecutionEnvironment env, List comArgs) { */ @Override public DatabaseCommandResult execute() { - try{ - String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); -// if(dbName == null){ -// throw new DatabaseException("Why dbname is null?"); -// } - String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); -// if(tbName == null){ -// throw new DatabaseException("Why tbName is null?"); -// } - String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); -// if(key == null){ -// throw new DatabaseException("Why key is null?"); -// } - Optional dataBase = environment.getDatabase(dbName); - if(dataBase.isEmpty()){ - throw new DatabaseException("We dont have"+ dbName); + try { + String databaseName = commandArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + String tableName = commandArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + String key = commandArgs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); + Optional database = env.getDatabase(databaseName); + if (database.isEmpty()) { + throw new DatabaseException(String.format("There is no database with name %s", databaseName)); } - Optional value = dataBase.get().read(tbName,key); - if(value.isEmpty()){ - throw new DatabaseException("We dont have"+ dbName + tbName + key); + Optional value = database.get().read(tableName, key); + if (value.isEmpty()) { + throw new DatabaseException(String.format("Value for key %s in table %s in database %s is absent", key, tableName, databaseName)); } return DatabaseCommandResult.success(value.get()); - } catch (DatabaseException ex){ - return new FailedDatabaseCommandResult(ex.getMessage()); + + } catch (DatabaseException e) { + return new FailedDatabaseCommandResult(e.getMessage()); } } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java index 2a10076f..ed140c67 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java @@ -12,30 +12,32 @@ import java.util.List; import java.util.Optional; + /** * Команда для создания записи значения */ public class SetKeyCommand implements DatabaseCommand { - private final ExecutionEnvironment environment; - private final List commandargs; - private static final int numberOfAgrguments = 6; + private static final int ARGUMENTS_QUANTITY = 6; + private final ExecutionEnvironment env; + private final List commandArgs; + /** * Создает команду. *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * * @param env env - * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. * Id команды, имя команды, имя бд, таблицы, ключ, значение * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public SetKeyCommand(ExecutionEnvironment env, List comArgs) { - if (comArgs.size() != numberOfAgrguments){ - throw new IllegalArgumentException("Why " + comArgs.size()+"!= 5 , in CreateTableCommand" ); + public SetKeyCommand(ExecutionEnvironment env, List commandArgs) { + this.env = env; + this.commandArgs = commandArgs; + if (commandArgs.size() != ARGUMENTS_QUANTITY) { + throw new IllegalArgumentException(String.format("Wrong number of arguments - you need %d but given %d", ARGUMENTS_QUANTITY, commandArgs.size())); } - environment = env; - commandargs = comArgs; } /** @@ -45,28 +47,21 @@ public SetKeyCommand(ExecutionEnvironment env, List comArgs) { */ @Override public DatabaseCommandResult execute() { - try{ - String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); -// if(dbName == null){ -// throw new DatabaseException("Why dbname is null?"); -// } - String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); -// if(tbName == null){ -// throw new DatabaseException("Why tbName is null?"); -// } - String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); -// if(key == null){ -// throw new DatabaseException("Why key is null?"); -// } - Optional dataBase = environment.getDatabase(dbName); - if(dataBase.isEmpty()){ - throw new DatabaseException("We dont have"+ dbName); + try { + String databaseName = commandArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + String tableName = commandArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + String key = commandArgs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); + byte[] value = commandArgs.get(DatabaseCommandArgPositions.VALUE.getPositionIndex()).asString().getBytes(StandardCharsets.UTF_8); + Optional database = env.getDatabase(databaseName); + if (database.isEmpty()) { + throw new DatabaseException(String.format("There is no database with name %s", databaseName)); } - byte[] value = commandargs.get(DatabaseCommandArgPositions.VALUE.getPositionIndex()).asString().getBytes(StandardCharsets.UTF_8); - dataBase.get().write(tbName,key,value); - return DatabaseCommandResult.success(("Success add key " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); - } catch (DatabaseException ex){ - return new FailedDatabaseCommandResult(ex.getMessage()); + database.get().write(tableName, key, value); + return DatabaseCommandResult.success(String.format("Key %s was successfully added in table %s in database %s", key, tableName, databaseName) + .getBytes(StandardCharsets.UTF_8)); + + } catch (DatabaseException e) { + return new FailedDatabaseCommandResult(e.getMessage()); } } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java b/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java index 0116dea2..72ee8604 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java +++ b/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java @@ -8,16 +8,15 @@ * Результат успешной команды */ public class SuccessDatabaseCommandResult implements DatabaseCommandResult { + private final byte[] payload; - private final byte[] payLoad; - - public SuccessDatabaseCommandResult(byte[] pload) { - payLoad = pload; + public SuccessDatabaseCommandResult(byte[] payload) { + this.payload = payload; } @Override public String getPayLoad() { - return payLoad !=null ? new String(payLoad) : null; + return payload != null ? new String(payload) : null; } @Override @@ -30,6 +29,6 @@ public boolean isSuccess() { */ @Override public RespObject serialize() { - return new RespBulkString(payLoad); + return new RespBulkString(payload); } -} +} \ No newline at end of file From 34f5cf050482a2c0c96b661cad34cc720a9fbc9c Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Mon, 17 May 2021 04:31:28 +0300 Subject: [PATCH 154/378] lz --- .../java/basics/console/DatabaseCommands.java | 12 +- .../console/impl/CreateDatabaseCommand.java | 46 ++--- .../console/impl/CreateTableCommand.java | 50 ++--- .../basics/console/impl/DeleteKeyCommand.java | 54 +++--- .../impl/ExecutionEnvironmentImpl.java | 19 +- .../impl/FailedDatabaseCommandResult.java | 13 +- .../basics/console/impl/GetKeyCommand.java | 56 +++--- .../basics/console/impl/SetKeyCommand.java | 57 +++--- .../impl/SuccessDatabaseCommandResult.java | 13 +- .../java/basics/logic/impl/CachingTable.java | 35 ++-- .../basics/logic/impl/DatabaseCacheImpl.java | 26 +-- .../java/basics/logic/impl/DatabaseImpl.java | 119 ++++++------ .../logic/impl/RemoveDatabaseRecord.java | 20 +- .../java/basics/logic/impl/SegmentImpl.java | 174 ++++++++++-------- .../basics/logic/impl/SetDatabaseRecord.java | 14 +- .../java/basics/logic/impl/TableImpl.java | 116 ++++++------ 16 files changed, 442 insertions(+), 382 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/DatabaseCommands.java b/src/main/java/com/itmo/java/basics/console/DatabaseCommands.java index b54c7473..6a5b68c3 100644 --- a/src/main/java/com/itmo/java/basics/console/DatabaseCommands.java +++ b/src/main/java/com/itmo/java/basics/console/DatabaseCommands.java @@ -15,31 +15,31 @@ public enum DatabaseCommands { CREATE_DATABASE { @Override public DatabaseCommand getCommand(ExecutionEnvironment env, List commandArgs) { - return new CreateDatabaseCommand(env, DatabaseImpl::create, commandArgs); + return new CreateDatabaseCommand(env, DatabaseImpl::create ,commandArgs); } }, CREATE_TABLE { @Override public DatabaseCommand getCommand(ExecutionEnvironment env, List commandArgs) { - return new CreateTableCommand(env, commandArgs); + return new CreateTableCommand(env,commandArgs); } }, SET_KEY { @Override public DatabaseCommand getCommand(ExecutionEnvironment env, List commandArgs) { - return new SetKeyCommand(env, commandArgs); + return new SetKeyCommand(env,commandArgs); } }, GET_KEY { @Override public DatabaseCommand getCommand(ExecutionEnvironment env, List commandArgs) { - return new GetKeyCommand(env, commandArgs); + return new GetKeyCommand(env,commandArgs); } }, DELETE_KEY { @Override public DatabaseCommand getCommand(ExecutionEnvironment env, List commandArgs) { - return new DeleteKeyCommand(env, commandArgs); + return new DeleteKeyCommand(env,commandArgs); } }; @@ -47,4 +47,4 @@ public DatabaseCommand getCommand(ExecutionEnvironment env, List com * Возвращает созданную команду. Каждый элемент перечисления создается со своей реализацией этого метода */ public abstract DatabaseCommand getCommand(ExecutionEnvironment env, List commandArgs); -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java index fbe5e141..e0393fe7 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java @@ -16,11 +16,10 @@ */ public class CreateDatabaseCommand implements DatabaseCommand { - private static final int ARGUMENTS_QUANTITY = 3; - private final ExecutionEnvironment env; - private final DatabaseFactory factory; - private final List commandArgs; - + private final ExecutionEnvironment environment; + private final DatabaseFactory dbfactory; + private final List commandargs; + private static final int numberOfAgrguments = 3; /** * Создает команду. @@ -29,17 +28,18 @@ public class CreateDatabaseCommand implements DatabaseCommand { * * @param env env * @param factory функция создания базы данных (пример: DatabaseImpl::create) - * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. * Id команды, имя команды, имя создаваемой бд * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public CreateDatabaseCommand(ExecutionEnvironment env, DatabaseFactory factory, List commandArgs) { - this.env = env; - this.factory = factory; - if (commandArgs.size() != ARGUMENTS_QUANTITY) { - throw new IllegalArgumentException(String.format("Wrong number of arguments - you need %d but given %d", ARGUMENTS_QUANTITY, commandArgs.size())); + public CreateDatabaseCommand(ExecutionEnvironment env, DatabaseFactory factory, List comArgs) { + + environment = env; + dbfactory = factory; + if (comArgs.size() != numberOfAgrguments){ + throw new IllegalArgumentException("Why " + comArgs.size()+"!= 3 , in CreateDataBaseCommand" ); } - this.commandArgs = commandArgs; + commandargs = comArgs; } /** @@ -49,15 +49,15 @@ public CreateDatabaseCommand(ExecutionEnvironment env, DatabaseFactory factory, */ @Override public DatabaseCommandResult execute() { - try { - String databaseName = commandArgs - .get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()) - .asString(); - env.addDatabase(factory.createNonExistent(databaseName, env.getWorkingPath())); - return DatabaseCommandResult.success(String.format("Database with name %s successfully added", databaseName) - .getBytes(StandardCharsets.UTF_8)); - } catch (DatabaseException e) { - return new FailedDatabaseCommandResult(e.getMessage()); - } + try{ + String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); +// if(dbName == null){ +// throw new DatabaseException("Why dbname is null? "); +// } + environment.addDatabase(dbfactory.createNonExistent(dbName,environment.getWorkingPath())); + return DatabaseCommandResult.success(("Success add " + dbName).getBytes(StandardCharsets.UTF_8)); + } catch (DatabaseException ex){ + return new FailedDatabaseCommandResult(ex.getMessage()); + } } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java index a43f69cf..9f954876 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java @@ -6,6 +6,7 @@ import com.itmo.java.basics.console.ExecutionEnvironment; import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.logic.Database; +import com.itmo.java.basics.logic.DatabaseFactory; import com.itmo.java.protocol.model.RespObject; import java.nio.charset.StandardCharsets; @@ -17,25 +18,24 @@ */ public class CreateTableCommand implements DatabaseCommand { - private static final int ARGUMENTS_QUANTITY = 4; - private final ExecutionEnvironment env; - private final List commandArgs; - + private final ExecutionEnvironment environment; + private final List commandargs; + private static final int numberOfAgrguments = 4; /** * Создает команду *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * * @param env env - * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. * Id команды, имя команды, имя бд, имя таблицы * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public CreateTableCommand(ExecutionEnvironment env, List commandArgs) { - this.env = env; - this.commandArgs = commandArgs; - if (commandArgs.size() != ARGUMENTS_QUANTITY) { - throw new IllegalArgumentException(String.format("Wrong number of arguments - you need %d but given %d", ARGUMENTS_QUANTITY, commandArgs.size())); + public CreateTableCommand(ExecutionEnvironment env, List comArgs) { + environment = env; + commandargs = comArgs; + if (comArgs.size() != numberOfAgrguments){ + throw new IllegalArgumentException("Why " + comArgs.size()+"!= 4 , in CreateTableCommand" ); } } @@ -46,19 +46,23 @@ public CreateTableCommand(ExecutionEnvironment env, List commandArgs */ @Override public DatabaseCommandResult execute() { - try { - String databaseName = commandArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - String tableName = commandArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); - Optional database = env.getDatabase(databaseName); - if (database.isEmpty()) { - throw new DatabaseException(String.format("There is no database with name %s", databaseName)); + try{ + String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); +// if(dbName == null){ +// throw new DatabaseException("Why dbname is null?"); +// } + String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); +// if(tbName == null){ +// throw new DatabaseException("Why tbName is null?"); +// } + Optional dataBase = environment.getDatabase(dbName); + if(dataBase.isEmpty()){ + throw new DatabaseException("We dont have"+ dbName); } - database.get().createTableIfNotExists(tableName); - return DatabaseCommandResult.success(String.format("Table with name %s successfully added into database %s", tableName, databaseName) - .getBytes(StandardCharsets.UTF_8)); - - } catch (DatabaseException e) { - return new FailedDatabaseCommandResult(e.getMessage()); + dataBase.get().createTableIfNotExists(tbName); + return DatabaseCommandResult.success(("Success add " + dbName + tbName).getBytes(StandardCharsets.UTF_8)); + } catch (DatabaseException ex){ + return new FailedDatabaseCommandResult(ex.getMessage()); } } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java index d042b5df..0aa319e5 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java @@ -17,25 +17,24 @@ */ public class DeleteKeyCommand implements DatabaseCommand { - private static final int ARGUMENTS_QUANTITY = 5; - private final ExecutionEnvironment env; - private final List commandArgs; - + private final ExecutionEnvironment environment; + private final List commandargs; + private static final int numberOfAgrguments = 5; /** * Создает команду. *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * * @param env env - * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. * Id команды, имя команды, имя бд, таблицы, ключ * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public DeleteKeyCommand(ExecutionEnvironment env, List commandArgs) { - this.env = env; - this.commandArgs = commandArgs; - if (commandArgs.size() != ARGUMENTS_QUANTITY) { - throw new IllegalArgumentException(String.format("Wrong number of arguments - you need %d but given %d", ARGUMENTS_QUANTITY, commandArgs.size())); + public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { + environment = env; + commandargs = comArgs; + if (comArgs.size() != numberOfAgrguments){ + throw new IllegalArgumentException("Why " + comArgs.size()+"!= 5 , in CreateTableCommand" ); } } @@ -46,20 +45,27 @@ public DeleteKeyCommand(ExecutionEnvironment env, List commandArgs) */ @Override public DatabaseCommandResult execute() { - try { - String databaseName = commandArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - String tableName = commandArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); - String key = commandArgs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); - Optional database = env.getDatabase(databaseName); - if (database.isEmpty()) { - throw new DatabaseException(String.format("There is no database with name %s", databaseName)); + try{ + String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); +// if(dbName == null){ +// throw new DatabaseException("Why dbname is null?"); +// } + String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); +// if(tbName == null){ +// throw new DatabaseException("Why tbName is null?"); +// } + String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); +// if(key == null){ +// throw new DatabaseException("Why key is null?"); +// } + Optional dataBase = environment.getDatabase(dbName); + if(dataBase.isEmpty()){ + throw new DatabaseException("We dont have"+ dbName); } - database.get().delete(tableName, key); - return DatabaseCommandResult.success(String.format("Key %s was succesfully deleted from table %s in database %s", key, tableName, databaseName) - .getBytes(StandardCharsets.UTF_8)); - - } catch (DatabaseException e) { - return new FailedDatabaseCommandResult(e.getMessage()); + dataBase.get().delete(tbName,key); + return DatabaseCommandResult.success(("Success del " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); + } catch (DatabaseException ex){ + return new FailedDatabaseCommandResult(ex.getMessage()); } } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java index 3a5d09ad..2251831b 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java +++ b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java @@ -5,32 +5,33 @@ import com.itmo.java.basics.logic.Database; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.HashMap; import java.util.Map; import java.util.Optional; public class ExecutionEnvironmentImpl implements ExecutionEnvironment { - private final DatabaseConfig config; - private final Map databases; + + private final DatabaseConfig dbConfig; + private final Map dataBase ; public ExecutionEnvironmentImpl(DatabaseConfig config) { - this.config = config; - databases = new HashMap<>(); + + dbConfig = config; + dataBase = new HashMap<>(); } @Override public Optional getDatabase(String name) { - return Optional.ofNullable(databases.get(name)); + return Optional.ofNullable(dataBase.get(name)); } @Override public void addDatabase(Database db) { - databases.put(db.getName(), db); + dataBase.put(db.getName(), db); } @Override public Path getWorkingPath() { - return Paths.get(config.getWorkingPath()); + return Path.of(dbConfig.getWorkingPath()); } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java b/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java index 1fe8de1a..a242a8dd 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java +++ b/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java @@ -10,10 +10,11 @@ * Зафейленная команда */ public class FailedDatabaseCommandResult implements DatabaseCommandResult { - private final String payload; - public FailedDatabaseCommandResult(String payload) { - this.payload = payload; + private final String payLoad; + + public FailedDatabaseCommandResult(String pload) { + payLoad = pload; } /** @@ -21,7 +22,7 @@ public FailedDatabaseCommandResult(String payload) { */ @Override public String getPayLoad() { - return payload; + return payLoad; } @Override @@ -34,6 +35,6 @@ public boolean isSuccess() { */ @Override public RespObject serialize() { - return new RespError(payload.getBytes(StandardCharsets.UTF_8)); + return new RespError(payLoad.getBytes(StandardCharsets.UTF_8)); } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java index 84d170a8..3b8f5791 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java @@ -8,6 +8,7 @@ import com.itmo.java.basics.logic.Database; import com.itmo.java.protocol.model.RespObject; +import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Optional; @@ -16,26 +17,25 @@ */ public class GetKeyCommand implements DatabaseCommand { - private static final int ARGUMENTS_QUANTITY = 5; - private final ExecutionEnvironment env; - private final List commandArgs; - + private final ExecutionEnvironment environment; + private final List commandargs; + private static final int numberOfAgrguments = 5; /** * Создает команду. *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * * @param env env - * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. * Id команды, имя команды, имя бд, таблицы, ключ * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public GetKeyCommand(ExecutionEnvironment env, List commandArgs) { - this.env = env; - this.commandArgs = commandArgs; - if (commandArgs.size() != ARGUMENTS_QUANTITY) { - throw new IllegalArgumentException(String.format("Wrong number of arguments - you need %d but given %d", ARGUMENTS_QUANTITY, commandArgs.size())); + public GetKeyCommand(ExecutionEnvironment env, List comArgs) { + if (comArgs.size() != numberOfAgrguments){ + throw new IllegalArgumentException("Why " + comArgs.size()+"!= 5 , in CreateTableCommand" ); } + environment = env; + commandargs = comArgs; } /** @@ -45,22 +45,30 @@ public GetKeyCommand(ExecutionEnvironment env, List commandArgs) { */ @Override public DatabaseCommandResult execute() { - try { - String databaseName = commandArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - String tableName = commandArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); - String key = commandArgs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); - Optional database = env.getDatabase(databaseName); - if (database.isEmpty()) { - throw new DatabaseException(String.format("There is no database with name %s", databaseName)); + try{ + String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); +// if(dbName == null){ +// throw new DatabaseException("Why dbname is null?"); +// } + String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); +// if(tbName == null){ +// throw new DatabaseException("Why tbName is null?"); +// } + String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); +// if(key == null){ +// throw new DatabaseException("Why key is null?"); +// } + Optional dataBase = environment.getDatabase(dbName); + if(dataBase.isEmpty()){ + throw new DatabaseException("We dont have"+ dbName); } - Optional value = database.get().read(tableName, key); - if (value.isEmpty()) { - throw new DatabaseException(String.format("Value for key %s in table %s in database %s is absent", key, tableName, databaseName)); + Optional value = dataBase.get().read(tbName,key); + if(value.isEmpty()){ + throw new DatabaseException("We dont have"+ dbName + tbName + key); } return DatabaseCommandResult.success(value.get()); - - } catch (DatabaseException e) { - return new FailedDatabaseCommandResult(e.getMessage()); + } catch (DatabaseException ex){ + return new FailedDatabaseCommandResult(ex.getMessage()); } } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java index ed140c67..2a10076f 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java @@ -12,32 +12,30 @@ import java.util.List; import java.util.Optional; - /** * Команда для создания записи значения */ public class SetKeyCommand implements DatabaseCommand { - private static final int ARGUMENTS_QUANTITY = 6; - private final ExecutionEnvironment env; - private final List commandArgs; - + private final ExecutionEnvironment environment; + private final List commandargs; + private static final int numberOfAgrguments = 6; /** * Создает команду. *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * * @param env env - * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. * Id команды, имя команды, имя бд, таблицы, ключ, значение * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public SetKeyCommand(ExecutionEnvironment env, List commandArgs) { - this.env = env; - this.commandArgs = commandArgs; - if (commandArgs.size() != ARGUMENTS_QUANTITY) { - throw new IllegalArgumentException(String.format("Wrong number of arguments - you need %d but given %d", ARGUMENTS_QUANTITY, commandArgs.size())); + public SetKeyCommand(ExecutionEnvironment env, List comArgs) { + if (comArgs.size() != numberOfAgrguments){ + throw new IllegalArgumentException("Why " + comArgs.size()+"!= 5 , in CreateTableCommand" ); } + environment = env; + commandargs = comArgs; } /** @@ -47,21 +45,28 @@ public SetKeyCommand(ExecutionEnvironment env, List commandArgs) { */ @Override public DatabaseCommandResult execute() { - try { - String databaseName = commandArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - String tableName = commandArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); - String key = commandArgs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); - byte[] value = commandArgs.get(DatabaseCommandArgPositions.VALUE.getPositionIndex()).asString().getBytes(StandardCharsets.UTF_8); - Optional database = env.getDatabase(databaseName); - if (database.isEmpty()) { - throw new DatabaseException(String.format("There is no database with name %s", databaseName)); + try{ + String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); +// if(dbName == null){ +// throw new DatabaseException("Why dbname is null?"); +// } + String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); +// if(tbName == null){ +// throw new DatabaseException("Why tbName is null?"); +// } + String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); +// if(key == null){ +// throw new DatabaseException("Why key is null?"); +// } + Optional dataBase = environment.getDatabase(dbName); + if(dataBase.isEmpty()){ + throw new DatabaseException("We dont have"+ dbName); } - database.get().write(tableName, key, value); - return DatabaseCommandResult.success(String.format("Key %s was successfully added in table %s in database %s", key, tableName, databaseName) - .getBytes(StandardCharsets.UTF_8)); - - } catch (DatabaseException e) { - return new FailedDatabaseCommandResult(e.getMessage()); + byte[] value = commandargs.get(DatabaseCommandArgPositions.VALUE.getPositionIndex()).asString().getBytes(StandardCharsets.UTF_8); + dataBase.get().write(tbName,key,value); + return DatabaseCommandResult.success(("Success add key " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); + } catch (DatabaseException ex){ + return new FailedDatabaseCommandResult(ex.getMessage()); } } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java b/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java index 72ee8604..0116dea2 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java +++ b/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java @@ -8,15 +8,16 @@ * Результат успешной команды */ public class SuccessDatabaseCommandResult implements DatabaseCommandResult { - private final byte[] payload; - public SuccessDatabaseCommandResult(byte[] payload) { - this.payload = payload; + private final byte[] payLoad; + + public SuccessDatabaseCommandResult(byte[] pload) { + payLoad = pload; } @Override public String getPayLoad() { - return payload != null ? new String(payload) : null; + return payLoad !=null ? new String(payLoad) : null; } @Override @@ -29,6 +30,6 @@ public boolean isSuccess() { */ @Override public RespObject serialize() { - return new RespBulkString(payload); + return new RespBulkString(payLoad); } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java index 5907df77..f4b9a9d8 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java @@ -6,43 +6,38 @@ import java.util.Optional; -/** - * Декоратор для таблицы. Кэширует данные - */ -public class CachingTable implements Table { - private final Table cacheTable; - private final DatabaseCache dbCache; +public class CachingTable implements Table { + private final Table table; + private final DatabaseCache cache; - public CachingTable(Table myTable) { - this.cacheTable = myTable; - this.dbCache = new DatabaseCacheImpl(); + public CachingTable(TableImpl table) { + this.table = table; + cache = new DatabaseCacheImpl(); } @Override public String getName() { - return cacheTable.getName(); + return table.getName(); } @Override public void write(String objectKey, byte[] objectValue) throws DatabaseException { - cacheTable.write(objectKey, objectValue); - dbCache.set(objectKey, objectValue); + table.write(objectKey, objectValue); + cache.set(objectKey, objectValue); } @Override public Optional read(String objectKey) throws DatabaseException { - byte[] reading = dbCache.get(objectKey); - if (reading != null) { - return Optional.of(reading); - } else { - return cacheTable.read(objectKey); - } + Optional value = Optional.ofNullable(cache.get(objectKey)); + if (value.isPresent()) + return value; + return table.read(objectKey); } @Override public void delete(String objectKey) throws DatabaseException { - cacheTable.delete(objectKey); - dbCache.delete(objectKey); + table.delete(objectKey); + cache.delete(objectKey); } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java index ef91ea58..12636f03 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java @@ -6,32 +6,36 @@ import java.util.Map; public class DatabaseCacheImpl implements DatabaseCache { - - private static final int dbCapacity = 5000; - private final Map dbCache; - - public DatabaseCacheImpl() { - - this.dbCache = new LinkedHashMap(dbCapacity, 1f, true) { + private static final int CAPACITY = 5_000; + private final LinkedHashMap cache; + public DatabaseCacheImpl(int capacity) + { + cache = new LinkedHashMap<>(capacity){ @Override protected boolean removeEldestEntry(Map.Entry eldest) { - return size() > dbCapacity; + return size() > capacity; } }; } + public DatabaseCacheImpl() + { + this(CAPACITY); + } + + @Override public byte[] get(String key) { - return dbCache.get(key); + return cache.get(key); } @Override public void set(String key, byte[] value) { - dbCache.put(key, value); + cache.put(key, value); } @Override public void delete(String key) { - dbCache.remove(key); + cache.remove(key); } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index 69f8b702..f41f99dc 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -1,8 +1,8 @@ package com.itmo.java.basics.logic.impl; import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.index.impl.TableIndex; import com.itmo.java.basics.initialization.DatabaseInitializationContext; +import com.itmo.java.basics.index.impl.TableIndex; import com.itmo.java.basics.logic.Database; import com.itmo.java.basics.logic.Table; @@ -15,94 +15,97 @@ import java.util.Optional; public class DatabaseImpl implements Database { + private final String name; + private final Path path; + private final Map tables; + + /** + * @param databaseRoot путь к директории, которая может содержать несколько БД, + * поэтому при создании БД необходимо создать директорию внутри databaseRoot. + */ + public static Database create(String dbName, Path databaseRoot) throws DatabaseException { + if (dbName == null) { + throw new DatabaseException("dbName is not stated"); + } + if (!Files.exists(databaseRoot)) { + throw new DatabaseException(String.format("There is no directory with path %s, there you want to create database", + databaseRoot)); + } + Path path = Paths.get(databaseRoot.toString(), dbName); - private final String dbName; - private final Path databaseRoot; - private Map tableDictionary = new HashMap(); + if (Files.exists(path)) { + throw new DatabaseException(String.format("Database with path %s is already exist", + path)); + } - private DatabaseImpl(String dbName, Path databaseRoot) { - this.dbName = dbName; - this.databaseRoot = databaseRoot; - } + try { + Files.createDirectory(path); + } catch (IOException e) { + throw new DatabaseException(e); + } - private DatabaseImpl(DatabaseInitializationContext context) { - this.dbName = context.getDbName(); - this.databaseRoot = context.getDatabasePath(); - this.tableDictionary = context.getTables(); + return new DatabaseImpl(dbName, path); } - public static Database create(String dbName, Path databaseRoot) throws DatabaseException { + private DatabaseImpl(String dbName, Path databaseRoot) + { + name = dbName; + path = databaseRoot; + tables = new HashMap<>(); + } - if (dbName == null) { - throw new DatabaseException("Why dataBase name is null?"); + private Table getTable(String tName) throws DatabaseException + { + if (!tables.containsKey(tName)) { + throw new DatabaseException(String.format("There is no table with name %s", + tName)); } - if (Files.exists(Paths.get(databaseRoot.toString(), dbName))) { - throw new DatabaseException("This" + dbName + "already exists"); - } - try { - Files.createDirectory(Paths.get(databaseRoot.toString(), dbName)); - } catch (IOException ex) { - throw new DatabaseException("Error while creating a DataBase(" + dbName + ") directory", ex); - } - return new DatabaseImpl(dbName, databaseRoot); + return tables.get(tName); + } - public static Database initializeFromContext(DatabaseInitializationContext context) { - return new DatabaseImpl(context); + + private DatabaseImpl(String dbName, Path databaseRoot, Map tables) { + name = dbName; + path = databaseRoot; + this.tables = tables; } + + public static Database initializeFromContext(DatabaseInitializationContext context) { + return new DatabaseImpl(context.getDbName(), context.getDatabasePath(), context.getTables()); + } @Override public String getName() { - return dbName; + return name; } @Override public void createTableIfNotExists(String tableName) throws DatabaseException { - if (tableName == null) { - throw new DatabaseException("Why tableName name is null?"); + throw new DatabaseException("Table name is not stated"); } - if ((tableDictionary.containsKey(tableName)) || (Files.exists(Paths.get(databaseRoot.toString(), dbName, tableName)))) { - throw new DatabaseException("We have " + tableName + " in " + dbName + "directory"); + if (!tables.containsKey(tableName)) { + tables.put(tableName, TableImpl.create(tableName, path, + new TableIndex())); + } else { + throw new DatabaseException(String.format("Table with name %s already exists", + tableName)); } - TableIndex newTableIndex = new TableIndex(); - Path pathToTableRoot = Paths.get(databaseRoot.toString(), dbName); - Table newTable = TableImpl.create(tableName, pathToTableRoot, newTableIndex); - tableDictionary.put(tableName, newTable); } @Override public void write(String tableName, String objectKey, byte[] objectValue) throws DatabaseException { - - if (tableName == null) { - throw new DatabaseException("Error while writing in , null name"); - } - if (!tableDictionary.containsKey(tableName)) { - throw new DatabaseException("Table " + tableName + " doesn't exist in database" + dbName); - } - - Table table = tableDictionary.get(tableName); - table.write(objectKey, objectValue); + getTable(tableName).write(objectKey, objectValue); } @Override public Optional read(String tableName, String objectKey) throws DatabaseException { - Table table = tableDictionary.get(tableName); - if (tableName == null) { - throw new DatabaseException("Error while reading in database , null name"); - } - return table.read(objectKey); + return getTable(tableName).read(objectKey); } @Override public void delete(String tableName, String objectKey) throws DatabaseException { - if (!tableDictionary.containsKey(tableName)) { - throw new DatabaseException("Table " + tableName + " doesnt exist in database" + dbName); - } - if (tableName == null) { - throw new DatabaseException("Writing in database error"); - } - Table tableImpl = tableDictionary.get(tableName); - tableImpl.delete(objectKey); + getTable(tableName).delete(objectKey); } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java index 6d09b739..de931f6c 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java @@ -6,13 +6,12 @@ * Запись в БД, означающая удаление значения по ключу */ public class RemoveDatabaseRecord implements WritableDatabaseRecord { - private byte[] key; - private byte[] value; - - public RemoveDatabaseRecord(byte[] key) { + private static final int REMOVED_OBJECT_SIZE = -1; + private final byte[] key; + public RemoveDatabaseRecord(byte[] key) + { this.key = key; } - @Override public byte[] getKey() { return key; @@ -23,9 +22,13 @@ public byte[] getValue() { return null; } + /** + * + * @return размер записи, где 8 - размер записи чисел, равных размерам ключа и значения( 2 размера Integer в байтах) + */ @Override public long size() { - return getKeySize() + 4 + 4; + return key.length + 8; } @Override @@ -33,7 +36,6 @@ public boolean isValuePresented() { return false; } - @Override public int getKeySize() { return key.length; @@ -41,6 +43,6 @@ public int getKeySize() { @Override public int getValueSize() { - return -1; + return REMOVED_OBJECT_SIZE; } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 406e4b93..1252f04e 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -1,143 +1,165 @@ package com.itmo.java.basics.logic.impl; import com.itmo.java.basics.exceptions.DatabaseException; +import com.itmo.java.basics.initialization.SegmentInitializationContext; import com.itmo.java.basics.index.SegmentOffsetInfo; import com.itmo.java.basics.index.impl.SegmentIndex; import com.itmo.java.basics.index.impl.SegmentOffsetInfoImpl; -import com.itmo.java.basics.initialization.SegmentInitializationContext; import com.itmo.java.basics.logic.DatabaseRecord; import com.itmo.java.basics.logic.Segment; +import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.logic.io.DatabaseInputStream; import com.itmo.java.basics.logic.io.DatabaseOutputStream; +import java.io.FileInputStream; +import java.io.FileOutputStream; import java.io.IOException; -import java.io.OutputStream; -import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Optional; -import static java.nio.file.StandardOpenOption.APPEND; - +/** + * Сегмент - append-only файл, хранящий пары ключ-значение, разделенные специальным символом. + * - имеет ограниченный размер, большие значения (>100000) записываются в последний сегмент, если он не read-only + * - при превышении размера сегмента создается новый сегмент и дальнейшие операции записи производятся в него + * - именование файла-сегмента должно позволять установить очередность их появления + * - является неизменяемым после появления более нового сегмента + */ public class SegmentImpl implements Segment { - - private final Path tableRootPath; - private final String segmentName; - private final SegmentIndex segmentIndex; - private final long sizeMaximum = 100000; - private final DatabaseOutputStream outStream; - private long segmentSize = 0; - - public SegmentImpl(Path tableRootPath, String segmentName, OutputStream outStream) { - this.tableRootPath = tableRootPath; - this.segmentName = segmentName; - this.segmentIndex = new SegmentIndex(); - this.outStream = new DatabaseOutputStream(outStream); - } - - private SegmentImpl(SegmentInitializationContext context, OutputStream outStream) { - this.tableRootPath = context.getSegmentPath(); - this.segmentName = context.getSegmentName(); - this.segmentIndex = context.getIndex(); - this.segmentSize = context.getCurrentSize(); - this.outStream = new DatabaseOutputStream(outStream); + private final String name; + private final Path path; + private boolean isReadonly; + private final SegmentIndex index; + private static final int MAX_SIZE = 100_000; + private long size; + private final DatabaseOutputStream outputStream; + + public static Segment initializeFromContext(SegmentInitializationContext context) { + if (context.getCurrentSize() < MAX_SIZE){ + try { + DatabaseOutputStream outputStream = new DatabaseOutputStream(new FileOutputStream(context.getSegmentPath().toString(), true)); + return new SegmentImpl(context.getSegmentName(), context.getSegmentPath(), context.getCurrentSize(), + context.getIndex(), outputStream, false); + } + catch (IOException ignored){ + } + } + return new SegmentImpl(context.getSegmentName(), context.getSegmentPath(), context.getCurrentSize(), + context.getIndex(), null, true); } public static Segment create(String segmentName, Path tableRootPath) throws DatabaseException { + Path path = Paths.get(tableRootPath.toString(), segmentName); + DatabaseOutputStream stream; - Path segmentRoot = Paths.get(tableRootPath.toString(), segmentName); - boolean isCreated; - OutputStream output; + /* + Здесь я не использую try with resources, потому что я оставляю открытым поток на запись в актуальном сегменте + */ try { - isCreated = segmentRoot.toFile().createNewFile(); - output = Files.newOutputStream(segmentRoot); - } catch (IOException ex) { - throw new DatabaseException("Error while creating segment " + segmentName, ex); - } - if (!isCreated) { - throw new DatabaseException("Error while creating segment " + segmentName + "as it already exists"); + Files.createFile(path); + stream = new DatabaseOutputStream(new FileOutputStream( + path.toString(), true)); + return new SegmentImpl(segmentName, path, stream); + } catch (IOException e) { + throw new DatabaseException(e); } - return new SegmentImpl(segmentRoot, segmentName, output); } - public static Segment initializeFromContext(SegmentInitializationContext context) throws RuntimeException{ - - OutputStream output; - try { - output = Files.newOutputStream(context.getSegmentPath(), APPEND); - } catch (IOException ex) { - throw new RuntimeException("Error while newOpenFile in Segment initializeFromContext" , ex); - } - SegmentImpl newSegment = new SegmentImpl(context, output); - return newSegment; + private SegmentImpl(String segmentName, Path path, DatabaseOutputStream stream) { + name = segmentName; + this.path = path; + size = 0; + index = new SegmentIndex(); + isReadonly = false; + outputStream = stream; } + private SegmentImpl(String segmentName, Path path, long size, SegmentIndex index, DatabaseOutputStream stream, boolean isReadonly){ + name = segmentName; + this.path = path; + this.size = size; + this.index = index; + this.outputStream = stream; + this.isReadonly = isReadonly; + } static String createSegmentName(String tableName) { + try { + Thread.sleep(1); + } + catch (Exception ignored){ + } return tableName + "_" + System.currentTimeMillis(); } @Override public String getName() { - return segmentName; + return name; } @Override public boolean write(String objectKey, byte[] objectValue) throws IOException { - if (isReadOnly()) { - outStream.close(); return false; } if (objectValue == null) { return delete(objectKey); } - SetDatabaseRecord newSeg = new SetDatabaseRecord(objectKey.getBytes(StandardCharsets.UTF_8), objectValue); - segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); - segmentSize += outStream.write(newSeg); - return true; + try { + long offsetSize = outputStream.write(new SetDatabaseRecord(objectKey.getBytes(), objectValue)); + index.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(size)); + size += offsetSize; + if (size >= MAX_SIZE) { + isReadonly = true; + outputStream.close(); + } + return true; + } catch (IOException e) { + outputStream.close(); + throw e; + } } @Override public Optional read(String objectKey) throws IOException { - - Optional offsetInfo = segmentIndex.searchForKey(objectKey); + Optional offsetInfo = index.searchForKey(objectKey); if (offsetInfo.isEmpty()) { return Optional.empty(); } - - long myOf = offsetInfo.get().getOffset(); - try (DatabaseInputStream input = new DatabaseInputStream(Files.newInputStream(tableRootPath))) { - long skipped = input.skip(myOf); - if (skipped != myOf) { - throw new IOException("Error while skipping bytes in segment called " + segmentName); + try (DatabaseInputStream stream = new DatabaseInputStream(new FileInputStream(path.toString()))) { + long offset = offsetInfo.get().getOffset(); + long realOffset = stream.skip(offset); + if (realOffset != offset) { + throw new IOException("Something went wrong with stream.skip()"); } - Optional value = input.readDbUnit(); - if (value.isEmpty()) { - return Optional.empty(); - } - return Optional.ofNullable(value.get().getValue()); - } catch (IOException exception) { - throw new IOException("Error while creating a Segment file " + segmentName, exception); + Optional record = stream.readDbUnit(); + return record.map(DatabaseRecord::getValue); } } @Override public boolean isReadOnly() { - return segmentSize >= sizeMaximum; + return isReadonly; } @Override public boolean delete(String objectKey) throws IOException { - if (isReadOnly()) { - outStream.close(); return false; } - RemoveDatabaseRecord newSeg = new RemoveDatabaseRecord(objectKey.getBytes()); - segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); - segmentSize += outStream.write(newSeg); - return true; + try { + long offsetSize = outputStream.write(new RemoveDatabaseRecord(objectKey.getBytes())); + index.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(size)); + size += offsetSize; + if (size >= MAX_SIZE) { + isReadonly = true; + outputStream.close(); + } + return true; + } catch (IOException e) { + outputStream.close(); + throw e; + } } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java index 38ced136..c914609d 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java @@ -6,16 +6,14 @@ * Запись в БД, означающая добавление значения по ключу */ public class SetDatabaseRecord implements WritableDatabaseRecord { - - private byte[] key; - private byte[] value; - - public SetDatabaseRecord(byte[] key, byte[] value) { + private final byte[] key; + private final byte[] value; + public SetDatabaseRecord(byte[] key, byte[] value) + { this.key = key; this.value = value; } - @Override public byte[] getKey() { return key; @@ -26,6 +24,10 @@ public byte[] getValue() { return value; } + /** + * + * @return размер записи, где 8 - размер записи чисел, равных размерам ключа и значения( 2 размера Integer в байтах) + */ @Override public long size() { return getKeySize() + getValueSize() + 4 + 4; diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index c1a346d8..fce17484 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -12,92 +12,98 @@ import java.nio.file.Paths; import java.util.Optional; +/** + * Таблица - логическая сущность, представляющая собой набор файлов-сегментов, которые объединены одним + * именем и используются для хранения однотипных данных (данных, представляющих собой одну и ту же сущность, + * например, таблица "Пользователи") + *

+ * - имеет единый размер сегмента + * - представляет из себя директорию в файловой системе, именованную как таблица + * и хранящую файлы-сегменты данной таблицы + */ public class TableImpl implements Table { + private final String name; + private final Path path; + private Segment actualSegment; + private final TableIndex index; - private final String tableName; - private final Path pathToDatabaseRoot; - private final TableIndex tableIndex; - private Segment lastSegment; - - private TableImpl(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { - this.tableName = tableName; - this.pathToDatabaseRoot = pathToDatabaseRoot; - this.tableIndex = tableIndex; - this.lastSegment = SegmentImpl.create(SegmentImpl.createSegmentName(tableName), pathToDatabaseRoot); - } - - private TableImpl(TableInitializationContext context) { - this.tableName = context.getTableName(); - this.lastSegment = context.getCurrentSegment(); - this.pathToDatabaseRoot = context.getTablePath().getParent(); - this.tableIndex = context.getTableIndex(); + public static Table initializeFromContext(TableInitializationContext context) { + return new CachingTable(new TableImpl(context.getTableName(), context.getTablePath(), context.getTableIndex(), context.getCurrentSegment())); } public static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { - if (tableName == null) { - throw new DatabaseException("Why tableBase name is null?"); - } - Path pathToTableRoot = Paths.get(pathToDatabaseRoot.toString(), tableName); + Path path = Paths.get(pathToDatabaseRoot.toString(), tableName); try { - Files.createDirectory(pathToTableRoot); - } catch (IOException ex) { - throw new DatabaseException("Error while creating a Table(" + tableName + ") directory"); + Files.createDirectory(path); + } catch (IOException e) { + throw new DatabaseException(e); } - TableImpl newTb = new TableImpl(tableName, pathToTableRoot, tableIndex); - return new CachingTable(newTb); + return new CachingTable(new TableImpl(tableName, path, tableIndex, null)); } - - public static Table initializeFromContext(TableInitializationContext context) { - return new CachingTable(new TableImpl(context)); + private TableImpl(String tableName, Path path, TableIndex tableIndex, Segment currentSegment) + { + name = tableName; + this.path = path; + actualSegment = currentSegment; + index = tableIndex; } + private TableImpl(String tableName, Path path, TableIndex tableIndex) + { + name = tableName; + this.path = path; + actualSegment = null; + index = tableIndex; + } + @Override public String getName() { - return tableName; + return name; } @Override public void write(String objectKey, byte[] objectValue) throws DatabaseException { try { - boolean canWewrite = lastSegment.write(objectKey, objectValue); - - if (!canWewrite) { - lastSegment = SegmentImpl.create(SegmentImpl.createSegmentName(tableName), pathToDatabaseRoot); - lastSegment.write(objectKey, objectValue); + if (actualSegment == null || !actualSegment.write(objectKey, objectValue)) { + actualSegment = SegmentImpl.create(SegmentImpl.createSegmentName(name), path); } - tableIndex.onIndexedEntityUpdated(objectKey, lastSegment); - } catch (IOException ex) { - throw new DatabaseException("Writing in database error ", ex); + actualSegment.write(objectKey, objectValue); + index.onIndexedEntityUpdated(objectKey, actualSegment); + } catch (IOException e) { + throw new DatabaseException(e); } } @Override public Optional read(String objectKey) throws DatabaseException { - try { - Optional segmentRead = tableIndex.searchForKey(objectKey); - - if (segmentRead.isPresent()) { - return segmentRead.get().read(objectKey); - } else - return Optional.empty(); - } catch (IOException ex) { - throw new DatabaseException("Reading in database error ", ex); + Optional value = Optional.empty(); + if (index.searchForKey(objectKey).isPresent()) { + try{ + value = index.searchForKey(objectKey).get().read(objectKey); + } catch (IOException e) { + throw new DatabaseException(e); + } } + return value; } @Override public void delete(String objectKey) throws DatabaseException { - try { - boolean canDel = lastSegment.delete(objectKey); - if (!canDel) { - this.lastSegment = SegmentImpl.create(SegmentImpl.createSegmentName(tableName), pathToDatabaseRoot); - this.lastSegment.delete(objectKey); + if (index.searchForKey(objectKey).isPresent()) { + try { + if (actualSegment == null || !actualSegment.delete(objectKey)) { + actualSegment = SegmentImpl.create(SegmentImpl.createSegmentName(name), path); + actualSegment.delete(objectKey); + index.onIndexedEntityUpdated(objectKey, actualSegment); + } + } catch (IOException e) { + throw new DatabaseException(e); } - tableIndex.onIndexedEntityUpdated(objectKey, null); - } catch (IOException ex) { - throw new DatabaseException("Deleting error in Table"); + } else { + throw new DatabaseException(String.format("There is no value for key %s", + objectKey)); } } } \ No newline at end of file From f82e601d0bcf73454418c1d155a17e36ba88e8f7 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Mon, 17 May 2021 04:32:53 +0300 Subject: [PATCH 155/378] 1 --- .../java/basics/logic/impl/CachingTable.java | 35 ++-- .../basics/logic/impl/DatabaseCacheImpl.java | 26 ++- .../java/basics/logic/impl/DatabaseImpl.java | 119 ++++++------ .../logic/impl/RemoveDatabaseRecord.java | 20 +- .../java/basics/logic/impl/SegmentImpl.java | 174 ++++++++---------- .../basics/logic/impl/SetDatabaseRecord.java | 14 +- .../java/basics/logic/impl/TableImpl.java | 116 ++++++------ 7 files changed, 235 insertions(+), 269 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java index f4b9a9d8..5907df77 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java @@ -6,38 +6,43 @@ import java.util.Optional; - +/** + * Декоратор для таблицы. Кэширует данные + */ public class CachingTable implements Table { - private final Table table; - private final DatabaseCache cache; - public CachingTable(TableImpl table) { - this.table = table; - cache = new DatabaseCacheImpl(); + private final Table cacheTable; + private final DatabaseCache dbCache; + + public CachingTable(Table myTable) { + this.cacheTable = myTable; + this.dbCache = new DatabaseCacheImpl(); } @Override public String getName() { - return table.getName(); + return cacheTable.getName(); } @Override public void write(String objectKey, byte[] objectValue) throws DatabaseException { - table.write(objectKey, objectValue); - cache.set(objectKey, objectValue); + cacheTable.write(objectKey, objectValue); + dbCache.set(objectKey, objectValue); } @Override public Optional read(String objectKey) throws DatabaseException { - Optional value = Optional.ofNullable(cache.get(objectKey)); - if (value.isPresent()) - return value; - return table.read(objectKey); + byte[] reading = dbCache.get(objectKey); + if (reading != null) { + return Optional.of(reading); + } else { + return cacheTable.read(objectKey); + } } @Override public void delete(String objectKey) throws DatabaseException { - table.delete(objectKey); - cache.delete(objectKey); + cacheTable.delete(objectKey); + dbCache.delete(objectKey); } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java index 12636f03..ef91ea58 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseCacheImpl.java @@ -6,36 +6,32 @@ import java.util.Map; public class DatabaseCacheImpl implements DatabaseCache { - private static final int CAPACITY = 5_000; - private final LinkedHashMap cache; - public DatabaseCacheImpl(int capacity) - { - cache = new LinkedHashMap<>(capacity){ + + private static final int dbCapacity = 5000; + private final Map dbCache; + + public DatabaseCacheImpl() { + + this.dbCache = new LinkedHashMap(dbCapacity, 1f, true) { @Override protected boolean removeEldestEntry(Map.Entry eldest) { - return size() > capacity; + return size() > dbCapacity; } }; } - public DatabaseCacheImpl() - { - this(CAPACITY); - } - - @Override public byte[] get(String key) { - return cache.get(key); + return dbCache.get(key); } @Override public void set(String key, byte[] value) { - cache.put(key, value); + dbCache.put(key, value); } @Override public void delete(String key) { - cache.remove(key); + dbCache.remove(key); } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index f41f99dc..69f8b702 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -1,8 +1,8 @@ package com.itmo.java.basics.logic.impl; import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.initialization.DatabaseInitializationContext; import com.itmo.java.basics.index.impl.TableIndex; +import com.itmo.java.basics.initialization.DatabaseInitializationContext; import com.itmo.java.basics.logic.Database; import com.itmo.java.basics.logic.Table; @@ -15,97 +15,94 @@ import java.util.Optional; public class DatabaseImpl implements Database { - private final String name; - private final Path path; - private final Map tables; - - /** - * @param databaseRoot путь к директории, которая может содержать несколько БД, - * поэтому при создании БД необходимо создать директорию внутри databaseRoot. - */ - public static Database create(String dbName, Path databaseRoot) throws DatabaseException { - if (dbName == null) { - throw new DatabaseException("dbName is not stated"); - } - if (!Files.exists(databaseRoot)) { - throw new DatabaseException(String.format("There is no directory with path %s, there you want to create database", - databaseRoot)); - } - Path path = Paths.get(databaseRoot.toString(), dbName); - if (Files.exists(path)) { - throw new DatabaseException(String.format("Database with path %s is already exist", - path)); - } + private final String dbName; + private final Path databaseRoot; + private Map tableDictionary = new HashMap(); - try { - Files.createDirectory(path); - } catch (IOException e) { - throw new DatabaseException(e); - } - - return new DatabaseImpl(dbName, path); - } - - private DatabaseImpl(String dbName, Path databaseRoot) - { - name = dbName; - path = databaseRoot; - tables = new HashMap<>(); + private DatabaseImpl(String dbName, Path databaseRoot) { + this.dbName = dbName; + this.databaseRoot = databaseRoot; } - private Table getTable(String tName) throws DatabaseException - { - if (!tables.containsKey(tName)) { - throw new DatabaseException(String.format("There is no table with name %s", - tName)); - } - return tables.get(tName); - + private DatabaseImpl(DatabaseInitializationContext context) { + this.dbName = context.getDbName(); + this.databaseRoot = context.getDatabasePath(); + this.tableDictionary = context.getTables(); } + public static Database create(String dbName, Path databaseRoot) throws DatabaseException { - private DatabaseImpl(String dbName, Path databaseRoot, Map tables) { - name = dbName; - path = databaseRoot; - this.tables = tables; + if (dbName == null) { + throw new DatabaseException("Why dataBase name is null?"); + } + if (Files.exists(Paths.get(databaseRoot.toString(), dbName))) { + throw new DatabaseException("This" + dbName + "already exists"); + } + try { + Files.createDirectory(Paths.get(databaseRoot.toString(), dbName)); + } catch (IOException ex) { + throw new DatabaseException("Error while creating a DataBase(" + dbName + ") directory", ex); + } + return new DatabaseImpl(dbName, databaseRoot); } - public static Database initializeFromContext(DatabaseInitializationContext context) { - return new DatabaseImpl(context.getDbName(), context.getDatabasePath(), context.getTables()); + return new DatabaseImpl(context); } + @Override public String getName() { - return name; + return dbName; } @Override public void createTableIfNotExists(String tableName) throws DatabaseException { + if (tableName == null) { - throw new DatabaseException("Table name is not stated"); + throw new DatabaseException("Why tableName name is null?"); } - if (!tables.containsKey(tableName)) { - tables.put(tableName, TableImpl.create(tableName, path, - new TableIndex())); - } else { - throw new DatabaseException(String.format("Table with name %s already exists", - tableName)); + if ((tableDictionary.containsKey(tableName)) || (Files.exists(Paths.get(databaseRoot.toString(), dbName, tableName)))) { + throw new DatabaseException("We have " + tableName + " in " + dbName + "directory"); } + TableIndex newTableIndex = new TableIndex(); + Path pathToTableRoot = Paths.get(databaseRoot.toString(), dbName); + Table newTable = TableImpl.create(tableName, pathToTableRoot, newTableIndex); + tableDictionary.put(tableName, newTable); } @Override public void write(String tableName, String objectKey, byte[] objectValue) throws DatabaseException { - getTable(tableName).write(objectKey, objectValue); + + if (tableName == null) { + throw new DatabaseException("Error while writing in , null name"); + } + if (!tableDictionary.containsKey(tableName)) { + throw new DatabaseException("Table " + tableName + " doesn't exist in database" + dbName); + } + + Table table = tableDictionary.get(tableName); + table.write(objectKey, objectValue); } @Override public Optional read(String tableName, String objectKey) throws DatabaseException { - return getTable(tableName).read(objectKey); + Table table = tableDictionary.get(tableName); + if (tableName == null) { + throw new DatabaseException("Error while reading in database , null name"); + } + return table.read(objectKey); } @Override public void delete(String tableName, String objectKey) throws DatabaseException { - getTable(tableName).delete(objectKey); + if (!tableDictionary.containsKey(tableName)) { + throw new DatabaseException("Table " + tableName + " doesnt exist in database" + dbName); + } + if (tableName == null) { + throw new DatabaseException("Writing in database error"); + } + Table tableImpl = tableDictionary.get(tableName); + tableImpl.delete(objectKey); } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java index de931f6c..6d09b739 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java @@ -6,12 +6,13 @@ * Запись в БД, означающая удаление значения по ключу */ public class RemoveDatabaseRecord implements WritableDatabaseRecord { - private static final int REMOVED_OBJECT_SIZE = -1; - private final byte[] key; - public RemoveDatabaseRecord(byte[] key) - { + private byte[] key; + private byte[] value; + + public RemoveDatabaseRecord(byte[] key) { this.key = key; } + @Override public byte[] getKey() { return key; @@ -22,13 +23,9 @@ public byte[] getValue() { return null; } - /** - * - * @return размер записи, где 8 - размер записи чисел, равных размерам ключа и значения( 2 размера Integer в байтах) - */ @Override public long size() { - return key.length + 8; + return getKeySize() + 4 + 4; } @Override @@ -36,6 +33,7 @@ public boolean isValuePresented() { return false; } + @Override public int getKeySize() { return key.length; @@ -43,6 +41,6 @@ public int getKeySize() { @Override public int getValueSize() { - return REMOVED_OBJECT_SIZE; + return -1; } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 1252f04e..406e4b93 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -1,165 +1,143 @@ package com.itmo.java.basics.logic.impl; import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.initialization.SegmentInitializationContext; import com.itmo.java.basics.index.SegmentOffsetInfo; import com.itmo.java.basics.index.impl.SegmentIndex; import com.itmo.java.basics.index.impl.SegmentOffsetInfoImpl; +import com.itmo.java.basics.initialization.SegmentInitializationContext; import com.itmo.java.basics.logic.DatabaseRecord; import com.itmo.java.basics.logic.Segment; -import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.logic.io.DatabaseInputStream; import com.itmo.java.basics.logic.io.DatabaseOutputStream; -import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.IOException; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Optional; -/** - * Сегмент - append-only файл, хранящий пары ключ-значение, разделенные специальным символом. - * - имеет ограниченный размер, большие значения (>100000) записываются в последний сегмент, если он не read-only - * - при превышении размера сегмента создается новый сегмент и дальнейшие операции записи производятся в него - * - именование файла-сегмента должно позволять установить очередность их появления - * - является неизменяемым после появления более нового сегмента - */ +import static java.nio.file.StandardOpenOption.APPEND; + public class SegmentImpl implements Segment { - private final String name; - private final Path path; - private boolean isReadonly; - private final SegmentIndex index; - private static final int MAX_SIZE = 100_000; - private long size; - private final DatabaseOutputStream outputStream; - - public static Segment initializeFromContext(SegmentInitializationContext context) { - if (context.getCurrentSize() < MAX_SIZE){ - try { - DatabaseOutputStream outputStream = new DatabaseOutputStream(new FileOutputStream(context.getSegmentPath().toString(), true)); - return new SegmentImpl(context.getSegmentName(), context.getSegmentPath(), context.getCurrentSize(), - context.getIndex(), outputStream, false); - } - catch (IOException ignored){ - } - } - return new SegmentImpl(context.getSegmentName(), context.getSegmentPath(), context.getCurrentSize(), - context.getIndex(), null, true); + + private final Path tableRootPath; + private final String segmentName; + private final SegmentIndex segmentIndex; + private final long sizeMaximum = 100000; + private final DatabaseOutputStream outStream; + private long segmentSize = 0; + + public SegmentImpl(Path tableRootPath, String segmentName, OutputStream outStream) { + this.tableRootPath = tableRootPath; + this.segmentName = segmentName; + this.segmentIndex = new SegmentIndex(); + this.outStream = new DatabaseOutputStream(outStream); + } + + private SegmentImpl(SegmentInitializationContext context, OutputStream outStream) { + this.tableRootPath = context.getSegmentPath(); + this.segmentName = context.getSegmentName(); + this.segmentIndex = context.getIndex(); + this.segmentSize = context.getCurrentSize(); + this.outStream = new DatabaseOutputStream(outStream); } public static Segment create(String segmentName, Path tableRootPath) throws DatabaseException { - Path path = Paths.get(tableRootPath.toString(), segmentName); - DatabaseOutputStream stream; - /* - Здесь я не использую try with resources, потому что я оставляю открытым поток на запись в актуальном сегменте - */ + Path segmentRoot = Paths.get(tableRootPath.toString(), segmentName); + boolean isCreated; + OutputStream output; try { - Files.createFile(path); - stream = new DatabaseOutputStream(new FileOutputStream( - path.toString(), true)); - return new SegmentImpl(segmentName, path, stream); - } catch (IOException e) { - throw new DatabaseException(e); + isCreated = segmentRoot.toFile().createNewFile(); + output = Files.newOutputStream(segmentRoot); + } catch (IOException ex) { + throw new DatabaseException("Error while creating segment " + segmentName, ex); + } + if (!isCreated) { + throw new DatabaseException("Error while creating segment " + segmentName + "as it already exists"); } + return new SegmentImpl(segmentRoot, segmentName, output); } - private SegmentImpl(String segmentName, Path path, DatabaseOutputStream stream) { - name = segmentName; - this.path = path; - size = 0; - index = new SegmentIndex(); - isReadonly = false; - outputStream = stream; - } + public static Segment initializeFromContext(SegmentInitializationContext context) throws RuntimeException{ - private SegmentImpl(String segmentName, Path path, long size, SegmentIndex index, DatabaseOutputStream stream, boolean isReadonly){ - name = segmentName; - this.path = path; - this.size = size; - this.index = index; - this.outputStream = stream; - this.isReadonly = isReadonly; - } - static String createSegmentName(String tableName) { + OutputStream output; try { - Thread.sleep(1); - } - catch (Exception ignored){ + output = Files.newOutputStream(context.getSegmentPath(), APPEND); + } catch (IOException ex) { + throw new RuntimeException("Error while newOpenFile in Segment initializeFromContext" , ex); } + SegmentImpl newSegment = new SegmentImpl(context, output); + return newSegment; + } + + static String createSegmentName(String tableName) { return tableName + "_" + System.currentTimeMillis(); } @Override public String getName() { - return name; + return segmentName; } @Override public boolean write(String objectKey, byte[] objectValue) throws IOException { + if (isReadOnly()) { + outStream.close(); return false; } if (objectValue == null) { return delete(objectKey); } - try { - long offsetSize = outputStream.write(new SetDatabaseRecord(objectKey.getBytes(), objectValue)); - index.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(size)); - size += offsetSize; - if (size >= MAX_SIZE) { - isReadonly = true; - outputStream.close(); - } - return true; - } catch (IOException e) { - outputStream.close(); - throw e; - } + SetDatabaseRecord newSeg = new SetDatabaseRecord(objectKey.getBytes(StandardCharsets.UTF_8), objectValue); + segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); + segmentSize += outStream.write(newSeg); + return true; } @Override public Optional read(String objectKey) throws IOException { - Optional offsetInfo = index.searchForKey(objectKey); + + Optional offsetInfo = segmentIndex.searchForKey(objectKey); if (offsetInfo.isEmpty()) { return Optional.empty(); } - try (DatabaseInputStream stream = new DatabaseInputStream(new FileInputStream(path.toString()))) { - long offset = offsetInfo.get().getOffset(); - long realOffset = stream.skip(offset); - if (realOffset != offset) { - throw new IOException("Something went wrong with stream.skip()"); + + long myOf = offsetInfo.get().getOffset(); + try (DatabaseInputStream input = new DatabaseInputStream(Files.newInputStream(tableRootPath))) { + long skipped = input.skip(myOf); + if (skipped != myOf) { + throw new IOException("Error while skipping bytes in segment called " + segmentName); } - Optional record = stream.readDbUnit(); - return record.map(DatabaseRecord::getValue); + Optional value = input.readDbUnit(); + if (value.isEmpty()) { + return Optional.empty(); + } + return Optional.ofNullable(value.get().getValue()); + } catch (IOException exception) { + throw new IOException("Error while creating a Segment file " + segmentName, exception); } } @Override public boolean isReadOnly() { - return isReadonly; + return segmentSize >= sizeMaximum; } @Override public boolean delete(String objectKey) throws IOException { + if (isReadOnly()) { + outStream.close(); return false; } - try { - long offsetSize = outputStream.write(new RemoveDatabaseRecord(objectKey.getBytes())); - index.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(size)); - size += offsetSize; - if (size >= MAX_SIZE) { - isReadonly = true; - outputStream.close(); - } - return true; - } catch (IOException e) { - outputStream.close(); - throw e; - } + RemoveDatabaseRecord newSeg = new RemoveDatabaseRecord(objectKey.getBytes()); + segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); + segmentSize += outStream.write(newSeg); + return true; } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java index c914609d..38ced136 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java @@ -6,14 +6,16 @@ * Запись в БД, означающая добавление значения по ключу */ public class SetDatabaseRecord implements WritableDatabaseRecord { - private final byte[] key; - private final byte[] value; - public SetDatabaseRecord(byte[] key, byte[] value) - { + + private byte[] key; + private byte[] value; + + public SetDatabaseRecord(byte[] key, byte[] value) { this.key = key; this.value = value; } + @Override public byte[] getKey() { return key; @@ -24,10 +26,6 @@ public byte[] getValue() { return value; } - /** - * - * @return размер записи, где 8 - размер записи чисел, равных размерам ключа и значения( 2 размера Integer в байтах) - */ @Override public long size() { return getKeySize() + getValueSize() + 4 + 4; diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index fce17484..c00b94c4 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -12,98 +12,92 @@ import java.nio.file.Paths; import java.util.Optional; -/** - * Таблица - логическая сущность, представляющая собой набор файлов-сегментов, которые объединены одним - * именем и используются для хранения однотипных данных (данных, представляющих собой одну и ту же сущность, - * например, таблица "Пользователи") - *

- * - имеет единый размер сегмента - * - представляет из себя директорию в файловой системе, именованную как таблица - * и хранящую файлы-сегменты данной таблицы - */ public class TableImpl implements Table { - private final String name; - private final Path path; - private Segment actualSegment; - private final TableIndex index; - public static Table initializeFromContext(TableInitializationContext context) { - return new CachingTable(new TableImpl(context.getTableName(), context.getTablePath(), context.getTableIndex(), context.getCurrentSegment())); + private final String tableName; + private final Path pathToDatabaseRoot; + private final TableIndex tableIndex; + private Segment lastSegment; + + private TableImpl(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { + this.tableName = tableName; + this.pathToDatabaseRoot = pathToDatabaseRoot; + this.tableIndex = tableIndex; + this.lastSegment = SegmentImpl.create(SegmentImpl.createSegmentName(tableName), pathToDatabaseRoot); + } + + private TableImpl(TableInitializationContext context) { + this.tableName = context.getTableName(); + this.lastSegment = context.getCurrentSegment(); + this.pathToDatabaseRoot = context.getTablePath().getParent(); + this.tableIndex = context.getTableIndex(); } public static Table create(String tableName, Path pathToDatabaseRoot, TableIndex tableIndex) throws DatabaseException { - Path path = Paths.get(pathToDatabaseRoot.toString(), tableName); + if (tableName == null) { + throw new DatabaseException("Why tableBase name is null?"); + } + Path pathToTableRoot = Paths.get(pathToDatabaseRoot.toString(), tableName); try { - Files.createDirectory(path); - } catch (IOException e) { - throw new DatabaseException(e); + Files.createDirectory(pathToTableRoot); + } catch (IOException ex) { + throw new DatabaseException("Error while creating a Table(" + tableName + ") directory"); } - return new CachingTable(new TableImpl(tableName, path, tableIndex, null)); - } - - private TableImpl(String tableName, Path path, TableIndex tableIndex, Segment currentSegment) - { - name = tableName; - this.path = path; - actualSegment = currentSegment; - index = tableIndex; + TableImpl newTb = new TableImpl(tableName, pathToTableRoot, tableIndex); + return new CachingTable(newTb); } - private TableImpl(String tableName, Path path, TableIndex tableIndex) - { - name = tableName; - this.path = path; - actualSegment = null; - index = tableIndex; + public static Table initializeFromContext(TableInitializationContext context) { + return new CachingTable(new TableImpl(context)); } + @Override public String getName() { - return name; + return tableName; } @Override public void write(String objectKey, byte[] objectValue) throws DatabaseException { try { - if (actualSegment == null || !actualSegment.write(objectKey, objectValue)) { - actualSegment = SegmentImpl.create(SegmentImpl.createSegmentName(name), path); + boolean canWewrite = lastSegment.write(objectKey, objectValue); + + if (!canWewrite) { + lastSegment = SegmentImpl.create(SegmentImpl.createSegmentName(tableName), pathToDatabaseRoot); + lastSegment.write(objectKey, objectValue); } - actualSegment.write(objectKey, objectValue); - index.onIndexedEntityUpdated(objectKey, actualSegment); - } catch (IOException e) { - throw new DatabaseException(e); + tableIndex.onIndexedEntityUpdated(objectKey, lastSegment); + } catch (IOException ex) { + throw new DatabaseException("Writing in database error ", ex); } } @Override public Optional read(String objectKey) throws DatabaseException { - Optional value = Optional.empty(); - if (index.searchForKey(objectKey).isPresent()) { - try{ - value = index.searchForKey(objectKey).get().read(objectKey); - } catch (IOException e) { - throw new DatabaseException(e); - } + try { + Optional segmentRead = tableIndex.searchForKey(objectKey); + + if (segmentRead.isPresent()) { + return segmentRead.get().read(objectKey); + } else + return Optional.empty(); + } catch (IOException ex) { + throw new DatabaseException("Reading in database error ", ex); } - return value; } @Override public void delete(String objectKey) throws DatabaseException { - if (index.searchForKey(objectKey).isPresent()) { - try { - if (actualSegment == null || !actualSegment.delete(objectKey)) { - actualSegment = SegmentImpl.create(SegmentImpl.createSegmentName(name), path); - actualSegment.delete(objectKey); - index.onIndexedEntityUpdated(objectKey, actualSegment); - } - } catch (IOException e) { - throw new DatabaseException(e); + try { + boolean canDel = lastSegment.delete(objectKey); + if (!canDel) { + lastSegment = SegmentImpl.create(SegmentImpl.createSegmentName(tableName), pathToDatabaseRoot); + lastSegment.delete(objectKey); } - } else { - throw new DatabaseException(String.format("There is no value for key %s", - objectKey)); + tableIndex.onIndexedEntityUpdated(objectKey, null); + } catch (IOException ex) { + throw new DatabaseException("Deleting error in Table"); } } } \ No newline at end of file From a6853fd7066e570bc9ebc203bb96e020c82daf27 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Mon, 17 May 2021 04:34:15 +0300 Subject: [PATCH 156/378] Update SegmentInitializationContextImpl.java --- .../SegmentInitializationContextImpl.java | 42 ++++++++++--------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java index 84844e53..51ced9b3 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java @@ -7,43 +7,47 @@ import java.nio.file.Paths; public class SegmentInitializationContextImpl implements SegmentInitializationContext { + private final String name; + private final Path path; + private final SegmentIndex index; + private final long size; + + public SegmentInitializationContextImpl(String segmentName, Path segmentPath, long currentSize, SegmentIndex index) { + name = segmentName; + path = segmentPath; + size = currentSize; + this.index = index; + } - private final String segmentName; - private final Path segmentPath; - private final long currentSize; - private final SegmentIndex segmentIndex; - public SegmentInitializationContextImpl(String segmentName, Path segmentPath, int currentSize, SegmentIndex index) { - this.segmentName = segmentName; - this.segmentPath = segmentPath; - this.currentSize = currentSize; - this.segmentIndex = index; + /** + * Не используйте этот конструктор. Оставлен для совместимости со старыми тестами. + */ + public SegmentInitializationContextImpl(String segmentName, Path tablePath, long currentSize) { + this(segmentName, tablePath.resolve(segmentName), currentSize, new SegmentIndex()); } - public SegmentInitializationContextImpl(String segmentName, Path tablePath, int currentSize) { - this.segmentName = segmentName; - this.segmentPath = Paths.get(tablePath.toString(), segmentName); - this.currentSize = currentSize; - this.segmentIndex = new SegmentIndex(); + public SegmentInitializationContextImpl(String segmentName, Path tablePath) { + this(segmentName, tablePath.resolve(segmentName), 0, new SegmentIndex()); } @Override public String getSegmentName() { - return segmentName; + return name; } @Override public Path getSegmentPath() { - return segmentPath; + return path; } @Override public SegmentIndex getIndex() { - return segmentIndex; + return index; } @Override public long getCurrentSize() { - return currentSize; + return size; } -} +} \ No newline at end of file From 94f75a8d5168cc9e75d4f5d02a034f5882dfd0c1 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Mon, 17 May 2021 04:41:40 +0300 Subject: [PATCH 157/378] why --- .../java/com/itmo/java/basics/DatabaseServer.java | 9 ++++++--- .../java/basics/console/DatabaseCommandResult.java | 13 ++++++------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/DatabaseServer.java b/src/main/java/com/itmo/java/basics/DatabaseServer.java index 59b69668..6d66d431 100644 --- a/src/main/java/com/itmo/java/basics/DatabaseServer.java +++ b/src/main/java/com/itmo/java/basics/DatabaseServer.java @@ -12,7 +12,7 @@ public class DatabaseServer { private final ExecutorService executorService = Executors.newSingleThreadExecutor(); - private final ExecutionEnvironment enviroment; + private final ExecutionEnvironment env; /** * Con structor @@ -27,11 +27,14 @@ public static DatabaseServer initialize(ExecutionEnvironment env, DatabaseServer } private DatabaseServer(ExecutionEnvironment env) { - this.enviroment = env; + this.env = env; } public CompletableFuture executeNextCommand(RespArray message) { - return CompletableFuture.supplyAsync(() -> DatabaseCommands.valueOf(message.getObjects().get(DatabaseCommandArgPositions.COMMAND_NAME.getPositionIndex()).asString()).getCommand(enviroment, message.getObjects()).execute(), executorService); + return CompletableFuture.supplyAsync(() -> + DatabaseCommands.valueOf(message.getObjects().get(DatabaseCommandArgPositions.COMMAND_NAME.getPositionIndex()).asString()) + .getCommand(env, message.getObjects()).execute() + , executorService); } public CompletableFuture executeNextCommand(DatabaseCommand command) { diff --git a/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java b/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java index 996e418d..fb491ece 100644 --- a/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java +++ b/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java @@ -1,5 +1,7 @@ package com.itmo.java.basics.console; +import com.itmo.java.basics.console.impl.FailedDatabaseCommandResult; +import com.itmo.java.basics.console.impl.SuccessDatabaseCommandResult; import com.itmo.java.protocol.model.RespObject; public interface DatabaseCommandResult extends DatabaseApiSerializable { @@ -11,8 +13,7 @@ public interface DatabaseCommandResult extends DatabaseApiSerializable { * @return успешный результат выполнения команды, который был сформирован */ static DatabaseCommandResult success(byte[] result) { - //TODO implement - return null; + return new SuccessDatabaseCommandResult(result); } /** @@ -22,20 +23,18 @@ static DatabaseCommandResult success(byte[] result) { * @return результат зафейленный команды, при выполнении которой произошла ошибка */ static DatabaseCommandResult error(String message) { - //TODO implement - return null; + return new FailedDatabaseCommandResult(message); } /** * Формирует результат команды, при выполнении которой произошла ошибка. - * Берется сообщение из исключения. Если в исключении нет сообщения - стэктрейс + * Берется сообщение из исключения. Если в исключении нет сообщения - стэктрейст * * @param exception исключение, из которого нужно сформировать результат выполнения команды * @return результат команды, при выполнении которой произошла ошибка */ static DatabaseCommandResult error(Exception exception) { - //TODO implement - return null; + return new FailedDatabaseCommandResult(exception.getMessage()); } /** From eed7ba2b5297debf91e535091b5315570fb87e5b Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Mon, 17 May 2021 04:55:47 +0300 Subject: [PATCH 158/378] 3lab --- .../com/itmo/java/basics/logic/impl/CachingTable.java | 3 --- src/main/java/com/itmo/java/protocol/model/RespArray.java | 2 +- .../java/com/itmo/java/protocol/model/RespBulkString.java | 8 ++++---- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java index 5907df77..05f09cbc 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java @@ -6,9 +6,6 @@ import java.util.Optional; -/** - * Декоратор для таблицы. Кэширует данные - */ public class CachingTable implements Table { private final Table cacheTable; diff --git a/src/main/java/com/itmo/java/protocol/model/RespArray.java b/src/main/java/com/itmo/java/protocol/model/RespArray.java index 978e285b..1223ed07 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespArray.java +++ b/src/main/java/com/itmo/java/protocol/model/RespArray.java @@ -16,7 +16,7 @@ public class RespArray implements RespObject { * Код объекта */ public static final byte CODE = '*'; - private final List objects; + private List objects; public RespArray(RespObject... obj) { objects = Arrays.asList(obj); diff --git a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java index bfa1f230..5dcc621d 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java +++ b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java @@ -43,14 +43,14 @@ public String asString() { @Override public void write(OutputStream output) throws IOException { output.write(CODE); - if (data != null) { + if (data == null) { + output.write(Integer.toString(NULL_STRING_SIZE).getBytes(StandardCharsets.UTF_8)); + } + else { output.write(Integer.toString(data.length).getBytes(StandardCharsets.UTF_8)); output.write(CRLF); output.write(data); } - else { - output.write(Integer.toString(NULL_STRING_SIZE).getBytes(StandardCharsets.UTF_8)); - } output.write(CRLF); } } From edc1bdae4457c9c9475d5b1392292a6080e568c0 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Mon, 17 May 2021 04:55:54 +0300 Subject: [PATCH 159/378] 3lab --- .../console/impl/CreateDatabaseCommand.java | 11 +++++------ .../console/impl/CreateTableCommand.java | 12 ++++++------ .../basics/console/impl/DeleteKeyCommand.java | 18 +++++++++--------- .../impl/FailedDatabaseCommandResult.java | 1 + .../basics/console/impl/GetKeyCommand.java | 18 +++++++++--------- .../basics/console/impl/SetKeyCommand.java | 18 +++++++++--------- .../java/basics/logic/impl/SegmentImpl.java | 4 ++-- 7 files changed, 41 insertions(+), 41 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java index e0393fe7..8e0038af 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java @@ -33,12 +33,11 @@ public class CreateDatabaseCommand implements DatabaseCommand { * @throws IllegalArgumentException если передано неправильное количество аргументов */ public CreateDatabaseCommand(ExecutionEnvironment env, DatabaseFactory factory, List comArgs) { - - environment = env; - dbfactory = factory; if (comArgs.size() != numberOfAgrguments){ throw new IllegalArgumentException("Why " + comArgs.size()+"!= 3 , in CreateDataBaseCommand" ); } + environment = env; + dbfactory = factory; commandargs = comArgs; } @@ -51,9 +50,9 @@ public CreateDatabaseCommand(ExecutionEnvironment env, DatabaseFactory factory, public DatabaseCommandResult execute() { try{ String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); -// if(dbName == null){ -// throw new DatabaseException("Why dbname is null? "); -// } + if(dbName == null){ + throw new DatabaseException("Why dbname is null? "); + } environment.addDatabase(dbfactory.createNonExistent(dbName,environment.getWorkingPath())); return DatabaseCommandResult.success(("Success add " + dbName).getBytes(StandardCharsets.UTF_8)); } catch (DatabaseException ex){ diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java index 9f954876..edb8e7ac 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java @@ -48,13 +48,13 @@ public CreateTableCommand(ExecutionEnvironment env, List comArgs) { public DatabaseCommandResult execute() { try{ String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); -// if(dbName == null){ -// throw new DatabaseException("Why dbname is null?"); -// } + if(dbName == null){ + throw new DatabaseException("Why dbname is null?"); + } String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); -// if(tbName == null){ -// throw new DatabaseException("Why tbName is null?"); -// } + if(tbName == null){ + throw new DatabaseException("Why tbName is null?"); + } Optional dataBase = environment.getDatabase(dbName); if(dataBase.isEmpty()){ throw new DatabaseException("We dont have"+ dbName); diff --git a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java index 0aa319e5..02d2f093 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java @@ -47,17 +47,17 @@ public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { public DatabaseCommandResult execute() { try{ String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); -// if(dbName == null){ -// throw new DatabaseException("Why dbname is null?"); -// } + if(dbName == null){ + throw new DatabaseException("Why dbname is null?"); + } String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); -// if(tbName == null){ -// throw new DatabaseException("Why tbName is null?"); -// } + if(tbName == null){ + throw new DatabaseException("Why tbName is null?"); + } String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); -// if(key == null){ -// throw new DatabaseException("Why key is null?"); -// } + if(key == null){ + throw new DatabaseException("Why key is null?"); + } Optional dataBase = environment.getDatabase(dbName); if(dataBase.isEmpty()){ throw new DatabaseException("We dont have"+ dbName); diff --git a/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java b/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java index a242a8dd..344b4dd7 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java +++ b/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java @@ -11,6 +11,7 @@ */ public class FailedDatabaseCommandResult implements DatabaseCommandResult { + private final String payLoad; public FailedDatabaseCommandResult(String pload) { diff --git a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java index 3b8f5791..7a89f035 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java @@ -47,17 +47,17 @@ public GetKeyCommand(ExecutionEnvironment env, List comArgs) { public DatabaseCommandResult execute() { try{ String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); -// if(dbName == null){ -// throw new DatabaseException("Why dbname is null?"); -// } + if(dbName == null){ + throw new DatabaseException("Why dbname is null?"); + } String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); -// if(tbName == null){ -// throw new DatabaseException("Why tbName is null?"); -// } + if(tbName == null){ + throw new DatabaseException("Why tbName is null?"); + } String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); -// if(key == null){ -// throw new DatabaseException("Why key is null?"); -// } + if(key == null){ + throw new DatabaseException("Why key is null?"); + } Optional dataBase = environment.getDatabase(dbName); if(dataBase.isEmpty()){ throw new DatabaseException("We dont have"+ dbName); diff --git a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java index 2a10076f..39776339 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java @@ -47,17 +47,17 @@ public SetKeyCommand(ExecutionEnvironment env, List comArgs) { public DatabaseCommandResult execute() { try{ String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); -// if(dbName == null){ -// throw new DatabaseException("Why dbname is null?"); -// } + if(dbName == null){ + throw new DatabaseException("Why dbname is null?"); + } String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); -// if(tbName == null){ -// throw new DatabaseException("Why tbName is null?"); -// } + if(tbName == null){ + throw new DatabaseException("Why tbName is null?"); + } String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); -// if(key == null){ -// throw new DatabaseException("Why key is null?"); -// } + if(key == null){ + throw new DatabaseException("Why key is null?"); + } Optional dataBase = environment.getDatabase(dbName); if(dataBase.isEmpty()){ throw new DatabaseException("We dont have"+ dbName); diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 406e4b93..cf7cb752 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -62,13 +62,13 @@ public static Segment create(String segmentName, Path tableRootPath) throws Data return new SegmentImpl(segmentRoot, segmentName, output); } - public static Segment initializeFromContext(SegmentInitializationContext context) throws RuntimeException{ + public static Segment initializeFromContext(SegmentInitializationContext context) throws RuntimeException { OutputStream output; try { output = Files.newOutputStream(context.getSegmentPath(), APPEND); } catch (IOException ex) { - throw new RuntimeException("Error while newOpenFile in Segment initializeFromContext" , ex); + throw new RuntimeException("Error while newOpenFile in Segment initializeFromContext", ex); } SegmentImpl newSegment = new SegmentImpl(context, output); return newSegment; From b5b29503cc4e9003f8d73635511e76e2155803ba Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Mon, 17 May 2021 05:11:04 +0300 Subject: [PATCH 160/378] Update SegmentInitializationContextImpl.java --- .../SegmentInitializationContextImpl.java | 42 +++++++++---------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java index 51ced9b3..84844e53 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializationContextImpl.java @@ -7,47 +7,43 @@ import java.nio.file.Paths; public class SegmentInitializationContextImpl implements SegmentInitializationContext { - private final String name; - private final Path path; - private final SegmentIndex index; - private final long size; - - public SegmentInitializationContextImpl(String segmentName, Path segmentPath, long currentSize, SegmentIndex index) { - name = segmentName; - path = segmentPath; - size = currentSize; - this.index = index; - } + private final String segmentName; + private final Path segmentPath; + private final long currentSize; + private final SegmentIndex segmentIndex; - /** - * Не используйте этот конструктор. Оставлен для совместимости со старыми тестами. - */ - public SegmentInitializationContextImpl(String segmentName, Path tablePath, long currentSize) { - this(segmentName, tablePath.resolve(segmentName), currentSize, new SegmentIndex()); + public SegmentInitializationContextImpl(String segmentName, Path segmentPath, int currentSize, SegmentIndex index) { + this.segmentName = segmentName; + this.segmentPath = segmentPath; + this.currentSize = currentSize; + this.segmentIndex = index; } - public SegmentInitializationContextImpl(String segmentName, Path tablePath) { - this(segmentName, tablePath.resolve(segmentName), 0, new SegmentIndex()); + public SegmentInitializationContextImpl(String segmentName, Path tablePath, int currentSize) { + this.segmentName = segmentName; + this.segmentPath = Paths.get(tablePath.toString(), segmentName); + this.currentSize = currentSize; + this.segmentIndex = new SegmentIndex(); } @Override public String getSegmentName() { - return name; + return segmentName; } @Override public Path getSegmentPath() { - return path; + return segmentPath; } @Override public SegmentIndex getIndex() { - return index; + return segmentIndex; } @Override public long getCurrentSize() { - return size; + return currentSize; } -} \ No newline at end of file +} From 7e49d01abcb9e895c9dcc696e1b20683ddd4ab86 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Mon, 17 May 2021 21:08:20 +0300 Subject: [PATCH 161/378] make nice --- .../com/itmo/java/basics/DatabaseServer.java | 8 ++-- .../java/basics/console/DatabaseCommands.java | 10 ++--- .../console/impl/CreateDatabaseCommand.java | 32 ++++++++-------- .../console/impl/CreateTableCommand.java | 24 ++++++------ .../basics/console/impl/DeleteKeyCommand.java | 27 +++++++------- .../impl/ExecutionEnvironmentImpl.java | 3 +- .../impl/FailedDatabaseCommandResult.java | 2 +- .../basics/console/impl/GetKeyCommand.java | 32 ++++++++-------- .../basics/console/impl/SetKeyCommand.java | 27 +++++++------- .../impl/SuccessDatabaseCommandResult.java | 6 ++- .../java/basics/logic/impl/TableImpl.java | 2 +- .../java/client/client/SimpleKvsClient.java | 37 ++++++++++--------- .../command/CreateDatabaseKvsCommand.java | 4 +- .../client/command/CreateTableKvsCommand.java | 8 ++-- .../java/client/command/DeleteKvsCommand.java | 6 +-- .../java/client/command/GetKvsCommand.java | 4 +- .../java/client/command/SetKvsCommand.java | 6 +-- .../DirectReferenceKvsConnection.java | 4 +- .../itmo/java/protocol/model/RespArray.java | 5 ++- .../java/protocol/model/RespBulkString.java | 4 +- .../java/protocol/model/RespCommandId.java | 1 - .../itmo/java/protocol/model/RespError.java | 6 +-- 22 files changed, 131 insertions(+), 127 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/DatabaseServer.java b/src/main/java/com/itmo/java/basics/DatabaseServer.java index 6d66d431..e0e45bc0 100644 --- a/src/main/java/com/itmo/java/basics/DatabaseServer.java +++ b/src/main/java/com/itmo/java/basics/DatabaseServer.java @@ -12,7 +12,7 @@ public class DatabaseServer { private final ExecutorService executorService = Executors.newSingleThreadExecutor(); - private final ExecutionEnvironment env; + private final ExecutionEnvironment enviroment; /** * Con structor @@ -27,14 +27,12 @@ public static DatabaseServer initialize(ExecutionEnvironment env, DatabaseServer } private DatabaseServer(ExecutionEnvironment env) { - this.env = env; + this.enviroment = env; } public CompletableFuture executeNextCommand(RespArray message) { return CompletableFuture.supplyAsync(() -> - DatabaseCommands.valueOf(message.getObjects().get(DatabaseCommandArgPositions.COMMAND_NAME.getPositionIndex()).asString()) - .getCommand(env, message.getObjects()).execute() - , executorService); + DatabaseCommands.valueOf(message.getObjects().get(DatabaseCommandArgPositions.COMMAND_NAME.getPositionIndex()).asString()).getCommand(enviroment, message.getObjects()).execute(), executorService); } public CompletableFuture executeNextCommand(DatabaseCommand command) { diff --git a/src/main/java/com/itmo/java/basics/console/DatabaseCommands.java b/src/main/java/com/itmo/java/basics/console/DatabaseCommands.java index 6a5b68c3..5b73b14b 100644 --- a/src/main/java/com/itmo/java/basics/console/DatabaseCommands.java +++ b/src/main/java/com/itmo/java/basics/console/DatabaseCommands.java @@ -15,31 +15,31 @@ public enum DatabaseCommands { CREATE_DATABASE { @Override public DatabaseCommand getCommand(ExecutionEnvironment env, List commandArgs) { - return new CreateDatabaseCommand(env, DatabaseImpl::create ,commandArgs); + return new CreateDatabaseCommand(env, DatabaseImpl::create, commandArgs); } }, CREATE_TABLE { @Override public DatabaseCommand getCommand(ExecutionEnvironment env, List commandArgs) { - return new CreateTableCommand(env,commandArgs); + return new CreateTableCommand(env, commandArgs); } }, SET_KEY { @Override public DatabaseCommand getCommand(ExecutionEnvironment env, List commandArgs) { - return new SetKeyCommand(env,commandArgs); + return new SetKeyCommand(env, commandArgs); } }, GET_KEY { @Override public DatabaseCommand getCommand(ExecutionEnvironment env, List commandArgs) { - return new GetKeyCommand(env,commandArgs); + return new GetKeyCommand(env, commandArgs); } }, DELETE_KEY { @Override public DatabaseCommand getCommand(ExecutionEnvironment env, List commandArgs) { - return new DeleteKeyCommand(env,commandArgs); + return new DeleteKeyCommand(env, commandArgs); } }; diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java index 8e0038af..f1f0b5b1 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java @@ -18,7 +18,7 @@ public class CreateDatabaseCommand implements DatabaseCommand { private final ExecutionEnvironment environment; private final DatabaseFactory dbfactory; - private final List commandargs; + private final List commandargs; private static final int numberOfAgrguments = 3; /** @@ -26,15 +26,15 @@ public class CreateDatabaseCommand implements DatabaseCommand { *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * - * @param env env - * @param factory функция создания базы данных (пример: DatabaseImpl::create) + * @param env env + * @param factory функция создания базы данных (пример: DatabaseImpl::create) * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. - * Id команды, имя команды, имя создаваемой бд + * Id команды, имя команды, имя создаваемой бд * @throws IllegalArgumentException если передано неправильное количество аргументов */ public CreateDatabaseCommand(ExecutionEnvironment env, DatabaseFactory factory, List comArgs) { - if (comArgs.size() != numberOfAgrguments){ - throw new IllegalArgumentException("Why " + comArgs.size()+"!= 3 , in CreateDataBaseCommand" ); + if (comArgs.size() != numberOfAgrguments) { + throw new IllegalArgumentException("Why " + comArgs.size() + "!= 3 , in CreateDataBaseCommand"); } environment = env; dbfactory = factory; @@ -48,15 +48,15 @@ public CreateDatabaseCommand(ExecutionEnvironment env, DatabaseFactory factory, */ @Override public DatabaseCommandResult execute() { - try{ - String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - if(dbName == null){ - throw new DatabaseException("Why dbname is null? "); - } - environment.addDatabase(dbfactory.createNonExistent(dbName,environment.getWorkingPath())); - return DatabaseCommandResult.success(("Success add " + dbName).getBytes(StandardCharsets.UTF_8)); - } catch (DatabaseException ex){ - return new FailedDatabaseCommandResult(ex.getMessage()); - } + try { + String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + if (dbName == null) { + throw new DatabaseException("Why dbname is null? "); + } + environment.addDatabase(dbfactory.createNonExistent(dbName, environment.getWorkingPath())); + return DatabaseCommandResult.success(("Success add " + dbName).getBytes(StandardCharsets.UTF_8)); + } catch (DatabaseException ex) { + return new FailedDatabaseCommandResult(ex.getMessage()); + } } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java index edb8e7ac..efa95b14 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java @@ -6,7 +6,6 @@ import com.itmo.java.basics.console.ExecutionEnvironment; import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.basics.logic.Database; -import com.itmo.java.basics.logic.DatabaseFactory; import com.itmo.java.protocol.model.RespObject; import java.nio.charset.StandardCharsets; @@ -19,23 +18,24 @@ public class CreateTableCommand implements DatabaseCommand { private final ExecutionEnvironment environment; - private final List commandargs; + private final List commandargs; private static final int numberOfAgrguments = 4; + /** * Создает команду *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * - * @param env env + * @param env env * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. - * Id команды, имя команды, имя бд, имя таблицы + * Id команды, имя команды, имя бд, имя таблицы * @throws IllegalArgumentException если передано неправильное количество аргументов */ public CreateTableCommand(ExecutionEnvironment env, List comArgs) { environment = env; commandargs = comArgs; - if (comArgs.size() != numberOfAgrguments){ - throw new IllegalArgumentException("Why " + comArgs.size()+"!= 4 , in CreateTableCommand" ); + if (comArgs.size() != numberOfAgrguments) { + throw new IllegalArgumentException("Why " + comArgs.size() + "!= 4 , in CreateTableCommand"); } } @@ -46,22 +46,22 @@ public CreateTableCommand(ExecutionEnvironment env, List comArgs) { */ @Override public DatabaseCommandResult execute() { - try{ + try { String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - if(dbName == null){ + if (dbName == null) { throw new DatabaseException("Why dbname is null?"); } String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); - if(tbName == null){ + if (tbName == null) { throw new DatabaseException("Why tbName is null?"); } Optional dataBase = environment.getDatabase(dbName); - if(dataBase.isEmpty()){ - throw new DatabaseException("We dont have"+ dbName); + if (dataBase.isEmpty()) { + throw new DatabaseException("We dont have" + dbName); } dataBase.get().createTableIfNotExists(tbName); return DatabaseCommandResult.success(("Success add " + dbName + tbName).getBytes(StandardCharsets.UTF_8)); - } catch (DatabaseException ex){ + } catch (DatabaseException ex) { return new FailedDatabaseCommandResult(ex.getMessage()); } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java index 02d2f093..fc112dd2 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java @@ -18,23 +18,24 @@ public class DeleteKeyCommand implements DatabaseCommand { private final ExecutionEnvironment environment; - private final List commandargs; + private final List commandargs; private static final int numberOfAgrguments = 5; + /** * Создает команду. *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * - * @param env env + * @param env env * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. - * Id команды, имя команды, имя бд, таблицы, ключ + * Id команды, имя команды, имя бд, таблицы, ключ * @throws IllegalArgumentException если передано неправильное количество аргументов */ public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { environment = env; commandargs = comArgs; - if (comArgs.size() != numberOfAgrguments){ - throw new IllegalArgumentException("Why " + comArgs.size()+"!= 5 , in CreateTableCommand" ); + if (comArgs.size() != numberOfAgrguments) { + throw new IllegalArgumentException("Why " + comArgs.size() + "!= 5 , in CreateTableCommand"); } } @@ -45,26 +46,26 @@ public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { */ @Override public DatabaseCommandResult execute() { - try{ + try { String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - if(dbName == null){ + if (dbName == null) { throw new DatabaseException("Why dbname is null?"); } String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); - if(tbName == null){ + if (tbName == null) { throw new DatabaseException("Why tbName is null?"); } String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); - if(key == null){ + if (key == null) { throw new DatabaseException("Why key is null?"); } Optional dataBase = environment.getDatabase(dbName); - if(dataBase.isEmpty()){ - throw new DatabaseException("We dont have"+ dbName); + if (dataBase.isEmpty()) { + throw new DatabaseException("We dont have" + dbName); } - dataBase.get().delete(tbName,key); + dataBase.get().delete(tbName, key); return DatabaseCommandResult.success(("Success del " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); - } catch (DatabaseException ex){ + } catch (DatabaseException ex) { return new FailedDatabaseCommandResult(ex.getMessage()); } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java index 2251831b..61006344 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java +++ b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java @@ -12,10 +12,9 @@ public class ExecutionEnvironmentImpl implements ExecutionEnvironment { private final DatabaseConfig dbConfig; - private final Map dataBase ; + private final Map dataBase; public ExecutionEnvironmentImpl(DatabaseConfig config) { - dbConfig = config; dataBase = new HashMap<>(); } diff --git a/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java b/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java index 344b4dd7..fc08c3c1 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java +++ b/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java @@ -15,7 +15,7 @@ public class FailedDatabaseCommandResult implements DatabaseCommandResult { private final String payLoad; public FailedDatabaseCommandResult(String pload) { - payLoad = pload; + payLoad = pload; } /** diff --git a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java index 7a89f035..07095674 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java @@ -8,7 +8,6 @@ import com.itmo.java.basics.logic.Database; import com.itmo.java.protocol.model.RespObject; -import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Optional; @@ -18,21 +17,22 @@ public class GetKeyCommand implements DatabaseCommand { private final ExecutionEnvironment environment; - private final List commandargs; + private final List commandargs; private static final int numberOfAgrguments = 5; + /** * Создает команду. *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * - * @param env env + * @param env env * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. - * Id команды, имя команды, имя бд, таблицы, ключ + * Id команды, имя команды, имя бд, таблицы, ключ * @throws IllegalArgumentException если передано неправильное количество аргументов */ public GetKeyCommand(ExecutionEnvironment env, List comArgs) { - if (comArgs.size() != numberOfAgrguments){ - throw new IllegalArgumentException("Why " + comArgs.size()+"!= 5 , in CreateTableCommand" ); + if (comArgs.size() != numberOfAgrguments) { + throw new IllegalArgumentException("Why " + comArgs.size() + "!= 5 , in CreateTableCommand"); } environment = env; commandargs = comArgs; @@ -45,29 +45,29 @@ public GetKeyCommand(ExecutionEnvironment env, List comArgs) { */ @Override public DatabaseCommandResult execute() { - try{ + try { String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - if(dbName == null){ + if (dbName == null) { throw new DatabaseException("Why dbname is null?"); } String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); - if(tbName == null){ + if (tbName == null) { throw new DatabaseException("Why tbName is null?"); } String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); - if(key == null){ + if (key == null) { throw new DatabaseException("Why key is null?"); } Optional dataBase = environment.getDatabase(dbName); - if(dataBase.isEmpty()){ - throw new DatabaseException("We dont have"+ dbName); + if (dataBase.isEmpty()) { + throw new DatabaseException("We dont have" + dbName); } - Optional value = dataBase.get().read(tbName,key); - if(value.isEmpty()){ - throw new DatabaseException("We dont have"+ dbName + tbName + key); + Optional value = dataBase.get().read(tbName, key); + if (value.isEmpty()) { + throw new DatabaseException("We dont have" + dbName + tbName + key); } return DatabaseCommandResult.success(value.get()); - } catch (DatabaseException ex){ + } catch (DatabaseException ex) { return new FailedDatabaseCommandResult(ex.getMessage()); } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java index 39776339..a95597b5 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java @@ -18,21 +18,22 @@ public class SetKeyCommand implements DatabaseCommand { private final ExecutionEnvironment environment; - private final List commandargs; + private final List commandargs; private static final int numberOfAgrguments = 6; + /** * Создает команду. *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * - * @param env env + * @param env env * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. - * Id команды, имя команды, имя бд, таблицы, ключ, значение + * Id команды, имя команды, имя бд, таблицы, ключ, значение * @throws IllegalArgumentException если передано неправильное количество аргументов */ public SetKeyCommand(ExecutionEnvironment env, List comArgs) { - if (comArgs.size() != numberOfAgrguments){ - throw new IllegalArgumentException("Why " + comArgs.size()+"!= 5 , in CreateTableCommand" ); + if (comArgs.size() != numberOfAgrguments) { + throw new IllegalArgumentException("Why " + comArgs.size() + "!= 5 , in CreateTableCommand"); } environment = env; commandargs = comArgs; @@ -45,27 +46,27 @@ public SetKeyCommand(ExecutionEnvironment env, List comArgs) { */ @Override public DatabaseCommandResult execute() { - try{ + try { String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - if(dbName == null){ + if (dbName == null) { throw new DatabaseException("Why dbname is null?"); } String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); - if(tbName == null){ + if (tbName == null) { throw new DatabaseException("Why tbName is null?"); } String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); - if(key == null){ + if (key == null) { throw new DatabaseException("Why key is null?"); } Optional dataBase = environment.getDatabase(dbName); - if(dataBase.isEmpty()){ - throw new DatabaseException("We dont have"+ dbName); + if (dataBase.isEmpty()) { + throw new DatabaseException("We dont have" + dbName); } byte[] value = commandargs.get(DatabaseCommandArgPositions.VALUE.getPositionIndex()).asString().getBytes(StandardCharsets.UTF_8); - dataBase.get().write(tbName,key,value); + dataBase.get().write(tbName, key, value); return DatabaseCommandResult.success(("Success add key " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); - } catch (DatabaseException ex){ + } catch (DatabaseException ex) { return new FailedDatabaseCommandResult(ex.getMessage()); } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java b/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java index 0116dea2..ae8fad44 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java +++ b/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java @@ -17,7 +17,11 @@ public SuccessDatabaseCommandResult(byte[] pload) { @Override public String getPayLoad() { - return payLoad !=null ? new String(payLoad) : null; + if(payLoad != null) { + return new String(payLoad); + } else { + return null; + } } @Override diff --git a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java index c00b94c4..20265491 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/TableImpl.java @@ -49,7 +49,7 @@ public static Table create(String tableName, Path pathToDatabaseRoot, TableIndex public static Table initializeFromContext(TableInitializationContext context) { - return new CachingTable(new TableImpl(context)); + return new CachingTable(new TableImpl(context)); } diff --git a/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java b/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java index c9347c9c..0cd550af 100644 --- a/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java +++ b/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java @@ -13,6 +13,7 @@ public class SimpleKvsClient implements KvsClient { private final String dbName; private final KvsConnection connectionSupplier; + /** * Конструктор * @@ -20,7 +21,7 @@ public class SimpleKvsClient implements KvsClient { * @param connectionSupplier метод создания подключения к базе */ public SimpleKvsClient(String databaseName, Supplier connectionSupplier) { - dbName = databaseName; + dbName = databaseName; this.connectionSupplier = connectionSupplier.get(); } @@ -29,11 +30,11 @@ public String createDatabase() throws DatabaseExecutionException { try { CreateDatabaseKvsCommand dbKvsCom = new CreateDatabaseKvsCommand(dbName); RespObject obj = connectionSupplier.send(dbKvsCom.getCommandId(), dbKvsCom.serialize()); - if(obj.isError()){ + if (obj.isError()) { throw new DatabaseExecutionException(obj.asString()); } return obj.asString(); - } catch(ConnectionException ex){ + } catch (ConnectionException ex) { return DatabaseCommandResult.error(ex).getPayLoad(); } } @@ -41,13 +42,13 @@ public String createDatabase() throws DatabaseExecutionException { @Override public String createTable(String tableName) throws DatabaseExecutionException { try { - CreateTableKvsCommand tbKvsCom = new CreateTableKvsCommand(dbName,tableName); + CreateTableKvsCommand tbKvsCom = new CreateTableKvsCommand(dbName, tableName); RespObject obj = connectionSupplier.send(tbKvsCom.getCommandId(), tbKvsCom.serialize()); - if(obj.isError()){ + if (obj.isError()) { throw new DatabaseExecutionException(obj.asString()); } return obj.asString(); - } catch(ConnectionException ex){ + } catch (ConnectionException ex) { return DatabaseCommandResult.error(ex).getPayLoad(); } } @@ -55,13 +56,13 @@ public String createTable(String tableName) throws DatabaseExecutionException { @Override public String get(String tableName, String key) throws DatabaseExecutionException { try { - GetKvsCommand getKvsCom = new GetKvsCommand(dbName,tableName,key); - RespObject obj = connectionSupplier.send(getKvsCom .getCommandId(), getKvsCom .serialize()); - if(obj.isError()){ + GetKvsCommand getKvsCom = new GetKvsCommand(dbName, tableName, key); + RespObject obj = connectionSupplier.send(getKvsCom.getCommandId(), getKvsCom.serialize()); + if (obj.isError()) { throw new DatabaseExecutionException(obj.asString()); } return obj.asString(); - } catch(ConnectionException ex){ + } catch (ConnectionException ex) { return DatabaseCommandResult.error(ex).getPayLoad(); } } @@ -69,13 +70,13 @@ public String get(String tableName, String key) throws DatabaseExecutionExceptio @Override public String set(String tableName, String key, String value) throws DatabaseExecutionException { try { - SetKvsCommand setKvsCom = new SetKvsCommand(dbName,tableName,key,value); - RespObject obj = connectionSupplier.send(setKvsCom .getCommandId(), setKvsCom .serialize()); - if(obj.isError()){ + SetKvsCommand setKvsCom = new SetKvsCommand(dbName, tableName, key, value); + RespObject obj = connectionSupplier.send(setKvsCom.getCommandId(), setKvsCom.serialize()); + if (obj.isError()) { throw new DatabaseExecutionException(obj.asString()); } return obj.asString(); - } catch(ConnectionException ex){ + } catch (ConnectionException ex) { return DatabaseCommandResult.error(ex).getPayLoad(); } } @@ -83,13 +84,13 @@ public String set(String tableName, String key, String value) throws DatabaseExe @Override public String delete(String tableName, String key) throws DatabaseExecutionException { try { - DeleteKvsCommand delKvsCom = new DeleteKvsCommand(dbName,tableName,key); - RespObject obj = connectionSupplier.send(delKvsCom .getCommandId(), delKvsCom .serialize()); - if(obj.isError()){ + DeleteKvsCommand delKvsCom = new DeleteKvsCommand(dbName, tableName, key); + RespObject obj = connectionSupplier.send(delKvsCom.getCommandId(), delKvsCom.serialize()); + if (obj.isError()) { throw new DatabaseExecutionException(obj.asString()); } return obj.asString(); - } catch(ConnectionException ex){ + } catch (ConnectionException ex) { return DatabaseCommandResult.error(ex).getPayLoad(); } } diff --git a/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java b/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java index ab601fa2..964abfab 100644 --- a/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java @@ -21,8 +21,8 @@ public class CreateDatabaseKvsCommand implements KvsCommand { * @param databaseName имя базы данных */ public CreateDatabaseKvsCommand(String databaseName) { - dbID = idGen.get(); - dbName = databaseName; + dbID = idGen.get(); + dbName = databaseName; } /** diff --git a/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java b/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java index ebb543fd..edcd1746 100644 --- a/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java @@ -10,16 +10,16 @@ * Команда для создания таблицы */ public class CreateTableKvsCommand implements KvsCommand { + private static final String COMMAND_NAME = "CREATE_TABLE"; private final String dbName; private final int tbID; private final String tbName; - public CreateTableKvsCommand(String databaseName, String tableName) { - dbName = databaseName; - tbName = tableName; - tbID = idGen.get(); + dbName = databaseName; + tbName = tableName; + tbID = idGen.get(); } /** diff --git a/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java b/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java index 23601402..ea7e1827 100644 --- a/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java @@ -7,15 +7,15 @@ import java.nio.charset.StandardCharsets; public class DeleteKvsCommand implements KvsCommand { + private static final String COMMAND_NAME = "DELETE_KEY"; private final String dbName; private final String tbName; private final String Key; - private final int delID ; - + private final int delID; public DeleteKvsCommand(String databaseName, String tableName, String key) { - dbName =databaseName; + dbName = databaseName; tbName = tableName; Key = key; delID = idGen.get(); diff --git a/src/main/java/com/itmo/java/client/command/GetKvsCommand.java b/src/main/java/com/itmo/java/client/command/GetKvsCommand.java index c7ed3625..43009e30 100644 --- a/src/main/java/com/itmo/java/client/command/GetKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/GetKvsCommand.java @@ -12,10 +12,10 @@ public class GetKvsCommand implements KvsCommand { private final String dbName; private final String tbName; private final String Key; - private final int getID ; + private final int getID; public GetKvsCommand(String databaseName, String tableName, String key) { - dbName =databaseName; + dbName = databaseName; tbName = tableName; Key = key; getID = idGen.get(); diff --git a/src/main/java/com/itmo/java/client/command/SetKvsCommand.java b/src/main/java/com/itmo/java/client/command/SetKvsCommand.java index 03ff1d26..b1661993 100644 --- a/src/main/java/com/itmo/java/client/command/SetKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/SetKvsCommand.java @@ -12,12 +12,12 @@ public class SetKvsCommand implements KvsCommand { private final String dbName; private final String tbName; private final String Key; - private final int setID ; + private final int setID; private final String Value; - public SetKvsCommand(String databaseName, String tableName, String key, String value) { - dbName =databaseName; + + dbName = databaseName; tbName = tableName; Key = key; setID = idGen.get(); diff --git a/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java b/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java index fcb017e0..40d0ccbd 100644 --- a/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java @@ -21,9 +21,9 @@ public DirectReferenceKvsConnection(DatabaseServer databaseServer) { @Override public RespObject send(int commandId, RespArray command) throws ConnectionException { - try{ + try { return dbServer.executeNextCommand(command).get().serialize(); - } catch(ExecutionException | InterruptedException ex){ + } catch (ExecutionException | InterruptedException ex) { throw new ConnectionException(ex.getMessage(), ex.getCause()); } } diff --git a/src/main/java/com/itmo/java/protocol/model/RespArray.java b/src/main/java/com/itmo/java/protocol/model/RespArray.java index 1223ed07..38929f15 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespArray.java +++ b/src/main/java/com/itmo/java/protocol/model/RespArray.java @@ -43,12 +43,13 @@ public String asString() { } @Override - public void write(OutputStream output) throws IOException { + public void write(OutputStream output) throws IOException { + output.write(CODE); output.write(Integer.toString(objects.size()).getBytes(StandardCharsets.UTF_8)); output.write(CRLF); for (RespObject obj : objects) { - obj.write(output); + obj.write(output); } } diff --git a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java index 5dcc621d..1639eae0 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java +++ b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java @@ -42,11 +42,11 @@ public String asString() { @Override public void write(OutputStream output) throws IOException { + output.write(CODE); if (data == null) { output.write(Integer.toString(NULL_STRING_SIZE).getBytes(StandardCharsets.UTF_8)); - } - else { + } else { output.write(Integer.toString(data.length).getBytes(StandardCharsets.UTF_8)); output.write(CRLF); output.write(data); diff --git a/src/main/java/com/itmo/java/protocol/model/RespCommandId.java b/src/main/java/com/itmo/java/protocol/model/RespCommandId.java index d077f659..785c04d8 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespCommandId.java +++ b/src/main/java/com/itmo/java/protocol/model/RespCommandId.java @@ -43,6 +43,5 @@ public void write(OutputStream output) throws IOException { output.write((commandByte >>> 8) & 0xFF); output.write(commandByte &0xFF); output.write(CRLF); - } } diff --git a/src/main/java/com/itmo/java/protocol/model/RespError.java b/src/main/java/com/itmo/java/protocol/model/RespError.java index 87e64d08..8688757d 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespError.java +++ b/src/main/java/com/itmo/java/protocol/model/RespError.java @@ -35,8 +35,8 @@ public String asString() { @Override public void write(OutputStream output) throws IOException { - output.write(CODE); - output.write(message); - output.write(CRLF); + output.write(CODE); + output.write(message); + output.write(CRLF); } } From 090c32621550ff72de334da07e9384941ffb2246 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Mon, 17 May 2021 21:18:44 +0300 Subject: [PATCH 162/378] lab3 --- .../com/itmo/java/basics/console/impl/CreateTableCommand.java | 4 ++-- .../com/itmo/java/basics/console/impl/DeleteKeyCommand.java | 4 ++-- src/main/java/com/itmo/java/protocol/model/RespArray.java | 1 - .../java/com/itmo/java/protocol/model/RespBulkString.java | 1 - 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java index efa95b14..b813f2ac 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java @@ -32,11 +32,11 @@ public class CreateTableCommand implements DatabaseCommand { * @throws IllegalArgumentException если передано неправильное количество аргументов */ public CreateTableCommand(ExecutionEnvironment env, List comArgs) { - environment = env; - commandargs = comArgs; if (comArgs.size() != numberOfAgrguments) { throw new IllegalArgumentException("Why " + comArgs.size() + "!= 4 , in CreateTableCommand"); } + environment = env; + commandargs = comArgs; } /** diff --git a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java index fc112dd2..c9e426f1 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java @@ -32,11 +32,11 @@ public class DeleteKeyCommand implements DatabaseCommand { * @throws IllegalArgumentException если передано неправильное количество аргументов */ public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { - environment = env; - commandargs = comArgs; if (comArgs.size() != numberOfAgrguments) { throw new IllegalArgumentException("Why " + comArgs.size() + "!= 5 , in CreateTableCommand"); } + environment = env; + commandargs = comArgs; } /** diff --git a/src/main/java/com/itmo/java/protocol/model/RespArray.java b/src/main/java/com/itmo/java/protocol/model/RespArray.java index 38929f15..a3200f35 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespArray.java +++ b/src/main/java/com/itmo/java/protocol/model/RespArray.java @@ -44,7 +44,6 @@ public String asString() { @Override public void write(OutputStream output) throws IOException { - output.write(CODE); output.write(Integer.toString(objects.size()).getBytes(StandardCharsets.UTF_8)); output.write(CRLF); diff --git a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java index 1639eae0..c3a53d83 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java +++ b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java @@ -42,7 +42,6 @@ public String asString() { @Override public void write(OutputStream output) throws IOException { - output.write(CODE); if (data == null) { output.write(Integer.toString(NULL_STRING_SIZE).getBytes(StandardCharsets.UTF_8)); From cfa1b204548e0ab5137e64836ee39190d99aaefc Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 18 May 2021 18:04:04 +0300 Subject: [PATCH 163/378] end3lab --- src/main/java/com/itmo/java/client/command/SetKvsCommand.java | 1 - src/main/java/com/itmo/java/protocol/model/RespCommandId.java | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/itmo/java/client/command/SetKvsCommand.java b/src/main/java/com/itmo/java/client/command/SetKvsCommand.java index b1661993..cb704e90 100644 --- a/src/main/java/com/itmo/java/client/command/SetKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/SetKvsCommand.java @@ -16,7 +16,6 @@ public class SetKvsCommand implements KvsCommand { private final String Value; public SetKvsCommand(String databaseName, String tableName, String key, String value) { - dbName = databaseName; tbName = tableName; Key = key; diff --git a/src/main/java/com/itmo/java/protocol/model/RespCommandId.java b/src/main/java/com/itmo/java/protocol/model/RespCommandId.java index 785c04d8..d7213a79 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespCommandId.java +++ b/src/main/java/com/itmo/java/protocol/model/RespCommandId.java @@ -16,7 +16,7 @@ public class RespCommandId implements RespObject { private final int commandId; public RespCommandId(int comId) { - commandId = comId; + commandId = comId; } /** From efb53c0c4abee952553cf538b26f3539fedf8550 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Mon, 7 Jun 2021 16:09:59 +0300 Subject: [PATCH 164/378] start --- .gradle/6.7/fileChanges/last-build.bin | Bin 0 -> 1 bytes .gradle/6.7/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .gradle/6.7/gc.properties | 0 .gradle/buildOutputCleanup/buildOutputCleanup.lock | Bin 0 -> 17 bytes .gradle/buildOutputCleanup/cache.properties | 2 ++ .gradle/checksums/checksums.lock | Bin 0 -> 17 bytes .gradle/configuration-cache/gc.properties | 0 .gradle/vcs-1/gc.properties | 0 .../basics/console/impl/CreateTableCommand.java | 3 ++- .../java/basics/console/impl/DeleteKeyCommand.java | 3 ++- .../java/basics/console/impl/GetKeyCommand.java | 3 ++- .../java/basics/console/impl/SetKeyCommand.java | 3 ++- .../java/basics/exceptions/DatabaseException.java | 2 +- .../java/com/itmo/java/basics/index/KvsIndex.java | 4 ++-- .../itmo/java/basics/index/SegmentOffsetInfo.java | 2 +- .../java/basics/index/impl/MapBasedKvsIndex.java | 4 ++-- .../itmo/java/basics/index/impl/SegmentIndex.java | 4 ++-- .../basics/index/impl/SegmentOffsetInfoImpl.java | 4 ++-- .../itmo/java/basics/index/impl/TableIndex.java | 4 ++-- .../initialization/impl/SegmentInitializer.java | 2 +- .../java/com/itmo/java/basics/logic/Database.java | 5 +++-- .../com/itmo/java/basics/logic/DatabaseRecord.java | 2 +- .../java/com/itmo/java/basics/logic/Segment.java | 3 +-- .../java/com/itmo/java/basics/logic/Table.java | 5 +++-- .../java/basics/logic/WritableDatabaseRecord.java | 2 +- .../itmo/java/basics/logic/impl/CachingTable.java | 7 ++++--- .../itmo/java/basics/logic/impl/DatabaseImpl.java | 6 +++--- .../java/basics/logic/io/DatabaseOutputStream.java | 5 ++--- 28 files changed, 41 insertions(+), 34 deletions(-) create mode 100644 .gradle/6.7/fileChanges/last-build.bin create mode 100644 .gradle/6.7/fileHashes/fileHashes.lock create mode 100644 .gradle/6.7/gc.properties create mode 100644 .gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 .gradle/buildOutputCleanup/cache.properties create mode 100644 .gradle/checksums/checksums.lock create mode 100644 .gradle/configuration-cache/gc.properties create mode 100644 .gradle/vcs-1/gc.properties diff --git a/.gradle/6.7/fileChanges/last-build.bin b/.gradle/6.7/fileChanges/last-build.bin new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/.gradle/6.7/fileHashes/fileHashes.lock b/.gradle/6.7/fileHashes/fileHashes.lock new file mode 100644 index 0000000000000000000000000000000000000000..7f336de7535c1530479936f7ef826631dfe95f44 GIT binary patch literal 17 ScmZSX)fVDVly9EH00jUVcmg#5 literal 0 HcmV?d00001 diff --git a/.gradle/6.7/gc.properties b/.gradle/6.7/gc.properties new file mode 100644 index 00000000..e69de29b diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 0000000000000000000000000000000000000000..5ee92ba22f2047174073963a92d48209a888b1eb GIT binary patch literal 17 TcmZQh^(_4#X!C=e0Rk8SE`$TK literal 0 HcmV?d00001 diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 00000000..fba80e9b --- /dev/null +++ b/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Mon Jun 07 15:01:23 MSK 2021 +gradle.version=6.7 diff --git a/.gradle/checksums/checksums.lock b/.gradle/checksums/checksums.lock new file mode 100644 index 0000000000000000000000000000000000000000..f80330cb572ef661db3bbe46620bcc5f74b912b0 GIT binary patch literal 17 TcmZQ}j(XrNvCZ@f0~7!NEI|XK literal 0 HcmV?d00001 diff --git a/.gradle/configuration-cache/gc.properties b/.gradle/configuration-cache/gc.properties new file mode 100644 index 00000000..e69de29b diff --git a/.gradle/vcs-1/gc.properties b/.gradle/vcs-1/gc.properties new file mode 100644 index 00000000..e69de29b diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java index b813f2ac..3f3a9902 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java @@ -8,6 +8,7 @@ import com.itmo.java.basics.logic.Database; import com.itmo.java.protocol.model.RespObject; +import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Optional; @@ -61,7 +62,7 @@ public DatabaseCommandResult execute() { } dataBase.get().createTableIfNotExists(tbName); return DatabaseCommandResult.success(("Success add " + dbName + tbName).getBytes(StandardCharsets.UTF_8)); - } catch (DatabaseException ex) { + } catch (DatabaseException | IOException ex) { return new FailedDatabaseCommandResult(ex.getMessage()); } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java index c9e426f1..518cf8a2 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java @@ -8,6 +8,7 @@ import com.itmo.java.basics.logic.Database; import com.itmo.java.protocol.model.RespObject; +import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Optional; @@ -65,7 +66,7 @@ public DatabaseCommandResult execute() { } dataBase.get().delete(tbName, key); return DatabaseCommandResult.success(("Success del " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); - } catch (DatabaseException ex) { + } catch (DatabaseException | IOException ex) { return new FailedDatabaseCommandResult(ex.getMessage()); } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java index 07095674..96826bfb 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java @@ -8,6 +8,7 @@ import com.itmo.java.basics.logic.Database; import com.itmo.java.protocol.model.RespObject; +import java.io.IOException; import java.util.List; import java.util.Optional; @@ -67,7 +68,7 @@ public DatabaseCommandResult execute() { throw new DatabaseException("We dont have" + dbName + tbName + key); } return DatabaseCommandResult.success(value.get()); - } catch (DatabaseException ex) { + } catch (DatabaseException | IOException ex) { return new FailedDatabaseCommandResult(ex.getMessage()); } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java index a95597b5..80cb6c31 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java @@ -8,6 +8,7 @@ import com.itmo.java.basics.logic.Database; import com.itmo.java.protocol.model.RespObject; +import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Optional; @@ -66,7 +67,7 @@ public DatabaseCommandResult execute() { byte[] value = commandargs.get(DatabaseCommandArgPositions.VALUE.getPositionIndex()).asString().getBytes(StandardCharsets.UTF_8); dataBase.get().write(tbName, key, value); return DatabaseCommandResult.success(("Success add key " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); - } catch (DatabaseException ex) { + } catch (DatabaseException | IOException ex) { return new FailedDatabaseCommandResult(ex.getMessage()); } } diff --git a/src/main/java/com/itmo/java/basics/exceptions/DatabaseException.java b/src/main/java/com/itmo/java/basics/exceptions/DatabaseException.java index 07d921e7..85a33133 100644 --- a/src/main/java/com/itmo/java/basics/exceptions/DatabaseException.java +++ b/src/main/java/com/itmo/java/basics/exceptions/DatabaseException.java @@ -1,4 +1,4 @@ -package main.java.com.itmo.java.basics.exceptions; +package com.itmo.java.basics.exceptions; public class DatabaseException extends Exception { public DatabaseException(String message) { diff --git a/src/main/java/com/itmo/java/basics/index/KvsIndex.java b/src/main/java/com/itmo/java/basics/index/KvsIndex.java index 9509f8a2..a20ba4b9 100644 --- a/src/main/java/com/itmo/java/basics/index/KvsIndex.java +++ b/src/main/java/com/itmo/java/basics/index/KvsIndex.java @@ -1,4 +1,4 @@ -package main.java.com.itmo.java.basics.index; +package com.itmo.java.basics.index; import java.util.Optional; @@ -18,4 +18,4 @@ public interface KvsIndex { * @return {@code Optional} */ Optional searchForKey(K key); -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/index/SegmentOffsetInfo.java b/src/main/java/com/itmo/java/basics/index/SegmentOffsetInfo.java index 38230ed5..93921ecd 100644 --- a/src/main/java/com/itmo/java/basics/index/SegmentOffsetInfo.java +++ b/src/main/java/com/itmo/java/basics/index/SegmentOffsetInfo.java @@ -1,4 +1,4 @@ -package main.java.com.itmo.java.basics.index; +package com.itmo.java.basics.index; public interface SegmentOffsetInfo { long getOffset(); diff --git a/src/main/java/com/itmo/java/basics/index/impl/MapBasedKvsIndex.java b/src/main/java/com/itmo/java/basics/index/impl/MapBasedKvsIndex.java index caae3e48..ba102d65 100644 --- a/src/main/java/com/itmo/java/basics/index/impl/MapBasedKvsIndex.java +++ b/src/main/java/com/itmo/java/basics/index/impl/MapBasedKvsIndex.java @@ -1,6 +1,6 @@ -package main.java.com.itmo.java.basics.index.impl; +package com.itmo.java.basics.index.impl; -import main.java.com.itmo.java.basics.index.KvsIndex; +import com.itmo.java.basics.index.KvsIndex; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/com/itmo/java/basics/index/impl/SegmentIndex.java b/src/main/java/com/itmo/java/basics/index/impl/SegmentIndex.java index ee6b8e48..7370c6d6 100644 --- a/src/main/java/com/itmo/java/basics/index/impl/SegmentIndex.java +++ b/src/main/java/com/itmo/java/basics/index/impl/SegmentIndex.java @@ -1,6 +1,6 @@ -package main.java.com.itmo.java.basics.index.impl; +package com.itmo.java.basics.index.impl; -import main.java.com.itmo.java.basics.index.SegmentOffsetInfo; +import com.itmo.java.basics.index.SegmentOffsetInfo; public class SegmentIndex extends MapBasedKvsIndex { } diff --git a/src/main/java/com/itmo/java/basics/index/impl/SegmentOffsetInfoImpl.java b/src/main/java/com/itmo/java/basics/index/impl/SegmentOffsetInfoImpl.java index 413cc58e..9ee2edc0 100644 --- a/src/main/java/com/itmo/java/basics/index/impl/SegmentOffsetInfoImpl.java +++ b/src/main/java/com/itmo/java/basics/index/impl/SegmentOffsetInfoImpl.java @@ -1,6 +1,6 @@ -package main.java.com.itmo.java.basics.index.impl; +package com.itmo.java.basics.index.impl; -import main.java.com.itmo.java.basics.index.SegmentOffsetInfo; +import com.itmo.java.basics.index.SegmentOffsetInfo; public class SegmentOffsetInfoImpl implements SegmentOffsetInfo { private final long offset; diff --git a/src/main/java/com/itmo/java/basics/index/impl/TableIndex.java b/src/main/java/com/itmo/java/basics/index/impl/TableIndex.java index 86eddfde..eceaeea8 100644 --- a/src/main/java/com/itmo/java/basics/index/impl/TableIndex.java +++ b/src/main/java/com/itmo/java/basics/index/impl/TableIndex.java @@ -1,6 +1,6 @@ -package main.java.com.itmo.java.basics.index.impl; +package com.itmo.java.basics.index.impl; -import main.java.com.itmo.java.basics.logic.Segment; +import com.itmo.java.basics.logic.Segment; public class TableIndex extends MapBasedKvsIndex { } diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java index 90409c2a..47b6be78 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/SegmentInitializer.java @@ -63,7 +63,7 @@ public void perform(InitializationContext context) throws DatabaseException { Segment newSegment = SegmentImpl.initializeFromContext(new SegmentInitializationContextImpl(segmentinitialContext.getSegmentName(), segmentinitialContext.getSegmentPath(), size, segIndex)); for (String in : keys) { - context.currentTableContext().getTableIndex().onIndexedEntityUpdated(in, segment); + context.currentTableContext().getTableIndex().onIndexedEntityUpdated(in,segment); } context.currentTableContext().updateCurrentSegment(newSegment); } diff --git a/src/main/java/com/itmo/java/basics/logic/Database.java b/src/main/java/com/itmo/java/basics/logic/Database.java index 76bfba28..dd4ebf7e 100644 --- a/src/main/java/com/itmo/java/basics/logic/Database.java +++ b/src/main/java/com/itmo/java/basics/logic/Database.java @@ -1,7 +1,8 @@ -package main.java.com.itmo.java.basics.logic; +package com.itmo.java.basics.logic; -import main.java.com.itmo.java.basics.exceptions.DatabaseException; +import com.itmo.java.basics.exceptions.DatabaseException; +import java.io.IOException; import java.util.Optional; public interface Database { diff --git a/src/main/java/com/itmo/java/basics/logic/DatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/DatabaseRecord.java index 4428875e..ee4d17b0 100644 --- a/src/main/java/com/itmo/java/basics/logic/DatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/DatabaseRecord.java @@ -1,4 +1,4 @@ -package main.java.com.itmo.java.basics.logic; +package com.itmo.java.basics.logic; /** * Представляет собой единицу хранения в БД diff --git a/src/main/java/com/itmo/java/basics/logic/Segment.java b/src/main/java/com/itmo/java/basics/logic/Segment.java index 7d6008a9..128db64d 100644 --- a/src/main/java/com/itmo/java/basics/logic/Segment.java +++ b/src/main/java/com/itmo/java/basics/logic/Segment.java @@ -1,6 +1,5 @@ -package main.java.com.itmo.java.basics.logic; +package com.itmo.java.basics.logic; -import main.java.com.itmo.java.basics.exceptions.DatabaseException; import java.io.IOException; import java.util.Optional; diff --git a/src/main/java/com/itmo/java/basics/logic/Table.java b/src/main/java/com/itmo/java/basics/logic/Table.java index 8f48055a..730041ec 100644 --- a/src/main/java/com/itmo/java/basics/logic/Table.java +++ b/src/main/java/com/itmo/java/basics/logic/Table.java @@ -1,7 +1,8 @@ -package main.java.com.itmo.java.basics.logic; +package com.itmo.java.basics.logic; -import main.java.com.itmo.java.basics.exceptions.DatabaseException; +import com.itmo.java.basics.exceptions.DatabaseException; +import java.io.IOException; import java.util.Optional; /** diff --git a/src/main/java/com/itmo/java/basics/logic/WritableDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/WritableDatabaseRecord.java index d1be1c27..f1f859c7 100644 --- a/src/main/java/com/itmo/java/basics/logic/WritableDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/WritableDatabaseRecord.java @@ -1,4 +1,4 @@ -package main.java.com.itmo.java.basics.logic; +package com.itmo.java.basics.logic; /** * Содержит информацию о параметрах {@link DatabaseRecord} для хранения в БД diff --git a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java index 05f09cbc..b694657d 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java @@ -4,6 +4,7 @@ import com.itmo.java.basics.logic.DatabaseCache; import com.itmo.java.basics.logic.Table; +import java.io.IOException; import java.util.Optional; public class CachingTable implements Table { @@ -22,13 +23,13 @@ public String getName() { } @Override - public void write(String objectKey, byte[] objectValue) throws DatabaseException { + public void write(String objectKey, byte[] objectValue) throws DatabaseException, IOException { cacheTable.write(objectKey, objectValue); dbCache.set(objectKey, objectValue); } @Override - public Optional read(String objectKey) throws DatabaseException { + public Optional read(String objectKey) throws DatabaseException, IOException { byte[] reading = dbCache.get(objectKey); if (reading != null) { return Optional.of(reading); @@ -38,7 +39,7 @@ public Optional read(String objectKey) throws DatabaseException { } @Override - public void delete(String objectKey) throws DatabaseException { + public void delete(String objectKey) throws DatabaseException, IOException { cacheTable.delete(objectKey); dbCache.delete(objectKey); } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index 69f8b702..341edc71 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -72,7 +72,7 @@ public void createTableIfNotExists(String tableName) throws DatabaseException { } @Override - public void write(String tableName, String objectKey, byte[] objectValue) throws DatabaseException { + public void write(String tableName, String objectKey, byte[] objectValue) throws DatabaseException, IOException { if (tableName == null) { throw new DatabaseException("Error while writing in , null name"); @@ -86,7 +86,7 @@ public void write(String tableName, String objectKey, byte[] objectValue) throws } @Override - public Optional read(String tableName, String objectKey) throws DatabaseException { + public Optional read(String tableName, String objectKey) throws DatabaseException, IOException { Table table = tableDictionary.get(tableName); if (tableName == null) { throw new DatabaseException("Error while reading in database , null name"); @@ -95,7 +95,7 @@ public Optional read(String tableName, String objectKey) throws Database } @Override - public void delete(String tableName, String objectKey) throws DatabaseException { + public void delete(String tableName, String objectKey) throws DatabaseException, IOException { if (!tableDictionary.containsKey(tableName)) { throw new DatabaseException("Table " + tableName + " doesnt exist in database" + dbName); } diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java index b3bb0fbf..ec1ad1c4 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java @@ -1,6 +1,5 @@ -package main.java.com.itmo.java.basics.logic.io; - -import main.java.com.itmo.java.basics.logic.WritableDatabaseRecord; +package com.itmo.java.basics.logic.io; +import com.itmo.java.basics.logic.WritableDatabaseRecord; import java.io.DataOutputStream; import java.io.IOException; From 148faa56eff0035356f2c2e01fafb69ca459b6ba Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Mon, 7 Jun 2021 16:35:54 +0300 Subject: [PATCH 165/378] fix throw IOException --- .../java/com/itmo/java/basics/console/DatabaseCommand.java | 4 +++- src/main/java/com/itmo/java/basics/logic/Table.java | 2 +- .../java/com/itmo/java/basics/logic/impl/CachingTable.java | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/DatabaseCommand.java b/src/main/java/com/itmo/java/basics/console/DatabaseCommand.java index cf861b2e..a441691b 100644 --- a/src/main/java/com/itmo/java/basics/console/DatabaseCommand.java +++ b/src/main/java/com/itmo/java/basics/console/DatabaseCommand.java @@ -1,10 +1,12 @@ package com.itmo.java.basics.console; +import com.itmo.java.basics.exceptions.DatabaseException; + public interface DatabaseCommand { /** * Запускает команду. * * @return Сообщение о выполнении результата команды. */ - DatabaseCommandResult execute(); + DatabaseCommandResult execute() ; } diff --git a/src/main/java/com/itmo/java/basics/logic/Table.java b/src/main/java/com/itmo/java/basics/logic/Table.java index 730041ec..2719da5c 100644 --- a/src/main/java/com/itmo/java/basics/logic/Table.java +++ b/src/main/java/com/itmo/java/basics/logic/Table.java @@ -40,6 +40,6 @@ public interface Table { */ Optional read(String objectKey) throws DatabaseException, IOException; - void delete(String objectKey) throws DatabaseException, IOException; + void delete(String objectKey) throws DatabaseException; } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java index b694657d..a3ac0b8a 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java @@ -39,7 +39,7 @@ public Optional read(String objectKey) throws DatabaseException, IOExcep } @Override - public void delete(String objectKey) throws DatabaseException, IOException { + public void delete(String objectKey) throws DatabaseException{ cacheTable.delete(objectKey); dbCache.delete(objectKey); } From 03b5e96ff631d853d98bc9aa25d18f6d7f07d2c4 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Mon, 7 Jun 2021 16:36:15 +0300 Subject: [PATCH 166/378] fix throw IOException --- .../com/itmo/java/basics/console/impl/DeleteKeyCommand.java | 2 +- src/main/java/com/itmo/java/basics/logic/Database.java | 2 +- src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java index 518cf8a2..a3e44175 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java @@ -66,7 +66,7 @@ public DatabaseCommandResult execute() { } dataBase.get().delete(tbName, key); return DatabaseCommandResult.success(("Success del " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); - } catch (DatabaseException | IOException ex) { + } catch (DatabaseException ex) { return new FailedDatabaseCommandResult(ex.getMessage()); } } diff --git a/src/main/java/com/itmo/java/basics/logic/Database.java b/src/main/java/com/itmo/java/basics/logic/Database.java index dd4ebf7e..8f64df66 100644 --- a/src/main/java/com/itmo/java/basics/logic/Database.java +++ b/src/main/java/com/itmo/java/basics/logic/Database.java @@ -41,5 +41,5 @@ public interface Database { */ Optional read(String tableName, String objectKey) throws DatabaseException, IOException; - void delete(String tableName, String objectKey) throws DatabaseException, IOException; + void delete(String tableName, String objectKey) throws DatabaseException; } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index 341edc71..34766015 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -95,7 +95,7 @@ public Optional read(String tableName, String objectKey) throws Database } @Override - public void delete(String tableName, String objectKey) throws DatabaseException, IOException { + public void delete(String tableName, String objectKey) throws DatabaseException { if (!tableDictionary.containsKey(tableName)) { throw new DatabaseException("Table " + tableName + " doesnt exist in database" + dbName); } From 7f289124dc048bc4cc27355222efb9f8345012fb Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Mon, 7 Jun 2021 17:00:46 +0300 Subject: [PATCH 167/378] fix --- .../itmo/java/basics/console/impl/DeleteKeyCommand.java | 7 ++++--- src/main/java/com/itmo/java/basics/logic/Database.java | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java index a3e44175..188c53d7 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java @@ -32,7 +32,8 @@ public class DeleteKeyCommand implements DatabaseCommand { * Id команды, имя команды, имя бд, таблицы, ключ * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { + public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { + if (comArgs.size() != numberOfAgrguments) { throw new IllegalArgumentException("Why " + comArgs.size() + "!= 5 , in CreateTableCommand"); } @@ -64,9 +65,9 @@ public DatabaseCommandResult execute() { if (dataBase.isEmpty()) { throw new DatabaseException("We dont have" + dbName); } - dataBase.get().delete(tbName, key); + dataBase.get().delete(tbName, key); return DatabaseCommandResult.success(("Success del " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); - } catch (DatabaseException ex) { + } catch (IOException | DatabaseException ex) { return new FailedDatabaseCommandResult(ex.getMessage()); } } diff --git a/src/main/java/com/itmo/java/basics/logic/Database.java b/src/main/java/com/itmo/java/basics/logic/Database.java index 8f64df66..f13e2f2d 100644 --- a/src/main/java/com/itmo/java/basics/logic/Database.java +++ b/src/main/java/com/itmo/java/basics/logic/Database.java @@ -41,5 +41,5 @@ public interface Database { */ Optional read(String tableName, String objectKey) throws DatabaseException, IOException; - void delete(String tableName, String objectKey) throws DatabaseException; + void delete(String tableName, String objectKey) throws DatabaseException , IOException; } \ No newline at end of file From 9a548e346837884eb802ce130636a9a4f11ce5b4 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Mon, 7 Jun 2021 17:00:51 +0300 Subject: [PATCH 168/378] fix --- src/main/java/com/itmo/java/basics/logic/Table.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/basics/logic/Table.java b/src/main/java/com/itmo/java/basics/logic/Table.java index 2719da5c..730041ec 100644 --- a/src/main/java/com/itmo/java/basics/logic/Table.java +++ b/src/main/java/com/itmo/java/basics/logic/Table.java @@ -40,6 +40,6 @@ public interface Table { */ Optional read(String objectKey) throws DatabaseException, IOException; - void delete(String objectKey) throws DatabaseException; + void delete(String objectKey) throws DatabaseException, IOException; } From 0f8f8dc69257e19889ab0aa935f98449cf536043 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Mon, 7 Jun 2021 17:04:14 +0300 Subject: [PATCH 169/378] fix --- src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index 34766015..341edc71 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -95,7 +95,7 @@ public Optional read(String tableName, String objectKey) throws Database } @Override - public void delete(String tableName, String objectKey) throws DatabaseException { + public void delete(String tableName, String objectKey) throws DatabaseException, IOException { if (!tableDictionary.containsKey(tableName)) { throw new DatabaseException("Table " + tableName + " doesnt exist in database" + dbName); } From 103b8fe8c5c4635b55c008db33492484da912669 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Mon, 7 Jun 2021 17:05:38 +0300 Subject: [PATCH 170/378] fix --- src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java index a3ac0b8a..b694657d 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java @@ -39,7 +39,7 @@ public Optional read(String objectKey) throws DatabaseException, IOExcep } @Override - public void delete(String objectKey) throws DatabaseException{ + public void delete(String objectKey) throws DatabaseException, IOException { cacheTable.delete(objectKey); dbCache.delete(objectKey); } From 96bea87458f603cb1bd092f3b8b134e362136b08 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Mon, 7 Jun 2021 17:16:24 +0300 Subject: [PATCH 171/378] fix --- .../com/itmo/java/basics/console/DatabaseCommand.java | 2 -- .../itmo/java/basics/console/impl/DeleteKeyCommand.java | 2 +- src/main/java/com/itmo/java/basics/logic/Database.java | 8 ++++---- src/main/java/com/itmo/java/basics/logic/Table.java | 6 +++--- .../com/itmo/java/basics/logic/impl/CachingTable.java | 8 ++++---- .../com/itmo/java/basics/logic/impl/DatabaseImpl.java | 6 +++--- 6 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/DatabaseCommand.java b/src/main/java/com/itmo/java/basics/console/DatabaseCommand.java index a441691b..8d9c3c67 100644 --- a/src/main/java/com/itmo/java/basics/console/DatabaseCommand.java +++ b/src/main/java/com/itmo/java/basics/console/DatabaseCommand.java @@ -1,7 +1,5 @@ package com.itmo.java.basics.console; -import com.itmo.java.basics.exceptions.DatabaseException; - public interface DatabaseCommand { /** * Запускает команду. diff --git a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java index 188c53d7..c02e0551 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java @@ -67,7 +67,7 @@ public DatabaseCommandResult execute() { } dataBase.get().delete(tbName, key); return DatabaseCommandResult.success(("Success del " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); - } catch (IOException | DatabaseException ex) { + } catch (DatabaseException ex) { return new FailedDatabaseCommandResult(ex.getMessage()); } } diff --git a/src/main/java/com/itmo/java/basics/logic/Database.java b/src/main/java/com/itmo/java/basics/logic/Database.java index f13e2f2d..893b1416 100644 --- a/src/main/java/com/itmo/java/basics/logic/Database.java +++ b/src/main/java/com/itmo/java/basics/logic/Database.java @@ -19,7 +19,7 @@ public interface Database { * @param tableName имя таблицы * @throws DatabaseException если таблица с данным именем уже существует или если произошла ошибка ввода-вывода */ - void createTableIfNotExists(String tableName) throws DatabaseException, IOException; + void createTableIfNotExists(String tableName) throws DatabaseException; /** * Записывает значение в указанную таблицу по переданному ключу. @@ -29,7 +29,7 @@ public interface Database { * @param objectValue значение, которое нужно записать * @throws DatabaseException если указанная таблица не была найдена или если произошла ошибка ввода-вывода */ - void write(String tableName, String objectKey, byte[] objectValue) throws DatabaseException, IOException; + void write(String tableName, String objectKey, byte[] objectValue) throws DatabaseException; /** * Считывает значение из указанной таблицы по заданному ключу. @@ -39,7 +39,7 @@ public interface Database { * @return значение, которое находится по ключу * @throws DatabaseException если не была найдена указанная таблица, или если не была найдена запись по данному ключу, или произошла ошибка ввода-вывода */ - Optional read(String tableName, String objectKey) throws DatabaseException, IOException; + Optional read(String tableName, String objectKey) throws DatabaseException; - void delete(String tableName, String objectKey) throws DatabaseException , IOException; + void delete(String tableName, String objectKey) throws DatabaseException ; } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/Table.java b/src/main/java/com/itmo/java/basics/logic/Table.java index 730041ec..cc70e342 100644 --- a/src/main/java/com/itmo/java/basics/logic/Table.java +++ b/src/main/java/com/itmo/java/basics/logic/Table.java @@ -29,7 +29,7 @@ public interface Table { * @param objectValue значение, которое нужно записать * @throws DatabaseException если произошла ошибка ввода-вывода */ - void write(String objectKey, byte[] objectValue) throws DatabaseException, IOException; + void write(String objectKey, byte[] objectValue) throws DatabaseException; /** * Считывает значение из таблицы по заданному ключу. @@ -38,8 +38,8 @@ public interface Table { * @return значение, которое находится по ключу * @throws DatabaseException если не была найдена запись по данному ключу или произошла ошибка ввода-вывода */ - Optional read(String objectKey) throws DatabaseException, IOException; + Optional read(String objectKey) throws DatabaseException; - void delete(String objectKey) throws DatabaseException, IOException; + void delete(String objectKey) throws DatabaseException; } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java index b694657d..5d0e92dc 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/CachingTable.java @@ -4,7 +4,7 @@ import com.itmo.java.basics.logic.DatabaseCache; import com.itmo.java.basics.logic.Table; -import java.io.IOException; + import java.util.Optional; public class CachingTable implements Table { @@ -23,13 +23,13 @@ public String getName() { } @Override - public void write(String objectKey, byte[] objectValue) throws DatabaseException, IOException { + public void write(String objectKey, byte[] objectValue) throws DatabaseException { cacheTable.write(objectKey, objectValue); dbCache.set(objectKey, objectValue); } @Override - public Optional read(String objectKey) throws DatabaseException, IOException { + public Optional read(String objectKey) throws DatabaseException { byte[] reading = dbCache.get(objectKey); if (reading != null) { return Optional.of(reading); @@ -39,7 +39,7 @@ public Optional read(String objectKey) throws DatabaseException, IOExcep } @Override - public void delete(String objectKey) throws DatabaseException, IOException { + public void delete(String objectKey) throws DatabaseException { cacheTable.delete(objectKey); dbCache.delete(objectKey); } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index 341edc71..14f5ffb2 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -72,7 +72,7 @@ public void createTableIfNotExists(String tableName) throws DatabaseException { } @Override - public void write(String tableName, String objectKey, byte[] objectValue) throws DatabaseException, IOException { + public void write(String tableName, String objectKey, byte[] objectValue) throws DatabaseException{ if (tableName == null) { throw new DatabaseException("Error while writing in , null name"); @@ -86,7 +86,7 @@ public void write(String tableName, String objectKey, byte[] objectValue) throws } @Override - public Optional read(String tableName, String objectKey) throws DatabaseException, IOException { + public Optional read(String tableName, String objectKey) throws DatabaseException { Table table = tableDictionary.get(tableName); if (tableName == null) { throw new DatabaseException("Error while reading in database , null name"); @@ -95,7 +95,7 @@ public Optional read(String tableName, String objectKey) throws Database } @Override - public void delete(String tableName, String objectKey) throws DatabaseException, IOException { + public void delete(String tableName, String objectKey) throws DatabaseException{ if (!tableDictionary.containsKey(tableName)) { throw new DatabaseException("Table " + tableName + " doesnt exist in database" + dbName); } From 4e05330d6832506d2d95d1f1e6b3326458d8fb1a Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Mon, 7 Jun 2021 17:17:42 +0300 Subject: [PATCH 172/378] fix --- .../java/com/itmo/java/basics/console/impl/SetKeyCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java index 80cb6c31..e6326d41 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java @@ -67,7 +67,7 @@ public DatabaseCommandResult execute() { byte[] value = commandargs.get(DatabaseCommandArgPositions.VALUE.getPositionIndex()).asString().getBytes(StandardCharsets.UTF_8); dataBase.get().write(tbName, key, value); return DatabaseCommandResult.success(("Success add key " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); - } catch (DatabaseException | IOException ex) { + } catch (DatabaseException ex) { return new FailedDatabaseCommandResult(ex.getMessage()); } } From f87db2e0782757426b8631259aeae78c94148896 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Mon, 7 Jun 2021 17:19:25 +0300 Subject: [PATCH 173/378] fix --- .../com/itmo/java/basics/console/impl/CreateTableCommand.java | 2 +- .../java/com/itmo/java/basics/console/impl/GetKeyCommand.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java index 3f3a9902..0ab1ee5f 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java @@ -62,7 +62,7 @@ public DatabaseCommandResult execute() { } dataBase.get().createTableIfNotExists(tbName); return DatabaseCommandResult.success(("Success add " + dbName + tbName).getBytes(StandardCharsets.UTF_8)); - } catch (DatabaseException | IOException ex) { + } catch (DatabaseException ex) { return new FailedDatabaseCommandResult(ex.getMessage()); } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java index 96826bfb..b88255ff 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java @@ -68,7 +68,7 @@ public DatabaseCommandResult execute() { throw new DatabaseException("We dont have" + dbName + tbName + key); } return DatabaseCommandResult.success(value.get()); - } catch (DatabaseException | IOException ex) { + } catch (DatabaseException ex) { return new FailedDatabaseCommandResult(ex.getMessage()); } } From 39683cb811234a6e7a23033e1b19643495c434f1 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 00:59:31 +0300 Subject: [PATCH 174/378] RespReader(writer) --- .../com/itmo/java/basics/DatabaseServer.java | 3 +- .../itmo/java/basics/config/ConfigLoader.java | 1 - .../com/itmo/java/protocol/RespReader.java | 111 +++++++++++++++--- .../com/itmo/java/protocol/RespWriter.java | 8 +- .../itmo/java/protocol/model/RespArray.java | 2 +- 5 files changed, 104 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/DatabaseServer.java b/src/main/java/com/itmo/java/basics/DatabaseServer.java index e0e45bc0..7ad13938 100644 --- a/src/main/java/com/itmo/java/basics/DatabaseServer.java +++ b/src/main/java/com/itmo/java/basics/DatabaseServer.java @@ -40,7 +40,6 @@ public CompletableFuture executeNextCommand(DatabaseComma } public ExecutionEnvironment getEnv() { - //TODO implement - return null; + return enviroment; } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/config/ConfigLoader.java b/src/main/java/com/itmo/java/basics/config/ConfigLoader.java index c96d3be8..d4628753 100644 --- a/src/main/java/com/itmo/java/basics/config/ConfigLoader.java +++ b/src/main/java/com/itmo/java/basics/config/ConfigLoader.java @@ -4,7 +4,6 @@ * Класс, отвечающий за подгрузку данных из конфигурационного файла формата .properties */ public class ConfigLoader { - /** * По умолчанию читает из server.properties */ diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 629b33a9..f804d67f 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -9,6 +9,10 @@ import java.io.EOFException; import java.io.IOException; import java.io.InputStream; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; public class RespReader implements AutoCloseable { @@ -17,17 +21,18 @@ public class RespReader implements AutoCloseable { */ private static final byte CR = '\r'; private static final byte LF = '\n'; + private final InputStream inputStream; public RespReader(InputStream is) { - //TODO implement + inputStream = is; } /** * Есть ли следующий массив в стриме? */ public boolean hasArray() throws IOException { - //TODO implement - return false; + byte bytes = inputStream.readNBytes(1)[0]; + return bytes == RespArray.CODE; } /** @@ -38,8 +43,22 @@ public boolean hasArray() throws IOException { * @throws IOException при ошибке чтения */ public RespObject readObject() throws IOException { - //TODO implement - return null; + if (inputStream == null) { + throw new EOFException("Why stream is null?"); + } + byte bytes = inputStream.readNBytes(1)[0]; + switch(bytes) { + case RespError.CODE: + return readError(); + case RespBulkString.CODE: + return readBulkString(); + case RespCommandId.CODE: + return readCommandId(); + case RespArray.CODE: + return readArray(); + default: + throw new IOException("Error while reading object code"); + } } /** @@ -49,8 +68,30 @@ public RespObject readObject() throws IOException { * @throws IOException при ошибке чтения */ public RespError readError() throws IOException { - //TODO implement - return null; + if (inputStream == null) { + throw new EOFException("Why stream is null?"); + } + boolean stop = false; + byte bytes = inputStream.readNBytes(1)[0]; + List errorBytes = new ArrayList<>(); + while (!stop) { + while ((bytes == CR)) { + bytes = inputStream.readNBytes(1)[0]; + if (bytes == LF) { + stop = true; + } else { + errorBytes.add(CR); + errorBytes.add(bytes); + bytes = inputStream.readNBytes(1)[0]; + } + } + } + int errorBytesCount = errorBytes.size(); + byte[] errorByte = new byte[errorBytesCount]; + for (int i = 0; i < errorBytesCount; i++) { + errorByte[i] = errorBytes.get(i); + } + return new RespError(errorByte); } /** @@ -60,8 +101,29 @@ public RespError readError() throws IOException { * @throws IOException при ошибке чтения */ public RespBulkString readBulkString() throws IOException { - //TODO implement - return null; + if (inputStream == null) { + throw new EOFException("Why stream is null?"); + } + byte bytes = inputStream.readNBytes(1)[0]; + List bulkBytes = new ArrayList<>(); + while ( bytes != CR) { + bulkBytes.add(bytes); + bytes = inputStream.readNBytes(1)[0]; + } + int bulkBytesSize = bulkBytes.size(); + byte[] bulkByte = new byte[bulkBytesSize]; + + for (int i = 0; i < bulkBytesSize; i++) { + bulkByte[i] = bulkBytes.get(i); + } + final int bulkByteCount = Integer.parseInt(new String( bulkByte, StandardCharsets.UTF_8)); + inputStream.readNBytes(1); + if (bulkByteCount == RespBulkString.NULL_STRING_SIZE) { + return new RespBulkString(null); + } + byte[] data = inputStream.readNBytes(bulkByteCount); + inputStream.readNBytes(2); + return new RespBulkString(data); } /** @@ -71,8 +133,28 @@ public RespBulkString readBulkString() throws IOException { * @throws IOException при ошибке чтения */ public RespArray readArray() throws IOException { - //TODO implement - return null; + if (inputStream == null) { + throw new EOFException("Why stream is null?"); + } + byte bytes = inputStream.readNBytes(1)[0]; + List arrayBytes = new ArrayList<>(); + while ( bytes != CR) { + arrayBytes.add(bytes); + bytes = inputStream.readNBytes(1)[0]; + } + int arrayBytesSize = arrayBytes.size(); + byte[] arrayByte = new byte[arrayBytesSize]; + + for (int i = 0; i < arrayBytesSize; i++) { + arrayByte[i] = arrayBytes.get(i); + } + final int arrayByteCount = Integer.parseInt(new String( arrayByte, StandardCharsets.UTF_8)); + RespObject[] objects = new RespObject[arrayByteCount]; + inputStream.readNBytes(1); + for (int i = 0; i < arrayByteCount; i++) { + objects[i] = this.readObject(); + } + return new RespArray(objects); } /** @@ -82,13 +164,14 @@ public RespArray readArray() throws IOException { * @throws IOException при ошибке чтения */ public RespCommandId readCommandId() throws IOException { - //TODO implement - return null; + int comID = ByteBuffer.wrap(inputStream.readNBytes(4)).getInt(); + inputStream.readNBytes(2); + return new RespCommandId(comID); } @Override public void close() throws IOException { - //TODO implement + inputStream.close(); } } diff --git a/src/main/java/com/itmo/java/protocol/RespWriter.java b/src/main/java/com/itmo/java/protocol/RespWriter.java index 5dace402..1447ba26 100644 --- a/src/main/java/com/itmo/java/protocol/RespWriter.java +++ b/src/main/java/com/itmo/java/protocol/RespWriter.java @@ -7,19 +7,21 @@ public class RespWriter implements AutoCloseable{ + private final OutputStream outputStream; + public RespWriter(OutputStream os) { - //TODO implement + outputStream = os; } /** * Записывает в output stream объект */ public void write(RespObject object) throws IOException { - //TODO implement + object.write(outputStream); } @Override public void close() throws IOException { - //TODO implement + outputStream.close(); } } diff --git a/src/main/java/com/itmo/java/protocol/model/RespArray.java b/src/main/java/com/itmo/java/protocol/model/RespArray.java index a3200f35..d4799edf 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespArray.java +++ b/src/main/java/com/itmo/java/protocol/model/RespArray.java @@ -40,7 +40,7 @@ public boolean isError() { @Override public String asString() { return objects.stream().map(object -> asString()).collect(Collectors.joining(" ")); - } + } // check @Override public void write(OutputStream output) throws IOException { From 5b67174dee7a1fde4a76909d665b9a205e14d55c Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 01:12:46 +0300 Subject: [PATCH 175/378] whyaborted --- .../com/itmo/java/protocol/RespReader.java | 269 ++++++++++++------ .../com/itmo/java/protocol/RespWriter.java | 29 +- 2 files changed, 198 insertions(+), 100 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index f804d67f..4680e398 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -13,7 +13,6 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; - public class RespReader implements AutoCloseable { /** @@ -21,18 +20,17 @@ public class RespReader implements AutoCloseable { */ private static final byte CR = '\r'; private static final byte LF = '\n'; - private final InputStream inputStream; public RespReader(InputStream is) { - inputStream = is; + //TODO implement } /** * Есть ли следующий массив в стриме? */ public boolean hasArray() throws IOException { - byte bytes = inputStream.readNBytes(1)[0]; - return bytes == RespArray.CODE; + //TODO implement + return false; } /** @@ -43,22 +41,8 @@ public boolean hasArray() throws IOException { * @throws IOException при ошибке чтения */ public RespObject readObject() throws IOException { - if (inputStream == null) { - throw new EOFException("Why stream is null?"); - } - byte bytes = inputStream.readNBytes(1)[0]; - switch(bytes) { - case RespError.CODE: - return readError(); - case RespBulkString.CODE: - return readBulkString(); - case RespCommandId.CODE: - return readCommandId(); - case RespArray.CODE: - return readArray(); - default: - throw new IOException("Error while reading object code"); - } + //TODO implement + return null; } /** @@ -68,30 +52,8 @@ public RespObject readObject() throws IOException { * @throws IOException при ошибке чтения */ public RespError readError() throws IOException { - if (inputStream == null) { - throw new EOFException("Why stream is null?"); - } - boolean stop = false; - byte bytes = inputStream.readNBytes(1)[0]; - List errorBytes = new ArrayList<>(); - while (!stop) { - while ((bytes == CR)) { - bytes = inputStream.readNBytes(1)[0]; - if (bytes == LF) { - stop = true; - } else { - errorBytes.add(CR); - errorBytes.add(bytes); - bytes = inputStream.readNBytes(1)[0]; - } - } - } - int errorBytesCount = errorBytes.size(); - byte[] errorByte = new byte[errorBytesCount]; - for (int i = 0; i < errorBytesCount; i++) { - errorByte[i] = errorBytes.get(i); - } - return new RespError(errorByte); + //TODO implement + return null; } /** @@ -101,29 +63,8 @@ public RespError readError() throws IOException { * @throws IOException при ошибке чтения */ public RespBulkString readBulkString() throws IOException { - if (inputStream == null) { - throw new EOFException("Why stream is null?"); - } - byte bytes = inputStream.readNBytes(1)[0]; - List bulkBytes = new ArrayList<>(); - while ( bytes != CR) { - bulkBytes.add(bytes); - bytes = inputStream.readNBytes(1)[0]; - } - int bulkBytesSize = bulkBytes.size(); - byte[] bulkByte = new byte[bulkBytesSize]; - - for (int i = 0; i < bulkBytesSize; i++) { - bulkByte[i] = bulkBytes.get(i); - } - final int bulkByteCount = Integer.parseInt(new String( bulkByte, StandardCharsets.UTF_8)); - inputStream.readNBytes(1); - if (bulkByteCount == RespBulkString.NULL_STRING_SIZE) { - return new RespBulkString(null); - } - byte[] data = inputStream.readNBytes(bulkByteCount); - inputStream.readNBytes(2); - return new RespBulkString(data); + //TODO implement + return null; } /** @@ -133,28 +74,8 @@ public RespBulkString readBulkString() throws IOException { * @throws IOException при ошибке чтения */ public RespArray readArray() throws IOException { - if (inputStream == null) { - throw new EOFException("Why stream is null?"); - } - byte bytes = inputStream.readNBytes(1)[0]; - List arrayBytes = new ArrayList<>(); - while ( bytes != CR) { - arrayBytes.add(bytes); - bytes = inputStream.readNBytes(1)[0]; - } - int arrayBytesSize = arrayBytes.size(); - byte[] arrayByte = new byte[arrayBytesSize]; - - for (int i = 0; i < arrayBytesSize; i++) { - arrayByte[i] = arrayBytes.get(i); - } - final int arrayByteCount = Integer.parseInt(new String( arrayByte, StandardCharsets.UTF_8)); - RespObject[] objects = new RespObject[arrayByteCount]; - inputStream.readNBytes(1); - for (int i = 0; i < arrayByteCount; i++) { - objects[i] = this.readObject(); - } - return new RespArray(objects); + //TODO implement + return null; } /** @@ -164,14 +85,174 @@ public RespArray readArray() throws IOException { * @throws IOException при ошибке чтения */ public RespCommandId readCommandId() throws IOException { - int comID = ByteBuffer.wrap(inputStream.readNBytes(4)).getInt(); - inputStream.readNBytes(2); - return new RespCommandId(comID); + //TODO implement + return null; } @Override public void close() throws IOException { - inputStream.close(); + //TODO implement } } +//public class RespReader implements AutoCloseable { +// +// /** +// * Специальные символы окончания элемента +// */ +// private static final byte CR = '\r'; +// private static final byte LF = '\n'; +// private final InputStream inputStream; +// +// public RespReader(InputStream is) { +// inputStream = is; +// } +// +// /** +// * Есть ли следующий массив в стриме? +// */ +// public boolean hasArray() throws IOException { +// byte bytes = inputStream.readNBytes(1)[0]; +// return bytes == RespArray.CODE; +// } +// +// /** +// * Считывает из input stream следующий объект. Может прочитать любой объект, сам определит его тип на основе кода объекта. +// * Например, если первый элемент "-", то вернет ошибку. Если "$" - bulk строку +// * +// * @throws EOFException если stream пустой +// * @throws IOException при ошибке чтения +// */ +// public RespObject readObject() throws IOException { +// if (inputStream == null) { +// throw new EOFException("Why stream is null?"); +// } +// byte bytes = inputStream.readNBytes(1)[0]; +// switch(bytes) { +// case RespError.CODE: +// return readError(); +// case RespBulkString.CODE: +// return readBulkString(); +// case RespCommandId.CODE: +// return readCommandId(); +// case RespArray.CODE: +// return readArray(); +// default: +// throw new IOException("Error while reading object code"); +// } +// } +// +// /** +// * Считывает объект ошибки +// * +// * @throws EOFException если stream пустой +// * @throws IOException при ошибке чтения +// */ +// public RespError readError() throws IOException { +// if (inputStream == null) { +// throw new EOFException("Why stream is null?"); +// } +// boolean stop = false; +// byte bytes = inputStream.readNBytes(1)[0]; +// List errorBytes = new ArrayList<>(); +// while (!stop) { +// while ((bytes == CR)) { +// bytes = inputStream.readNBytes(1)[0]; +// if (bytes == LF) { +// stop = true; +// } else { +// errorBytes.add(CR); +// errorBytes.add(bytes); +// bytes = inputStream.readNBytes(1)[0]; +// } +// } +// } +// int errorBytesCount = errorBytes.size(); +// byte[] errorByte = new byte[errorBytesCount]; +// for (int i = 0; i < errorBytesCount; i++) { +// errorByte[i] = errorBytes.get(i); +// } +// return new RespError(errorByte); +// } +// +// /** +// * Читает bulk строку +// * +// * @throws EOFException если stream пустой +// * @throws IOException при ошибке чтения +// */ +// public RespBulkString readBulkString() throws IOException { +// if (inputStream == null) { +// throw new EOFException("Why stream is null?"); +// } +// byte bytes = inputStream.readNBytes(1)[0]; +// List bulkBytes = new ArrayList<>(); +// while ( bytes != CR) { +// bulkBytes.add(bytes); +// bytes = inputStream.readNBytes(1)[0]; +// } +// int bulkBytesSize = bulkBytes.size(); +// byte[] bulkByte = new byte[bulkBytesSize]; +// +// for (int i = 0; i < bulkBytesSize; i++) { +// bulkByte[i] = bulkBytes.get(i); +// } +// final int bulkByteCount = Integer.parseInt(new String( bulkByte, StandardCharsets.UTF_8)); +// inputStream.readNBytes(1); +// if (bulkByteCount == RespBulkString.NULL_STRING_SIZE) { +// return new RespBulkString(null); +// } +// byte[] data = inputStream.readNBytes(bulkByteCount); +// inputStream.readNBytes(2); +// return new RespBulkString(data); +// } +// +// /** +// * Считывает массив RESP элементов +// * +// * @throws EOFException если stream пустой +// * @throws IOException при ошибке чтения +// */ +// public RespArray readArray() throws IOException { +// if (inputStream == null) { +// throw new EOFException("Why stream is null?"); +// } +// byte bytes = inputStream.readNBytes(1)[0]; +// List arrayBytes = new ArrayList<>(); +// while ( bytes != CR) { +// arrayBytes.add(bytes); +// bytes = inputStream.readNBytes(1)[0]; +// } +// int arrayBytesSize = arrayBytes.size(); +// byte[] arrayByte = new byte[arrayBytesSize]; +// +// for (int i = 0; i < arrayBytesSize; i++) { +// arrayByte[i] = arrayBytes.get(i); +// } +// final int arrayByteCount = Integer.parseInt(new String( arrayByte, StandardCharsets.UTF_8)); +// RespObject[] objects = new RespObject[arrayByteCount]; +// inputStream.readNBytes(1); +// for (int i = 0; i < arrayByteCount; i++) { +// objects[i] = this.readObject(); +// } +// return new RespArray(objects); +// } +// +// /** +// * Считывает id команды +// * +// * @throws EOFException если stream пустой +// * @throws IOException при ошибке чтения +// */ +// public RespCommandId readCommandId() throws IOException { +// int comID = ByteBuffer.wrap(inputStream.readNBytes(4)).getInt(); +// inputStream.readNBytes(2); +// return new RespCommandId(comID); +// } +// +// +// @Override +// public void close() throws IOException { +// inputStream.close(); +// } +//} diff --git a/src/main/java/com/itmo/java/protocol/RespWriter.java b/src/main/java/com/itmo/java/protocol/RespWriter.java index 1447ba26..39f5b51d 100644 --- a/src/main/java/com/itmo/java/protocol/RespWriter.java +++ b/src/main/java/com/itmo/java/protocol/RespWriter.java @@ -4,24 +4,41 @@ import java.io.IOException; import java.io.OutputStream; - public class RespWriter implements AutoCloseable{ - private final OutputStream outputStream; - public RespWriter(OutputStream os) { - outputStream = os; + //TODO implement } /** * Записывает в output stream объект */ public void write(RespObject object) throws IOException { - object.write(outputStream); + //TODO implement } @Override public void close() throws IOException { - outputStream.close(); + //TODO implement } } +//public class RespWriter implements AutoCloseable{ +// +// private final OutputStream outputStream; +// +// public RespWriter(OutputStream os) { +// outputStream = os; +// } +// +// /** +// * Записывает в output stream объект +// */ +// public void write(RespObject object) throws IOException { +// object.write(outputStream); +// } +// +// @Override +// public void close() throws IOException { +// outputStream.close(); +// } +//} From a8efb409091d289e7c683eac4b9b542a1e1fba43 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 01:14:55 +0300 Subject: [PATCH 176/378] addWriter --- .../com/itmo/java/protocol/RespWriter.java | 29 ++++--------------- 1 file changed, 6 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespWriter.java b/src/main/java/com/itmo/java/protocol/RespWriter.java index 39f5b51d..1447ba26 100644 --- a/src/main/java/com/itmo/java/protocol/RespWriter.java +++ b/src/main/java/com/itmo/java/protocol/RespWriter.java @@ -4,41 +4,24 @@ import java.io.IOException; import java.io.OutputStream; + public class RespWriter implements AutoCloseable{ + private final OutputStream outputStream; + public RespWriter(OutputStream os) { - //TODO implement + outputStream = os; } /** * Записывает в output stream объект */ public void write(RespObject object) throws IOException { - //TODO implement + object.write(outputStream); } @Override public void close() throws IOException { - //TODO implement + outputStream.close(); } } -//public class RespWriter implements AutoCloseable{ -// -// private final OutputStream outputStream; -// -// public RespWriter(OutputStream os) { -// outputStream = os; -// } -// -// /** -// * Записывает в output stream объект -// */ -// public void write(RespObject object) throws IOException { -// object.write(outputStream); -// } -// -// @Override -// public void close() throws IOException { -// outputStream.close(); -// } -//} From c540638b89a6a4656f5f9f5994e882f452d1698d Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 01:17:37 +0300 Subject: [PATCH 177/378] addsomereader --- .../com/itmo/java/protocol/RespReader.java | 202 ++++++------------ 1 file changed, 62 insertions(+), 140 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 4680e398..00682ef6 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -13,6 +13,7 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; + public class RespReader implements AutoCloseable { /** @@ -20,17 +21,18 @@ public class RespReader implements AutoCloseable { */ private static final byte CR = '\r'; private static final byte LF = '\n'; + private final InputStream inputStream; public RespReader(InputStream is) { - //TODO implement + inputStream = is; } /** * Есть ли следующий массив в стриме? */ public boolean hasArray() throws IOException { - //TODO implement - return false; + byte bytes = inputStream.readNBytes(1)[0]; + return bytes == RespArray.CODE; } /** @@ -41,8 +43,22 @@ public boolean hasArray() throws IOException { * @throws IOException при ошибке чтения */ public RespObject readObject() throws IOException { - //TODO implement - return null; + if (inputStream == null) { + throw new EOFException("Why stream is null?"); + } + byte bytes = inputStream.readNBytes(1)[0]; + switch(bytes) { + case RespError.CODE: + return readError(); + case RespBulkString.CODE: + return readBulkString(); + case RespCommandId.CODE: + return readCommandId(); + case RespArray.CODE: + return readArray(); + default: + throw new IOException("Error while reading object code"); + } } /** @@ -52,103 +68,6 @@ public RespObject readObject() throws IOException { * @throws IOException при ошибке чтения */ public RespError readError() throws IOException { - //TODO implement - return null; - } - - /** - * Читает bulk строку - * - * @throws EOFException если stream пустой - * @throws IOException при ошибке чтения - */ - public RespBulkString readBulkString() throws IOException { - //TODO implement - return null; - } - - /** - * Считывает массив RESP элементов - * - * @throws EOFException если stream пустой - * @throws IOException при ошибке чтения - */ - public RespArray readArray() throws IOException { - //TODO implement - return null; - } - - /** - * Считывает id команды - * - * @throws EOFException если stream пустой - * @throws IOException при ошибке чтения - */ - public RespCommandId readCommandId() throws IOException { - //TODO implement - return null; - } - - - @Override - public void close() throws IOException { - //TODO implement - } -} -//public class RespReader implements AutoCloseable { -// -// /** -// * Специальные символы окончания элемента -// */ -// private static final byte CR = '\r'; -// private static final byte LF = '\n'; -// private final InputStream inputStream; -// -// public RespReader(InputStream is) { -// inputStream = is; -// } -// -// /** -// * Есть ли следующий массив в стриме? -// */ -// public boolean hasArray() throws IOException { -// byte bytes = inputStream.readNBytes(1)[0]; -// return bytes == RespArray.CODE; -// } -// -// /** -// * Считывает из input stream следующий объект. Может прочитать любой объект, сам определит его тип на основе кода объекта. -// * Например, если первый элемент "-", то вернет ошибку. Если "$" - bulk строку -// * -// * @throws EOFException если stream пустой -// * @throws IOException при ошибке чтения -// */ -// public RespObject readObject() throws IOException { -// if (inputStream == null) { -// throw new EOFException("Why stream is null?"); -// } -// byte bytes = inputStream.readNBytes(1)[0]; -// switch(bytes) { -// case RespError.CODE: -// return readError(); -// case RespBulkString.CODE: -// return readBulkString(); -// case RespCommandId.CODE: -// return readCommandId(); -// case RespArray.CODE: -// return readArray(); -// default: -// throw new IOException("Error while reading object code"); -// } -// } -// -// /** -// * Считывает объект ошибки -// * -// * @throws EOFException если stream пустой -// * @throws IOException при ошибке чтения -// */ -// public RespError readError() throws IOException { // if (inputStream == null) { // throw new EOFException("Why stream is null?"); // } @@ -173,15 +92,16 @@ public void close() throws IOException { // errorByte[i] = errorBytes.get(i); // } // return new RespError(errorByte); -// } -// -// /** -// * Читает bulk строку -// * -// * @throws EOFException если stream пустой -// * @throws IOException при ошибке чтения -// */ -// public RespBulkString readBulkString() throws IOException { + return null; + } + + /** + * Читает bulk строку + * + * @throws EOFException если stream пустой + * @throws IOException при ошибке чтения + */ + public RespBulkString readBulkString() throws IOException { // if (inputStream == null) { // throw new EOFException("Why stream is null?"); // } @@ -205,15 +125,16 @@ public void close() throws IOException { // byte[] data = inputStream.readNBytes(bulkByteCount); // inputStream.readNBytes(2); // return new RespBulkString(data); -// } -// -// /** -// * Считывает массив RESP элементов -// * -// * @throws EOFException если stream пустой -// * @throws IOException при ошибке чтения -// */ -// public RespArray readArray() throws IOException { + return null; + } + + /** + * Считывает массив RESP элементов + * + * @throws EOFException если stream пустой + * @throws IOException при ошибке чтения + */ + public RespArray readArray() throws IOException { // if (inputStream == null) { // throw new EOFException("Why stream is null?"); // } @@ -236,23 +157,24 @@ public void close() throws IOException { // objects[i] = this.readObject(); // } // return new RespArray(objects); -// } -// -// /** -// * Считывает id команды -// * -// * @throws EOFException если stream пустой -// * @throws IOException при ошибке чтения -// */ -// public RespCommandId readCommandId() throws IOException { -// int comID = ByteBuffer.wrap(inputStream.readNBytes(4)).getInt(); -// inputStream.readNBytes(2); -// return new RespCommandId(comID); -// } -// -// -// @Override -// public void close() throws IOException { -// inputStream.close(); -// } -//} + return null; + } + + /** + * Считывает id команды + * + * @throws EOFException если stream пустой + * @throws IOException при ошибке чтения + */ + public RespCommandId readCommandId() throws IOException { + int comID = ByteBuffer.wrap(inputStream.readNBytes(4)).getInt(); + inputStream.readNBytes(2); + return new RespCommandId(comID); + } + + + @Override + public void close() throws IOException { + inputStream.close(); + } +} From 7eaf209cb49951259b611d593eaa35080bb22266 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 01:25:25 +0300 Subject: [PATCH 178/378] add readError --- .../com/itmo/java/protocol/RespReader.java | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 00682ef6..8b6f08b0 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -68,31 +68,31 @@ public RespObject readObject() throws IOException { * @throws IOException при ошибке чтения */ public RespError readError() throws IOException { -// if (inputStream == null) { -// throw new EOFException("Why stream is null?"); -// } -// boolean stop = false; -// byte bytes = inputStream.readNBytes(1)[0]; -// List errorBytes = new ArrayList<>(); -// while (!stop) { -// while ((bytes == CR)) { -// bytes = inputStream.readNBytes(1)[0]; -// if (bytes == LF) { -// stop = true; -// } else { -// errorBytes.add(CR); -// errorBytes.add(bytes); -// bytes = inputStream.readNBytes(1)[0]; -// } -// } -// } -// int errorBytesCount = errorBytes.size(); -// byte[] errorByte = new byte[errorBytesCount]; -// for (int i = 0; i < errorBytesCount; i++) { -// errorByte[i] = errorBytes.get(i); -// } -// return new RespError(errorByte); - return null; + if (inputStream == null) { + throw new EOFException("Why stream is null?"); + } + boolean stop = false; + byte bytes = inputStream.readNBytes(1)[0]; + List errorBytes = new ArrayList<>(); + while (!stop) { + while ((bytes == CR)) { + bytes = inputStream.readNBytes(1)[0]; + if (bytes == LF) { + stop = true; + } else { + errorBytes.add(CR); + errorBytes.add(bytes); + bytes = inputStream.readNBytes(1)[0]; + } + } + } + int errorBytesCount = errorBytes.size(); + byte[] errorByte = new byte[errorBytesCount]; + for (int i = 0; i < errorBytesCount; i++) { + errorByte[i] = errorBytes.get(i); + } + return new RespError(errorByte); +// return null; } /** From f50722acb3c4343edd1715992cd52338b6e47539 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 01:29:47 +0300 Subject: [PATCH 179/378] fix readError --- src/main/java/com/itmo/java/protocol/RespReader.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 8b6f08b0..dd3237bd 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -81,6 +81,10 @@ public RespError readError() throws IOException { stop = true; } else { errorBytes.add(CR); +// errorBytes.add(bytes); +// bytes = inputStream.readNBytes(1)[0]; + } + if (!stop) { errorBytes.add(bytes); bytes = inputStream.readNBytes(1)[0]; } From 05845269492aad57fe46768f0b0161a611420983 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 01:33:35 +0300 Subject: [PATCH 180/378] fix readError } --- src/main/java/com/itmo/java/protocol/RespReader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index dd3237bd..4a8c199d 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -84,11 +84,11 @@ public RespError readError() throws IOException { // errorBytes.add(bytes); // bytes = inputStream.readNBytes(1)[0]; } + } if (!stop) { errorBytes.add(bytes); bytes = inputStream.readNBytes(1)[0]; } - } } int errorBytesCount = errorBytes.size(); byte[] errorByte = new byte[errorBytesCount]; From f9633ad7e2c37ae73024d84f05aa8b414ffe55c8 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 01:36:31 +0300 Subject: [PATCH 181/378] respError take off commits --- .../com/itmo/java/protocol/RespReader.java | 94 +++++++++---------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 4a8c199d..3b63f139 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -106,30 +106,30 @@ public RespError readError() throws IOException { * @throws IOException при ошибке чтения */ public RespBulkString readBulkString() throws IOException { -// if (inputStream == null) { -// throw new EOFException("Why stream is null?"); -// } -// byte bytes = inputStream.readNBytes(1)[0]; -// List bulkBytes = new ArrayList<>(); -// while ( bytes != CR) { -// bulkBytes.add(bytes); -// bytes = inputStream.readNBytes(1)[0]; -// } -// int bulkBytesSize = bulkBytes.size(); -// byte[] bulkByte = new byte[bulkBytesSize]; -// -// for (int i = 0; i < bulkBytesSize; i++) { -// bulkByte[i] = bulkBytes.get(i); -// } -// final int bulkByteCount = Integer.parseInt(new String( bulkByte, StandardCharsets.UTF_8)); -// inputStream.readNBytes(1); -// if (bulkByteCount == RespBulkString.NULL_STRING_SIZE) { -// return new RespBulkString(null); -// } -// byte[] data = inputStream.readNBytes(bulkByteCount); -// inputStream.readNBytes(2); -// return new RespBulkString(data); - return null; + if (inputStream == null) { + throw new EOFException("Why stream is null?"); + } + byte bytes = inputStream.readNBytes(1)[0]; + List bulkBytes = new ArrayList<>(); + while ( bytes != CR) { + bulkBytes.add(bytes); + bytes = inputStream.readNBytes(1)[0]; + } + int bulkBytesSize = bulkBytes.size(); + byte[] bulkByte = new byte[bulkBytesSize]; + + for (int i = 0; i < bulkBytesSize; i++) { + bulkByte[i] = bulkBytes.get(i); + } + final int bulkByteCount = Integer.parseInt(new String( bulkByte, StandardCharsets.UTF_8)); + inputStream.readNBytes(1); + if (bulkByteCount == RespBulkString.NULL_STRING_SIZE) { + return new RespBulkString(null); + } + byte[] data = inputStream.readNBytes(bulkByteCount); + inputStream.readNBytes(2); + return new RespBulkString(data); + // return null; } /** @@ -139,29 +139,29 @@ public RespBulkString readBulkString() throws IOException { * @throws IOException при ошибке чтения */ public RespArray readArray() throws IOException { -// if (inputStream == null) { -// throw new EOFException("Why stream is null?"); -// } -// byte bytes = inputStream.readNBytes(1)[0]; -// List arrayBytes = new ArrayList<>(); -// while ( bytes != CR) { -// arrayBytes.add(bytes); -// bytes = inputStream.readNBytes(1)[0]; -// } -// int arrayBytesSize = arrayBytes.size(); -// byte[] arrayByte = new byte[arrayBytesSize]; -// -// for (int i = 0; i < arrayBytesSize; i++) { -// arrayByte[i] = arrayBytes.get(i); -// } -// final int arrayByteCount = Integer.parseInt(new String( arrayByte, StandardCharsets.UTF_8)); -// RespObject[] objects = new RespObject[arrayByteCount]; -// inputStream.readNBytes(1); -// for (int i = 0; i < arrayByteCount; i++) { -// objects[i] = this.readObject(); -// } -// return new RespArray(objects); - return null; + if (inputStream == null) { + throw new EOFException("Why stream is null?"); + } + byte bytes = inputStream.readNBytes(1)[0]; + List arrayBytes = new ArrayList<>(); + while ( bytes != CR) { + arrayBytes.add(bytes); + bytes = inputStream.readNBytes(1)[0]; + } + int arrayBytesSize = arrayBytes.size(); + byte[] arrayByte = new byte[arrayBytesSize]; + + for (int i = 0; i < arrayBytesSize; i++) { + arrayByte[i] = arrayBytes.get(i); + } + final int arrayByteCount = Integer.parseInt(new String( arrayByte, StandardCharsets.UTF_8)); + RespObject[] objects = new RespObject[arrayByteCount]; + inputStream.readNBytes(1); + for (int i = 0; i < arrayByteCount; i++) { + objects[i] = this.readObject(); + } + return new RespArray(objects); + // return null; } /** From 1e724ef53fee6a4695b5a22750cc3625d50815f7 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 02:04:19 +0300 Subject: [PATCH 182/378] add configLoader --- .../itmo/java/basics/config/ConfigLoader.java | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/config/ConfigLoader.java b/src/main/java/com/itmo/java/basics/config/ConfigLoader.java index d4628753..e3e55f60 100644 --- a/src/main/java/com/itmo/java/basics/config/ConfigLoader.java +++ b/src/main/java/com/itmo/java/basics/config/ConfigLoader.java @@ -1,5 +1,7 @@ package com.itmo.java.basics.config; +import java.util.Properties; + /** * Класс, отвечающий за подгрузку данных из конфигурационного файла формата .properties */ @@ -7,15 +9,18 @@ public class ConfigLoader { /** * По умолчанию читает из server.properties */ + private final String configFileName; + private static final String AUTO_NAME = "server.properties"; + private Properties properties = new Properties(); public ConfigLoader() { - //TODO implement + configFileName = AUTO_NAME; } /** * @param name Имя конфикурационного файла, откуда читать */ public ConfigLoader(String name) { - //TODO implement + configFileName = name; } /** @@ -26,7 +31,20 @@ public ConfigLoader(String name) { * Читаются: "kvs.workingPath", "kvs.host", "kvs.port" (но в конфигурационном файле допустимы и другие проперти) */ public DatabaseServerConfig readConfig() { - //TODO implement - return null; + String workingPath = properties.getProperty("kvs.workingPath"); + if (workingPath == null){ + workingPath = DatabaseConfig.DEFAULT_WORKING_PATH; + } + String host = properties.getProperty("kvs.host"); + if (host == null) { + host = ServerConfig.DEFAULT_HOST; + } + int port; + if (properties.getProperty("kvs.port") == null){ + port = ServerConfig.DEFAULT_PORT; + }else { + port = Integer.parseInt(properties.getProperty("kvs.port")); + } + return new DatabaseServerConfig(new ServerConfig(host, port), new DatabaseConfig(workingPath)); } } From e5f25dab1575556640667960863638e1fd826eda Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 02:13:01 +0300 Subject: [PATCH 183/378] ConfigLoader --- .../itmo/java/basics/config/ConfigLoader.java | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/config/ConfigLoader.java b/src/main/java/com/itmo/java/basics/config/ConfigLoader.java index e3e55f60..81bb26fb 100644 --- a/src/main/java/com/itmo/java/basics/config/ConfigLoader.java +++ b/src/main/java/com/itmo/java/basics/config/ConfigLoader.java @@ -1,5 +1,7 @@ package com.itmo.java.basics.config; +import java.io.FileInputStream; +import java.io.IOException; import java.util.Properties; /** @@ -9,18 +11,32 @@ public class ConfigLoader { /** * По умолчанию читает из server.properties */ - private final String configFileName; + private static final String AUTO_NAME = "server.properties"; - private Properties properties = new Properties(); + private final Properties properties = new Properties(); public ConfigLoader() { - configFileName = AUTO_NAME; + try{ + properties.load(this.getClass().getClassLoader().getResourceAsStream(AUTO_NAME)); + } catch (IOException ex) { + ex.printStackTrace(); + } + } /** * @param name Имя конфикурационного файла, откуда читать */ public ConfigLoader(String name) { - configFileName = name; + try{ + if (this.getClass().getClassLoader().getResourceAsStream(name) != null) { + properties.load(this.getClass().getClassLoader().getResourceAsStream(name)); + } else { + FileInputStream inputStream = new FileInputStream(name); + properties.load(inputStream); + } + } catch( IOException ex) { + ex.printStackTrace(); + } } /** From e287ac6fcc173f38b61092dd0c8abafced26600a Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 02:27:19 +0300 Subject: [PATCH 184/378] CommandReader --- .../itmo/java/basics/resp/CommandReader.java | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/resp/CommandReader.java b/src/main/java/com/itmo/java/basics/resp/CommandReader.java index 9132bed1..c7850170 100644 --- a/src/main/java/com/itmo/java/basics/resp/CommandReader.java +++ b/src/main/java/com/itmo/java/basics/resp/CommandReader.java @@ -1,23 +1,29 @@ package com.itmo.java.basics.resp; import com.itmo.java.basics.console.DatabaseCommand; +import com.itmo.java.basics.console.DatabaseCommandArgPositions; +import com.itmo.java.basics.console.DatabaseCommands; import com.itmo.java.basics.console.ExecutionEnvironment; import com.itmo.java.protocol.RespReader; +import com.itmo.java.protocol.model.RespObject; import java.io.IOException; +import java.util.List; public class CommandReader implements AutoCloseable { + private final RespReader respReader; + private final ExecutionEnvironment executionEnvironment; public CommandReader(RespReader reader, ExecutionEnvironment env) { - //TODO implement + respReader = reader; + executionEnvironment = env; } /** * Есть ли следующая команда в ридере? */ public boolean hasNextCommand() throws IOException { - //TODO implement - return false; + return respReader.hasArray(); } /** @@ -26,12 +32,16 @@ public boolean hasNextCommand() throws IOException { * @throws IllegalArgumentException если нет имени команды и id */ public DatabaseCommand readCommand() throws IOException { - //TODO implement - return null; + List comArgs = respReader.readArray().getObjects(); + if(comArgs.size() < 2) { + throw new IllegalArgumentException("Why we dont have id and command name?"); + } + return DatabaseCommands.valueOf(comArgs.get(DatabaseCommandArgPositions.COMMAND_NAME.getPositionIndex()).asString()) + .getCommand(executionEnvironment,comArgs); } @Override public void close() throws Exception { - //TODO implement + respReader.close(); } } From 3a3343f9e10033c3c7e95e4f5e89d887b56add86 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 02:50:13 +0300 Subject: [PATCH 185/378] firstSocketKvsConnection --- .../connection/SocketKvsConnection.java | 39 +++++++++++++++++-- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index 4a0b4825..d4f62c25 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -4,27 +4,51 @@ import com.itmo.java.protocol.RespReader; import com.itmo.java.protocol.RespWriter; import com.itmo.java.protocol.model.RespArray; +import com.itmo.java.protocol.model.RespCommandId; import com.itmo.java.protocol.model.RespObject; +import java.io.IOException; +import java.net.Socket; + /** * С помощью {@link RespWriter} и {@link RespReader} читает/пишет в сокет */ public class SocketKvsConnection implements KvsConnection { + private Socket socket; + private RespReader respReader; + private RespWriter respWriter; + public SocketKvsConnection(ConnectionConfig config) { - //TODO implement + try { + socket = new Socket(config.toString(), config.getPort()); + respReader = new RespReader(socket.getInputStream()); + respWriter = new RespWriter(socket.getOutputStream()); + } catch (IOException ex) { + ex.toString(); + } } /** * Отправляет с помощью сокета команду и получает результат. + * * @param commandId id команды (номер) * @param command команда * @throws ConnectionException если сокет закрыт или если произошла другая ошибка соединения */ @Override public synchronized RespObject send(int commandId, RespArray command) throws ConnectionException { - //TODO implement - return null; + try { + + respWriter.write(new RespArray(new RespCommandId(commandId),command)); + RespObject respObject = respReader.readObject(); + if (respObject.isError()) { + throw new ConnectionException("Connection error respObgect is error"); + } + return respObject; + } catch (IOException ex) { + throw new ConnectionException("Error while sendinh in SocketKvsConnection" , ex); + } } /** @@ -32,6 +56,13 @@ public synchronized RespObject send(int commandId, RespArray command) throws Con */ @Override public void close() { - //TODO implement + try { + socket.close(); + respReader.close(); + respWriter.close(); + } catch (IOException ex) { + ex.printStackTrace(); + } + } } From 5d1f14ba173e25add42f6701ed98af10b460c8f3 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 02:56:20 +0300 Subject: [PATCH 186/378] rewrite SocketWritrer --- .../com/itmo/java/client/connection/SocketKvsConnection.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index d4f62c25..d56f2654 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -40,7 +40,7 @@ public SocketKvsConnection(ConnectionConfig config) { public synchronized RespObject send(int commandId, RespArray command) throws ConnectionException { try { - respWriter.write(new RespArray(new RespCommandId(commandId),command)); + respWriter.write(command); RespObject respObject = respReader.readObject(); if (respObject.isError()) { throw new ConnectionException("Connection error respObgect is error"); From acf50f36f23499416d05d58b74d0b67705115e88 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 02:59:40 +0300 Subject: [PATCH 187/378] SocketWriter --- .../itmo/java/client/connection/SocketKvsConnection.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index d56f2654..ed9a548c 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -17,13 +17,13 @@ public class SocketKvsConnection implements KvsConnection { private Socket socket; private RespReader respReader; - private RespWriter respWriter; + //private RespWriter respWriter; public SocketKvsConnection(ConnectionConfig config) { try { socket = new Socket(config.toString(), config.getPort()); respReader = new RespReader(socket.getInputStream()); - respWriter = new RespWriter(socket.getOutputStream()); + //respWriter = new RespWriter(socket.getOutputStream()); } catch (IOException ex) { ex.toString(); } @@ -39,7 +39,7 @@ public SocketKvsConnection(ConnectionConfig config) { @Override public synchronized RespObject send(int commandId, RespArray command) throws ConnectionException { try { - + RespWriter respWriter = new RespWriter(socket.getOutputStream()); respWriter.write(command); RespObject respObject = respReader.readObject(); if (respObject.isError()) { From 155d9c8bcbe672e947315a4c3da705f18fd14e0d Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 03:03:46 +0300 Subject: [PATCH 188/378] Socket try add config --- .../java/client/connection/SocketKvsConnection.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index ed9a548c..7916fe24 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -17,13 +17,15 @@ public class SocketKvsConnection implements KvsConnection { private Socket socket; private RespReader respReader; - //private RespWriter respWriter; + private ConnectionConfig connectionConfig; + private RespWriter respWriter; public SocketKvsConnection(ConnectionConfig config) { try { - socket = new Socket(config.toString(), config.getPort()); + connectionConfig = config; + socket = new Socket(connectionConfig.toString(), connectionConfig.getPort()); respReader = new RespReader(socket.getInputStream()); - //respWriter = new RespWriter(socket.getOutputStream()); + respWriter = new RespWriter(socket.getOutputStream()); } catch (IOException ex) { ex.toString(); } @@ -39,7 +41,7 @@ public SocketKvsConnection(ConnectionConfig config) { @Override public synchronized RespObject send(int commandId, RespArray command) throws ConnectionException { try { - RespWriter respWriter = new RespWriter(socket.getOutputStream()); + // RespWriter respWriter = new RespWriter(socket.getOutputStream()); respWriter.write(command); RespObject respObject = respReader.readObject(); if (respObject.isError()) { From ee255ba6ee362a7dc9674c8e48fa7b0a5e90a662 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 03:07:23 +0300 Subject: [PATCH 189/378] Socket try only config --- .../client/connection/SocketKvsConnection.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index 7916fe24..2070fa87 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -16,16 +16,16 @@ public class SocketKvsConnection implements KvsConnection { private Socket socket; - private RespReader respReader; + // private RespReader respReader; private ConnectionConfig connectionConfig; - private RespWriter respWriter; + // private RespWriter respWriter; public SocketKvsConnection(ConnectionConfig config) { try { connectionConfig = config; socket = new Socket(connectionConfig.toString(), connectionConfig.getPort()); - respReader = new RespReader(socket.getInputStream()); - respWriter = new RespWriter(socket.getOutputStream()); + // respReader = new RespReader(socket.getInputStream()); + // respWriter = new RespWriter(socket.getOutputStream()); } catch (IOException ex) { ex.toString(); } @@ -41,7 +41,8 @@ public SocketKvsConnection(ConnectionConfig config) { @Override public synchronized RespObject send(int commandId, RespArray command) throws ConnectionException { try { - // RespWriter respWriter = new RespWriter(socket.getOutputStream()); + final RespReader respReader = new RespReader(socket.getInputStream()); + final RespWriter respWriter = new RespWriter(socket.getOutputStream()); respWriter.write(command); RespObject respObject = respReader.readObject(); if (respObject.isError()) { @@ -60,8 +61,8 @@ public synchronized RespObject send(int commandId, RespArray command) throws Con public void close() { try { socket.close(); - respReader.close(); - respWriter.close(); + // respReader.close(); + // respWriter.close(); } catch (IOException ex) { ex.printStackTrace(); } From 8f13cd695cd562974d314ea389a93638ecb78120 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 03:11:36 +0300 Subject: [PATCH 190/378] Socket try --- .../com/itmo/java/client/connection/SocketKvsConnection.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index 2070fa87..6e92db97 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -1,5 +1,6 @@ package com.itmo.java.client.connection; +import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.client.exception.ConnectionException; import com.itmo.java.protocol.RespReader; import com.itmo.java.protocol.RespWriter; @@ -27,7 +28,7 @@ public SocketKvsConnection(ConnectionConfig config) { // respReader = new RespReader(socket.getInputStream()); // respWriter = new RespWriter(socket.getOutputStream()); } catch (IOException ex) { - ex.toString(); + throw new RuntimeException("SocketKvsConnection" , ex); } } @@ -64,7 +65,7 @@ public void close() { // respReader.close(); // respWriter.close(); } catch (IOException ex) { - ex.printStackTrace(); + throw new RuntimeException("Socket close" , ex); } } From d7dec6b53b19fba891fb12e6ff7c24aff0ee0d6a Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 03:15:09 +0300 Subject: [PATCH 191/378] SocketKvs try --- .../java/client/connection/SocketKvsConnection.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index 6e92db97..e85a36f4 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -16,17 +16,13 @@ */ public class SocketKvsConnection implements KvsConnection { - private Socket socket; - // private RespReader respReader; - private ConnectionConfig connectionConfig; - // private RespWriter respWriter; + final Socket socket; + final ConnectionConfig connectionConfig; public SocketKvsConnection(ConnectionConfig config) { try { connectionConfig = config; socket = new Socket(connectionConfig.toString(), connectionConfig.getPort()); - // respReader = new RespReader(socket.getInputStream()); - // respWriter = new RespWriter(socket.getOutputStream()); } catch (IOException ex) { throw new RuntimeException("SocketKvsConnection" , ex); } @@ -42,9 +38,10 @@ public SocketKvsConnection(ConnectionConfig config) { @Override public synchronized RespObject send(int commandId, RespArray command) throws ConnectionException { try { - final RespReader respReader = new RespReader(socket.getInputStream()); + final RespWriter respWriter = new RespWriter(socket.getOutputStream()); respWriter.write(command); + final RespReader respReader = new RespReader(socket.getInputStream()); RespObject respObject = respReader.readObject(); if (respObject.isError()) { throw new ConnectionException("Connection error respObgect is error"); From b1c08443348a25987ec2880556e70e1152dcd51a Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 03:18:05 +0300 Subject: [PATCH 192/378] Socket try --- .../com/itmo/java/client/connection/SocketKvsConnection.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index e85a36f4..2bac9674 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -20,8 +20,8 @@ public class SocketKvsConnection implements KvsConnection { final ConnectionConfig connectionConfig; public SocketKvsConnection(ConnectionConfig config) { - try { - connectionConfig = config; + connectionConfig = config; + try { socket = new Socket(connectionConfig.toString(), connectionConfig.getPort()); } catch (IOException ex) { throw new RuntimeException("SocketKvsConnection" , ex); @@ -38,7 +38,6 @@ public SocketKvsConnection(ConnectionConfig config) { @Override public synchronized RespObject send(int commandId, RespArray command) throws ConnectionException { try { - final RespWriter respWriter = new RespWriter(socket.getOutputStream()); respWriter.write(command); final RespReader respReader = new RespReader(socket.getInputStream()); From 0e20c56fe30e8d54532a4ae02c41facd4f46e859 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 03:23:57 +0300 Subject: [PATCH 193/378] SocketKvs getHost// --- .../com/itmo/java/client/connection/SocketKvsConnection.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index 2bac9674..11675bc0 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -22,7 +22,7 @@ public class SocketKvsConnection implements KvsConnection { public SocketKvsConnection(ConnectionConfig config) { connectionConfig = config; try { - socket = new Socket(connectionConfig.toString(), connectionConfig.getPort()); + socket = new Socket(connectionConfig.getHost(), connectionConfig.getPort()); } catch (IOException ex) { throw new RuntimeException("SocketKvsConnection" , ex); } From af6188282c135146df4df1ea143613cb110e1b94 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 03:24:51 +0300 Subject: [PATCH 194/378] SocketKvs getHost// --- .../com/itmo/java/client/connection/SocketKvsConnection.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index 11675bc0..68bd3d65 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -20,9 +20,10 @@ public class SocketKvsConnection implements KvsConnection { final ConnectionConfig connectionConfig; public SocketKvsConnection(ConnectionConfig config) { - connectionConfig = config; + //connectionConfig = config; try { - socket = new Socket(connectionConfig.getHost(), connectionConfig.getPort()); + connectionConfig = config; + socket = new Socket(connectionConfig.getHost(), connectionConfig.getPort()); } catch (IOException ex) { throw new RuntimeException("SocketKvsConnection" , ex); } From fdd0ff4ec4bff35691aaf4f2703b4ceb02372913 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 03:29:54 +0300 Subject: [PATCH 195/378] SocketKvs test --- .../java/client/connection/SocketKvsConnection.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index 68bd3d65..eb3fed94 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -18,12 +18,16 @@ public class SocketKvsConnection implements KvsConnection { final Socket socket; final ConnectionConfig connectionConfig; + private final RespReader respReader; + private final RespWriter respWriter; public SocketKvsConnection(ConnectionConfig config) { - //connectionConfig = config; + try { connectionConfig = config; socket = new Socket(connectionConfig.getHost(), connectionConfig.getPort()); + respWriter = new RespWriter(socket.getOutputStream()); + respReader = new RespReader(socket.getInputStream()); } catch (IOException ex) { throw new RuntimeException("SocketKvsConnection" , ex); } @@ -39,9 +43,7 @@ public SocketKvsConnection(ConnectionConfig config) { @Override public synchronized RespObject send(int commandId, RespArray command) throws ConnectionException { try { - final RespWriter respWriter = new RespWriter(socket.getOutputStream()); respWriter.write(command); - final RespReader respReader = new RespReader(socket.getInputStream()); RespObject respObject = respReader.readObject(); if (respObject.isError()) { throw new ConnectionException("Connection error respObgect is error"); @@ -59,8 +61,8 @@ public synchronized RespObject send(int commandId, RespArray command) throws Con public void close() { try { socket.close(); - // respReader.close(); - // respWriter.close(); + respReader.close(); + respWriter.close(); } catch (IOException ex) { throw new RuntimeException("Socket close" , ex); } From 84331dd0ec2a1c336be967416523db0e441556b8 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 03:32:56 +0300 Subject: [PATCH 196/378] SocketKvs try write --- .../com/itmo/java/client/connection/SocketKvsConnection.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index eb3fed94..cfe364ea 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -43,7 +43,7 @@ public SocketKvsConnection(ConnectionConfig config) { @Override public synchronized RespObject send(int commandId, RespArray command) throws ConnectionException { try { - respWriter.write(command); + respWriter.write(new RespArray(new RespCommandId(commandId),command)); RespObject respObject = respReader.readObject(); if (respObject.isError()) { throw new ConnectionException("Connection error respObgect is error"); From dd41c742bbfe7fa84b5efac2907c40e3d9181738 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 03:39:21 +0300 Subject: [PATCH 197/378] SocketKvs --- .../itmo/java/client/connection/SocketKvsConnection.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index cfe364ea..6a93f767 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -43,7 +43,11 @@ public SocketKvsConnection(ConnectionConfig config) { @Override public synchronized RespObject send(int commandId, RespArray command) throws ConnectionException { try { - respWriter.write(new RespArray(new RespCommandId(commandId),command)); + try { + respWriter.write(new RespArray(new RespCommandId(commandId), command)); + } catch (IOException ex) { + ex.printStackTrace(); + } RespObject respObject = respReader.readObject(); if (respObject.isError()) { throw new ConnectionException("Connection error respObgect is error"); From 5490ed7245a27e814ee541e82893b383e3af4f39 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 03:42:10 +0300 Subject: [PATCH 198/378] SocketKvs --- .../client/connection/SocketKvsConnection.java | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index 6a93f767..645bc02c 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -17,15 +17,15 @@ public class SocketKvsConnection implements KvsConnection { final Socket socket; - final ConnectionConfig connectionConfig; + // final ConnectionConfig connectionConfig; private final RespReader respReader; private final RespWriter respWriter; public SocketKvsConnection(ConnectionConfig config) { try { - connectionConfig = config; - socket = new Socket(connectionConfig.getHost(), connectionConfig.getPort()); + // connectionConfig = config; + socket = new Socket(config.getHost(), config.getPort()); respWriter = new RespWriter(socket.getOutputStream()); respReader = new RespReader(socket.getInputStream()); } catch (IOException ex) { @@ -43,18 +43,14 @@ public SocketKvsConnection(ConnectionConfig config) { @Override public synchronized RespObject send(int commandId, RespArray command) throws ConnectionException { try { - try { - respWriter.write(new RespArray(new RespCommandId(commandId), command)); - } catch (IOException ex) { - ex.printStackTrace(); - } + respWriter.write(new RespArray(new RespCommandId(commandId),command)); RespObject respObject = respReader.readObject(); if (respObject.isError()) { - throw new ConnectionException("Connection error respObgect is error"); + throw new ConnectionException("Connection error respObject is error"); } return respObject; } catch (IOException ex) { - throw new ConnectionException("Error while sendinh in SocketKvsConnection" , ex); + throw new ConnectionException("Error while sending in SocketKvsConnection" , ex); } } From a862db04b54f901100d1bc6668ff481cad8a0754 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 04:02:30 +0300 Subject: [PATCH 199/378] JavaSocket --- .../connector/JavaSocketServerConnector.java | 73 ++++++++++++++++--- 1 file changed, 61 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index cbb7ca07..7127c9f9 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -2,11 +2,15 @@ import com.itmo.java.basics.DatabaseServer; import com.itmo.java.basics.config.ServerConfig; +import com.itmo.java.basics.console.DatabaseCommand; import com.itmo.java.basics.resp.CommandReader; +import com.itmo.java.protocol.RespReader; import com.itmo.java.protocol.RespWriter; +import lombok.SneakyThrows; import java.io.Closeable; import java.io.IOException; +import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -20,24 +24,40 @@ public class JavaSocketServerConnector implements Closeable { * Экзекьютор для выполнения ClientTask */ private final ExecutorService clientIOWorkers = Executors.newSingleThreadExecutor(); - -// private final ServerSocket serverSocket; // todo uncomment + private final ServerSocket serverSocket; // todo uncomment private final ExecutorService connectionAcceptorExecutor = Executors.newSingleThreadExecutor(); + private final DatabaseServer dbServer; /** * Стартует сервер. По аналогии с сокетом открывает коннекшн в конструкторе. */ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig config) throws IOException { + try { + dbServer = databaseServer; + serverSocket = new ServerSocket(config.getPort()); + } catch (IOException ex) { + throw new IOException("JavaSocketServerConnector error constructor",ex); + } } /** * Начинает слушать заданный порт, начинает аксептить клиентские сокеты. На каждый из них начинает клиентскую таску */ - public void start() { - connectionAcceptorExecutor.submit(() -> { - // todo implement - }); - } + public void start() { + connectionAcceptorExecutor.submit(() -> { + try { + Socket socket = serverSocket.accept(); + clientIOWorkers.submit(() -> { + ClientTask clientTask = new ClientTask(socket, dbServer); + clientTask.run(); + }); + } catch (IOException exception) { + exception.printStackTrace(); + } finally { + close(); + } + }); + } /** * Закрывает все, что нужно ¯\_(ツ)_/¯ @@ -45,7 +65,11 @@ public void start() { @Override public void close() { System.out.println("Stopping socket connector"); - // todo implement + try { + serverSocket.close(); + } catch (IOException exception){ + exception.printStackTrace(); + } } @@ -57,13 +81,23 @@ public static void main(String[] args) throws Exception { * Runnable, описывающий исполнение клиентской команды. */ static class ClientTask implements Runnable, Closeable { - + private RespWriter respWriter; + private RespReader respReader; + private Socket clientSocket; + DatabaseServer databaseServer; /** * @param client клиентский сокет * @param server сервер, на котором исполняется задача */ public ClientTask(Socket client, DatabaseServer server) { - //TODO implement + try { + databaseServer = server; + clientSocket = client; + respReader = new RespReader(client.getInputStream()); + respWriter = new RespWriter(client.getOutputStream()); + } catch (IOException e) { + e.printStackTrace(); + } } /** @@ -73,9 +107,18 @@ public ClientTask(Socket client, DatabaseServer server) { * 2. Исполняет ее на сервере * 3. Записывает результат в сокет с помощью {@link RespWriter} */ + @SneakyThrows @Override public void run() { - //TODO implement + CommandReader commandReader = new CommandReader(respReader, databaseServer.getEnv()); + while (commandReader.hasNextCommand()) { + try { + DatabaseCommand dbCommand = commandReader.readCommand(); + respWriter.write(dbCommand.execute().serialize()); + } catch (IOException e) { + e.printStackTrace(); + } + } } /** @@ -83,7 +126,13 @@ public void run() { */ @Override public void close() { - //TODO implement + try { + clientSocket.close(); + respReader.close(); + respWriter.close(); + } catch (IOException ex) { + throw new RuntimeException("Error while cloasing socket client" , ex); + } } } } From 30dcfb2557ca9a0c93df9db4a3857669604a61c0 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 04:08:16 +0300 Subject: [PATCH 200/378] JavaSocket first com --- .../connector/JavaSocketServerConnector.java | 90 +++++++++---------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index 7127c9f9..7a27657b 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -45,17 +45,17 @@ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig con */ public void start() { connectionAcceptorExecutor.submit(() -> { - try { - Socket socket = serverSocket.accept(); - clientIOWorkers.submit(() -> { - ClientTask clientTask = new ClientTask(socket, dbServer); - clientTask.run(); - }); - } catch (IOException exception) { - exception.printStackTrace(); - } finally { - close(); - } +// try { +// Socket socket = serverSocket.accept(); +// clientIOWorkers.submit(() -> { +// ClientTask clientTask = new ClientTask(socket, dbServer); +// clientTask.run(); +// }); +// } catch (IOException exception) { +// exception.printStackTrace(); +// } finally { +// close(); +// } }); } @@ -64,12 +64,12 @@ public void start() { */ @Override public void close() { - System.out.println("Stopping socket connector"); - try { - serverSocket.close(); - } catch (IOException exception){ - exception.printStackTrace(); - } +// System.out.println("Stopping socket connector"); +// try { +// serverSocket.close(); +// } catch (IOException exception){ +// exception.printStackTrace(); +// } } @@ -81,23 +81,23 @@ public static void main(String[] args) throws Exception { * Runnable, описывающий исполнение клиентской команды. */ static class ClientTask implements Runnable, Closeable { - private RespWriter respWriter; - private RespReader respReader; - private Socket clientSocket; - DatabaseServer databaseServer; +// private RespWriter respWriter; +// private RespReader respReader; +// private Socket clientSocket; +// DatabaseServer databaseServer; /** * @param client клиентский сокет * @param server сервер, на котором исполняется задача */ public ClientTask(Socket client, DatabaseServer server) { - try { - databaseServer = server; - clientSocket = client; - respReader = new RespReader(client.getInputStream()); - respWriter = new RespWriter(client.getOutputStream()); - } catch (IOException e) { - e.printStackTrace(); - } +// try { +// databaseServer = server; +// clientSocket = client; +// respReader = new RespReader(client.getInputStream()); +// respWriter = new RespWriter(client.getOutputStream()); +// } catch (IOException e) { +// e.printStackTrace(); +// } } /** @@ -110,15 +110,15 @@ public ClientTask(Socket client, DatabaseServer server) { @SneakyThrows @Override public void run() { - CommandReader commandReader = new CommandReader(respReader, databaseServer.getEnv()); - while (commandReader.hasNextCommand()) { - try { - DatabaseCommand dbCommand = commandReader.readCommand(); - respWriter.write(dbCommand.execute().serialize()); - } catch (IOException e) { - e.printStackTrace(); - } - } +// CommandReader commandReader = new CommandReader(respReader, databaseServer.getEnv()); +// while (commandReader.hasNextCommand()) { +// try { +// DatabaseCommand dbCommand = commandReader.readCommand(); +// respWriter.write(dbCommand.execute().serialize()); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } } /** @@ -126,13 +126,13 @@ public void run() { */ @Override public void close() { - try { - clientSocket.close(); - respReader.close(); - respWriter.close(); - } catch (IOException ex) { - throw new RuntimeException("Error while cloasing socket client" , ex); - } +// try { +// clientSocket.close(); +// respReader.close(); +// respWriter.close(); +// } catch (IOException ex) { +// throw new RuntimeException("Error while cloasing socket client" , ex); +// } } } } From d43d73831f5c5061ba6d5b5b69111a36795b082f Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 04:10:37 +0300 Subject: [PATCH 201/378] add start --- .../connector/JavaSocketServerConnector.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index 7a27657b..c7093768 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -45,17 +45,17 @@ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig con */ public void start() { connectionAcceptorExecutor.submit(() -> { -// try { -// Socket socket = serverSocket.accept(); -// clientIOWorkers.submit(() -> { -// ClientTask clientTask = new ClientTask(socket, dbServer); -// clientTask.run(); -// }); -// } catch (IOException exception) { -// exception.printStackTrace(); -// } finally { -// close(); -// } + try { + Socket socket = serverSocket.accept(); + clientIOWorkers.submit(() -> { + ClientTask clientTask = new ClientTask(socket, dbServer); + clientTask.run(); + }); + } catch (IOException exception) { + exception.printStackTrace(); + } finally { + close(); + } }); } From 96f698da75c1090e7b211926d58baf46c33d2b43 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 04:12:38 +0300 Subject: [PATCH 202/378] add close --- .../basics/connector/JavaSocketServerConnector.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index c7093768..38e3ff85 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -64,12 +64,12 @@ public void start() { */ @Override public void close() { -// System.out.println("Stopping socket connector"); -// try { -// serverSocket.close(); -// } catch (IOException exception){ -// exception.printStackTrace(); -// } + System.out.println("Stopping socket connector"); + try { + serverSocket.close(); + } catch (IOException exception){ + exception.printStackTrace(); + } } From f35bc8b84edd23d6cea02a22b56fca6f63fab616 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 04:19:35 +0300 Subject: [PATCH 203/378] update close --- .../itmo/java/basics/connector/JavaSocketServerConnector.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index 38e3ff85..59903fa5 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -67,6 +67,8 @@ public void close() { System.out.println("Stopping socket connector"); try { serverSocket.close(); + connectionAcceptorExecutor.shutdown(); + clientIOWorkers.shutdown(); } catch (IOException exception){ exception.printStackTrace(); } From d4ef1ea3c73ed068f807d279ca339fce75fa30b7 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 04:23:36 +0300 Subject: [PATCH 204/378] - close --- .../connector/JavaSocketServerConnector.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index 59903fa5..ca84cc41 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -64,14 +64,14 @@ public void start() { */ @Override public void close() { - System.out.println("Stopping socket connector"); - try { - serverSocket.close(); - connectionAcceptorExecutor.shutdown(); - clientIOWorkers.shutdown(); - } catch (IOException exception){ - exception.printStackTrace(); - } +// System.out.println("Stopping socket connector"); +// try { +// serverSocket.close(); +// connectionAcceptorExecutor.shutdown(); +// clientIOWorkers.shutdown(); +// } catch (IOException exception){ +// exception.printStackTrace(); +// } } From e854dda2c6d1f9d73106a9470877a9a45107a429 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 04:28:28 +0300 Subject: [PATCH 205/378] Update JavaSocketServerConnector.java --- .../connector/JavaSocketServerConnector.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index ca84cc41..7a8683cb 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -32,12 +32,12 @@ public class JavaSocketServerConnector implements Closeable { * Стартует сервер. По аналогии с сокетом открывает коннекшн в конструкторе. */ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig config) throws IOException { - try { + //try { dbServer = databaseServer; serverSocket = new ServerSocket(config.getPort()); - } catch (IOException ex) { - throw new IOException("JavaSocketServerConnector error constructor",ex); - } + // } catch (IOException ex) { + // throw new IOException("JavaSocketServerConnector error constructor",ex); + // } } /** @@ -64,14 +64,14 @@ public void start() { */ @Override public void close() { -// System.out.println("Stopping socket connector"); -// try { -// serverSocket.close(); -// connectionAcceptorExecutor.shutdown(); -// clientIOWorkers.shutdown(); -// } catch (IOException exception){ -// exception.printStackTrace(); -// } + System.out.println("Stopping socket connector"); + try { + serverSocket.close(); + connectionAcceptorExecutor.shutdown(); + clientIOWorkers.shutdown(); + } catch (IOException exception){ + exception.printStackTrace(); + } } From e796542488ff029a5187e156f50e257f286a66fc Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 04:35:36 +0300 Subject: [PATCH 206/378] -com --- .../connector/JavaSocketServerConnector.java | 56 +++++++++---------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index 7a8683cb..e3cb52f0 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -83,23 +83,23 @@ public static void main(String[] args) throws Exception { * Runnable, описывающий исполнение клиентской команды. */ static class ClientTask implements Runnable, Closeable { -// private RespWriter respWriter; -// private RespReader respReader; -// private Socket clientSocket; -// DatabaseServer databaseServer; + private RespWriter respWriter; + private RespReader respReader; + private Socket clientSocket; + DatabaseServer databaseServer; /** * @param client клиентский сокет * @param server сервер, на котором исполняется задача */ public ClientTask(Socket client, DatabaseServer server) { -// try { -// databaseServer = server; -// clientSocket = client; -// respReader = new RespReader(client.getInputStream()); -// respWriter = new RespWriter(client.getOutputStream()); -// } catch (IOException e) { -// e.printStackTrace(); -// } + try { + databaseServer = server; + clientSocket = client; + respReader = new RespReader(client.getInputStream()); + respWriter = new RespWriter(client.getOutputStream()); + } catch (IOException e) { + e.printStackTrace(); + } } /** @@ -112,15 +112,15 @@ public ClientTask(Socket client, DatabaseServer server) { @SneakyThrows @Override public void run() { -// CommandReader commandReader = new CommandReader(respReader, databaseServer.getEnv()); -// while (commandReader.hasNextCommand()) { -// try { -// DatabaseCommand dbCommand = commandReader.readCommand(); -// respWriter.write(dbCommand.execute().serialize()); -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } + CommandReader commandReader = new CommandReader(respReader, databaseServer.getEnv()); + while (commandReader.hasNextCommand()) { + try { + DatabaseCommand dbCommand = commandReader.readCommand(); + respWriter.write(dbCommand.execute().serialize()); + } catch (IOException e) { + e.printStackTrace(); + } + } } /** @@ -128,13 +128,13 @@ public void run() { */ @Override public void close() { -// try { -// clientSocket.close(); -// respReader.close(); -// respWriter.close(); -// } catch (IOException ex) { -// throw new RuntimeException("Error while cloasing socket client" , ex); -// } + try { + clientSocket.close(); + respReader.close(); + respWriter.close(); + } catch (IOException ex) { + throw new RuntimeException("Error while cloasing socket client" , ex); + } } } } From 0eda97c792d5e1e0cf843bcf79f91f15417a20d4 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 04:36:47 +0300 Subject: [PATCH 207/378] close --- .../itmo/java/basics/connector/JavaSocketServerConnector.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index e3cb52f0..e4dced03 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -117,10 +117,12 @@ public void run() { try { DatabaseCommand dbCommand = commandReader.readCommand(); respWriter.write(dbCommand.execute().serialize()); + commandReader.close(); } catch (IOException e) { e.printStackTrace(); } } + commandReader.close(); } /** From 4c0dbcfc5b685d52e7d2d92112b72410c4e1dfaa Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 04:43:56 +0300 Subject: [PATCH 208/378] new run --- .../connector/JavaSocketServerConnector.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index e4dced03..bb28aae4 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -113,16 +113,21 @@ public ClientTask(Socket client, DatabaseServer server) { @Override public void run() { CommandReader commandReader = new CommandReader(respReader, databaseServer.getEnv()); - while (commandReader.hasNextCommand()) { + try { - DatabaseCommand dbCommand = commandReader.readCommand(); - respWriter.write(dbCommand.execute().serialize()); + while (!Thread.currentThread().isInterrupted() && !clientSocket.isClosed()) { + if (commandReader.hasNextCommand()) { + DatabaseCommand databaseCommand = commandReader.readCommand(); + respWriter.write(databaseCommand.execute().serialize()); + } else { + commandReader.close(); + break; + } + } commandReader.close(); - } catch (IOException e) { - e.printStackTrace(); + } catch (Exception ex) { + ex.printStackTrace(); } - } - commandReader.close(); } /** From 714beb128b9debbe53de09c9872e0ee9b17e89e9 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 04:50:43 +0300 Subject: [PATCH 209/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../connector/JavaSocketServerConnector.java | 69 +++++++++---------- 1 file changed, 31 insertions(+), 38 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index bb28aae4..aaa2df37 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -33,31 +33,31 @@ public class JavaSocketServerConnector implements Closeable { */ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig config) throws IOException { //try { - dbServer = databaseServer; - serverSocket = new ServerSocket(config.getPort()); - // } catch (IOException ex) { - // throw new IOException("JavaSocketServerConnector error constructor",ex); - // } + dbServer = databaseServer; + serverSocket = new ServerSocket(config.getPort()); + // } catch (IOException ex) { + // throw new IOException("JavaSocketServerConnector error constructor",ex); + // } } - - /** + + /** * Начинает слушать заданный порт, начинает аксептить клиентские сокеты. На каждый из них начинает клиентскую таску */ - public void start() { - connectionAcceptorExecutor.submit(() -> { - try { - Socket socket = serverSocket.accept(); - clientIOWorkers.submit(() -> { - ClientTask clientTask = new ClientTask(socket, dbServer); - clientTask.run(); - }); - } catch (IOException exception) { - exception.printStackTrace(); - } finally { - close(); - } - }); - } + public void start() { + connectionAcceptorExecutor.submit(() -> { + try { + Socket socket = serverSocket.accept(); + clientIOWorkers.submit(() -> { + ClientTask clientTask = new ClientTask(socket, dbServer); + clientTask.run(); + }); + } catch (IOException exception) { + exception.printStackTrace(); + } finally { + close(); + } + }); + } /** * Закрывает все, что нужно ¯\_(ツ)_/¯ @@ -113,21 +113,14 @@ public ClientTask(Socket client, DatabaseServer server) { @Override public void run() { CommandReader commandReader = new CommandReader(respReader, databaseServer.getEnv()); - + while (commandReader.hasNextCommand()) { try { - while (!Thread.currentThread().isInterrupted() && !clientSocket.isClosed()) { - if (commandReader.hasNextCommand()) { - DatabaseCommand databaseCommand = commandReader.readCommand(); - respWriter.write(databaseCommand.execute().serialize()); - } else { - commandReader.close(); - break; - } - } - commandReader.close(); - } catch (Exception ex) { - ex.printStackTrace(); + DatabaseCommand dbCommand = commandReader.readCommand(); + respWriter.write(dbCommand.execute().serialize()); + } catch (IOException e) { + e.printStackTrace(); } + } } /** @@ -135,13 +128,13 @@ public void run() { */ @Override public void close() { - try { + try { clientSocket.close(); respReader.close(); respWriter.close(); } catch (IOException ex) { - throw new RuntimeException("Error while cloasing socket client" , ex); + throw new RuntimeException("Error while cloasing socket client" , ex); } } } -} +} \ No newline at end of file From bf3b4296b1777820d4084f04a3ea5088a66bdb85 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 05:00:44 +0300 Subject: [PATCH 210/378] update --- .../connector/JavaSocketServerConnector.java | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index aaa2df37..0384f253 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -67,8 +67,8 @@ public void close() { System.out.println("Stopping socket connector"); try { serverSocket.close(); - connectionAcceptorExecutor.shutdown(); - clientIOWorkers.shutdown(); +// connectionAcceptorExecutor.shutdown(); +// clientIOWorkers.shutdown(); } catch (IOException exception){ exception.printStackTrace(); } @@ -112,14 +112,20 @@ public ClientTask(Socket client, DatabaseServer server) { @SneakyThrows @Override public void run() { - CommandReader commandReader = new CommandReader(respReader, databaseServer.getEnv()); - while (commandReader.hasNextCommand()) { - try { - DatabaseCommand dbCommand = commandReader.readCommand(); - respWriter.write(dbCommand.execute().serialize()); - } catch (IOException e) { - e.printStackTrace(); + CommandReader commandReader = new CommandReader(respReader,databaseServer.getEnv()); + try { + while (!Thread.currentThread().isInterrupted() && !clientSocket.isClosed()) { + if (commandReader.hasNextCommand()) { + DatabaseCommand databaseCommand = commandReader.readCommand(); + respWriter.write(databaseCommand.execute().serialize()); + } else { + commandReader.close(); + break; + } } + commandReader.close(); + } catch (Exception ex) { + ex.printStackTrace(); } } From 976db07588b1cf174b57b20f718626198de773aa Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 05:05:18 +0300 Subject: [PATCH 211/378] updatenew --- .../basics/connector/JavaSocketServerConnector.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index 0384f253..82824f4d 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -46,11 +46,9 @@ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig con public void start() { connectionAcceptorExecutor.submit(() -> { try { - Socket socket = serverSocket.accept(); - clientIOWorkers.submit(() -> { - ClientTask clientTask = new ClientTask(socket, dbServer); - clientTask.run(); - }); + Socket socketClient = serverSocket.accept(); + ClientTask clientTask = new ClientTask(socketClient ,dbServer); + clientIOWorkers.submit(clientTask); } catch (IOException exception) { exception.printStackTrace(); } finally { @@ -67,8 +65,8 @@ public void close() { System.out.println("Stopping socket connector"); try { serverSocket.close(); -// connectionAcceptorExecutor.shutdown(); -// clientIOWorkers.shutdown(); + connectionAcceptorExecutor.shutdown(); + clientIOWorkers.shutdown(); } catch (IOException exception){ exception.printStackTrace(); } From 88d6621806b6b5d4aa3c6a86ffc6b32528365cfd Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 05:09:08 +0300 Subject: [PATCH 212/378] help --- .../connector/JavaSocketServerConnector.java | 98 +++++++++---------- 1 file changed, 47 insertions(+), 51 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index 82824f4d..5c98c4d4 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -32,12 +32,12 @@ public class JavaSocketServerConnector implements Closeable { * Стартует сервер. По аналогии с сокетом открывает коннекшн в конструкторе. */ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig config) throws IOException { - //try { - dbServer = databaseServer; - serverSocket = new ServerSocket(config.getPort()); - // } catch (IOException ex) { - // throw new IOException("JavaSocketServerConnector error constructor",ex); - // } + try { + dbServer = databaseServer; + serverSocket = new ServerSocket(config.getPort()); + } catch (IOException ex) { + throw new IOException("JavaSocketServerConnector error constructor",ex); + } } /** @@ -46,9 +46,11 @@ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig con public void start() { connectionAcceptorExecutor.submit(() -> { try { - Socket socketClient = serverSocket.accept(); - ClientTask clientTask = new ClientTask(socketClient ,dbServer); - clientIOWorkers.submit(clientTask); + Socket socket = serverSocket.accept(); + clientIOWorkers.submit(() -> { + ClientTask clientTask = new ClientTask(socket, dbServer); + clientTask.run(); + }); } catch (IOException exception) { exception.printStackTrace(); } finally { @@ -62,14 +64,14 @@ public void start() { */ @Override public void close() { - System.out.println("Stopping socket connector"); - try { - serverSocket.close(); - connectionAcceptorExecutor.shutdown(); - clientIOWorkers.shutdown(); - } catch (IOException exception){ - exception.printStackTrace(); - } +// System.out.println("Stopping socket connector"); +// try { +// serverSocket.close(); +// connectionAcceptorExecutor.shutdown(); +// clientIOWorkers.shutdown(); +// } catch (IOException exception){ +// exception.printStackTrace(); +// } } @@ -81,23 +83,23 @@ public static void main(String[] args) throws Exception { * Runnable, описывающий исполнение клиентской команды. */ static class ClientTask implements Runnable, Closeable { - private RespWriter respWriter; - private RespReader respReader; - private Socket clientSocket; - DatabaseServer databaseServer; +// private RespWriter respWriter; +// private RespReader respReader; +// private Socket clientSocket; +// DatabaseServer databaseServer; /** * @param client клиентский сокет * @param server сервер, на котором исполняется задача */ public ClientTask(Socket client, DatabaseServer server) { - try { - databaseServer = server; - clientSocket = client; - respReader = new RespReader(client.getInputStream()); - respWriter = new RespWriter(client.getOutputStream()); - } catch (IOException e) { - e.printStackTrace(); - } +// try { +// databaseServer = server; +// clientSocket = client; +// respReader = new RespReader(client.getInputStream()); +// respWriter = new RespWriter(client.getOutputStream()); +// } catch (IOException e) { +// e.printStackTrace(); +// } } /** @@ -110,21 +112,15 @@ public ClientTask(Socket client, DatabaseServer server) { @SneakyThrows @Override public void run() { - CommandReader commandReader = new CommandReader(respReader,databaseServer.getEnv()); - try { - while (!Thread.currentThread().isInterrupted() && !clientSocket.isClosed()) { - if (commandReader.hasNextCommand()) { - DatabaseCommand databaseCommand = commandReader.readCommand(); - respWriter.write(databaseCommand.execute().serialize()); - } else { - commandReader.close(); - break; - } - } - commandReader.close(); - } catch (Exception ex) { - ex.printStackTrace(); - } +// CommandReader commandReader = new CommandReader(respReader, databaseServer.getEnv()); +// while (commandReader.hasNextCommand()) { +// try { +// DatabaseCommand dbCommand = commandReader.readCommand(); +// respWriter.write(dbCommand.execute().serialize()); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } } /** @@ -132,13 +128,13 @@ public void run() { */ @Override public void close() { - try { - clientSocket.close(); - respReader.close(); - respWriter.close(); - } catch (IOException ex) { - throw new RuntimeException("Error while cloasing socket client" , ex); - } +// try { +// clientSocket.close(); +// respReader.close(); +// respWriter.close(); +// } catch (IOException ex) { +// throw new RuntimeException("Error while cloasing socket client" , ex); +// } } } } \ No newline at end of file From a872b78a1215b658daa9f5cf233d9c82c84b6608 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 05:12:24 +0300 Subject: [PATCH 213/378] maybe now --- .../connector/JavaSocketServerConnector.java | 78 ++++++++++--------- 1 file changed, 42 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index 5c98c4d4..6dba7ebe 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -64,14 +64,14 @@ public void start() { */ @Override public void close() { -// System.out.println("Stopping socket connector"); -// try { -// serverSocket.close(); -// connectionAcceptorExecutor.shutdown(); -// clientIOWorkers.shutdown(); -// } catch (IOException exception){ -// exception.printStackTrace(); -// } + System.out.println("Stopping socket connector"); + try { + serverSocket.close(); + connectionAcceptorExecutor.shutdown(); + clientIOWorkers.shutdown(); + } catch (IOException exception){ + exception.printStackTrace(); + } } @@ -83,23 +83,23 @@ public static void main(String[] args) throws Exception { * Runnable, описывающий исполнение клиентской команды. */ static class ClientTask implements Runnable, Closeable { -// private RespWriter respWriter; -// private RespReader respReader; -// private Socket clientSocket; -// DatabaseServer databaseServer; + private RespWriter respWriter; + private RespReader respReader; + private Socket clientSocket; + DatabaseServer databaseServer; /** * @param client клиентский сокет * @param server сервер, на котором исполняется задача */ public ClientTask(Socket client, DatabaseServer server) { -// try { -// databaseServer = server; -// clientSocket = client; -// respReader = new RespReader(client.getInputStream()); -// respWriter = new RespWriter(client.getOutputStream()); -// } catch (IOException e) { -// e.printStackTrace(); -// } + try { + databaseServer = server; + clientSocket = client; + respReader = new RespReader(client.getInputStream()); + respWriter = new RespWriter(client.getOutputStream()); + } catch (IOException e) { + e.printStackTrace(); + } } /** @@ -112,15 +112,21 @@ public ClientTask(Socket client, DatabaseServer server) { @SneakyThrows @Override public void run() { -// CommandReader commandReader = new CommandReader(respReader, databaseServer.getEnv()); -// while (commandReader.hasNextCommand()) { -// try { -// DatabaseCommand dbCommand = commandReader.readCommand(); -// respWriter.write(dbCommand.execute().serialize()); -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } + CommandReader commandReader = new CommandReader(respReader,databaseServer.getEnv()); + try { + while (!Thread.currentThread().isInterrupted() && !clientSocket.isClosed()) { + if (commandReader.hasNextCommand()) { + DatabaseCommand databaseCommand = commandReader.readCommand(); + respWriter.write(databaseCommand.execute().serialize()); + } else { + commandReader.close(); + break; + } + } + commandReader.close(); + } catch (Exception ex) { + ex.printStackTrace(); + } } /** @@ -128,13 +134,13 @@ public void run() { */ @Override public void close() { -// try { -// clientSocket.close(); -// respReader.close(); -// respWriter.close(); -// } catch (IOException ex) { -// throw new RuntimeException("Error while cloasing socket client" , ex); -// } + try { + clientSocket.close(); + respReader.close(); + respWriter.close(); + } catch (IOException ex) { + throw new RuntimeException("Error while cloasing socket client" , ex); + } } } } \ No newline at end of file From 5be96d07e788d843324ad1b3de6184a6d2e93bd1 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 05:16:12 +0300 Subject: [PATCH 214/378] minus closed --- .../connector/JavaSocketServerConnector.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index 6dba7ebe..5148318b 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -64,14 +64,14 @@ public void start() { */ @Override public void close() { - System.out.println("Stopping socket connector"); - try { - serverSocket.close(); - connectionAcceptorExecutor.shutdown(); - clientIOWorkers.shutdown(); - } catch (IOException exception){ - exception.printStackTrace(); - } +// System.out.println("Stopping socket connector"); +// try { +// serverSocket.close(); +// connectionAcceptorExecutor.shutdown(); +// clientIOWorkers.shutdown(); +// } catch (IOException exception){ +// exception.printStackTrace(); +// } } From f68e445ccdb76a95288b19d4d9b4a1f58ca48393 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 05:18:12 +0300 Subject: [PATCH 215/378] new first close --- .../basics/connector/JavaSocketServerConnector.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index 5148318b..3d5aa11c 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -64,14 +64,14 @@ public void start() { */ @Override public void close() { -// System.out.println("Stopping socket connector"); -// try { -// serverSocket.close(); + System.out.println("Stopping socket connector"); + try { + serverSocket.close(); // connectionAcceptorExecutor.shutdown(); // clientIOWorkers.shutdown(); -// } catch (IOException exception){ -// exception.printStackTrace(); -// } + } catch (IOException exception){ + exception.printStackTrace(); + } } From c890c16dcefc057b8bc68fd4f8339f210158708a Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 05:22:49 +0300 Subject: [PATCH 216/378] pp --- .../basics/connector/JavaSocketServerConnector.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index 3d5aa11c..5148318b 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -64,14 +64,14 @@ public void start() { */ @Override public void close() { - System.out.println("Stopping socket connector"); - try { - serverSocket.close(); +// System.out.println("Stopping socket connector"); +// try { +// serverSocket.close(); // connectionAcceptorExecutor.shutdown(); // clientIOWorkers.shutdown(); - } catch (IOException exception){ - exception.printStackTrace(); - } +// } catch (IOException exception){ +// exception.printStackTrace(); +// } } From 71d18e628b84c8c4e3e64a851e14288fa6b79dbe Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 05:30:23 +0300 Subject: [PATCH 217/378] Update JavaSocket --- .../connector/JavaSocketServerConnector.java | 41 +++++++++---------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index 5148318b..e9294100 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -26,18 +26,14 @@ public class JavaSocketServerConnector implements Closeable { private final ExecutorService clientIOWorkers = Executors.newSingleThreadExecutor(); private final ServerSocket serverSocket; // todo uncomment private final ExecutorService connectionAcceptorExecutor = Executors.newSingleThreadExecutor(); - private final DatabaseServer dbServer; + private DatabaseServer dbServer; /** * Стартует сервер. По аналогии с сокетом открывает коннекшн в конструкторе. */ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig config) throws IOException { - try { - dbServer = databaseServer; - serverSocket = new ServerSocket(config.getPort()); - } catch (IOException ex) { - throw new IOException("JavaSocketServerConnector error constructor",ex); - } + serverSocket = new ServerSocket(config.getPort()); + dbServer = databaseServer; } /** @@ -64,25 +60,25 @@ public void start() { */ @Override public void close() { -// System.out.println("Stopping socket connector"); -// try { -// serverSocket.close(); -// connectionAcceptorExecutor.shutdown(); -// clientIOWorkers.shutdown(); -// } catch (IOException exception){ -// exception.printStackTrace(); -// } + System.out.println("Stopping socket connector"); + try { + serverSocket.close(); + connectionAcceptorExecutor.shutdownNow(); + clientIOWorkers.shutdownNow(); + } catch (IOException exception){ + exception.printStackTrace(); + } } public static void main(String[] args) throws Exception { - // можнно запускать прямо здесь } /** * Runnable, описывающий исполнение клиентской команды. */ static class ClientTask implements Runnable, Closeable { + private RespWriter respWriter; private RespReader respReader; private Socket clientSocket; @@ -94,7 +90,7 @@ static class ClientTask implements Runnable, Closeable { public ClientTask(Socket client, DatabaseServer server) { try { databaseServer = server; - clientSocket = client; + this.clientSocket = client; respReader = new RespReader(client.getInputStream()); respWriter = new RespWriter(client.getOutputStream()); } catch (IOException e) { @@ -109,10 +105,9 @@ public ClientTask(Socket client, DatabaseServer server) { * 2. Исполняет ее на сервере * 3. Записывает результат в сокет с помощью {@link RespWriter} */ - @SneakyThrows @Override public void run() { - CommandReader commandReader = new CommandReader(respReader,databaseServer.getEnv()); + CommandReader commandReader = new CommandReader(respReader, databaseServer.getEnv()); try { while (!Thread.currentThread().isInterrupted() && !clientSocket.isClosed()) { if (commandReader.hasNextCommand()) { @@ -124,9 +119,11 @@ public void run() { } } commandReader.close(); - } catch (Exception ex) { - ex.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); } + + } /** @@ -139,7 +136,7 @@ public void close() { respReader.close(); respWriter.close(); } catch (IOException ex) { - throw new RuntimeException("Error while cloasing socket client" , ex); + ex.printStackTrace(); } } } From f7bcc10cca7309c5141d025bd86012c81d0cd1f6 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 05:35:58 +0300 Subject: [PATCH 218/378] try catch --- .../java/basics/connector/JavaSocketServerConnector.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index e9294100..3a1fa74d 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -32,8 +32,12 @@ public class JavaSocketServerConnector implements Closeable { * Стартует сервер. По аналогии с сокетом открывает коннекшн в конструкторе. */ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig config) throws IOException { - serverSocket = new ServerSocket(config.getPort()); - dbServer = databaseServer; + try { + serverSocket = new ServerSocket(config.getPort()); + dbServer = databaseServer; + } catch (IOException ex) { + throw new IOException("Constructor",ex); + } } /** From 715456645b0f14c8c02a6779c4fe452c184e7356 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 05:43:31 +0300 Subject: [PATCH 219/378] new JavaSocket --- .../connector/JavaSocketServerConnector.java | 42 +++++++++---------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index 3a1fa74d..ee31de0e 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -26,7 +26,7 @@ public class JavaSocketServerConnector implements Closeable { private final ExecutorService clientIOWorkers = Executors.newSingleThreadExecutor(); private final ServerSocket serverSocket; // todo uncomment private final ExecutorService connectionAcceptorExecutor = Executors.newSingleThreadExecutor(); - private DatabaseServer dbServer; + private final DatabaseServer dbServer; /** * Стартует сервер. По аналогии с сокетом открывает коннекшн в конструкторе. @@ -46,15 +46,11 @@ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig con public void start() { connectionAcceptorExecutor.submit(() -> { try { - Socket socket = serverSocket.accept(); - clientIOWorkers.submit(() -> { - ClientTask clientTask = new ClientTask(socket, dbServer); - clientTask.run(); - }); - } catch (IOException exception) { - exception.printStackTrace(); - } finally { - close(); + final Socket socketClient = serverSocket.accept(); + final ClientTask clientTask = new ClientTask(socketClient,dbServer); + clientIOWorkers.submit(clientTask); + } catch (IOException ex) { + ex.printStackTrace(); } }); } @@ -83,8 +79,8 @@ public static void main(String[] args) throws Exception { */ static class ClientTask implements Runnable, Closeable { - private RespWriter respWriter; - private RespReader respReader; + // private RespWriter respWriter; + // private RespReader respReader; private Socket clientSocket; DatabaseServer databaseServer; /** @@ -92,14 +88,10 @@ static class ClientTask implements Runnable, Closeable { * @param server сервер, на котором исполняется задача */ public ClientTask(Socket client, DatabaseServer server) { - try { - databaseServer = server; - this.clientSocket = client; - respReader = new RespReader(client.getInputStream()); - respWriter = new RespWriter(client.getOutputStream()); - } catch (IOException e) { - e.printStackTrace(); - } + databaseServer = server; + clientSocket = client; + // respReader = new RespReader(client.getInputStream()); + // respWriter = new RespWriter(client.getOutputStream()); } /** @@ -111,8 +103,12 @@ public ClientTask(Socket client, DatabaseServer server) { */ @Override public void run() { - CommandReader commandReader = new CommandReader(respReader, databaseServer.getEnv()); + // CommandReader commandReader = new CommandReader(respReader, databaseServer.getEnv()); + // final RespReader respReader = new RespReader(clientSocket.getInputStream()); try { + final RespReader respReader = new RespReader(clientSocket.getInputStream()); + final RespWriter respWriter = new RespWriter(clientSocket.getOutputStream()); + CommandReader commandReader = new CommandReader(respReader, databaseServer.getEnv()); while (!Thread.currentThread().isInterrupted() && !clientSocket.isClosed()) { if (commandReader.hasNextCommand()) { DatabaseCommand databaseCommand = commandReader.readCommand(); @@ -137,8 +133,8 @@ public void run() { public void close() { try { clientSocket.close(); - respReader.close(); - respWriter.close(); + // respReader.close(); + // respWriter.close(); } catch (IOException ex) { ex.printStackTrace(); } From 48ee80d9cde471a4728d0cb2eb3917051919f528 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 05:54:04 +0300 Subject: [PATCH 220/378] Update JavaSocketCon --- .../connector/JavaSocketServerConnector.java | 59 +++++++------------ 1 file changed, 21 insertions(+), 38 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index ee31de0e..37a2b9f6 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -3,6 +3,7 @@ import com.itmo.java.basics.DatabaseServer; import com.itmo.java.basics.config.ServerConfig; import com.itmo.java.basics.console.DatabaseCommand; +import com.itmo.java.basics.console.DatabaseCommandResult; import com.itmo.java.basics.resp.CommandReader; import com.itmo.java.protocol.RespReader; import com.itmo.java.protocol.RespWriter; @@ -12,9 +13,11 @@ import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; +import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; + /** * Класс, который предоставляет доступ к серверу через сокеты */ @@ -32,12 +35,8 @@ public class JavaSocketServerConnector implements Closeable { * Стартует сервер. По аналогии с сокетом открывает коннекшн в конструкторе. */ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig config) throws IOException { - try { - serverSocket = new ServerSocket(config.getPort()); - dbServer = databaseServer; - } catch (IOException ex) { - throw new IOException("Constructor",ex); - } + dbServer = databaseServer; + serverSocket = new ServerSocket(config.getPort()); } /** @@ -46,8 +45,8 @@ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig con public void start() { connectionAcceptorExecutor.submit(() -> { try { - final Socket socketClient = serverSocket.accept(); - final ClientTask clientTask = new ClientTask(socketClient,dbServer); + final Socket clientSocket = serverSocket.accept(); + final ClientTask clientTask = new ClientTask(clientSocket, dbServer); clientIOWorkers.submit(clientTask); } catch (IOException ex) { ex.printStackTrace(); @@ -63,9 +62,9 @@ public void close() { System.out.println("Stopping socket connector"); try { serverSocket.close(); - connectionAcceptorExecutor.shutdownNow(); - clientIOWorkers.shutdownNow(); - } catch (IOException exception){ + connectionAcceptorExecutor.shutdown(); + clientIOWorkers.shutdown(); + } catch (IOException exception) { exception.printStackTrace(); } } @@ -78,20 +77,16 @@ public static void main(String[] args) throws Exception { * Runnable, описывающий исполнение клиентской команды. */ static class ClientTask implements Runnable, Closeable { + private final Socket clientSocket; + private final DatabaseServer databaseServer; - // private RespWriter respWriter; - // private RespReader respReader; - private Socket clientSocket; - DatabaseServer databaseServer; /** * @param client клиентский сокет * @param server сервер, на котором исполняется задача */ public ClientTask(Socket client, DatabaseServer server) { - databaseServer = server; clientSocket = client; - // respReader = new RespReader(client.getInputStream()); - // respWriter = new RespWriter(client.getOutputStream()); + databaseServer = server; } /** @@ -103,27 +98,17 @@ public ClientTask(Socket client, DatabaseServer server) { */ @Override public void run() { - // CommandReader commandReader = new CommandReader(respReader, databaseServer.getEnv()); - // final RespReader respReader = new RespReader(clientSocket.getInputStream()); try { - final RespReader respReader = new RespReader(clientSocket.getInputStream()); + final CommandReader commandReader = new CommandReader(new RespReader(clientSocket.getInputStream()), databaseServer.getEnv()); final RespWriter respWriter = new RespWriter(clientSocket.getOutputStream()); - CommandReader commandReader = new CommandReader(respReader, databaseServer.getEnv()); - while (!Thread.currentThread().isInterrupted() && !clientSocket.isClosed()) { - if (commandReader.hasNextCommand()) { - DatabaseCommand databaseCommand = commandReader.readCommand(); - respWriter.write(databaseCommand.execute().serialize()); - } else { - commandReader.close(); - break; - } + while (commandReader.hasNextCommand()) { + final DatabaseCommand command = commandReader.readCommand(); + final DatabaseCommandResult commandResult = databaseServer.executeNextCommand(command).get(); + respWriter.write(commandResult.serialize()); } - commandReader.close(); - } catch (Exception e) { - e.printStackTrace(); + } catch (ExecutionException | IOException | InterruptedException exception) { + exception.printStackTrace(); } - - } /** @@ -133,11 +118,9 @@ public void run() { public void close() { try { clientSocket.close(); - // respReader.close(); - // respWriter.close(); } catch (IOException ex) { ex.printStackTrace(); } } } -} \ No newline at end of file +} From 0d7f0cd9ab77b38af1e0ce6cfef592c32f063d30 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 06:06:09 +0300 Subject: [PATCH 221/378] test start --- .../connector/JavaSocketServerConnector.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index 37a2b9f6..19ee4947 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -45,11 +45,15 @@ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig con public void start() { connectionAcceptorExecutor.submit(() -> { try { - final Socket clientSocket = serverSocket.accept(); - final ClientTask clientTask = new ClientTask(clientSocket, dbServer); - clientIOWorkers.submit(clientTask); - } catch (IOException ex) { - ex.printStackTrace(); + Socket clientSocket = serverSocket.accept(); + clientIOWorkers.submit(() -> { + ClientTask clientTask = new ClientTask(clientSocket, dbServer); + clientTask.run(); + }); + } catch (IOException exception) { + exception.printStackTrace(); + } finally { + close(); } }); } From acb1f47f640f75a6d8fbe25aa82902c840bc8576 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 06:13:43 +0300 Subject: [PATCH 222/378] testing --- .../connector/JavaSocketServerConnector.java | 43 +++++++++++-------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index 19ee4947..0b10403f 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -45,15 +45,11 @@ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig con public void start() { connectionAcceptorExecutor.submit(() -> { try { - Socket clientSocket = serverSocket.accept(); - clientIOWorkers.submit(() -> { - ClientTask clientTask = new ClientTask(clientSocket, dbServer); - clientTask.run(); - }); - } catch (IOException exception) { - exception.printStackTrace(); - } finally { - close(); + final Socket clientSocket = serverSocket.accept(); + final ClientTask clientTask = new ClientTask(clientSocket, dbServer); + clientIOWorkers.submit(clientTask); + } catch (IOException ex) { + ex.printStackTrace(); } }); } @@ -83,14 +79,18 @@ public static void main(String[] args) throws Exception { static class ClientTask implements Runnable, Closeable { private final Socket clientSocket; private final DatabaseServer databaseServer; + private RespWriter respWriter; + private RespReader respReader; /** * @param client клиентский сокет * @param server сервер, на котором исполняется задача */ public ClientTask(Socket client, DatabaseServer server) { + clientSocket = client; databaseServer = server; + } /** @@ -103,18 +103,27 @@ public ClientTask(Socket client, DatabaseServer server) { @Override public void run() { try { - final CommandReader commandReader = new CommandReader(new RespReader(clientSocket.getInputStream()), databaseServer.getEnv()); - final RespWriter respWriter = new RespWriter(clientSocket.getOutputStream()); - while (commandReader.hasNextCommand()) { - final DatabaseCommand command = commandReader.readCommand(); - final DatabaseCommandResult commandResult = databaseServer.executeNextCommand(command).get(); - respWriter.write(commandResult.serialize()); + RespWriter respWriter = new RespWriter(clientSocket.getOutputStream()); + RespReader respReader = new RespReader(clientSocket.getInputStream()); + CommandReader commandReader = new CommandReader(respReader, databaseServer.getEnv()); + while (!Thread.currentThread().isInterrupted() && !clientSocket.isClosed()) { + if (commandReader.hasNextCommand()) { + DatabaseCommand databaseCommand = commandReader.readCommand(); + respWriter.write(databaseCommand.execute().serialize()); + } else { + commandReader.close(); + break; + } } - } catch (ExecutionException | IOException | InterruptedException exception) { - exception.printStackTrace(); + commandReader.close(); + } catch (Exception e) { + e.printStackTrace(); } + + } + /** * Закрывает клиентский сокет */ From 910eb9745a9e778043ccc3c215a2c8c56c5dcbee Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 06:25:03 +0300 Subject: [PATCH 223/378] testing --- .../connector/JavaSocketServerConnector.java | 58 ++++++++++--------- 1 file changed, 30 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index 0b10403f..07e91b3f 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -45,11 +45,15 @@ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig con public void start() { connectionAcceptorExecutor.submit(() -> { try { - final Socket clientSocket = serverSocket.accept(); - final ClientTask clientTask = new ClientTask(clientSocket, dbServer); - clientIOWorkers.submit(clientTask); - } catch (IOException ex) { - ex.printStackTrace(); + Socket clientSocket = serverSocket.accept(); + clientIOWorkers.submit(() -> { + ClientTask clientTask = new ClientTask(clientSocket, dbServer); + clientTask.run(); + }); + } catch (IOException exception) { + exception.printStackTrace(); + } finally { + close(); } }); } @@ -77,8 +81,8 @@ public static void main(String[] args) throws Exception { * Runnable, описывающий исполнение клиентской команды. */ static class ClientTask implements Runnable, Closeable { - private final Socket clientSocket; - private final DatabaseServer databaseServer; + private Socket clientSocket; + private DatabaseServer databaseServer; private RespWriter respWriter; private RespReader respReader; @@ -87,9 +91,14 @@ static class ClientTask implements Runnable, Closeable { * @param server сервер, на котором исполняется задача */ public ClientTask(Socket client, DatabaseServer server) { - - clientSocket = client; - databaseServer = server; + try { + clientSocket = client; + databaseServer = server; + respReader = new RespReader(client.getInputStream()); + respWriter = new RespWriter(client.getOutputStream()); + } catch (IOException ex) { + ex.printStackTrace(); + } } @@ -103,27 +112,18 @@ public ClientTask(Socket client, DatabaseServer server) { @Override public void run() { try { - RespWriter respWriter = new RespWriter(clientSocket.getOutputStream()); - RespReader respReader = new RespReader(clientSocket.getInputStream()); - CommandReader commandReader = new CommandReader(respReader, databaseServer.getEnv()); - while (!Thread.currentThread().isInterrupted() && !clientSocket.isClosed()) { - if (commandReader.hasNextCommand()) { - DatabaseCommand databaseCommand = commandReader.readCommand(); - respWriter.write(databaseCommand.execute().serialize()); - } else { - commandReader.close(); - break; - } + final CommandReader commandReader = new CommandReader(respReader, databaseServer.getEnv()); + ; + while (commandReader.hasNextCommand()) { + final DatabaseCommand command = commandReader.readCommand(); + final DatabaseCommandResult commandResult = databaseServer.executeNextCommand(command).get(); + respWriter.write(commandResult.serialize()); } - commandReader.close(); - } catch (Exception e) { - e.printStackTrace(); + } catch (ExecutionException | IOException | InterruptedException exception) { + exception.printStackTrace(); } - - } - /** * Закрывает клиентский сокет */ @@ -131,9 +131,11 @@ public void run() { public void close() { try { clientSocket.close(); + respWriter.close(); + respReader.close(); } catch (IOException ex) { ex.printStackTrace(); } } } -} +} \ No newline at end of file From e548d648cdc3e667676117c8dd2a2758922b41ec Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 06:28:21 +0300 Subject: [PATCH 224/378] testing --- .../connector/JavaSocketServerConnector.java | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index 07e91b3f..b5afa5ac 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -111,16 +111,20 @@ public ClientTask(Socket client, DatabaseServer server) { */ @Override public void run() { + CommandReader commandReader = new CommandReader(respReader, databaseServer.getEnv()); try { - final CommandReader commandReader = new CommandReader(respReader, databaseServer.getEnv()); - ; - while (commandReader.hasNextCommand()) { - final DatabaseCommand command = commandReader.readCommand(); - final DatabaseCommandResult commandResult = databaseServer.executeNextCommand(command).get(); - respWriter.write(commandResult.serialize()); + while (!Thread.currentThread().isInterrupted() && !clientSocket.isClosed()) { + if (commandReader.hasNextCommand()) { + DatabaseCommand dbCommand = commandReader.readCommand(); + respWriter.write(dbCommand.execute().serialize()); + } else { + commandReader.close(); + break; + } } - } catch (ExecutionException | IOException | InterruptedException exception) { - exception.printStackTrace(); + commandReader.close(); + } catch (Exception e) { + e.printStackTrace(); } } From ba94026a7f76e754ddf4fffef0bc586741c3a4f6 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 06:32:22 +0300 Subject: [PATCH 225/378] testing --- .../connector/JavaSocketServerConnector.java | 42 ++++++++++--------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index b5afa5ac..768a77e6 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -13,7 +13,6 @@ import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; -import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -28,15 +27,17 @@ public class JavaSocketServerConnector implements Closeable { */ private final ExecutorService clientIOWorkers = Executors.newSingleThreadExecutor(); private final ServerSocket serverSocket; // todo uncomment + private final ExecutorService connectionAcceptorExecutor = Executors.newSingleThreadExecutor(); - private final DatabaseServer dbServer; + + private DatabaseServer dbServer; /** * Стартует сервер. По аналогии с сокетом открывает коннекшн в конструкторе. */ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig config) throws IOException { - dbServer = databaseServer; serverSocket = new ServerSocket(config.getPort()); + dbServer = databaseServer; } /** @@ -45,9 +46,9 @@ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig con public void start() { connectionAcceptorExecutor.submit(() -> { try { - Socket clientSocket = serverSocket.accept(); + Socket socket = serverSocket.accept(); clientIOWorkers.submit(() -> { - ClientTask clientTask = new ClientTask(clientSocket, dbServer); + ClientTask clientTask = new ClientTask(socket, dbServer); clientTask.run(); }); } catch (IOException exception) { @@ -66,9 +67,9 @@ public void close() { System.out.println("Stopping socket connector"); try { serverSocket.close(); - connectionAcceptorExecutor.shutdown(); - clientIOWorkers.shutdown(); - } catch (IOException exception) { + connectionAcceptorExecutor.shutdownNow(); + clientIOWorkers.shutdownNow(); + } catch (IOException exception){ exception.printStackTrace(); } } @@ -81,25 +82,24 @@ public static void main(String[] args) throws Exception { * Runnable, описывающий исполнение клиентской команды. */ static class ClientTask implements Runnable, Closeable { - private Socket clientSocket; - private DatabaseServer databaseServer; + private RespWriter respWriter; private RespReader respReader; - + private Socket client; + DatabaseServer databaseServer; /** * @param client клиентский сокет * @param server сервер, на котором исполняется задача */ public ClientTask(Socket client, DatabaseServer server) { try { - clientSocket = client; databaseServer = server; + this.client = client; respReader = new RespReader(client.getInputStream()); respWriter = new RespWriter(client.getOutputStream()); - } catch (IOException ex) { - ex.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); } - } /** @@ -113,7 +113,7 @@ public ClientTask(Socket client, DatabaseServer server) { public void run() { CommandReader commandReader = new CommandReader(respReader, databaseServer.getEnv()); try { - while (!Thread.currentThread().isInterrupted() && !clientSocket.isClosed()) { + while (!Thread.currentThread().isInterrupted() && !client.isClosed()) { if (commandReader.hasNextCommand()) { DatabaseCommand dbCommand = commandReader.readCommand(); respWriter.write(dbCommand.execute().serialize()); @@ -126,6 +126,8 @@ public void run() { } catch (Exception e) { e.printStackTrace(); } + + } /** @@ -134,11 +136,11 @@ public void run() { @Override public void close() { try { - clientSocket.close(); - respWriter.close(); + client.close(); respReader.close(); - } catch (IOException ex) { - ex.printStackTrace(); + respWriter.close(); + } catch (IOException exception) { + exception.printStackTrace(); } } } From 4284859ac167a1e17661d6f83061aadbac51ac85 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 06:36:09 +0300 Subject: [PATCH 226/378] testings --- .../connection/SocketKvsConnection.java | 36 ++++++++----------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index 645bc02c..3021802f 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -16,21 +16,18 @@ */ public class SocketKvsConnection implements KvsConnection { - final Socket socket; - // final ConnectionConfig connectionConfig; - private final RespReader respReader; - private final RespWriter respWriter; + private Socket socket; + private RespWriter respWriter; + private RespReader respReader; public SocketKvsConnection(ConnectionConfig config) { - try { - // connectionConfig = config; socket = new Socket(config.getHost(), config.getPort()); - respWriter = new RespWriter(socket.getOutputStream()); respReader = new RespReader(socket.getInputStream()); - } catch (IOException ex) { - throw new RuntimeException("SocketKvsConnection" , ex); - } + respWriter = new RespWriter(socket.getOutputStream()); + } catch (IOException ex) { + throw new RuntimeException(ex); + } } /** @@ -43,14 +40,10 @@ public SocketKvsConnection(ConnectionConfig config) { @Override public synchronized RespObject send(int commandId, RespArray command) throws ConnectionException { try { - respWriter.write(new RespArray(new RespCommandId(commandId),command)); - RespObject respObject = respReader.readObject(); - if (respObject.isError()) { - throw new ConnectionException("Connection error respObject is error"); - } - return respObject; - } catch (IOException ex) { - throw new ConnectionException("Error while sending in SocketKvsConnection" , ex); + respWriter.write(new RespArray(new RespCommandId(commandId) ,command)); + return respReader.readObject(); + } catch (IOException e) { + throw new ConnectionException("?", e); } } @@ -61,11 +54,10 @@ public synchronized RespObject send(int commandId, RespArray command) throws Con public void close() { try { socket.close(); - respReader.close(); respWriter.close(); - } catch (IOException ex) { - throw new RuntimeException("Socket close" , ex); + respReader.close(); + } catch (IOException exception) { + exception.printStackTrace(); } - } } From ca892aac3972bb1b6f19f71b6f4dd8ba39dd5d51 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 06:41:13 +0300 Subject: [PATCH 227/378] testing --- .../connector/JavaSocketServerConnector.java | 77 ++++++++----------- .../connection/SocketKvsConnection.java | 34 ++++---- 2 files changed, 47 insertions(+), 64 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index 768a77e6..bc78300b 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -13,6 +13,7 @@ import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; +import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -26,18 +27,16 @@ public class JavaSocketServerConnector implements Closeable { * Экзекьютор для выполнения ClientTask */ private final ExecutorService clientIOWorkers = Executors.newSingleThreadExecutor(); - private final ServerSocket serverSocket; // todo uncomment - + private final ServerSocket serverSocket; private final ExecutorService connectionAcceptorExecutor = Executors.newSingleThreadExecutor(); - - private DatabaseServer dbServer; + private final DatabaseServer databaseServer; /** * Стартует сервер. По аналогии с сокетом открывает коннекшн в конструкторе. */ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig config) throws IOException { - serverSocket = new ServerSocket(config.getPort()); - dbServer = databaseServer; + this.databaseServer = databaseServer; + this.serverSocket = new ServerSocket(config.getPort()); } /** @@ -46,15 +45,12 @@ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig con public void start() { connectionAcceptorExecutor.submit(() -> { try { - Socket socket = serverSocket.accept(); - clientIOWorkers.submit(() -> { - ClientTask clientTask = new ClientTask(socket, dbServer); - clientTask.run(); - }); + final Socket client = serverSocket.accept(); + final ClientTask clientTask = new ClientTask(client, databaseServer); + + clientIOWorkers.submit(clientTask); } catch (IOException exception) { exception.printStackTrace(); - } finally { - close(); } }); } @@ -65,12 +61,13 @@ public void start() { @Override public void close() { System.out.println("Stopping socket connector"); + try { serverSocket.close(); - connectionAcceptorExecutor.shutdownNow(); - clientIOWorkers.shutdownNow(); - } catch (IOException exception){ - exception.printStackTrace(); + connectionAcceptorExecutor.shutdown(); + clientIOWorkers.shutdown(); + } catch (IOException exception) { + throw new RuntimeException("Closing server socket error", exception); } } @@ -82,24 +79,16 @@ public static void main(String[] args) throws Exception { * Runnable, описывающий исполнение клиентской команды. */ static class ClientTask implements Runnable, Closeable { + private final Socket client; + private final DatabaseServer server; - private RespWriter respWriter; - private RespReader respReader; - private Socket client; - DatabaseServer databaseServer; /** * @param client клиентский сокет * @param server сервер, на котором исполняется задача */ public ClientTask(Socket client, DatabaseServer server) { - try { - databaseServer = server; - this.client = client; - respReader = new RespReader(client.getInputStream()); - respWriter = new RespWriter(client.getOutputStream()); - } catch (IOException e) { - e.printStackTrace(); - } + this.client = client; + this.server = server; } /** @@ -111,23 +100,19 @@ public ClientTask(Socket client, DatabaseServer server) { */ @Override public void run() { - CommandReader commandReader = new CommandReader(respReader, databaseServer.getEnv()); try { - while (!Thread.currentThread().isInterrupted() && !client.isClosed()) { - if (commandReader.hasNextCommand()) { - DatabaseCommand dbCommand = commandReader.readCommand(); - respWriter.write(dbCommand.execute().serialize()); - } else { - commandReader.close(); - break; - } - } - commandReader.close(); - } catch (Exception e) { - e.printStackTrace(); - } + final CommandReader commandReader = new CommandReader(new RespReader(client.getInputStream()), server.getEnv()); + final RespWriter respWriter = new RespWriter(client.getOutputStream()); + while (commandReader.hasNextCommand()) { + final DatabaseCommand command = commandReader.readCommand(); + final DatabaseCommandResult commandResult = server.executeNextCommand(command).get(); + respWriter.write(commandResult.serialize()); + } + } catch (ExecutionException | IOException | InterruptedException exception) { + exception.printStackTrace(); + } } /** @@ -137,11 +122,9 @@ public void run() { public void close() { try { client.close(); - respReader.close(); - respWriter.close(); } catch (IOException exception) { - exception.printStackTrace(); + throw new RuntimeException("Closing client socket error", exception); } } } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index 3021802f..b2aad7b5 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -15,24 +15,20 @@ * С помощью {@link RespWriter} и {@link RespReader} читает/пишет в сокет */ public class SocketKvsConnection implements KvsConnection { - - private Socket socket; - private RespWriter respWriter; - private RespReader respReader; + final ConnectionConfig config; + final Socket socket; public SocketKvsConnection(ConnectionConfig config) { + this.config = config; try { - socket = new Socket(config.getHost(), config.getPort()); - respReader = new RespReader(socket.getInputStream()); - respWriter = new RespWriter(socket.getOutputStream()); - } catch (IOException ex) { - throw new RuntimeException(ex); + this.socket = new Socket(this.config.getHost(), this.config.getPort()); + } catch (IOException exception) { + throw new RuntimeException("Creation socket error", exception); } } /** * Отправляет с помощью сокета команду и получает результат. - * * @param commandId id команды (номер) * @param command команда * @throws ConnectionException если сокет закрыт или если произошла другая ошибка соединения @@ -40,10 +36,16 @@ public SocketKvsConnection(ConnectionConfig config) { @Override public synchronized RespObject send(int commandId, RespArray command) throws ConnectionException { try { - respWriter.write(new RespArray(new RespCommandId(commandId) ,command)); - return respReader.readObject(); - } catch (IOException e) { - throw new ConnectionException("?", e); + final RespWriter respWriter = new RespWriter(socket.getOutputStream()); + respWriter.write(command); + final RespReader respReader = new RespReader(socket.getInputStream()); + final RespObject respObject = respReader.readObject(); + if (respObject.isError()) { + throw new ConnectionException("Response error"); + } + return respObject; + } catch (IOException exception) { + throw new ConnectionException("Connection exception", exception); } } @@ -54,10 +56,8 @@ public synchronized RespObject send(int commandId, RespArray command) throws Con public void close() { try { socket.close(); - respWriter.close(); - respReader.close(); } catch (IOException exception) { - exception.printStackTrace(); + throw new RuntimeException("Closing client socket error", exception); } } } From 8d61ca8ae870186ae82fc4042fa71923d4602332 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 06:44:56 +0300 Subject: [PATCH 228/378] testing --- .../connection/SocketKvsConnection.java | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index b2aad7b5..caf41c5a 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -15,20 +15,24 @@ * С помощью {@link RespWriter} и {@link RespReader} читает/пишет в сокет */ public class SocketKvsConnection implements KvsConnection { - final ConnectionConfig config; - final Socket socket; + + private Socket socket; + private RespWriter respWriter; + private RespReader respReader; public SocketKvsConnection(ConnectionConfig config) { - this.config = config; try { - this.socket = new Socket(this.config.getHost(), this.config.getPort()); - } catch (IOException exception) { - throw new RuntimeException("Creation socket error", exception); + socket = new Socket(config.getHost(), config.getPort()); + respReader = new RespReader(socket.getInputStream()); + respWriter = new RespWriter(socket.getOutputStream()); + } catch (IOException e) { + e.printStackTrace(); } } /** * Отправляет с помощью сокета команду и получает результат. + * * @param commandId id команды (номер) * @param command команда * @throws ConnectionException если сокет закрыт или если произошла другая ошибка соединения @@ -36,16 +40,10 @@ public SocketKvsConnection(ConnectionConfig config) { @Override public synchronized RespObject send(int commandId, RespArray command) throws ConnectionException { try { - final RespWriter respWriter = new RespWriter(socket.getOutputStream()); - respWriter.write(command); - final RespReader respReader = new RespReader(socket.getInputStream()); - final RespObject respObject = respReader.readObject(); - if (respObject.isError()) { - throw new ConnectionException("Response error"); - } - return respObject; - } catch (IOException exception) { - throw new ConnectionException("Connection exception", exception); + respWriter.write(new RespArray(new RespCommandId(commandId) ,command)); + return respReader.readObject(); + } catch (IOException e) { + throw new ConnectionException("?", e); } } @@ -56,8 +54,10 @@ public synchronized RespObject send(int commandId, RespArray command) throws Con public void close() { try { socket.close(); + respWriter.close(); + respReader.close(); } catch (IOException exception) { - throw new RuntimeException("Closing client socket error", exception); + exception.printStackTrace(); } } } From 6c213663f0460145bb88c2a98ace5262f6597660 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 12:20:44 +0300 Subject: [PATCH 229/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../connection/SocketKvsConnection.java | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index caf41c5a..b2aad7b5 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -15,24 +15,20 @@ * С помощью {@link RespWriter} и {@link RespReader} читает/пишет в сокет */ public class SocketKvsConnection implements KvsConnection { - - private Socket socket; - private RespWriter respWriter; - private RespReader respReader; + final ConnectionConfig config; + final Socket socket; public SocketKvsConnection(ConnectionConfig config) { + this.config = config; try { - socket = new Socket(config.getHost(), config.getPort()); - respReader = new RespReader(socket.getInputStream()); - respWriter = new RespWriter(socket.getOutputStream()); - } catch (IOException e) { - e.printStackTrace(); + this.socket = new Socket(this.config.getHost(), this.config.getPort()); + } catch (IOException exception) { + throw new RuntimeException("Creation socket error", exception); } } /** * Отправляет с помощью сокета команду и получает результат. - * * @param commandId id команды (номер) * @param command команда * @throws ConnectionException если сокет закрыт или если произошла другая ошибка соединения @@ -40,10 +36,16 @@ public SocketKvsConnection(ConnectionConfig config) { @Override public synchronized RespObject send(int commandId, RespArray command) throws ConnectionException { try { - respWriter.write(new RespArray(new RespCommandId(commandId) ,command)); - return respReader.readObject(); - } catch (IOException e) { - throw new ConnectionException("?", e); + final RespWriter respWriter = new RespWriter(socket.getOutputStream()); + respWriter.write(command); + final RespReader respReader = new RespReader(socket.getInputStream()); + final RespObject respObject = respReader.readObject(); + if (respObject.isError()) { + throw new ConnectionException("Response error"); + } + return respObject; + } catch (IOException exception) { + throw new ConnectionException("Connection exception", exception); } } @@ -54,10 +56,8 @@ public synchronized RespObject send(int commandId, RespArray command) throws Con public void close() { try { socket.close(); - respWriter.close(); - respReader.close(); } catch (IOException exception) { - exception.printStackTrace(); + throw new RuntimeException("Closing client socket error", exception); } } } From 5af6481b2b06c791e6b94376d8f8472912e46a4e Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 12:38:59 +0300 Subject: [PATCH 230/378] RespReader --- .../com/itmo/java/protocol/RespReader.java | 81 ++++++++----------- .../java/protocol/model/RespBulkString.java | 1 + 2 files changed, 34 insertions(+), 48 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 3b63f139..e18dba0c 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -16,6 +16,7 @@ public class RespReader implements AutoCloseable { + /** * Специальные символы окончания элемента */ @@ -24,7 +25,7 @@ public class RespReader implements AutoCloseable { private final InputStream inputStream; public RespReader(InputStream is) { - inputStream = is; + inputStream = is; } /** @@ -68,9 +69,9 @@ public RespObject readObject() throws IOException { * @throws IOException при ошибке чтения */ public RespError readError() throws IOException { - if (inputStream == null) { - throw new EOFException("Why stream is null?"); - } +// if (inputStream == null) { +// throw new EOFException("Why stream is null?"); +// } boolean stop = false; byte bytes = inputStream.readNBytes(1)[0]; List errorBytes = new ArrayList<>(); @@ -85,10 +86,10 @@ public RespError readError() throws IOException { // bytes = inputStream.readNBytes(1)[0]; } } - if (!stop) { - errorBytes.add(bytes); - bytes = inputStream.readNBytes(1)[0]; - } + if (!stop) { + errorBytes.add(bytes); + bytes = inputStream.readNBytes(1)[0]; + } } int errorBytesCount = errorBytes.size(); byte[] errorByte = new byte[errorBytesCount]; @@ -96,7 +97,6 @@ public RespError readError() throws IOException { errorByte[i] = errorBytes.get(i); } return new RespError(errorByte); -// return null; } /** @@ -106,30 +106,15 @@ public RespError readError() throws IOException { * @throws IOException при ошибке чтения */ public RespBulkString readBulkString() throws IOException { - if (inputStream == null) { - throw new EOFException("Why stream is null?"); - } - byte bytes = inputStream.readNBytes(1)[0]; - List bulkBytes = new ArrayList<>(); - while ( bytes != CR) { - bulkBytes.add(bytes); - bytes = inputStream.readNBytes(1)[0]; - } - int bulkBytesSize = bulkBytes.size(); - byte[] bulkByte = new byte[bulkBytesSize]; - - for (int i = 0; i < bulkBytesSize; i++) { - bulkByte[i] = bulkBytes.get(i); - } - final int bulkByteCount = Integer.parseInt(new String( bulkByte, StandardCharsets.UTF_8)); + final byte[] bytes = this.getStringNumberInBytes(); + final int bytesCount = Integer.parseInt(new String(bytes, StandardCharsets.UTF_8)); inputStream.readNBytes(1); - if (bulkByteCount == RespBulkString.NULL_STRING_SIZE) { - return new RespBulkString(null); + if (bytesCount == RespBulkString.NULL_STRING_SIZE) { + return RespBulkString.NULL_STRING; } - byte[] data = inputStream.readNBytes(bulkByteCount); + final byte[] data = inputStream.readNBytes(bytesCount); inputStream.readNBytes(2); return new RespBulkString(data); - // return null; } /** @@ -139,29 +124,14 @@ public RespBulkString readBulkString() throws IOException { * @throws IOException при ошибке чтения */ public RespArray readArray() throws IOException { - if (inputStream == null) { - throw new EOFException("Why stream is null?"); - } - byte bytes = inputStream.readNBytes(1)[0]; - List arrayBytes = new ArrayList<>(); - while ( bytes != CR) { - arrayBytes.add(bytes); - bytes = inputStream.readNBytes(1)[0]; - } - int arrayBytesSize = arrayBytes.size(); - byte[] arrayByte = new byte[arrayBytesSize]; - - for (int i = 0; i < arrayBytesSize; i++) { - arrayByte[i] = arrayBytes.get(i); - } - final int arrayByteCount = Integer.parseInt(new String( arrayByte, StandardCharsets.UTF_8)); - RespObject[] objects = new RespObject[arrayByteCount]; + final byte[] bytes = this.getStringNumberInBytes(); + final int elementsCount = Integer.parseInt(new String(bytes, StandardCharsets.UTF_8)); + final RespObject[] objects = new RespObject[elementsCount]; inputStream.readNBytes(1); - for (int i = 0; i < arrayByteCount; i++) { + for (int i = 0; i < elementsCount; i++) { objects[i] = this.readObject(); } return new RespArray(objects); - // return null; } /** @@ -181,4 +151,19 @@ public RespCommandId readCommandId() throws IOException { public void close() throws IOException { inputStream.close(); } + + private byte[] getStringNumberInBytes() throws IOException { + byte symbol = inputStream.readNBytes(1)[0]; + final List symboles = new ArrayList<>(); + while (symbol != CR) { + symboles.add(symbol); + symbol = inputStream.readNBytes(1)[0]; + } + final int symbolsCount = symboles.size(); + final byte[] bytes = new byte[symbolsCount]; + for (int i = 0; i < symbolsCount; i++) { + bytes[i] = symboles.get(i); + } + return bytes; + } } diff --git a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java index c3a53d83..11bde3ed 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java +++ b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java @@ -14,6 +14,7 @@ public class RespBulkString implements RespObject { public static final byte CODE = '$'; public static final int NULL_STRING_SIZE = -1; private final byte[] data; + public static final RespBulkString NULL_STRING = new RespBulkString(null); public RespBulkString(byte[] inform) { From 1bbd92dc280fafe886696634d65b63843d08fc92 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 13:12:05 +0300 Subject: [PATCH 231/378] update RespReader --- .../com/itmo/java/protocol/RespReader.java | 152 +++++++++++------- 1 file changed, 97 insertions(+), 55 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index e18dba0c..cfd5e332 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -32,8 +32,12 @@ public RespReader(InputStream is) { * Есть ли следующий массив в стриме? */ public boolean hasArray() throws IOException { - byte bytes = inputStream.readNBytes(1)[0]; - return bytes == RespArray.CODE; + try { + byte bytes = inputStream.readNBytes(1)[0]; + return bytes == RespArray.CODE; + } catch (IOException ex) { + throw new IOException("has array" ,ex); + } } /** @@ -47,6 +51,7 @@ public RespObject readObject() throws IOException { if (inputStream == null) { throw new EOFException("Why stream is null?"); } + try { byte bytes = inputStream.readNBytes(1)[0]; switch(bytes) { case RespError.CODE: @@ -59,8 +64,12 @@ public RespObject readObject() throws IOException { return readArray(); default: throw new IOException("Error while reading object code"); + } + }catch(IOException ex) { + throw new IOException("readobject" ,ex); + } } - } + /** * Считывает объект ошибки @@ -69,34 +78,38 @@ public RespObject readObject() throws IOException { * @throws IOException при ошибке чтения */ public RespError readError() throws IOException { -// if (inputStream == null) { -// throw new EOFException("Why stream is null?"); -// } - boolean stop = false; - byte bytes = inputStream.readNBytes(1)[0]; - List errorBytes = new ArrayList<>(); - while (!stop) { - while ((bytes == CR)) { - bytes = inputStream.readNBytes(1)[0]; - if (bytes == LF) { - stop = true; - } else { - errorBytes.add(CR); + if (inputStream == null) { + throw new EOFException("Why stream is null?"); + } + try { + boolean stop = false; + byte bytes = inputStream.readNBytes(1)[0]; + List errorBytes = new ArrayList<>(); + while (!stop) { + while ((bytes == CR)) { + bytes = inputStream.readNBytes(1)[0]; + if (bytes == LF) { + stop = true; + } else { + errorBytes.add(CR); // errorBytes.add(bytes); // bytes = inputStream.readNBytes(1)[0]; + } + } + if (!stop) { + errorBytes.add(bytes); + bytes = inputStream.readNBytes(1)[0]; } } - if (!stop) { - errorBytes.add(bytes); - bytes = inputStream.readNBytes(1)[0]; + int errorBytesCount = errorBytes.size(); + byte[] errorByte = new byte[errorBytesCount]; + for (int i = 0; i < errorBytesCount; i++) { + errorByte[i] = errorBytes.get(i); } + return new RespError(errorByte); + } catch(IOException ex) { + throw new IOException("read error",ex); } - int errorBytesCount = errorBytes.size(); - byte[] errorByte = new byte[errorBytesCount]; - for (int i = 0; i < errorBytesCount; i++) { - errorByte[i] = errorBytes.get(i); - } - return new RespError(errorByte); } /** @@ -106,15 +119,22 @@ public RespError readError() throws IOException { * @throws IOException при ошибке чтения */ public RespBulkString readBulkString() throws IOException { - final byte[] bytes = this.getStringNumberInBytes(); - final int bytesCount = Integer.parseInt(new String(bytes, StandardCharsets.UTF_8)); - inputStream.readNBytes(1); - if (bytesCount == RespBulkString.NULL_STRING_SIZE) { - return RespBulkString.NULL_STRING; + if (inputStream == null) { + throw new EOFException("Why stream is null?"); + } + try { + final byte[] bytes = this.getStringNumberInBytes(); + final int bytesCount = Integer.parseInt(new String(bytes, StandardCharsets.UTF_8)); + inputStream.readNBytes(1); + if (bytesCount == RespBulkString.NULL_STRING_SIZE) { + return RespBulkString.NULL_STRING; + } + final byte[] data = inputStream.readNBytes(bytesCount); + inputStream.readNBytes(2); + return new RespBulkString(data); + } catch (IOException ex) { + throw new IOException("RespBulk " ,ex); } - final byte[] data = inputStream.readNBytes(bytesCount); - inputStream.readNBytes(2); - return new RespBulkString(data); } /** @@ -124,14 +144,21 @@ public RespBulkString readBulkString() throws IOException { * @throws IOException при ошибке чтения */ public RespArray readArray() throws IOException { - final byte[] bytes = this.getStringNumberInBytes(); - final int elementsCount = Integer.parseInt(new String(bytes, StandardCharsets.UTF_8)); - final RespObject[] objects = new RespObject[elementsCount]; - inputStream.readNBytes(1); - for (int i = 0; i < elementsCount; i++) { - objects[i] = this.readObject(); + if (inputStream == null) { + throw new EOFException("Why stream is null?"); + } + try { + final byte[] bytes = this.getStringNumberInBytes(); + final int elementsCount = Integer.parseInt(new String(bytes, StandardCharsets.UTF_8)); + final RespObject[] objects = new RespObject[elementsCount]; + inputStream.readNBytes(1); + for (int i = 0; i < elementsCount; i++) { + objects[i] = this.readObject(); + } + return new RespArray(objects); + } catch (IOException ex) { + throw new IOException("readArray " ,ex); } - return new RespArray(objects); } /** @@ -141,29 +168,44 @@ public RespArray readArray() throws IOException { * @throws IOException при ошибке чтения */ public RespCommandId readCommandId() throws IOException { - int comID = ByteBuffer.wrap(inputStream.readNBytes(4)).getInt(); - inputStream.readNBytes(2); - return new RespCommandId(comID); + if (inputStream == null) { + throw new EOFException("Why stream is null?"); + } + try { + int comID = ByteBuffer.wrap(inputStream.readNBytes(4)).getInt(); + inputStream.readNBytes(2); + return new RespCommandId(comID); + } catch (IOException ex) { + throw new IOException("readCommandID " ,ex); + } } @Override public void close() throws IOException { - inputStream.close(); + try { + inputStream.close(); + } catch (IOException ex) { + throw new IOException("close " ,ex); + } } private byte[] getStringNumberInBytes() throws IOException { - byte symbol = inputStream.readNBytes(1)[0]; - final List symboles = new ArrayList<>(); - while (symbol != CR) { - symboles.add(symbol); - symbol = inputStream.readNBytes(1)[0]; - } - final int symbolsCount = symboles.size(); - final byte[] bytes = new byte[symbolsCount]; - for (int i = 0; i < symbolsCount; i++) { - bytes[i] = symboles.get(i); + try { + byte symbol = inputStream.readNBytes(1)[0]; + final List symboles = new ArrayList<>(); + while (symbol != CR) { + symboles.add(symbol); + symbol = inputStream.readNBytes(1)[0]; + } + final int symbolsCount = symboles.size(); + final byte[] bytes = new byte[symbolsCount]; + for (int i = 0; i < symbolsCount; i++) { + bytes[i] = symboles.get(i); + } + return bytes; + } catch (IOException ex) { + throw new IOException("getbytes", ex); } - return bytes; } } From 76ac3c1d1a3c7b495c27a83e9b0237b56c764993 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 14:53:22 +0300 Subject: [PATCH 232/378] reader --- .../connector/JavaSocketServerConnector.java | 2 - .../com/itmo/java/protocol/RespReader.java | 195 ++++++++---------- 2 files changed, 82 insertions(+), 115 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index bc78300b..c80f814a 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -47,7 +47,6 @@ public void start() { try { final Socket client = serverSocket.accept(); final ClientTask clientTask = new ClientTask(client, databaseServer); - clientIOWorkers.submit(clientTask); } catch (IOException exception) { exception.printStackTrace(); @@ -61,7 +60,6 @@ public void start() { @Override public void close() { System.out.println("Stopping socket connector"); - try { serverSocket.close(); connectionAcceptorExecutor.shutdown(); diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index cfd5e332..4412a175 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -9,35 +9,36 @@ import java.io.EOFException; import java.io.IOException; import java.io.InputStream; -import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.List; +import java.util.Arrays; public class RespReader implements AutoCloseable { - + private final InputStream inputStream; + private boolean isHasArray = false; /** * Специальные символы окончания элемента */ private static final byte CR = '\r'; private static final byte LF = '\n'; - private final InputStream inputStream; public RespReader(InputStream is) { - inputStream = is; + this.inputStream = is; } /** * Есть ли следующий массив в стриме? */ public boolean hasArray() throws IOException { - try { - byte bytes = inputStream.readNBytes(1)[0]; - return bytes == RespArray.CODE; - } catch (IOException ex) { - throw new IOException("has array" ,ex); + if (isHasArray) { + return true; + } + byte[] currentRespObjectType = inputStream.readNBytes(1); + if (currentRespObjectType[0] == RespArray.CODE){ + isHasArray = true; + return true; } + return false; } /** @@ -48,29 +49,38 @@ public boolean hasArray() throws IOException { * @throws IOException при ошибке чтения */ public RespObject readObject() throws IOException { - if (inputStream == null) { - throw new EOFException("Why stream is null?"); - } try { - byte bytes = inputStream.readNBytes(1)[0]; - switch(bytes) { - case RespError.CODE: + byte[] firstSymbol = inputStream.readNBytes(1); + if (firstSymbol[0] == RespError.CODE){ return readError(); - case RespBulkString.CODE: + } + if(firstSymbol[0] == RespBulkString.CODE){ return readBulkString(); - case RespCommandId.CODE: + } + if(firstSymbol[0] == RespCommandId.CODE){ return readCommandId(); - case RespArray.CODE: - return readArray(); - default: - throw new IOException("Error while reading object code"); - } - }catch(IOException ex) { - throw new IOException("readobject" ,ex); } + throw new IOException("unknow byte" + new String(firstSymbol)); + } catch (IOException e){ + throw new IOException("can't read next first symbol", e); } + } + private int readInt() throws IOException { + try{ + StringBuilder size = new StringBuilder(); + byte[] sizeB = inputStream.readNBytes(1); + while (sizeB[0] != CR){ + size.append(new String(sizeB)); + sizeB = inputStream.readNBytes(1); + } + return Integer.parseInt(size.toString()); + } catch (IOException e) { + throw new IOException("IO exception in reading int", e); + } + } + /** * Считывает объект ошибки * @@ -78,37 +88,17 @@ public RespObject readObject() throws IOException { * @throws IOException при ошибке чтения */ public RespError readError() throws IOException { - if (inputStream == null) { - throw new EOFException("Why stream is null?"); - } - try { - boolean stop = false; - byte bytes = inputStream.readNBytes(1)[0]; - List errorBytes = new ArrayList<>(); - while (!stop) { - while ((bytes == CR)) { - bytes = inputStream.readNBytes(1)[0]; - if (bytes == LF) { - stop = true; - } else { - errorBytes.add(CR); -// errorBytes.add(bytes); -// bytes = inputStream.readNBytes(1)[0]; - } - } - if (!stop) { - errorBytes.add(bytes); - bytes = inputStream.readNBytes(1)[0]; - } + try{ + StringBuilder errorMessage = new StringBuilder(); + byte[] currentSymbol = inputStream.readNBytes(1); + while (currentSymbol[0] != CR){ + errorMessage.append(new String(currentSymbol)); + currentSymbol = inputStream.readNBytes(1); } - int errorBytesCount = errorBytes.size(); - byte[] errorByte = new byte[errorBytesCount]; - for (int i = 0; i < errorBytesCount; i++) { - errorByte[i] = errorBytes.get(i); - } - return new RespError(errorByte); - } catch(IOException ex) { - throw new IOException("read error",ex); + inputStream.readNBytes(1); //LF + return new RespError(errorMessage.toString().getBytes(StandardCharsets.UTF_8)); + } catch (IOException e) { + throw new IOException("IO exception in reading Error", e); } } @@ -119,22 +109,19 @@ public RespError readError() throws IOException { * @throws IOException при ошибке чтения */ public RespBulkString readBulkString() throws IOException { - if (inputStream == null) { - throw new EOFException("Why stream is null?"); - } - try { - final byte[] bytes = this.getStringNumberInBytes(); - final int bytesCount = Integer.parseInt(new String(bytes, StandardCharsets.UTF_8)); - inputStream.readNBytes(1); - if (bytesCount == RespBulkString.NULL_STRING_SIZE) { + try{ + int bulkSize = readInt(); + inputStream.readNBytes(1); //LF + if (bulkSize == -1){ return RespBulkString.NULL_STRING; } - final byte[] data = inputStream.readNBytes(bytesCount); - inputStream.readNBytes(2); - return new RespBulkString(data); - } catch (IOException ex) { - throw new IOException("RespBulk " ,ex); + byte[] bulkString = inputStream.readNBytes(bulkSize); + inputStream.readNBytes(2); //CRLF + return new RespBulkString(bulkString); + } catch (IOException e) { + throw new IOException("IO exception in reading Bulk String", e); } + } /** @@ -144,21 +131,28 @@ public RespBulkString readBulkString() throws IOException { * @throws IOException при ошибке чтения */ public RespArray readArray() throws IOException { - if (inputStream == null) { - throw new EOFException("Why stream is null?"); - } try { - final byte[] bytes = this.getStringNumberInBytes(); - final int elementsCount = Integer.parseInt(new String(bytes, StandardCharsets.UTF_8)); - final RespObject[] objects = new RespObject[elementsCount]; - inputStream.readNBytes(1); - for (int i = 0; i < elementsCount; i++) { - objects[i] = this.readObject(); + byte[] firstSymbol; + if (!isHasArray) { + firstSymbol = inputStream.readNBytes(1); + if (Arrays.equals(firstSymbol, new byte[0])){ + throw new EOFException("end of the stream"); + } else if (firstSymbol[0] != RespArray.CODE){ + throw new IOException("wrong symbol, expected " + String.valueOf(RespArray.CODE) + " but was: " + + String.valueOf(firstSymbol[0])); + } + } + int arraySize = readInt(); + inputStream.readNBytes(1); //LF + RespObject[] listObjects = new RespObject[arraySize]; + for (int i = 0; i < arraySize; i++){ + listObjects[i] = readObject(); } - return new RespArray(objects); - } catch (IOException ex) { - throw new IOException("readArray " ,ex); + return new RespArray(listObjects); + } catch (IOException e) { + throw new IOException("IO exception in reading Array", e); } + } /** @@ -168,44 +162,19 @@ public RespArray readArray() throws IOException { * @throws IOException при ошибке чтения */ public RespCommandId readCommandId() throws IOException { - if (inputStream == null) { - throw new EOFException("Why stream is null?"); - } try { - int comID = ByteBuffer.wrap(inputStream.readNBytes(4)).getInt(); - inputStream.readNBytes(2); - return new RespCommandId(comID); - } catch (IOException ex) { - throw new IOException("readCommandID " ,ex); + int commandId = readInt(); + inputStream.readNBytes(1); //LF + return new RespCommandId(commandId); + } catch (IOException e) { + throw new IOException("IO exception in reading command id", e); } } @Override public void close() throws IOException { - try { - inputStream.close(); - } catch (IOException ex) { - throw new IOException("close " ,ex); - } - } - - private byte[] getStringNumberInBytes() throws IOException { - try { - byte symbol = inputStream.readNBytes(1)[0]; - final List symboles = new ArrayList<>(); - while (symbol != CR) { - symboles.add(symbol); - symbol = inputStream.readNBytes(1)[0]; - } - final int symbolsCount = symboles.size(); - final byte[] bytes = new byte[symbolsCount]; - for (int i = 0; i < symbolsCount; i++) { - bytes[i] = symboles.get(i); - } - return bytes; - } catch (IOException ex) { - throw new IOException("getbytes", ex); - } + inputStream.close(); } } + \ No newline at end of file From 8c8af7dd66e413acc4785cf4e67ea2659dc7d0bf Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 14:58:17 +0300 Subject: [PATCH 233/378] testings --- .../com/itmo/java/protocol/RespReader.java | 201 ++++++++++-------- 1 file changed, 116 insertions(+), 85 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 4412a175..41096f72 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -9,36 +9,35 @@ import java.io.EOFException; import java.io.IOException; import java.io.InputStream; +import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; -import java.util.Arrays; +import java.util.ArrayList; +import java.util.List; public class RespReader implements AutoCloseable { - private final InputStream inputStream; - private boolean isHasArray = false; + /** * Специальные символы окончания элемента */ private static final byte CR = '\r'; private static final byte LF = '\n'; + private final InputStream inputStream; public RespReader(InputStream is) { - this.inputStream = is; + inputStream = is; } /** * Есть ли следующий массив в стриме? */ public boolean hasArray() throws IOException { - if (isHasArray) { - return true; - } - byte[] currentRespObjectType = inputStream.readNBytes(1); - if (currentRespObjectType[0] == RespArray.CODE){ - isHasArray = true; - return true; + try { + byte bytes = inputStream.readNBytes(1)[0]; + return bytes == RespArray.CODE; + } catch (IOException ex) { + throw new IOException("has array" ,ex); } - return false; } /** @@ -49,38 +48,29 @@ public boolean hasArray() throws IOException { * @throws IOException при ошибке чтения */ public RespObject readObject() throws IOException { + if (inputStream == null) { + throw new EOFException("Why stream is null?"); + } try { - byte[] firstSymbol = inputStream.readNBytes(1); - if (firstSymbol[0] == RespError.CODE){ - return readError(); - } - if(firstSymbol[0] == RespBulkString.CODE){ - return readBulkString(); + byte bytes = inputStream.readNBytes(1)[0]; + switch(bytes) { + case RespError.CODE: + return readError(); + case RespBulkString.CODE: + return readBulkString(); + case RespCommandId.CODE: + return readCommandId(); + case RespArray.CODE: + return readArray(); + default: + throw new IOException("Error while reading object code"); } - if(firstSymbol[0] == RespCommandId.CODE){ - return readCommandId(); - } - throw new IOException("unknow byte" + new String(firstSymbol)); - } catch (IOException e){ - throw new IOException("can't read next first symbol", e); + }catch(IOException ex) { + throw new IOException("readobject" ,ex); } } - private int readInt() throws IOException { - try{ - StringBuilder size = new StringBuilder(); - byte[] sizeB = inputStream.readNBytes(1); - while (sizeB[0] != CR){ - size.append(new String(sizeB)); - sizeB = inputStream.readNBytes(1); - } - return Integer.parseInt(size.toString()); - } catch (IOException e) { - throw new IOException("IO exception in reading int", e); - } - } - /** * Считывает объект ошибки * @@ -88,17 +78,37 @@ private int readInt() throws IOException { * @throws IOException при ошибке чтения */ public RespError readError() throws IOException { - try{ - StringBuilder errorMessage = new StringBuilder(); - byte[] currentSymbol = inputStream.readNBytes(1); - while (currentSymbol[0] != CR){ - errorMessage.append(new String(currentSymbol)); - currentSymbol = inputStream.readNBytes(1); + if (inputStream == null) { + throw new EOFException("Why stream is null?"); + } + try { + boolean stop = false; + byte bytes = inputStream.readNBytes(1)[0]; + List errorBytes = new ArrayList<>(); + while (!stop) { + while ((bytes == CR)) { + bytes = inputStream.readNBytes(1)[0]; + if (bytes == LF) { + stop = true; + } else { + errorBytes.add(CR); +// errorBytes.add(bytes); +// bytes = inputStream.readNBytes(1)[0]; + } + } + if (!stop) { + errorBytes.add(bytes); + bytes = inputStream.readNBytes(1)[0]; + } + } + int errorBytesCount = errorBytes.size(); + byte[] errorByte = new byte[errorBytesCount]; + for (int i = 0; i < errorBytesCount; i++) { + errorByte[i] = errorBytes.get(i); } - inputStream.readNBytes(1); //LF - return new RespError(errorMessage.toString().getBytes(StandardCharsets.UTF_8)); - } catch (IOException e) { - throw new IOException("IO exception in reading Error", e); + return new RespError(errorByte); + } catch(IOException ex) { + throw new IOException("read error",ex); } } @@ -109,19 +119,22 @@ public RespError readError() throws IOException { * @throws IOException при ошибке чтения */ public RespBulkString readBulkString() throws IOException { - try{ - int bulkSize = readInt(); - inputStream.readNBytes(1); //LF - if (bulkSize == -1){ + if (inputStream == null) { + throw new EOFException("Why stream is null?"); + } + try { + final byte[] bytes = this.getStringNumberInBytes(); + final int bytesCount = Integer.parseInt(new String(bytes, StandardCharsets.UTF_8)); + inputStream.readNBytes(1); + if (bytesCount == RespBulkString.NULL_STRING_SIZE) { return RespBulkString.NULL_STRING; } - byte[] bulkString = inputStream.readNBytes(bulkSize); - inputStream.readNBytes(2); //CRLF - return new RespBulkString(bulkString); - } catch (IOException e) { - throw new IOException("IO exception in reading Bulk String", e); + final byte[] data = inputStream.readNBytes(bytesCount); + inputStream.readNBytes(2); + return new RespBulkString(data); + } catch (IOException ex) { + throw new IOException("RespBulk " ,ex); } - } /** @@ -131,28 +144,21 @@ public RespBulkString readBulkString() throws IOException { * @throws IOException при ошибке чтения */ public RespArray readArray() throws IOException { + if (inputStream == null) { + throw new EOFException("Why stream is null?"); + } try { - byte[] firstSymbol; - if (!isHasArray) { - firstSymbol = inputStream.readNBytes(1); - if (Arrays.equals(firstSymbol, new byte[0])){ - throw new EOFException("end of the stream"); - } else if (firstSymbol[0] != RespArray.CODE){ - throw new IOException("wrong symbol, expected " + String.valueOf(RespArray.CODE) + " but was: " + - String.valueOf(firstSymbol[0])); - } - } - int arraySize = readInt(); - inputStream.readNBytes(1); //LF - RespObject[] listObjects = new RespObject[arraySize]; - for (int i = 0; i < arraySize; i++){ - listObjects[i] = readObject(); + final byte[] bytes = this.getStringNumberInBytes(); + final int elementsCount = Integer.parseInt(new String(bytes, StandardCharsets.UTF_8)); + final RespObject[] objects = new RespObject[elementsCount]; + inputStream.readNBytes(1); + for (int i = 0; i < elementsCount; i++) { + objects[i] = this.readObject(); } - return new RespArray(listObjects); - } catch (IOException e) { - throw new IOException("IO exception in reading Array", e); + return new RespArray(objects); + } catch (IOException ex) { + throw new IOException("readArray " ,ex); } - } /** @@ -162,19 +168,44 @@ public RespArray readArray() throws IOException { * @throws IOException при ошибке чтения */ public RespCommandId readCommandId() throws IOException { + if (inputStream == null) { + throw new EOFException("Why stream is null?"); + } try { - int commandId = readInt(); - inputStream.readNBytes(1); //LF - return new RespCommandId(commandId); - } catch (IOException e) { - throw new IOException("IO exception in reading command id", e); + int comID = ByteBuffer.wrap(inputStream.readNBytes(4)).getInt(); + inputStream.readNBytes(2); + return new RespCommandId(comID); + } catch (IOException ex) { + throw new IOException("readCommandID " ,ex); } } @Override public void close() throws IOException { - inputStream.close(); + try { + inputStream.close(); + } catch (IOException ex) { + throw new IOException("close " ,ex); + } + } + + private byte[] getStringNumberInBytes() throws IOException { + try { + byte symbol = inputStream.readNBytes(1)[0]; + final List symboles = new ArrayList<>(); + while (symbol != CR) { + symboles.add(symbol); + symbol = inputStream.readNBytes(1)[0]; + } + final int symbolsCount = symboles.size(); + final byte[] bytes = new byte[symbolsCount]; + for (int i = 0; i < symbolsCount; i++) { + bytes[i] = symboles.get(i); + } + return bytes; + } catch (IOException ex) { + throw new IOException("getbytes", ex); + } } -} - \ No newline at end of file +} \ No newline at end of file From 8d7dd8230114156d585dd7b98c20e002ec8d7870 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 15:02:42 +0300 Subject: [PATCH 234/378] testings reader --- .../com/itmo/java/protocol/RespReader.java | 174 +++++++----------- 1 file changed, 66 insertions(+), 108 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 41096f72..478f7909 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -32,12 +32,8 @@ public RespReader(InputStream is) { * Есть ли следующий массив в стриме? */ public boolean hasArray() throws IOException { - try { - byte bytes = inputStream.readNBytes(1)[0]; - return bytes == RespArray.CODE; - } catch (IOException ex) { - throw new IOException("has array" ,ex); - } + byte bytes = inputStream.readNBytes(1)[0]; + return bytes == RespArray.CODE; } /** @@ -51,26 +47,21 @@ public RespObject readObject() throws IOException { if (inputStream == null) { throw new EOFException("Why stream is null?"); } - try { - byte bytes = inputStream.readNBytes(1)[0]; - switch(bytes) { - case RespError.CODE: - return readError(); - case RespBulkString.CODE: - return readBulkString(); - case RespCommandId.CODE: - return readCommandId(); - case RespArray.CODE: - return readArray(); - default: - throw new IOException("Error while reading object code"); - } - }catch(IOException ex) { - throw new IOException("readobject" ,ex); + byte bytes = inputStream.readNBytes(1)[0]; + switch(bytes) { + case RespError.CODE: + return readError(); + case RespBulkString.CODE: + return readBulkString(); + case RespCommandId.CODE: + return readCommandId(); + case RespArray.CODE: + return readArray(); + default: + throw new IOException("Error while reading object code"); } } - /** * Считывает объект ошибки * @@ -78,38 +69,34 @@ public RespObject readObject() throws IOException { * @throws IOException при ошибке чтения */ public RespError readError() throws IOException { - if (inputStream == null) { - throw new EOFException("Why stream is null?"); - } - try { - boolean stop = false; - byte bytes = inputStream.readNBytes(1)[0]; - List errorBytes = new ArrayList<>(); - while (!stop) { - while ((bytes == CR)) { - bytes = inputStream.readNBytes(1)[0]; - if (bytes == LF) { - stop = true; - } else { - errorBytes.add(CR); +// if (inputStream == null) { +// throw new EOFException("Why stream is null?"); +// } + boolean stop = false; + byte bytes = inputStream.readNBytes(1)[0]; + List errorBytes = new ArrayList<>(); + while (!stop) { + while ((bytes == CR)) { + bytes = inputStream.readNBytes(1)[0]; + if (bytes == LF) { + stop = true; + } else { + errorBytes.add(CR); // errorBytes.add(bytes); // bytes = inputStream.readNBytes(1)[0]; - } - } - if (!stop) { - errorBytes.add(bytes); - bytes = inputStream.readNBytes(1)[0]; } } - int errorBytesCount = errorBytes.size(); - byte[] errorByte = new byte[errorBytesCount]; - for (int i = 0; i < errorBytesCount; i++) { - errorByte[i] = errorBytes.get(i); + if (!stop) { + errorBytes.add(bytes); + bytes = inputStream.readNBytes(1)[0]; } - return new RespError(errorByte); - } catch(IOException ex) { - throw new IOException("read error",ex); } + int errorBytesCount = errorBytes.size(); + byte[] errorByte = new byte[errorBytesCount]; + for (int i = 0; i < errorBytesCount; i++) { + errorByte[i] = errorBytes.get(i); + } + return new RespError(errorByte); } /** @@ -119,22 +106,15 @@ public RespError readError() throws IOException { * @throws IOException при ошибке чтения */ public RespBulkString readBulkString() throws IOException { - if (inputStream == null) { - throw new EOFException("Why stream is null?"); - } - try { - final byte[] bytes = this.getStringNumberInBytes(); - final int bytesCount = Integer.parseInt(new String(bytes, StandardCharsets.UTF_8)); - inputStream.readNBytes(1); - if (bytesCount == RespBulkString.NULL_STRING_SIZE) { - return RespBulkString.NULL_STRING; - } - final byte[] data = inputStream.readNBytes(bytesCount); - inputStream.readNBytes(2); - return new RespBulkString(data); - } catch (IOException ex) { - throw new IOException("RespBulk " ,ex); + final byte[] bytes = this.getStringNumberInBytes(); + final int bytesCount = Integer.parseInt(new String(bytes, StandardCharsets.UTF_8)); + inputStream.readNBytes(1); + if (bytesCount == RespBulkString.NULL_STRING_SIZE) { + return RespBulkString.NULL_STRING; } + final byte[] data = inputStream.readNBytes(bytesCount); + inputStream.readNBytes(2); + return new RespBulkString(data); } /** @@ -144,21 +124,14 @@ public RespBulkString readBulkString() throws IOException { * @throws IOException при ошибке чтения */ public RespArray readArray() throws IOException { - if (inputStream == null) { - throw new EOFException("Why stream is null?"); - } - try { - final byte[] bytes = this.getStringNumberInBytes(); - final int elementsCount = Integer.parseInt(new String(bytes, StandardCharsets.UTF_8)); - final RespObject[] objects = new RespObject[elementsCount]; - inputStream.readNBytes(1); - for (int i = 0; i < elementsCount; i++) { - objects[i] = this.readObject(); - } - return new RespArray(objects); - } catch (IOException ex) { - throw new IOException("readArray " ,ex); + final byte[] bytes = this.getStringNumberInBytes(); + final int elementsCount = Integer.parseInt(new String(bytes, StandardCharsets.UTF_8)); + final RespObject[] objects = new RespObject[elementsCount]; + inputStream.readNBytes(1); + for (int i = 0; i < elementsCount; i++) { + objects[i] = this.readObject(); } + return new RespArray(objects); } /** @@ -168,44 +141,29 @@ public RespArray readArray() throws IOException { * @throws IOException при ошибке чтения */ public RespCommandId readCommandId() throws IOException { - if (inputStream == null) { - throw new EOFException("Why stream is null?"); - } - try { - int comID = ByteBuffer.wrap(inputStream.readNBytes(4)).getInt(); - inputStream.readNBytes(2); - return new RespCommandId(comID); - } catch (IOException ex) { - throw new IOException("readCommandID " ,ex); - } + int comID = ByteBuffer.wrap(inputStream.readNBytes(4)).getInt(); + inputStream.readNBytes(2); + return new RespCommandId(comID); } @Override public void close() throws IOException { - try { - inputStream.close(); - } catch (IOException ex) { - throw new IOException("close " ,ex); - } + inputStream.close(); } private byte[] getStringNumberInBytes() throws IOException { - try { - byte symbol = inputStream.readNBytes(1)[0]; - final List symboles = new ArrayList<>(); - while (symbol != CR) { - symboles.add(symbol); - symbol = inputStream.readNBytes(1)[0]; - } - final int symbolsCount = symboles.size(); - final byte[] bytes = new byte[symbolsCount]; - for (int i = 0; i < symbolsCount; i++) { - bytes[i] = symboles.get(i); - } - return bytes; - } catch (IOException ex) { - throw new IOException("getbytes", ex); + byte symbol = inputStream.readNBytes(1)[0]; + final List symboles = new ArrayList<>(); + while (symbol != CR) { + symboles.add(symbol); + symbol = inputStream.readNBytes(1)[0]; + } + final int symbolsCount = symboles.size(); + final byte[] bytes = new byte[symbolsCount]; + for (int i = 0; i < symbolsCount; i++) { + bytes[i] = symboles.get(i); } + return bytes; } } \ No newline at end of file From 5ddae8e6add83d77b7127997b84009fa5bc941c5 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 15:05:37 +0300 Subject: [PATCH 235/378] testing readers --- .../com/itmo/java/protocol/RespReader.java | 167 ++++++++++-------- 1 file changed, 90 insertions(+), 77 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 478f7909..bed322d3 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -12,28 +12,36 @@ import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; public class RespReader implements AutoCloseable { - + private final InputStream is; + private boolean isHasArray = false; /** * Специальные символы окончания элемента */ private static final byte CR = '\r'; private static final byte LF = '\n'; - private final InputStream inputStream; public RespReader(InputStream is) { - inputStream = is; + this.is = is; } /** * Есть ли следующий массив в стриме? */ public boolean hasArray() throws IOException { - byte bytes = inputStream.readNBytes(1)[0]; - return bytes == RespArray.CODE; + if (isHasArray) { + return true; + } + byte[] currentRespObjectType = is.readNBytes(1); + if (currentRespObjectType[0] == RespArray.CODE){ + isHasArray = true; + return true; + } + return false; } /** @@ -44,21 +52,35 @@ public boolean hasArray() throws IOException { * @throws IOException при ошибке чтения */ public RespObject readObject() throws IOException { - if (inputStream == null) { - throw new EOFException("Why stream is null?"); - } - byte bytes = inputStream.readNBytes(1)[0]; - switch(bytes) { - case RespError.CODE: + try { + byte[] firstSymbol = is.readNBytes(1); + if (firstSymbol[0] == RespError.CODE){ return readError(); - case RespBulkString.CODE: + } + if(firstSymbol[0] == RespBulkString.CODE){ return readBulkString(); - case RespCommandId.CODE: + } + if(firstSymbol[0] == RespCommandId.CODE){ return readCommandId(); - case RespArray.CODE: - return readArray(); - default: - throw new IOException("Error while reading object code"); + } + throw new IOException("unknow byte" + new String(firstSymbol)); + } catch (IOException e){ + throw new IOException("can't read next first symbol", e); + } + } + + + private int readInt() throws IOException { + try{ + StringBuilder size = new StringBuilder(); + byte[] sizeB = is.readNBytes(1); + while (sizeB[0] != CR){ + size.append(new String(sizeB)); + sizeB = is.readNBytes(1); + } + return Integer.parseInt(size.toString()); + } catch (IOException e) { + throw new IOException("IO exception in reading int", e); } } @@ -69,34 +91,18 @@ public RespObject readObject() throws IOException { * @throws IOException при ошибке чтения */ public RespError readError() throws IOException { -// if (inputStream == null) { -// throw new EOFException("Why stream is null?"); -// } - boolean stop = false; - byte bytes = inputStream.readNBytes(1)[0]; - List errorBytes = new ArrayList<>(); - while (!stop) { - while ((bytes == CR)) { - bytes = inputStream.readNBytes(1)[0]; - if (bytes == LF) { - stop = true; - } else { - errorBytes.add(CR); -// errorBytes.add(bytes); -// bytes = inputStream.readNBytes(1)[0]; - } + try{ + StringBuilder errorMessage = new StringBuilder(); + byte[] currentSymbol = is.readNBytes(1); + while (currentSymbol[0] != CR){ + errorMessage.append(new String(currentSymbol)); + currentSymbol = is.readNBytes(1); } - if (!stop) { - errorBytes.add(bytes); - bytes = inputStream.readNBytes(1)[0]; - } - } - int errorBytesCount = errorBytes.size(); - byte[] errorByte = new byte[errorBytesCount]; - for (int i = 0; i < errorBytesCount; i++) { - errorByte[i] = errorBytes.get(i); + is.readNBytes(1); //LF + return new RespError(errorMessage.toString().getBytes(StandardCharsets.UTF_8)); + } catch (IOException e) { + throw new IOException("IO exception in reading Error", e); } - return new RespError(errorByte); } /** @@ -106,15 +112,19 @@ public RespError readError() throws IOException { * @throws IOException при ошибке чтения */ public RespBulkString readBulkString() throws IOException { - final byte[] bytes = this.getStringNumberInBytes(); - final int bytesCount = Integer.parseInt(new String(bytes, StandardCharsets.UTF_8)); - inputStream.readNBytes(1); - if (bytesCount == RespBulkString.NULL_STRING_SIZE) { - return RespBulkString.NULL_STRING; + try{ + int bulkSize = readInt(); + is.readNBytes(1); //LF + if (bulkSize == -1){ + return RespBulkString.NULL_STRING; + } + byte[] bulkString = is.readNBytes(bulkSize); + is.readNBytes(2); //CRLF + return new RespBulkString(bulkString); + } catch (IOException e) { + throw new IOException("IO exception in reading Bulk String", e); } - final byte[] data = inputStream.readNBytes(bytesCount); - inputStream.readNBytes(2); - return new RespBulkString(data); + } /** @@ -124,14 +134,28 @@ public RespBulkString readBulkString() throws IOException { * @throws IOException при ошибке чтения */ public RespArray readArray() throws IOException { - final byte[] bytes = this.getStringNumberInBytes(); - final int elementsCount = Integer.parseInt(new String(bytes, StandardCharsets.UTF_8)); - final RespObject[] objects = new RespObject[elementsCount]; - inputStream.readNBytes(1); - for (int i = 0; i < elementsCount; i++) { - objects[i] = this.readObject(); + try { + byte[] firstSymbol; + if (!isHasArray) { + firstSymbol = is.readNBytes(1); + if (Arrays.equals(firstSymbol, new byte[0])){ + throw new EOFException("end of the stream"); + } else if (firstSymbol[0] != RespArray.CODE){ + throw new IOException("wrong symbol, expected " + String.valueOf(RespArray.CODE) + " but was: " + + String.valueOf(firstSymbol[0])); + } + } + int arraySize = readInt(); + is.readNBytes(1); //LF + RespObject[] listObjects = new RespObject[arraySize]; + for (int i = 0; i < arraySize; i++){ + listObjects[i] = readObject(); + } + return new RespArray(listObjects); + } catch (IOException e) { + throw new IOException("IO exception in reading Array", e); } - return new RespArray(objects); + } /** @@ -141,29 +165,18 @@ public RespArray readArray() throws IOException { * @throws IOException при ошибке чтения */ public RespCommandId readCommandId() throws IOException { - int comID = ByteBuffer.wrap(inputStream.readNBytes(4)).getInt(); - inputStream.readNBytes(2); - return new RespCommandId(comID); + try { + int commandId = readInt(); + is.readNBytes(1); //LF + return new RespCommandId(commandId); + } catch (IOException e) { + throw new IOException("IO exception in reading command id", e); + } } @Override public void close() throws IOException { - inputStream.close(); - } - - private byte[] getStringNumberInBytes() throws IOException { - byte symbol = inputStream.readNBytes(1)[0]; - final List symboles = new ArrayList<>(); - while (symbol != CR) { - symboles.add(symbol); - symbol = inputStream.readNBytes(1)[0]; - } - final int symbolsCount = symboles.size(); - final byte[] bytes = new byte[symbolsCount]; - for (int i = 0; i < symbolsCount; i++) { - bytes[i] = symboles.get(i); - } - return bytes; + is.close(); } } \ No newline at end of file From 202992398791de3b2180fb848e2c293d9a779d3d Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Tue, 8 Jun 2021 15:08:55 +0300 Subject: [PATCH 236/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/itmo/java/protocol/RespReader.java | 167 ++++++++---------- 1 file changed, 77 insertions(+), 90 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index bed322d3..478f7909 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -12,36 +12,28 @@ import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; public class RespReader implements AutoCloseable { - private final InputStream is; - private boolean isHasArray = false; + /** * Специальные символы окончания элемента */ private static final byte CR = '\r'; private static final byte LF = '\n'; + private final InputStream inputStream; public RespReader(InputStream is) { - this.is = is; + inputStream = is; } /** * Есть ли следующий массив в стриме? */ public boolean hasArray() throws IOException { - if (isHasArray) { - return true; - } - byte[] currentRespObjectType = is.readNBytes(1); - if (currentRespObjectType[0] == RespArray.CODE){ - isHasArray = true; - return true; - } - return false; + byte bytes = inputStream.readNBytes(1)[0]; + return bytes == RespArray.CODE; } /** @@ -52,35 +44,21 @@ public boolean hasArray() throws IOException { * @throws IOException при ошибке чтения */ public RespObject readObject() throws IOException { - try { - byte[] firstSymbol = is.readNBytes(1); - if (firstSymbol[0] == RespError.CODE){ + if (inputStream == null) { + throw new EOFException("Why stream is null?"); + } + byte bytes = inputStream.readNBytes(1)[0]; + switch(bytes) { + case RespError.CODE: return readError(); - } - if(firstSymbol[0] == RespBulkString.CODE){ + case RespBulkString.CODE: return readBulkString(); - } - if(firstSymbol[0] == RespCommandId.CODE){ + case RespCommandId.CODE: return readCommandId(); - } - throw new IOException("unknow byte" + new String(firstSymbol)); - } catch (IOException e){ - throw new IOException("can't read next first symbol", e); - } - } - - - private int readInt() throws IOException { - try{ - StringBuilder size = new StringBuilder(); - byte[] sizeB = is.readNBytes(1); - while (sizeB[0] != CR){ - size.append(new String(sizeB)); - sizeB = is.readNBytes(1); - } - return Integer.parseInt(size.toString()); - } catch (IOException e) { - throw new IOException("IO exception in reading int", e); + case RespArray.CODE: + return readArray(); + default: + throw new IOException("Error while reading object code"); } } @@ -91,18 +69,34 @@ private int readInt() throws IOException { * @throws IOException при ошибке чтения */ public RespError readError() throws IOException { - try{ - StringBuilder errorMessage = new StringBuilder(); - byte[] currentSymbol = is.readNBytes(1); - while (currentSymbol[0] != CR){ - errorMessage.append(new String(currentSymbol)); - currentSymbol = is.readNBytes(1); +// if (inputStream == null) { +// throw new EOFException("Why stream is null?"); +// } + boolean stop = false; + byte bytes = inputStream.readNBytes(1)[0]; + List errorBytes = new ArrayList<>(); + while (!stop) { + while ((bytes == CR)) { + bytes = inputStream.readNBytes(1)[0]; + if (bytes == LF) { + stop = true; + } else { + errorBytes.add(CR); +// errorBytes.add(bytes); +// bytes = inputStream.readNBytes(1)[0]; + } } - is.readNBytes(1); //LF - return new RespError(errorMessage.toString().getBytes(StandardCharsets.UTF_8)); - } catch (IOException e) { - throw new IOException("IO exception in reading Error", e); + if (!stop) { + errorBytes.add(bytes); + bytes = inputStream.readNBytes(1)[0]; + } + } + int errorBytesCount = errorBytes.size(); + byte[] errorByte = new byte[errorBytesCount]; + for (int i = 0; i < errorBytesCount; i++) { + errorByte[i] = errorBytes.get(i); } + return new RespError(errorByte); } /** @@ -112,19 +106,15 @@ public RespError readError() throws IOException { * @throws IOException при ошибке чтения */ public RespBulkString readBulkString() throws IOException { - try{ - int bulkSize = readInt(); - is.readNBytes(1); //LF - if (bulkSize == -1){ - return RespBulkString.NULL_STRING; - } - byte[] bulkString = is.readNBytes(bulkSize); - is.readNBytes(2); //CRLF - return new RespBulkString(bulkString); - } catch (IOException e) { - throw new IOException("IO exception in reading Bulk String", e); + final byte[] bytes = this.getStringNumberInBytes(); + final int bytesCount = Integer.parseInt(new String(bytes, StandardCharsets.UTF_8)); + inputStream.readNBytes(1); + if (bytesCount == RespBulkString.NULL_STRING_SIZE) { + return RespBulkString.NULL_STRING; } - + final byte[] data = inputStream.readNBytes(bytesCount); + inputStream.readNBytes(2); + return new RespBulkString(data); } /** @@ -134,28 +124,14 @@ public RespBulkString readBulkString() throws IOException { * @throws IOException при ошибке чтения */ public RespArray readArray() throws IOException { - try { - byte[] firstSymbol; - if (!isHasArray) { - firstSymbol = is.readNBytes(1); - if (Arrays.equals(firstSymbol, new byte[0])){ - throw new EOFException("end of the stream"); - } else if (firstSymbol[0] != RespArray.CODE){ - throw new IOException("wrong symbol, expected " + String.valueOf(RespArray.CODE) + " but was: " + - String.valueOf(firstSymbol[0])); - } - } - int arraySize = readInt(); - is.readNBytes(1); //LF - RespObject[] listObjects = new RespObject[arraySize]; - for (int i = 0; i < arraySize; i++){ - listObjects[i] = readObject(); - } - return new RespArray(listObjects); - } catch (IOException e) { - throw new IOException("IO exception in reading Array", e); + final byte[] bytes = this.getStringNumberInBytes(); + final int elementsCount = Integer.parseInt(new String(bytes, StandardCharsets.UTF_8)); + final RespObject[] objects = new RespObject[elementsCount]; + inputStream.readNBytes(1); + for (int i = 0; i < elementsCount; i++) { + objects[i] = this.readObject(); } - + return new RespArray(objects); } /** @@ -165,18 +141,29 @@ public RespArray readArray() throws IOException { * @throws IOException при ошибке чтения */ public RespCommandId readCommandId() throws IOException { - try { - int commandId = readInt(); - is.readNBytes(1); //LF - return new RespCommandId(commandId); - } catch (IOException e) { - throw new IOException("IO exception in reading command id", e); - } + int comID = ByteBuffer.wrap(inputStream.readNBytes(4)).getInt(); + inputStream.readNBytes(2); + return new RespCommandId(comID); } @Override public void close() throws IOException { - is.close(); + inputStream.close(); + } + + private byte[] getStringNumberInBytes() throws IOException { + byte symbol = inputStream.readNBytes(1)[0]; + final List symboles = new ArrayList<>(); + while (symbol != CR) { + symboles.add(symbol); + symbol = inputStream.readNBytes(1)[0]; + } + final int symbolsCount = symboles.size(); + final byte[] bytes = new byte[symbolsCount]; + for (int i = 0; i < symbolsCount; i++) { + bytes[i] = symboles.get(i); + } + return bytes; } } \ No newline at end of file From 351d238120e8107118f89886aae3de077cddbc0a Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 00:12:44 +0300 Subject: [PATCH 237/378] testing reader --- .../com/itmo/java/protocol/RespReader.java | 201 +++++++++++------- 1 file changed, 121 insertions(+), 80 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 478f7909..12095481 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -9,31 +9,35 @@ import java.io.EOFException; import java.io.IOException; import java.io.InputStream; -import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.List; public class RespReader implements AutoCloseable { - + private final InputStream is; + private boolean isHasArray = false; /** * Специальные символы окончания элемента */ private static final byte CR = '\r'; private static final byte LF = '\n'; - private final InputStream inputStream; public RespReader(InputStream is) { - inputStream = is; + this.is = is; } /** * Есть ли следующий массив в стриме? */ public boolean hasArray() throws IOException { - byte bytes = inputStream.readNBytes(1)[0]; - return bytes == RespArray.CODE; + if (isHasArray) { + return true; + } + byte[] currentRespObjectType = is.readNBytes(1); + if (currentRespObjectType[0] == RespArray.CODE){ + isHasArray = true; + return true; + } + return false; } /** @@ -44,21 +48,48 @@ public boolean hasArray() throws IOException { * @throws IOException при ошибке чтения */ public RespObject readObject() throws IOException { - if (inputStream == null) { - throw new EOFException("Why stream is null?"); - } - byte bytes = inputStream.readNBytes(1)[0]; - switch(bytes) { - case RespError.CODE: + try { + byte[] firstSymbol = is.readNBytes(1); + if (firstSymbol.length == 0){ + throw new EOFException("end of the stream"); + } + if (firstSymbol[0] == RespError.CODE){ return readError(); - case RespBulkString.CODE: + } + if(firstSymbol[0] == RespBulkString.CODE){ return readBulkString(); - case RespCommandId.CODE: + } + if(firstSymbol[0] == RespCommandId.CODE){ return readCommandId(); - case RespArray.CODE: - return readArray(); - default: - throw new IOException("Error while reading object code"); + } + throw new IOException("unknown byte" + new String(firstSymbol)); + } catch (IOException e){ + throw new IOException("exception in reading object", e); + } + } + + + private int readInt() throws IOException { + try{ + StringBuilder size = new StringBuilder(); + byte[] sizeByte = is.readNBytes(1); + if (sizeByte.length == 0){ + throw new EOFException("end of the stream"); + } + while (sizeByte[0] != CR){ + size.append(new String(sizeByte)); + sizeByte = is.readNBytes(1); + if (sizeByte.length == 0){ + throw new EOFException("end of the stream"); + } + } + try { + return Integer.parseInt(size.toString()); + } catch (NumberFormatException e) { + throw new IOException("expected reading int from this string: " + size.toString()); + } + } catch (IOException e) { + throw new IOException("IO exception in reading int", e); } } @@ -69,34 +100,24 @@ public RespObject readObject() throws IOException { * @throws IOException при ошибке чтения */ public RespError readError() throws IOException { -// if (inputStream == null) { -// throw new EOFException("Why stream is null?"); -// } - boolean stop = false; - byte bytes = inputStream.readNBytes(1)[0]; - List errorBytes = new ArrayList<>(); - while (!stop) { - while ((bytes == CR)) { - bytes = inputStream.readNBytes(1)[0]; - if (bytes == LF) { - stop = true; - } else { - errorBytes.add(CR); -// errorBytes.add(bytes); -// bytes = inputStream.readNBytes(1)[0]; - } + try{ + StringBuilder errorMessage = new StringBuilder(); + byte[] currentSymbol = is.readNBytes(1); + if (currentSymbol.length == 0){ + throw new EOFException("end of the stream"); } - if (!stop) { - errorBytes.add(bytes); - bytes = inputStream.readNBytes(1)[0]; + while (currentSymbol[0] != CR){ + errorMessage.append(new String(currentSymbol)); + currentSymbol = is.readNBytes(1); + if (currentSymbol.length == 0){ + throw new EOFException("end of the stream"); + } } + readCompareByte(LF); + return new RespError(errorMessage.toString().getBytes(StandardCharsets.UTF_8)); + } catch (IOException e) { + throw new IOException("IO exception in reading Error", e); } - int errorBytesCount = errorBytes.size(); - byte[] errorByte = new byte[errorBytesCount]; - for (int i = 0; i < errorBytesCount; i++) { - errorByte[i] = errorBytes.get(i); - } - return new RespError(errorByte); } /** @@ -106,15 +127,20 @@ public RespError readError() throws IOException { * @throws IOException при ошибке чтения */ public RespBulkString readBulkString() throws IOException { - final byte[] bytes = this.getStringNumberInBytes(); - final int bytesCount = Integer.parseInt(new String(bytes, StandardCharsets.UTF_8)); - inputStream.readNBytes(1); - if (bytesCount == RespBulkString.NULL_STRING_SIZE) { - return RespBulkString.NULL_STRING; + try{ + int bulkSize = readInt(); + readCompareByte(LF); + if (bulkSize == -1){ + return RespBulkString.NULL_STRING; + } + byte[] bulkString = is.readNBytes(bulkSize); + readCompareByte(CR); + readCompareByte(LF); + return new RespBulkString(bulkString); + } catch (IOException e) { + throw new IOException("IO exception in reading Bulk String", e); } - final byte[] data = inputStream.readNBytes(bytesCount); - inputStream.readNBytes(2); - return new RespBulkString(data); + } /** @@ -124,14 +150,21 @@ public RespBulkString readBulkString() throws IOException { * @throws IOException при ошибке чтения */ public RespArray readArray() throws IOException { - final byte[] bytes = this.getStringNumberInBytes(); - final int elementsCount = Integer.parseInt(new String(bytes, StandardCharsets.UTF_8)); - final RespObject[] objects = new RespObject[elementsCount]; - inputStream.readNBytes(1); - for (int i = 0; i < elementsCount; i++) { - objects[i] = this.readObject(); + try { + if (!isHasArray) { + readCompareByte(RespArray.CODE); + } + int arraySize = readInt(); + readCompareByte(LF); + RespObject[] listObjects = new RespObject[arraySize]; + for (int i = 0; i < arraySize; i++){ + listObjects[i] = readObject(); + } + return new RespArray(listObjects); + } catch (IOException e) { + throw new IOException("IO exception in reading Array", e); } - return new RespArray(objects); + } /** @@ -141,29 +174,37 @@ public RespArray readArray() throws IOException { * @throws IOException при ошибке чтения */ public RespCommandId readCommandId() throws IOException { - int comID = ByteBuffer.wrap(inputStream.readNBytes(4)).getInt(); - inputStream.readNBytes(2); - return new RespCommandId(comID); + try { + byte[] commandId1 = is.readNBytes(1); + byte[] commandId2 = is.readNBytes(1); + byte[] commandId3 = is.readNBytes(1); + byte[] commandId4 = is.readNBytes(1); + int commandId = ((commandId1[0] << 24) + (commandId2[0]<< 16) + (commandId3[0] << 8) + (commandId4[0] << 0)); + readCompareByte(CR); + readCompareByte(LF); + return new RespCommandId(commandId); + } catch (IOException e) { + throw new IOException("IO exception in reading command id", e); + } + } + + private void readCompareByte(byte compareWith) throws IOException { + byte[] nextByte; + try { + nextByte = is.readNBytes(1); + if (nextByte.length == 0){ + throw new EOFException("end of the stream"); + } else if (nextByte[0] != compareWith) { + throw new IOException("expected symbol: " + String.valueOf(compareWith) + " but get: " + String.valueOf(nextByte[0])); + } + } catch (IOException e) { + throw new IOException("IO exception in reading byte", e); + } } @Override public void close() throws IOException { - inputStream.close(); - } - - private byte[] getStringNumberInBytes() throws IOException { - byte symbol = inputStream.readNBytes(1)[0]; - final List symboles = new ArrayList<>(); - while (symbol != CR) { - symboles.add(symbol); - symbol = inputStream.readNBytes(1)[0]; - } - final int symbolsCount = symboles.size(); - final byte[] bytes = new byte[symbolsCount]; - for (int i = 0; i < symbolsCount; i++) { - bytes[i] = symboles.get(i); - } - return bytes; + is.close(); } -} \ No newline at end of file +} From 50d390a102e6a05ea9d4b9d0433b03fa466d5650 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 00:15:02 +0300 Subject: [PATCH 238/378] fix resp array --- src/main/java/com/itmo/java/protocol/model/RespArray.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/protocol/model/RespArray.java b/src/main/java/com/itmo/java/protocol/model/RespArray.java index d4799edf..6b10269f 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespArray.java +++ b/src/main/java/com/itmo/java/protocol/model/RespArray.java @@ -39,7 +39,7 @@ public boolean isError() { */ @Override public String asString() { - return objects.stream().map(object -> asString()).collect(Collectors.joining(" ")); + return objects.stream().map(RespObject::asString).collect(Collectors.joining(" ")); } // check @Override From ade738fb82b5b22e4d5c22af9fbe3f22ee4d3ba5 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 00:17:34 +0300 Subject: [PATCH 239/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/itmo/java/protocol/RespReader.java | 212 ++++++++---------- 1 file changed, 95 insertions(+), 117 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 12095481..dcc36317 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -9,11 +9,13 @@ import java.io.EOFException; import java.io.IOException; import java.io.InputStream; +import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; public class RespReader implements AutoCloseable { private final InputStream is; - private boolean isHasArray = false; /** * Специальные символы окончания элемента @@ -29,15 +31,9 @@ public RespReader(InputStream is) { * Есть ли следующий массив в стриме? */ public boolean hasArray() throws IOException { - if (isHasArray) { - return true; - } - byte[] currentRespObjectType = is.readNBytes(1); - if (currentRespObjectType[0] == RespArray.CODE){ - isHasArray = true; - return true; - } - return false; + final byte code = is.readNBytes(1)[0]; + + return code == RespArray.CODE; } /** @@ -48,48 +44,19 @@ public boolean hasArray() throws IOException { * @throws IOException при ошибке чтения */ public RespObject readObject() throws IOException { - try { - byte[] firstSymbol = is.readNBytes(1); - if (firstSymbol.length == 0){ - throw new EOFException("end of the stream"); - } - if (firstSymbol[0] == RespError.CODE){ - return readError(); - } - if(firstSymbol[0] == RespBulkString.CODE){ - return readBulkString(); - } - if(firstSymbol[0] == RespCommandId.CODE){ - return readCommandId(); - } - throw new IOException("unknown byte" + new String(firstSymbol)); - } catch (IOException e){ - throw new IOException("exception in reading object", e); - } - } - - - private int readInt() throws IOException { - try{ - StringBuilder size = new StringBuilder(); - byte[] sizeByte = is.readNBytes(1); - if (sizeByte.length == 0){ - throw new EOFException("end of the stream"); - } - while (sizeByte[0] != CR){ - size.append(new String(sizeByte)); - sizeByte = is.readNBytes(1); - if (sizeByte.length == 0){ - throw new EOFException("end of the stream"); - } - } - try { - return Integer.parseInt(size.toString()); - } catch (NumberFormatException e) { - throw new IOException("expected reading int from this string: " + size.toString()); - } - } catch (IOException e) { - throw new IOException("IO exception in reading int", e); + final byte code = is.readNBytes(1)[0]; + + switch (code) { + case RespError.CODE: + return this.readError(); + case RespBulkString.CODE: + return this.readBulkString(); + case RespArray.CODE: + return this.readArray(); + case RespCommandId.CODE: + return this.readCommandId(); + default: + throw new IOException("Wrong object code"); } } @@ -100,24 +67,38 @@ private int readInt() throws IOException { * @throws IOException при ошибке чтения */ public RespError readError() throws IOException { - try{ - StringBuilder errorMessage = new StringBuilder(); - byte[] currentSymbol = is.readNBytes(1); - if (currentSymbol.length == 0){ - throw new EOFException("end of the stream"); - } - while (currentSymbol[0] != CR){ - errorMessage.append(new String(currentSymbol)); - currentSymbol = is.readNBytes(1); - if (currentSymbol.length == 0){ - throw new EOFException("end of the stream"); + byte symbol = is.readNBytes(1)[0]; + + final List symbols = new ArrayList<>(); + + boolean isEndOfError = false; + + while (!isEndOfError) { + while (symbol == CR) { + symbol = is.readNBytes(1)[0]; + + if (symbol == LF) { + isEndOfError = true; + } else { + symbols.add(CR); } } - readCompareByte(LF); - return new RespError(errorMessage.toString().getBytes(StandardCharsets.UTF_8)); - } catch (IOException e) { - throw new IOException("IO exception in reading Error", e); + + if (!isEndOfError) { + symbols.add(symbol); + symbol = is.readNBytes(1)[0]; + } + } + + final int symbolsCount = symbols.size(); + + final byte[] bytes = new byte[symbolsCount]; + + for (int i = 0; i < symbolsCount; i++) { + bytes[i] = symbols.get(i); } + + return new RespError(bytes); } /** @@ -127,20 +108,20 @@ public RespError readError() throws IOException { * @throws IOException при ошибке чтения */ public RespBulkString readBulkString() throws IOException { - try{ - int bulkSize = readInt(); - readCompareByte(LF); - if (bulkSize == -1){ - return RespBulkString.NULL_STRING; - } - byte[] bulkString = is.readNBytes(bulkSize); - readCompareByte(CR); - readCompareByte(LF); - return new RespBulkString(bulkString); - } catch (IOException e) { - throw new IOException("IO exception in reading Bulk String", e); + final byte[] bytes = this.getStringNumberInBytes(); + final int bytesCount = Integer.parseInt(new String(bytes, StandardCharsets.UTF_8)); + + is.readNBytes(1); + + if (bytesCount == RespBulkString.NULL_STRING_SIZE) { + return RespBulkString.NULL_STRING; } + final byte[] data = is.readNBytes(bytesCount); + + is.readNBytes(2); + + return new RespBulkString(data); } /** @@ -150,21 +131,18 @@ public RespBulkString readBulkString() throws IOException { * @throws IOException при ошибке чтения */ public RespArray readArray() throws IOException { - try { - if (!isHasArray) { - readCompareByte(RespArray.CODE); - } - int arraySize = readInt(); - readCompareByte(LF); - RespObject[] listObjects = new RespObject[arraySize]; - for (int i = 0; i < arraySize; i++){ - listObjects[i] = readObject(); - } - return new RespArray(listObjects); - } catch (IOException e) { - throw new IOException("IO exception in reading Array", e); + final byte[] bytes = this.getStringNumberInBytes(); + final int elementsCount = Integer.parseInt(new String(bytes, StandardCharsets.UTF_8)); + + final RespObject[] objects = new RespObject[elementsCount]; + + is.readNBytes(1); + + for (int i = 0; i < elementsCount; i++) { + objects[i] = this.readObject(); } + return new RespArray(objects); } /** @@ -174,32 +152,11 @@ public RespArray readArray() throws IOException { * @throws IOException при ошибке чтения */ public RespCommandId readCommandId() throws IOException { - try { - byte[] commandId1 = is.readNBytes(1); - byte[] commandId2 = is.readNBytes(1); - byte[] commandId3 = is.readNBytes(1); - byte[] commandId4 = is.readNBytes(1); - int commandId = ((commandId1[0] << 24) + (commandId2[0]<< 16) + (commandId3[0] << 8) + (commandId4[0] << 0)); - readCompareByte(CR); - readCompareByte(LF); - return new RespCommandId(commandId); - } catch (IOException e) { - throw new IOException("IO exception in reading command id", e); - } - } + final int commandId = ByteBuffer.wrap(is.readNBytes(4)).getInt(); - private void readCompareByte(byte compareWith) throws IOException { - byte[] nextByte; - try { - nextByte = is.readNBytes(1); - if (nextByte.length == 0){ - throw new EOFException("end of the stream"); - } else if (nextByte[0] != compareWith) { - throw new IOException("expected symbol: " + String.valueOf(compareWith) + " but get: " + String.valueOf(nextByte[0])); - } - } catch (IOException e) { - throw new IOException("IO exception in reading byte", e); - } + is.readNBytes(2); + + return new RespCommandId(commandId); } @@ -207,4 +164,25 @@ private void readCompareByte(byte compareWith) throws IOException { public void close() throws IOException { is.close(); } + + private byte[] getStringNumberInBytes() throws IOException { + byte symbol = is.readNBytes(1)[0]; + + final List symbols = new ArrayList<>(); + + while (symbol != CR) { + symbols.add(symbol); + symbol = is.readNBytes(1)[0]; + } + + final int symbolsCount = symbols.size(); + + final byte[] bytes = new byte[symbolsCount]; + + for (int i = 0; i < symbolsCount; i++) { + bytes[i] = symbols.get(i); + } + + return bytes; + } } From 2b32997c533d154ba4b3fd7d11e00429fabda5e4 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 00:29:20 +0300 Subject: [PATCH 240/378] RespReader hasArray --- .../java/com/itmo/java/protocol/RespReader.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index dcc36317..a0a95bdf 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -16,6 +16,7 @@ public class RespReader implements AutoCloseable { private final InputStream is; + private boolean ishasArray = false; /** * Специальные символы окончания элемента @@ -31,9 +32,15 @@ public RespReader(InputStream is) { * Есть ли следующий массив в стриме? */ public boolean hasArray() throws IOException { - final byte code = is.readNBytes(1)[0]; - - return code == RespArray.CODE; + if (ishasArray) { + return true; + } + byte[] bytes = is.readNBytes(1); + if (bytes[0] == RespArray.CODE) { + ishasArray = true; + return true; + } + return false; } /** From 2feb2f13de2fecff426c0f671751cce2594d2397 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 00:32:52 +0300 Subject: [PATCH 241/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/itmo/java/protocol/RespReader.java | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index a0a95bdf..dcc36317 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -16,7 +16,6 @@ public class RespReader implements AutoCloseable { private final InputStream is; - private boolean ishasArray = false; /** * Специальные символы окончания элемента @@ -32,15 +31,9 @@ public RespReader(InputStream is) { * Есть ли следующий массив в стриме? */ public boolean hasArray() throws IOException { - if (ishasArray) { - return true; - } - byte[] bytes = is.readNBytes(1); - if (bytes[0] == RespArray.CODE) { - ishasArray = true; - return true; - } - return false; + final byte code = is.readNBytes(1)[0]; + + return code == RespArray.CODE; } /** From 2f1080e9119e04dc78a09e382bbea7016c351293 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 00:36:26 +0300 Subject: [PATCH 242/378] testing readobjects --- .../com/itmo/java/protocol/RespReader.java | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index dcc36317..4f87ef67 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -44,19 +44,23 @@ public boolean hasArray() throws IOException { * @throws IOException при ошибке чтения */ public RespObject readObject() throws IOException { - final byte code = is.readNBytes(1)[0]; - - switch (code) { - case RespError.CODE: - return this.readError(); - case RespBulkString.CODE: - return this.readBulkString(); - case RespArray.CODE: - return this.readArray(); - case RespCommandId.CODE: - return this.readCommandId(); - default: - throw new IOException("Wrong object code"); + try { + byte[] firstSymbol = is.readNBytes(1); + if (firstSymbol.length == 0){ + throw new EOFException("end of the stream"); + } + if (firstSymbol[0] == RespError.CODE){ + return readError(); + } + if(firstSymbol[0] == RespBulkString.CODE){ + return readBulkString(); + } + if(firstSymbol[0] == RespCommandId.CODE){ + return readCommandId(); + } + throw new IOException("unknown byte" + new String(firstSymbol)); + } catch (IOException e){ + throw new IOException("exception in reading object", e); } } From 883002d052c9a5e4f332553d9473fc6055350f94 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 00:40:24 +0300 Subject: [PATCH 243/378] readError --- .../com/itmo/java/protocol/RespReader.java | 54 +++++++++---------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 4f87ef67..f145309a 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -71,38 +71,38 @@ public RespObject readObject() throws IOException { * @throws IOException при ошибке чтения */ public RespError readError() throws IOException { - byte symbol = is.readNBytes(1)[0]; - - final List symbols = new ArrayList<>(); - - boolean isEndOfError = false; - - while (!isEndOfError) { - while (symbol == CR) { - symbol = is.readNBytes(1)[0]; - - if (symbol == LF) { - isEndOfError = true; - } else { - symbols.add(CR); - } + try{ + StringBuilder errorMessage = new StringBuilder(); + byte[] currentSymbol = is.readNBytes(1); + if (currentSymbol.length == 0){ + throw new EOFException("end of the stream"); } - - if (!isEndOfError) { - symbols.add(symbol); - symbol = is.readNBytes(1)[0]; + while (currentSymbol[0] != CR){ + errorMessage.append(new String(currentSymbol)); + currentSymbol = is.readNBytes(1); + if (currentSymbol.length == 0){ + throw new EOFException("end of the stream"); + } } + readCompareByte(LF); + return new RespError(errorMessage.toString().getBytes(StandardCharsets.UTF_8)); + } catch (IOException e) { + throw new IOException("IO exception in reading Error", e); } + } - final int symbolsCount = symbols.size(); - - final byte[] bytes = new byte[symbolsCount]; - - for (int i = 0; i < symbolsCount; i++) { - bytes[i] = symbols.get(i); + private void readCompareByte(byte compareWith) throws IOException { + byte[] nextByte; + try { + nextByte = is.readNBytes(1); + if (nextByte.length == 0){ + throw new EOFException("end of the stream"); + } else if (nextByte[0] != compareWith) { + throw new IOException("expected symbol: " + String.valueOf(compareWith) + " but get: " + String.valueOf(nextByte[0])); + } + } catch (IOException e) { + throw new IOException("IO exception in reading byte", e); } - - return new RespError(bytes); } /** From f79926d7cadf664cafabf18c1037c7748f9cfcff Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 00:46:00 +0300 Subject: [PATCH 244/378] trying --- .../com/itmo/java/protocol/RespReader.java | 158 ++++++++++++------ 1 file changed, 104 insertions(+), 54 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index f145309a..b5b0baad 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -16,6 +16,7 @@ public class RespReader implements AutoCloseable { private final InputStream is; + private boolean isHasArray = false; /** * Специальные символы окончания элемента @@ -71,38 +72,38 @@ public RespObject readObject() throws IOException { * @throws IOException при ошибке чтения */ public RespError readError() throws IOException { - try{ - StringBuilder errorMessage = new StringBuilder(); - byte[] currentSymbol = is.readNBytes(1); - if (currentSymbol.length == 0){ - throw new EOFException("end of the stream"); - } - while (currentSymbol[0] != CR){ - errorMessage.append(new String(currentSymbol)); - currentSymbol = is.readNBytes(1); - if (currentSymbol.length == 0){ - throw new EOFException("end of the stream"); + byte symbol = is.readNBytes(1)[0]; + + final List symbols = new ArrayList<>(); + + boolean isEndOfError = false; + + while (!isEndOfError) { + while (symbol == CR) { + symbol = is.readNBytes(1)[0]; + + if (symbol == LF) { + isEndOfError = true; + } else { + symbols.add(CR); } } - readCompareByte(LF); - return new RespError(errorMessage.toString().getBytes(StandardCharsets.UTF_8)); - } catch (IOException e) { - throw new IOException("IO exception in reading Error", e); - } - } - private void readCompareByte(byte compareWith) throws IOException { - byte[] nextByte; - try { - nextByte = is.readNBytes(1); - if (nextByte.length == 0){ - throw new EOFException("end of the stream"); - } else if (nextByte[0] != compareWith) { - throw new IOException("expected symbol: " + String.valueOf(compareWith) + " but get: " + String.valueOf(nextByte[0])); + if (!isEndOfError) { + symbols.add(symbol); + symbol = is.readNBytes(1)[0]; } - } catch (IOException e) { - throw new IOException("IO exception in reading byte", e); } + + final int symbolsCount = symbols.size(); + + final byte[] bytes = new byte[symbolsCount]; + + for (int i = 0; i < symbolsCount; i++) { + bytes[i] = symbols.get(i); + } + + return new RespError(bytes); } /** @@ -112,20 +113,20 @@ private void readCompareByte(byte compareWith) throws IOException { * @throws IOException при ошибке чтения */ public RespBulkString readBulkString() throws IOException { - final byte[] bytes = this.getStringNumberInBytes(); - final int bytesCount = Integer.parseInt(new String(bytes, StandardCharsets.UTF_8)); - - is.readNBytes(1); - - if (bytesCount == RespBulkString.NULL_STRING_SIZE) { - return RespBulkString.NULL_STRING; + try{ + int bulkSize = readInt(); + readCompareByte(LF); + if (bulkSize == -1){ + return RespBulkString.NULL_STRING; + } + byte[] bulkString = is.readNBytes(bulkSize); + readCompareByte(CR); + readCompareByte(LF); + return new RespBulkString(bulkString); + } catch (IOException e) { + throw new IOException("IO exception in reading Bulk String", e); } - final byte[] data = is.readNBytes(bytesCount); - - is.readNBytes(2); - - return new RespBulkString(data); } /** @@ -135,18 +136,21 @@ public RespBulkString readBulkString() throws IOException { * @throws IOException при ошибке чтения */ public RespArray readArray() throws IOException { - final byte[] bytes = this.getStringNumberInBytes(); - final int elementsCount = Integer.parseInt(new String(bytes, StandardCharsets.UTF_8)); - - final RespObject[] objects = new RespObject[elementsCount]; - - is.readNBytes(1); - - for (int i = 0; i < elementsCount; i++) { - objects[i] = this.readObject(); + try { + if (!hasArray()) { + readCompareByte(RespArray.CODE); + } + int arraySize = readInt(); + readCompareByte(LF); + RespObject[] listObjects = new RespObject[arraySize]; + for (int i = 0; i < arraySize; i++){ + listObjects[i] = readObject(); + } + return new RespArray(listObjects); + } catch (IOException e) { + throw new IOException("IO exception in reading Array", e); } - return new RespArray(objects); } /** @@ -156,11 +160,18 @@ public RespArray readArray() throws IOException { * @throws IOException при ошибке чтения */ public RespCommandId readCommandId() throws IOException { - final int commandId = ByteBuffer.wrap(is.readNBytes(4)).getInt(); - - is.readNBytes(2); - - return new RespCommandId(commandId); + try { + byte[] commandId1 = is.readNBytes(1); + byte[] commandId2 = is.readNBytes(1); + byte[] commandId3 = is.readNBytes(1); + byte[] commandId4 = is.readNBytes(1); + int commandId = ((commandId1[0] << 24) + (commandId2[0]<< 16) + (commandId3[0] << 8) + (commandId4[0] << 0)); + readCompareByte(CR); + readCompareByte(LF); + return new RespCommandId(commandId); + } catch (IOException e) { + throw new IOException("IO exception in reading command id", e); + } } @@ -189,4 +200,43 @@ private byte[] getStringNumberInBytes() throws IOException { return bytes; } + + private int readInt() throws IOException { + try{ + StringBuilder size = new StringBuilder(); + byte[] sizeByte = is.readNBytes(1); + if (sizeByte.length == 0){ + throw new EOFException("end of the stream"); + } + while (sizeByte[0] != CR){ + size.append(new String(sizeByte)); + sizeByte = is.readNBytes(1); + if (sizeByte.length == 0){ + throw new EOFException("end of the stream"); + } + } + try { + return Integer.parseInt(size.toString()); + } catch (NumberFormatException e) { + throw new IOException("expected reading int from this string: " + size.toString()); + } + } catch (IOException e) { + throw new IOException("IO exception in reading int", e); + } + } + + private void readCompareByte(byte compareWith) throws IOException { + byte[] nextByte; + try { + nextByte = is.readNBytes(1); + if (nextByte.length == 0){ + throw new EOFException("end of the stream"); + } else if (nextByte[0] != compareWith) { + throw new IOException("expected symbol: " + String.valueOf(compareWith) + " but get: " + String.valueOf(nextByte[0])); + } + } catch (IOException e) { + throw new IOException("IO exception in reading byte", e); + } + } + } From 2d76684bdd78910cb6fdfe81aae3b3895711df19 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 01:02:08 +0300 Subject: [PATCH 245/378] try --- .../connector/JavaSocketServerConnector.java | 4 +- .../connection/SocketKvsConnection.java | 7 +- .../com/itmo/java/protocol/RespReader.java | 160 ++++++------------ 3 files changed, 62 insertions(+), 109 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index c80f814a..e3c8d6e1 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -7,7 +7,6 @@ import com.itmo.java.basics.resp.CommandReader; import com.itmo.java.protocol.RespReader; import com.itmo.java.protocol.RespWriter; -import lombok.SneakyThrows; import java.io.Closeable; import java.io.IOException; @@ -17,7 +16,6 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; - /** * Класс, который предоставляет доступ к серверу через сокеты */ @@ -47,6 +45,7 @@ public void start() { try { final Socket client = serverSocket.accept(); final ClientTask clientTask = new ClientTask(client, databaseServer); + clientIOWorkers.submit(clientTask); } catch (IOException exception) { exception.printStackTrace(); @@ -60,6 +59,7 @@ public void start() { @Override public void close() { System.out.println("Stopping socket connector"); + try { serverSocket.close(); connectionAcceptorExecutor.shutdown(); diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index b2aad7b5..484a7d4e 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -1,11 +1,9 @@ package com.itmo.java.client.connection; -import com.itmo.java.basics.exceptions.DatabaseException; import com.itmo.java.client.exception.ConnectionException; import com.itmo.java.protocol.RespReader; import com.itmo.java.protocol.RespWriter; import com.itmo.java.protocol.model.RespArray; -import com.itmo.java.protocol.model.RespCommandId; import com.itmo.java.protocol.model.RespObject; import java.io.IOException; @@ -20,6 +18,7 @@ public class SocketKvsConnection implements KvsConnection { public SocketKvsConnection(ConnectionConfig config) { this.config = config; + try { this.socket = new Socket(this.config.getHost(), this.config.getPort()); } catch (IOException exception) { @@ -37,12 +36,16 @@ public SocketKvsConnection(ConnectionConfig config) { public synchronized RespObject send(int commandId, RespArray command) throws ConnectionException { try { final RespWriter respWriter = new RespWriter(socket.getOutputStream()); + respWriter.write(command); + final RespReader respReader = new RespReader(socket.getInputStream()); final RespObject respObject = respReader.readObject(); + if (respObject.isError()) { throw new ConnectionException("Response error"); } + return respObject; } catch (IOException exception) { throw new ConnectionException("Connection exception", exception); diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index b5b0baad..5cbb3098 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -16,7 +16,6 @@ public class RespReader implements AutoCloseable { private final InputStream is; - private boolean isHasArray = false; /** * Специальные символы окончания элемента @@ -72,38 +71,38 @@ public RespObject readObject() throws IOException { * @throws IOException при ошибке чтения */ public RespError readError() throws IOException { - byte symbol = is.readNBytes(1)[0]; - - final List symbols = new ArrayList<>(); - - boolean isEndOfError = false; - - while (!isEndOfError) { - while (symbol == CR) { - symbol = is.readNBytes(1)[0]; - - if (symbol == LF) { - isEndOfError = true; - } else { - symbols.add(CR); - } + try{ + StringBuilder errorMessage = new StringBuilder(); + byte[] currentSymbol = is.readNBytes(1); + if (currentSymbol.length == 0){ + throw new EOFException("end of the stream"); } - - if (!isEndOfError) { - symbols.add(symbol); - symbol = is.readNBytes(1)[0]; + while (currentSymbol[0] != CR){ + errorMessage.append(new String(currentSymbol)); + currentSymbol = is.readNBytes(1); + if (currentSymbol.length == 0){ + throw new EOFException("end of the stream"); + } } + readCompareByte(LF); + return new RespError(errorMessage.toString().getBytes(StandardCharsets.UTF_8)); + } catch (IOException e) { + throw new IOException("IO exception in reading Error", e); } + } - final int symbolsCount = symbols.size(); - - final byte[] bytes = new byte[symbolsCount]; - - for (int i = 0; i < symbolsCount; i++) { - bytes[i] = symbols.get(i); + private void readCompareByte(byte compareWith) throws IOException { + byte[] nextByte; + try { + nextByte = is.readNBytes(1); + if (nextByte.length == 0){ + throw new EOFException("end of the stream"); + } else if (nextByte[0] != compareWith) { + throw new IOException("expected symbol: " + String.valueOf(compareWith) + " but get: " + String.valueOf(nextByte[0])); + } + } catch (IOException e) { + throw new IOException("IO exception in reading byte", e); } - - return new RespError(bytes); } /** @@ -113,20 +112,20 @@ public RespError readError() throws IOException { * @throws IOException при ошибке чтения */ public RespBulkString readBulkString() throws IOException { - try{ - int bulkSize = readInt(); - readCompareByte(LF); - if (bulkSize == -1){ - return RespBulkString.NULL_STRING; - } - byte[] bulkString = is.readNBytes(bulkSize); - readCompareByte(CR); - readCompareByte(LF); - return new RespBulkString(bulkString); - } catch (IOException e) { - throw new IOException("IO exception in reading Bulk String", e); + final byte[] bytes = this.getStringNumberInBytes(); + final int bytesCount = Integer.parseInt(new String(bytes, StandardCharsets.UTF_8)); + + is.readNBytes(1); + + if (bytesCount == RespBulkString.NULL_STRING_SIZE) { + return RespBulkString.NULL_STRING; } + final byte[] data = is.readNBytes(bytesCount); + + is.readNBytes(2); + + return new RespBulkString(data); } /** @@ -136,21 +135,18 @@ public RespBulkString readBulkString() throws IOException { * @throws IOException при ошибке чтения */ public RespArray readArray() throws IOException { - try { - if (!hasArray()) { - readCompareByte(RespArray.CODE); - } - int arraySize = readInt(); - readCompareByte(LF); - RespObject[] listObjects = new RespObject[arraySize]; - for (int i = 0; i < arraySize; i++){ - listObjects[i] = readObject(); - } - return new RespArray(listObjects); - } catch (IOException e) { - throw new IOException("IO exception in reading Array", e); + final byte[] bytes = this.getStringNumberInBytes(); + final int elementsCount = Integer.parseInt(new String(bytes, StandardCharsets.UTF_8)); + + final RespObject[] objects = new RespObject[elementsCount]; + + is.readNBytes(1); + + for (int i = 0; i < elementsCount; i++) { + objects[i] = this.readObject(); } + return new RespArray(objects); } /** @@ -160,18 +156,11 @@ public RespArray readArray() throws IOException { * @throws IOException при ошибке чтения */ public RespCommandId readCommandId() throws IOException { - try { - byte[] commandId1 = is.readNBytes(1); - byte[] commandId2 = is.readNBytes(1); - byte[] commandId3 = is.readNBytes(1); - byte[] commandId4 = is.readNBytes(1); - int commandId = ((commandId1[0] << 24) + (commandId2[0]<< 16) + (commandId3[0] << 8) + (commandId4[0] << 0)); - readCompareByte(CR); - readCompareByte(LF); - return new RespCommandId(commandId); - } catch (IOException e) { - throw new IOException("IO exception in reading command id", e); - } + final int commandId = ByteBuffer.wrap(is.readNBytes(4)).getInt(); + + is.readNBytes(2); + + return new RespCommandId(commandId); } @@ -200,43 +189,4 @@ private byte[] getStringNumberInBytes() throws IOException { return bytes; } - - private int readInt() throws IOException { - try{ - StringBuilder size = new StringBuilder(); - byte[] sizeByte = is.readNBytes(1); - if (sizeByte.length == 0){ - throw new EOFException("end of the stream"); - } - while (sizeByte[0] != CR){ - size.append(new String(sizeByte)); - sizeByte = is.readNBytes(1); - if (sizeByte.length == 0){ - throw new EOFException("end of the stream"); - } - } - try { - return Integer.parseInt(size.toString()); - } catch (NumberFormatException e) { - throw new IOException("expected reading int from this string: " + size.toString()); - } - } catch (IOException e) { - throw new IOException("IO exception in reading int", e); - } - } - - private void readCompareByte(byte compareWith) throws IOException { - byte[] nextByte; - try { - nextByte = is.readNBytes(1); - if (nextByte.length == 0){ - throw new EOFException("end of the stream"); - } else if (nextByte[0] != compareWith) { - throw new IOException("expected symbol: " + String.valueOf(compareWith) + " but get: " + String.valueOf(nextByte[0])); - } - } catch (IOException e) { - throw new IOException("IO exception in reading byte", e); - } - } - -} +} \ No newline at end of file From 044d7cccc55d976e3e979ba82c3ff52fb5852da2 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 01:05:38 +0300 Subject: [PATCH 246/378] try javasocket --- .../connector/JavaSocketServerConnector.java | 105 ++++++++++++------ 1 file changed, 74 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index e3c8d6e1..b92e34d5 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -3,16 +3,17 @@ import com.itmo.java.basics.DatabaseServer; import com.itmo.java.basics.config.ServerConfig; import com.itmo.java.basics.console.DatabaseCommand; -import com.itmo.java.basics.console.DatabaseCommandResult; import com.itmo.java.basics.resp.CommandReader; import com.itmo.java.protocol.RespReader; import com.itmo.java.protocol.RespWriter; +import com.itmo.java.protocol.model.RespObject; import java.io.Closeable; +import java.io.FileInputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; -import java.util.concurrent.ExecutionException; +import java.nio.ByteBuffer; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -25,16 +26,18 @@ public class JavaSocketServerConnector implements Closeable { * Экзекьютор для выполнения ClientTask */ private final ExecutorService clientIOWorkers = Executors.newSingleThreadExecutor(); - private final ServerSocket serverSocket; + private final ServerSocket serverSocket; // todo uncomment + private final ExecutorService connectionAcceptorExecutor = Executors.newSingleThreadExecutor(); - private final DatabaseServer databaseServer; + + private DatabaseServer dbServer; /** * Стартует сервер. По аналогии с сокетом открывает коннекшн в конструкторе. */ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig config) throws IOException { - this.databaseServer = databaseServer; - this.serverSocket = new ServerSocket(config.getPort()); + serverSocket = new ServerSocket(config.getPort()); + dbServer = databaseServer; } /** @@ -43,12 +46,15 @@ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig con public void start() { connectionAcceptorExecutor.submit(() -> { try { - final Socket client = serverSocket.accept(); - final ClientTask clientTask = new ClientTask(client, databaseServer); - - clientIOWorkers.submit(clientTask); + Socket socket = serverSocket.accept(); + clientIOWorkers.submit(() -> { + ClientTask clientTask = new ClientTask(socket, dbServer); + clientTask.run(); + }); } catch (IOException exception) { exception.printStackTrace(); + } finally { + close(); } }); } @@ -59,34 +65,65 @@ public void start() { @Override public void close() { System.out.println("Stopping socket connector"); - try { serverSocket.close(); - connectionAcceptorExecutor.shutdown(); - clientIOWorkers.shutdown(); - } catch (IOException exception) { - throw new RuntimeException("Closing server socket error", exception); + connectionAcceptorExecutor.shutdownNow(); + clientIOWorkers.shutdownNow(); + } catch (IOException exception){ + exception.printStackTrace(); } } public static void main(String[] args) throws Exception { +/*DatabaseConfig cfg = new DatabaseConfig("C:\\Users\\odmen\\Documents\\testdata"); +ExecutionEnvironment env = new ExecutionEnvironmentImpl(cfg); +DatabaseInitializationContext dbContext = null; +TableInitializationContext tableContext = null; +SegmentInitializationContext sgmContext = null; + +InitializationContextImpl context = new InitializationContextImpl(env, null, null, null); +Initializer init = new DatabaseServerInitializer( +new DatabaseInitializer( +new TableInitializer( +new SegmentInitializer()))); + +DatabaseServer dbs = DatabaseServer.initialize(env, (DatabaseServerInitializer) init); +ServerConfig serverConfig = new ServerConfig("localhost", 8080); +JavaSocketServerConnector javaConnector = new JavaSocketServerConnector(dbs,serverConfig); +javaConnector.start(); + +javaConnector.close();*/ + ByteBuffer bb = ByteBuffer.allocate(11); + RespReader respReader = new RespReader(new FileInputStream("C:\\Users\\odmen\\Documents\\testdata\\respreader.txt")); + RespObject respObject = respReader.readBulkString(); + RespObject respObject1 = respObject; } /** * Runnable, описывающий исполнение клиентской команды. */ static class ClientTask implements Runnable, Closeable { - private final Socket client; - private final DatabaseServer server; + private RespWriter respWriter; + private + + RespReader respReader; + private Socket client; + DatabaseServer databaseServer; /** * @param client клиентский сокет * @param server сервер, на котором исполняется задача */ public ClientTask(Socket client, DatabaseServer server) { - this.client = client; - this.server = server; + try { + databaseServer = server; + this.client = client; + respReader = new RespReader(client.getInputStream()); + respWriter = new RespWriter(client.getOutputStream()); + } catch (IOException e) { + e.printStackTrace(); + } } /** @@ -98,19 +135,23 @@ public ClientTask(Socket client, DatabaseServer server) { */ @Override public void run() { + CommandReader commandReader = new CommandReader(respReader, databaseServer.getEnv()); try { - final CommandReader commandReader = new CommandReader(new RespReader(client.getInputStream()), server.getEnv()); - final RespWriter respWriter = new RespWriter(client.getOutputStream()); - - while (commandReader.hasNextCommand()) { - final DatabaseCommand command = commandReader.readCommand(); - final DatabaseCommandResult commandResult = server.executeNextCommand(command).get(); - - respWriter.write(commandResult.serialize()); + while (!Thread.currentThread().isInterrupted() && !client.isClosed()) { + if (commandReader.hasNextCommand()) { + DatabaseCommand dbCommand = commandReader.readCommand(); + respWriter.write(dbCommand.execute().serialize()); + } else { + commandReader.close(); + break; + } } - } catch (ExecutionException | IOException | InterruptedException exception) { - exception.printStackTrace(); + commandReader.close(); + } catch (Exception e) { + e.printStackTrace(); } + + } /** @@ -120,9 +161,11 @@ public void run() { public void close() { try { client.close(); + respReader.close(); + respWriter.close(); } catch (IOException exception) { - throw new RuntimeException("Closing client socket error", exception); + exception.printStackTrace(); } } } -} +} \ No newline at end of file From 30b26493377d21e7874b94d9fcaca1d0d24b71a6 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 01:11:03 +0300 Subject: [PATCH 247/378] try socket --- .../connection/SocketKvsConnection.java | 40 +++++++++---------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index 484a7d4e..2f8f9045 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -4,6 +4,7 @@ import com.itmo.java.protocol.RespReader; import com.itmo.java.protocol.RespWriter; import com.itmo.java.protocol.model.RespArray; +import com.itmo.java.protocol.model.RespCommandId; import com.itmo.java.protocol.model.RespObject; import java.io.IOException; @@ -13,21 +14,24 @@ * С помощью {@link RespWriter} и {@link RespReader} читает/пишет в сокет */ public class SocketKvsConnection implements KvsConnection { - final ConnectionConfig config; - final Socket socket; - public SocketKvsConnection(ConnectionConfig config) { - this.config = config; + private Socket socket; + private RespWriter respWriter; + private RespReader respReader; + public SocketKvsConnection(ConnectionConfig config) { try { - this.socket = new Socket(this.config.getHost(), this.config.getPort()); - } catch (IOException exception) { - throw new RuntimeException("Creation socket error", exception); + socket = new Socket(config.getHost(), config.getPort()); + respReader = new RespReader(socket.getInputStream()); + respWriter = new RespWriter(socket.getOutputStream()); + } catch (IOException e) { + e.printStackTrace(); } } /** * Отправляет с помощью сокета команду и получает результат. + * * @param commandId id команды (номер) * @param command команда * @throws ConnectionException если сокет закрыт или если произошла другая ошибка соединения @@ -35,20 +39,10 @@ public SocketKvsConnection(ConnectionConfig config) { @Override public synchronized RespObject send(int commandId, RespArray command) throws ConnectionException { try { - final RespWriter respWriter = new RespWriter(socket.getOutputStream()); - - respWriter.write(command); - - final RespReader respReader = new RespReader(socket.getInputStream()); - final RespObject respObject = respReader.readObject(); - - if (respObject.isError()) { - throw new ConnectionException("Response error"); - } - - return respObject; - } catch (IOException exception) { - throw new ConnectionException("Connection exception", exception); + respWriter.write(new RespArray(new RespCommandId(commandId) ,command)); + return respReader.readObject(); + } catch (IOException e) { + throw new ConnectionException("?", e); } } @@ -59,8 +53,10 @@ public synchronized RespObject send(int commandId, RespArray command) throws Con public void close() { try { socket.close(); + respWriter.close(); + respReader.close(); } catch (IOException exception) { - throw new RuntimeException("Closing client socket error", exception); + exception.printStackTrace(); } } } From 8b20869dc2a4bde3a849e17c8820219686b24892 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 01:15:14 +0300 Subject: [PATCH 248/378] try start --- .../connector/JavaSocketServerConnector.java | 37 +++-------------- .../connection/SocketKvsConnection.java | 40 ++++++++++--------- 2 files changed, 27 insertions(+), 50 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index b92e34d5..fe7f9001 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -6,14 +6,12 @@ import com.itmo.java.basics.resp.CommandReader; import com.itmo.java.protocol.RespReader; import com.itmo.java.protocol.RespWriter; -import com.itmo.java.protocol.model.RespObject; + import java.io.Closeable; -import java.io.FileInputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; -import java.nio.ByteBuffer; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -46,15 +44,12 @@ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig con public void start() { connectionAcceptorExecutor.submit(() -> { try { - Socket socket = serverSocket.accept(); - clientIOWorkers.submit(() -> { - ClientTask clientTask = new ClientTask(socket, dbServer); - clientTask.run(); - }); + final Socket client = serverSocket.accept(); + final ClientTask clientTask = new ClientTask(client, dbServer); + + clientIOWorkers.submit(clientTask); } catch (IOException exception) { exception.printStackTrace(); - } finally { - close(); } }); } @@ -76,28 +71,6 @@ public void close() { public static void main(String[] args) throws Exception { -/*DatabaseConfig cfg = new DatabaseConfig("C:\\Users\\odmen\\Documents\\testdata"); -ExecutionEnvironment env = new ExecutionEnvironmentImpl(cfg); -DatabaseInitializationContext dbContext = null; -TableInitializationContext tableContext = null; -SegmentInitializationContext sgmContext = null; - -InitializationContextImpl context = new InitializationContextImpl(env, null, null, null); -Initializer init = new DatabaseServerInitializer( -new DatabaseInitializer( -new TableInitializer( -new SegmentInitializer()))); - -DatabaseServer dbs = DatabaseServer.initialize(env, (DatabaseServerInitializer) init); -ServerConfig serverConfig = new ServerConfig("localhost", 8080); -JavaSocketServerConnector javaConnector = new JavaSocketServerConnector(dbs,serverConfig); -javaConnector.start(); - -javaConnector.close();*/ - ByteBuffer bb = ByteBuffer.allocate(11); - RespReader respReader = new RespReader(new FileInputStream("C:\\Users\\odmen\\Documents\\testdata\\respreader.txt")); - RespObject respObject = respReader.readBulkString(); - RespObject respObject1 = respObject; } /** diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index 2f8f9045..484a7d4e 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -4,7 +4,6 @@ import com.itmo.java.protocol.RespReader; import com.itmo.java.protocol.RespWriter; import com.itmo.java.protocol.model.RespArray; -import com.itmo.java.protocol.model.RespCommandId; import com.itmo.java.protocol.model.RespObject; import java.io.IOException; @@ -14,24 +13,21 @@ * С помощью {@link RespWriter} и {@link RespReader} читает/пишет в сокет */ public class SocketKvsConnection implements KvsConnection { - - private Socket socket; - private RespWriter respWriter; - private RespReader respReader; + final ConnectionConfig config; + final Socket socket; public SocketKvsConnection(ConnectionConfig config) { + this.config = config; + try { - socket = new Socket(config.getHost(), config.getPort()); - respReader = new RespReader(socket.getInputStream()); - respWriter = new RespWriter(socket.getOutputStream()); - } catch (IOException e) { - e.printStackTrace(); + this.socket = new Socket(this.config.getHost(), this.config.getPort()); + } catch (IOException exception) { + throw new RuntimeException("Creation socket error", exception); } } /** * Отправляет с помощью сокета команду и получает результат. - * * @param commandId id команды (номер) * @param command команда * @throws ConnectionException если сокет закрыт или если произошла другая ошибка соединения @@ -39,10 +35,20 @@ public SocketKvsConnection(ConnectionConfig config) { @Override public synchronized RespObject send(int commandId, RespArray command) throws ConnectionException { try { - respWriter.write(new RespArray(new RespCommandId(commandId) ,command)); - return respReader.readObject(); - } catch (IOException e) { - throw new ConnectionException("?", e); + final RespWriter respWriter = new RespWriter(socket.getOutputStream()); + + respWriter.write(command); + + final RespReader respReader = new RespReader(socket.getInputStream()); + final RespObject respObject = respReader.readObject(); + + if (respObject.isError()) { + throw new ConnectionException("Response error"); + } + + return respObject; + } catch (IOException exception) { + throw new ConnectionException("Connection exception", exception); } } @@ -53,10 +59,8 @@ public synchronized RespObject send(int commandId, RespArray command) throws Con public void close() { try { socket.close(); - respWriter.close(); - respReader.close(); } catch (IOException exception) { - exception.printStackTrace(); + throw new RuntimeException("Closing client socket error", exception); } } } From dcec244a5d7e017d9986bb0f05dd4ca919c54bbb Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 01:20:35 +0300 Subject: [PATCH 249/378] try reader --- .../connector/JavaSocketServerConnector.java | 11 +- .../com/itmo/java/protocol/RespReader.java | 158 ++++++++++++------ 2 files changed, 111 insertions(+), 58 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index fe7f9001..c91e6e5c 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -44,12 +44,15 @@ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig con public void start() { connectionAcceptorExecutor.submit(() -> { try { - final Socket client = serverSocket.accept(); - final ClientTask clientTask = new ClientTask(client, dbServer); - - clientIOWorkers.submit(clientTask); + Socket socket = serverSocket.accept(); + clientIOWorkers.submit(() -> { + ClientTask clientTask = new ClientTask(socket, dbServer); + clientTask.run(); + }); } catch (IOException exception) { exception.printStackTrace(); + } finally { + close(); } }); } diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 5cbb3098..966b2385 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -16,6 +16,7 @@ public class RespReader implements AutoCloseable { private final InputStream is; + private boolean isHasArray = false; /** * Специальные символы окончания элемента @@ -71,38 +72,38 @@ public RespObject readObject() throws IOException { * @throws IOException при ошибке чтения */ public RespError readError() throws IOException { - try{ - StringBuilder errorMessage = new StringBuilder(); - byte[] currentSymbol = is.readNBytes(1); - if (currentSymbol.length == 0){ - throw new EOFException("end of the stream"); - } - while (currentSymbol[0] != CR){ - errorMessage.append(new String(currentSymbol)); - currentSymbol = is.readNBytes(1); - if (currentSymbol.length == 0){ - throw new EOFException("end of the stream"); + byte symbol = is.readNBytes(1)[0]; + + final List symbols = new ArrayList<>(); + + boolean isEndOfError = false; + + while (!isEndOfError) { + while (symbol == CR) { + symbol = is.readNBytes(1)[0]; + + if (symbol == LF) { + isEndOfError = true; + } else { + symbols.add(CR); } } - readCompareByte(LF); - return new RespError(errorMessage.toString().getBytes(StandardCharsets.UTF_8)); - } catch (IOException e) { - throw new IOException("IO exception in reading Error", e); - } - } - private void readCompareByte(byte compareWith) throws IOException { - byte[] nextByte; - try { - nextByte = is.readNBytes(1); - if (nextByte.length == 0){ - throw new EOFException("end of the stream"); - } else if (nextByte[0] != compareWith) { - throw new IOException("expected symbol: " + String.valueOf(compareWith) + " but get: " + String.valueOf(nextByte[0])); + if (!isEndOfError) { + symbols.add(symbol); + symbol = is.readNBytes(1)[0]; } - } catch (IOException e) { - throw new IOException("IO exception in reading byte", e); } + + final int symbolsCount = symbols.size(); + + final byte[] bytes = new byte[symbolsCount]; + + for (int i = 0; i < symbolsCount; i++) { + bytes[i] = symbols.get(i); + } + + return new RespError(bytes); } /** @@ -112,20 +113,20 @@ private void readCompareByte(byte compareWith) throws IOException { * @throws IOException при ошибке чтения */ public RespBulkString readBulkString() throws IOException { - final byte[] bytes = this.getStringNumberInBytes(); - final int bytesCount = Integer.parseInt(new String(bytes, StandardCharsets.UTF_8)); - - is.readNBytes(1); - - if (bytesCount == RespBulkString.NULL_STRING_SIZE) { - return RespBulkString.NULL_STRING; + try{ + int bulkSize = readInt(); + readCompareByte(LF); + if (bulkSize == -1){ + return RespBulkString.NULL_STRING; + } + byte[] bulkString = is.readNBytes(bulkSize); + readCompareByte(CR); + readCompareByte(LF); + return new RespBulkString(bulkString); + } catch (IOException e) { + throw new IOException("IO exception in reading Bulk String", e); } - final byte[] data = is.readNBytes(bytesCount); - - is.readNBytes(2); - - return new RespBulkString(data); } /** @@ -135,18 +136,21 @@ public RespBulkString readBulkString() throws IOException { * @throws IOException при ошибке чтения */ public RespArray readArray() throws IOException { - final byte[] bytes = this.getStringNumberInBytes(); - final int elementsCount = Integer.parseInt(new String(bytes, StandardCharsets.UTF_8)); - - final RespObject[] objects = new RespObject[elementsCount]; - - is.readNBytes(1); - - for (int i = 0; i < elementsCount; i++) { - objects[i] = this.readObject(); + try { + if (!hasArray()) { + readCompareByte(RespArray.CODE); + } + int arraySize = readInt(); + readCompareByte(LF); + RespObject[] listObjects = new RespObject[arraySize]; + for (int i = 0; i < arraySize; i++){ + listObjects[i] = readObject(); + } + return new RespArray(listObjects); + } catch (IOException e) { + throw new IOException("IO exception in reading Array", e); } - return new RespArray(objects); } /** @@ -156,11 +160,18 @@ public RespArray readArray() throws IOException { * @throws IOException при ошибке чтения */ public RespCommandId readCommandId() throws IOException { - final int commandId = ByteBuffer.wrap(is.readNBytes(4)).getInt(); - - is.readNBytes(2); - - return new RespCommandId(commandId); + try { + byte[] commandId1 = is.readNBytes(1); + byte[] commandId2 = is.readNBytes(1); + byte[] commandId3 = is.readNBytes(1); + byte[] commandId4 = is.readNBytes(1); + int commandId = ((commandId1[0] << 24) + (commandId2[0]<< 16) + (commandId3[0] << 8) + (commandId4[0] << 0)); + readCompareByte(CR); + readCompareByte(LF); + return new RespCommandId(commandId); + } catch (IOException e) { + throw new IOException("IO exception in reading command id", e); + } } @@ -189,4 +200,43 @@ private byte[] getStringNumberInBytes() throws IOException { return bytes; } + + private int readInt() throws IOException { + try{ + StringBuilder size = new StringBuilder(); + byte[] sizeByte = is.readNBytes(1); + if (sizeByte.length == 0){ + throw new EOFException("end of the stream"); + } + while (sizeByte[0] != CR){ + size.append(new String(sizeByte)); + sizeByte = is.readNBytes(1); + if (sizeByte.length == 0){ + throw new EOFException("end of the stream"); + } + } + try { + return Integer.parseInt(size.toString()); + } catch (NumberFormatException e) { + throw new IOException("expected reading int from this string: " + size.toString()); + } + } catch (IOException e) { + throw new IOException("IO exception in reading int", e); + } + } + + private void readCompareByte(byte compareWith) throws IOException { + byte[] nextByte; + try { + nextByte = is.readNBytes(1); + if (nextByte.length == 0){ + throw new EOFException("end of the stream"); + } else if (nextByte[0] != compareWith) { + throw new IOException("expected symbol: " + String.valueOf(compareWith) + " but get: " + String.valueOf(nextByte[0])); + } + } catch (IOException e) { + throw new IOException("IO exception in reading byte", e); + } + } + } \ No newline at end of file From c99ddff76313c312e55c22424718b4c27a6acbdd Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 01:28:29 +0300 Subject: [PATCH 250/378] try without --- .../com/itmo/java/protocol/RespReader.java | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 966b2385..a6a38a9c 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -115,13 +115,16 @@ public RespError readError() throws IOException { public RespBulkString readBulkString() throws IOException { try{ int bulkSize = readInt(); - readCompareByte(LF); + // readCompareByte(LF); + is.readNBytes(LF); if (bulkSize == -1){ return RespBulkString.NULL_STRING; } byte[] bulkString = is.readNBytes(bulkSize); - readCompareByte(CR); - readCompareByte(LF); + is.readNBytes(CR); + is.readNBytes(LF); + // readCompareByte(CR); + // readCompareByte(LF); return new RespBulkString(bulkString); } catch (IOException e) { throw new IOException("IO exception in reading Bulk String", e); @@ -138,10 +141,12 @@ public RespBulkString readBulkString() throws IOException { public RespArray readArray() throws IOException { try { if (!hasArray()) { - readCompareByte(RespArray.CODE); + is.readNBytes(RespArray.CODE); + // readCompareByte(RespArray.CODE); } int arraySize = readInt(); - readCompareByte(LF); + is.readNBytes(LF); + //readCompareByte(LF); RespObject[] listObjects = new RespObject[arraySize]; for (int i = 0; i < arraySize; i++){ listObjects[i] = readObject(); @@ -166,8 +171,10 @@ public RespCommandId readCommandId() throws IOException { byte[] commandId3 = is.readNBytes(1); byte[] commandId4 = is.readNBytes(1); int commandId = ((commandId1[0] << 24) + (commandId2[0]<< 16) + (commandId3[0] << 8) + (commandId4[0] << 0)); - readCompareByte(CR); - readCompareByte(LF); + is.readNBytes(CR); + is.readNBytes(LF); + // readCompareByte(CR); + // readCompareByte(LF); return new RespCommandId(commandId); } catch (IOException e) { throw new IOException("IO exception in reading command id", e); From d6f709f964613ae2119f79476073d1221eac0a2c Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 01:35:29 +0300 Subject: [PATCH 251/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/itmo/java/protocol/RespReader.java | 21 +++++++------------ 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index a6a38a9c..966b2385 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -115,16 +115,13 @@ public RespError readError() throws IOException { public RespBulkString readBulkString() throws IOException { try{ int bulkSize = readInt(); - // readCompareByte(LF); - is.readNBytes(LF); + readCompareByte(LF); if (bulkSize == -1){ return RespBulkString.NULL_STRING; } byte[] bulkString = is.readNBytes(bulkSize); - is.readNBytes(CR); - is.readNBytes(LF); - // readCompareByte(CR); - // readCompareByte(LF); + readCompareByte(CR); + readCompareByte(LF); return new RespBulkString(bulkString); } catch (IOException e) { throw new IOException("IO exception in reading Bulk String", e); @@ -141,12 +138,10 @@ public RespBulkString readBulkString() throws IOException { public RespArray readArray() throws IOException { try { if (!hasArray()) { - is.readNBytes(RespArray.CODE); - // readCompareByte(RespArray.CODE); + readCompareByte(RespArray.CODE); } int arraySize = readInt(); - is.readNBytes(LF); - //readCompareByte(LF); + readCompareByte(LF); RespObject[] listObjects = new RespObject[arraySize]; for (int i = 0; i < arraySize; i++){ listObjects[i] = readObject(); @@ -171,10 +166,8 @@ public RespCommandId readCommandId() throws IOException { byte[] commandId3 = is.readNBytes(1); byte[] commandId4 = is.readNBytes(1); int commandId = ((commandId1[0] << 24) + (commandId2[0]<< 16) + (commandId3[0] << 8) + (commandId4[0] << 0)); - is.readNBytes(CR); - is.readNBytes(LF); - // readCompareByte(CR); - // readCompareByte(LF); + readCompareByte(CR); + readCompareByte(LF); return new RespCommandId(commandId); } catch (IOException e) { throw new IOException("IO exception in reading command id", e); From 6721a200cb8ac502e293e2d1f5bd043ddff2fea2 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 01:40:02 +0300 Subject: [PATCH 252/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82=20java?= =?UTF-8?q?=20socket?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../connector/JavaSocketServerConnector.java | 81 +++++++------------ 1 file changed, 31 insertions(+), 50 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index c91e6e5c..e3c8d6e1 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -3,15 +3,16 @@ import com.itmo.java.basics.DatabaseServer; import com.itmo.java.basics.config.ServerConfig; import com.itmo.java.basics.console.DatabaseCommand; +import com.itmo.java.basics.console.DatabaseCommandResult; import com.itmo.java.basics.resp.CommandReader; import com.itmo.java.protocol.RespReader; import com.itmo.java.protocol.RespWriter; - import java.io.Closeable; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; +import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -24,18 +25,16 @@ public class JavaSocketServerConnector implements Closeable { * Экзекьютор для выполнения ClientTask */ private final ExecutorService clientIOWorkers = Executors.newSingleThreadExecutor(); - private final ServerSocket serverSocket; // todo uncomment - + private final ServerSocket serverSocket; private final ExecutorService connectionAcceptorExecutor = Executors.newSingleThreadExecutor(); - - private DatabaseServer dbServer; + private final DatabaseServer databaseServer; /** * Стартует сервер. По аналогии с сокетом открывает коннекшн в конструкторе. */ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig config) throws IOException { - serverSocket = new ServerSocket(config.getPort()); - dbServer = databaseServer; + this.databaseServer = databaseServer; + this.serverSocket = new ServerSocket(config.getPort()); } /** @@ -44,15 +43,12 @@ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig con public void start() { connectionAcceptorExecutor.submit(() -> { try { - Socket socket = serverSocket.accept(); - clientIOWorkers.submit(() -> { - ClientTask clientTask = new ClientTask(socket, dbServer); - clientTask.run(); - }); + final Socket client = serverSocket.accept(); + final ClientTask clientTask = new ClientTask(client, databaseServer); + + clientIOWorkers.submit(clientTask); } catch (IOException exception) { exception.printStackTrace(); - } finally { - close(); } }); } @@ -63,12 +59,13 @@ public void start() { @Override public void close() { System.out.println("Stopping socket connector"); + try { serverSocket.close(); - connectionAcceptorExecutor.shutdownNow(); - clientIOWorkers.shutdownNow(); - } catch (IOException exception){ - exception.printStackTrace(); + connectionAcceptorExecutor.shutdown(); + clientIOWorkers.shutdown(); + } catch (IOException exception) { + throw new RuntimeException("Closing server socket error", exception); } } @@ -80,26 +77,16 @@ public static void main(String[] args) throws Exception { * Runnable, описывающий исполнение клиентской команды. */ static class ClientTask implements Runnable, Closeable { + private final Socket client; + private final DatabaseServer server; - private RespWriter respWriter; - private - - RespReader respReader; - private Socket client; - DatabaseServer databaseServer; /** * @param client клиентский сокет * @param server сервер, на котором исполняется задача */ public ClientTask(Socket client, DatabaseServer server) { - try { - databaseServer = server; - this.client = client; - respReader = new RespReader(client.getInputStream()); - respWriter = new RespWriter(client.getOutputStream()); - } catch (IOException e) { - e.printStackTrace(); - } + this.client = client; + this.server = server; } /** @@ -111,23 +98,19 @@ public ClientTask(Socket client, DatabaseServer server) { */ @Override public void run() { - CommandReader commandReader = new CommandReader(respReader, databaseServer.getEnv()); try { - while (!Thread.currentThread().isInterrupted() && !client.isClosed()) { - if (commandReader.hasNextCommand()) { - DatabaseCommand dbCommand = commandReader.readCommand(); - respWriter.write(dbCommand.execute().serialize()); - } else { - commandReader.close(); - break; - } - } - commandReader.close(); - } catch (Exception e) { - e.printStackTrace(); - } + final CommandReader commandReader = new CommandReader(new RespReader(client.getInputStream()), server.getEnv()); + final RespWriter respWriter = new RespWriter(client.getOutputStream()); + while (commandReader.hasNextCommand()) { + final DatabaseCommand command = commandReader.readCommand(); + final DatabaseCommandResult commandResult = server.executeNextCommand(command).get(); + respWriter.write(commandResult.serialize()); + } + } catch (ExecutionException | IOException | InterruptedException exception) { + exception.printStackTrace(); + } } /** @@ -137,11 +120,9 @@ public void run() { public void close() { try { client.close(); - respReader.close(); - respWriter.close(); } catch (IOException exception) { - exception.printStackTrace(); + throw new RuntimeException("Closing client socket error", exception); } } } -} \ No newline at end of file +} From 5e0163c9ee2bf01e8e1ce0e728374ac0adfd3309 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 15:04:53 +0300 Subject: [PATCH 253/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../connector/JavaSocketServerConnector.java | 81 ++++++++++++------- 1 file changed, 50 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index e3c8d6e1..c91e6e5c 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -3,16 +3,15 @@ import com.itmo.java.basics.DatabaseServer; import com.itmo.java.basics.config.ServerConfig; import com.itmo.java.basics.console.DatabaseCommand; -import com.itmo.java.basics.console.DatabaseCommandResult; import com.itmo.java.basics.resp.CommandReader; import com.itmo.java.protocol.RespReader; import com.itmo.java.protocol.RespWriter; + import java.io.Closeable; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; -import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -25,16 +24,18 @@ public class JavaSocketServerConnector implements Closeable { * Экзекьютор для выполнения ClientTask */ private final ExecutorService clientIOWorkers = Executors.newSingleThreadExecutor(); - private final ServerSocket serverSocket; + private final ServerSocket serverSocket; // todo uncomment + private final ExecutorService connectionAcceptorExecutor = Executors.newSingleThreadExecutor(); - private final DatabaseServer databaseServer; + + private DatabaseServer dbServer; /** * Стартует сервер. По аналогии с сокетом открывает коннекшн в конструкторе. */ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig config) throws IOException { - this.databaseServer = databaseServer; - this.serverSocket = new ServerSocket(config.getPort()); + serverSocket = new ServerSocket(config.getPort()); + dbServer = databaseServer; } /** @@ -43,12 +44,15 @@ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig con public void start() { connectionAcceptorExecutor.submit(() -> { try { - final Socket client = serverSocket.accept(); - final ClientTask clientTask = new ClientTask(client, databaseServer); - - clientIOWorkers.submit(clientTask); + Socket socket = serverSocket.accept(); + clientIOWorkers.submit(() -> { + ClientTask clientTask = new ClientTask(socket, dbServer); + clientTask.run(); + }); } catch (IOException exception) { exception.printStackTrace(); + } finally { + close(); } }); } @@ -59,13 +63,12 @@ public void start() { @Override public void close() { System.out.println("Stopping socket connector"); - try { serverSocket.close(); - connectionAcceptorExecutor.shutdown(); - clientIOWorkers.shutdown(); - } catch (IOException exception) { - throw new RuntimeException("Closing server socket error", exception); + connectionAcceptorExecutor.shutdownNow(); + clientIOWorkers.shutdownNow(); + } catch (IOException exception){ + exception.printStackTrace(); } } @@ -77,16 +80,26 @@ public static void main(String[] args) throws Exception { * Runnable, описывающий исполнение клиентской команды. */ static class ClientTask implements Runnable, Closeable { - private final Socket client; - private final DatabaseServer server; + private RespWriter respWriter; + private + + RespReader respReader; + private Socket client; + DatabaseServer databaseServer; /** * @param client клиентский сокет * @param server сервер, на котором исполняется задача */ public ClientTask(Socket client, DatabaseServer server) { - this.client = client; - this.server = server; + try { + databaseServer = server; + this.client = client; + respReader = new RespReader(client.getInputStream()); + respWriter = new RespWriter(client.getOutputStream()); + } catch (IOException e) { + e.printStackTrace(); + } } /** @@ -98,19 +111,23 @@ public ClientTask(Socket client, DatabaseServer server) { */ @Override public void run() { + CommandReader commandReader = new CommandReader(respReader, databaseServer.getEnv()); try { - final CommandReader commandReader = new CommandReader(new RespReader(client.getInputStream()), server.getEnv()); - final RespWriter respWriter = new RespWriter(client.getOutputStream()); - - while (commandReader.hasNextCommand()) { - final DatabaseCommand command = commandReader.readCommand(); - final DatabaseCommandResult commandResult = server.executeNextCommand(command).get(); - - respWriter.write(commandResult.serialize()); + while (!Thread.currentThread().isInterrupted() && !client.isClosed()) { + if (commandReader.hasNextCommand()) { + DatabaseCommand dbCommand = commandReader.readCommand(); + respWriter.write(dbCommand.execute().serialize()); + } else { + commandReader.close(); + break; + } } - } catch (ExecutionException | IOException | InterruptedException exception) { - exception.printStackTrace(); + commandReader.close(); + } catch (Exception e) { + e.printStackTrace(); } + + } /** @@ -120,9 +137,11 @@ public void run() { public void close() { try { client.close(); + respReader.close(); + respWriter.close(); } catch (IOException exception) { - throw new RuntimeException("Closing client socket error", exception); + exception.printStackTrace(); } } } -} +} \ No newline at end of file From 487207a44a929853f7eb4f58d7ee66c9614767d9 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 15:16:19 +0300 Subject: [PATCH 254/378] socket --- .../connection/SocketKvsConnection.java | 33 ++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index 484a7d4e..fdf05541 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -13,14 +13,21 @@ * С помощью {@link RespWriter} и {@link RespReader} читает/пишет в сокет */ public class SocketKvsConnection implements KvsConnection { - final ConnectionConfig config; + //final ConnectionConfig config; final Socket socket; + final int port; + final String host; + final RespWriter respWriter; + final RespReader respReader; public SocketKvsConnection(ConnectionConfig config) { - this.config = config; + port = config.getPort(); + host = config.getHost(); try { - this.socket = new Socket(this.config.getHost(), this.config.getPort()); + socket = new Socket(host, port); + respWriter = new RespWriter(socket.getOutputStream()); + respReader = new RespReader(socket.getInputStream()); } catch (IOException exception) { throw new RuntimeException("Creation socket error", exception); } @@ -35,18 +42,18 @@ public SocketKvsConnection(ConnectionConfig config) { @Override public synchronized RespObject send(int commandId, RespArray command) throws ConnectionException { try { - final RespWriter respWriter = new RespWriter(socket.getOutputStream()); + RespWriter respWriter = new RespWriter(socket.getOutputStream()); respWriter.write(command); - final RespReader respReader = new RespReader(socket.getInputStream()); - final RespObject respObject = respReader.readObject(); + RespReader respReader = new RespReader(socket.getInputStream()); +// final RespObject respObject = respReader.readObject(); +// +// if (respObject.isError()) { +// throw new ConnectionException("Response error"); +// } - if (respObject.isError()) { - throw new ConnectionException("Response error"); - } - - return respObject; + return respReader.readObject(); } catch (IOException exception) { throw new ConnectionException("Connection exception", exception); } @@ -58,9 +65,11 @@ public synchronized RespObject send(int commandId, RespArray command) throws Con @Override public void close() { try { + respWriter.close(); + respReader.close(); socket.close(); } catch (IOException exception) { throw new RuntimeException("Closing client socket error", exception); } } -} +} \ No newline at end of file From d3813d5761304eee131db270cb9983c03bb9725a Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 15:29:34 +0300 Subject: [PATCH 255/378] JavaSocket --- .../connector/JavaSocketServerConnector.java | 90 +++++++++---------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index c91e6e5c..c5907b16 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -3,6 +3,7 @@ import com.itmo.java.basics.DatabaseServer; import com.itmo.java.basics.config.ServerConfig; import com.itmo.java.basics.console.DatabaseCommand; +import com.itmo.java.basics.console.DatabaseCommandResult; import com.itmo.java.basics.resp.CommandReader; import com.itmo.java.protocol.RespReader; import com.itmo.java.protocol.RespWriter; @@ -12,6 +13,7 @@ import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -42,19 +44,20 @@ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig con * Начинает слушать заданный порт, начинает аксептить клиентские сокеты. На каждый из них начинает клиентскую таску */ public void start() { - connectionAcceptorExecutor.submit(() -> { - try { - Socket socket = serverSocket.accept(); - clientIOWorkers.submit(() -> { - ClientTask clientTask = new ClientTask(socket, dbServer); - clientTask.run(); - }); - } catch (IOException exception) { - exception.printStackTrace(); - } finally { - close(); - } - }); + try { + connectionAcceptorExecutor.submit(() -> { + try { + while (true) { + Socket clientSocket = serverSocket.accept(); + clientIOWorkers.submit(new ClientTask(clientSocket, dbServer)); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + }); + } catch (Exception ex) { + ex.printStackTrace(); + } } /** @@ -63,12 +66,14 @@ public void start() { @Override public void close() { System.out.println("Stopping socket connector"); - try { - serverSocket.close(); - connectionAcceptorExecutor.shutdownNow(); - clientIOWorkers.shutdownNow(); - } catch (IOException exception){ - exception.printStackTrace(); + connectionAcceptorExecutor.shutdownNow(); + clientIOWorkers.shutdownNow(); + if (serverSocket != null) { + try { + serverSocket.close(); + } catch (IOException exception) { + exception.printStackTrace(); + } } } @@ -81,22 +86,23 @@ public static void main(String[] args) throws Exception { */ static class ClientTask implements Runnable, Closeable { - private RespWriter respWriter; - private - - RespReader respReader; - private Socket client; - DatabaseServer databaseServer; + private RespWriter respWriter; + //private RespReader respReader; + private final Socket client; + private final DatabaseServer databaseServer; /** * @param client клиентский сокет * @param server сервер, на котором исполняется задача */ public ClientTask(Socket client, DatabaseServer server) { + + databaseServer = server; + this.client = client; try { - databaseServer = server; - this.client = client; - respReader = new RespReader(client.getInputStream()); - respWriter = new RespWriter(client.getOutputStream()); +// databaseServer = server; +// this.client = client; +// respReader = new RespReader(client.getInputStream()); + this.respWriter = new RespWriter(client.getOutputStream()); } catch (IOException e) { e.printStackTrace(); } @@ -111,23 +117,16 @@ public ClientTask(Socket client, DatabaseServer server) { */ @Override public void run() { - CommandReader commandReader = new CommandReader(respReader, databaseServer.getEnv()); - try { - while (!Thread.currentThread().isInterrupted() && !client.isClosed()) { - if (commandReader.hasNextCommand()) { - DatabaseCommand dbCommand = commandReader.readCommand(); - respWriter.write(dbCommand.execute().serialize()); - } else { - commandReader.close(); - break; - } + try (CommandReader commandReader = new CommandReader(new RespReader(client.getInputStream()), databaseServer.getEnv())) { + while (commandReader.hasNextCommand()) { + CompletableFuture commandResult = databaseServer.executeNextCommand(commandReader.readCommand()); + respWriter.write(commandResult.get().serialize()); } - commandReader.close(); + close(); } catch (Exception e) { - e.printStackTrace(); + close(); + throw new RuntimeException("When try to read, write or execute command", e); } - - } /** @@ -136,9 +135,10 @@ public void run() { @Override public void close() { try { - client.close(); - respReader.close(); respWriter.close(); + client.close(); +// respReader.close(); +// respWriter.close(); } catch (IOException exception) { exception.printStackTrace(); } From 7c67aa586ff2e0fa122245b88d05052ecc24db62 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 15:33:07 +0300 Subject: [PATCH 256/378] delete catch --- .../basics/connector/JavaSocketServerConnector.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index c5907b16..4727381c 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -44,20 +44,14 @@ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig con * Начинает слушать заданный порт, начинает аксептить клиентские сокеты. На каждый из них начинает клиентскую таску */ public void start() { - try { connectionAcceptorExecutor.submit(() -> { - try { + while (true) { Socket clientSocket = serverSocket.accept(); clientIOWorkers.submit(new ClientTask(clientSocket, dbServer)); } - } catch (Exception ex) { - ex.printStackTrace(); - } + }); - } catch (Exception ex) { - ex.printStackTrace(); - } } /** From 4361f9dccc47dbab76d1138c6865b1a961905414 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 15:39:55 +0300 Subject: [PATCH 257/378] add try catch Io --- .../com/itmo/java/protocol/RespReader.java | 60 +++++++++++-------- .../com/itmo/java/protocol/RespWriter.java | 13 +++- .../itmo/java/protocol/model/RespArray.java | 14 +++-- .../java/protocol/model/RespBulkString.java | 19 +++--- .../java/protocol/model/RespCommandId.java | 18 +++--- .../itmo/java/protocol/model/RespError.java | 10 +++- 6 files changed, 86 insertions(+), 48 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 966b2385..252fbe37 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -32,9 +32,13 @@ public RespReader(InputStream is) { * Есть ли следующий массив в стриме? */ public boolean hasArray() throws IOException { - final byte code = is.readNBytes(1)[0]; + try { + final byte code = is.readNBytes(1)[0]; - return code == RespArray.CODE; + return code == RespArray.CODE; + } catch(IOException ex) { + throw new IOException(ex); + } } /** @@ -72,38 +76,42 @@ public RespObject readObject() throws IOException { * @throws IOException при ошибке чтения */ public RespError readError() throws IOException { - byte symbol = is.readNBytes(1)[0]; + try { + byte symbol = is.readNBytes(1)[0]; - final List symbols = new ArrayList<>(); + final List symbols = new ArrayList<>(); - boolean isEndOfError = false; + boolean isEndOfError = false; - while (!isEndOfError) { - while (symbol == CR) { - symbol = is.readNBytes(1)[0]; + while (!isEndOfError) { + while (symbol == CR) { + symbol = is.readNBytes(1)[0]; - if (symbol == LF) { - isEndOfError = true; - } else { - symbols.add(CR); + if (symbol == LF) { + isEndOfError = true; + } else { + symbols.add(CR); + } } - } - if (!isEndOfError) { - symbols.add(symbol); - symbol = is.readNBytes(1)[0]; + if (!isEndOfError) { + symbols.add(symbol); + symbol = is.readNBytes(1)[0]; + } } - } - final int symbolsCount = symbols.size(); + final int symbolsCount = symbols.size(); - final byte[] bytes = new byte[symbolsCount]; + final byte[] bytes = new byte[symbolsCount]; - for (int i = 0; i < symbolsCount; i++) { - bytes[i] = symbols.get(i); - } + for (int i = 0; i < symbolsCount; i++) { + bytes[i] = symbols.get(i); + } - return new RespError(bytes); + return new RespError(bytes); + } catch (IOException ex) { + throw new IOException(ex); + } } /** @@ -177,7 +185,11 @@ public RespCommandId readCommandId() throws IOException { @Override public void close() throws IOException { - is.close(); + try { + is.close(); + } catch (IOException ex) { + throw new IOException(ex); + } } private byte[] getStringNumberInBytes() throws IOException { diff --git a/src/main/java/com/itmo/java/protocol/RespWriter.java b/src/main/java/com/itmo/java/protocol/RespWriter.java index 1447ba26..448177c0 100644 --- a/src/main/java/com/itmo/java/protocol/RespWriter.java +++ b/src/main/java/com/itmo/java/protocol/RespWriter.java @@ -10,6 +10,7 @@ public class RespWriter implements AutoCloseable{ private final OutputStream outputStream; public RespWriter(OutputStream os) { + outputStream = os; } @@ -17,11 +18,19 @@ public RespWriter(OutputStream os) { * Записывает в output stream объект */ public void write(RespObject object) throws IOException { - object.write(outputStream); + try { + object.write(outputStream); + } catch (IOException ex) { + throw new IOException(ex); + } } @Override public void close() throws IOException { - outputStream.close(); + try { + outputStream.close(); + } catch (IOException ex) { + throw new IOException(ex); + } } } diff --git a/src/main/java/com/itmo/java/protocol/model/RespArray.java b/src/main/java/com/itmo/java/protocol/model/RespArray.java index 6b10269f..ccba34f6 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespArray.java +++ b/src/main/java/com/itmo/java/protocol/model/RespArray.java @@ -44,11 +44,15 @@ public String asString() { @Override public void write(OutputStream output) throws IOException { - output.write(CODE); - output.write(Integer.toString(objects.size()).getBytes(StandardCharsets.UTF_8)); - output.write(CRLF); - for (RespObject obj : objects) { - obj.write(output); + try { + output.write(CODE); + output.write(Integer.toString(objects.size()).getBytes(StandardCharsets.UTF_8)); + output.write(CRLF); + for (RespObject obj : objects) { + obj.write(output); + } + } catch (IOException ex){ + throw new IOException(ex); } } diff --git a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java index 11bde3ed..6ef8d5d4 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java +++ b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java @@ -43,14 +43,19 @@ public String asString() { @Override public void write(OutputStream output) throws IOException { - output.write(CODE); - if (data == null) { - output.write(Integer.toString(NULL_STRING_SIZE).getBytes(StandardCharsets.UTF_8)); - } else { - output.write(Integer.toString(data.length).getBytes(StandardCharsets.UTF_8)); + try { + output.write(CODE); + if (data == null) { + output.write(Integer.toString(NULL_STRING_SIZE).getBytes(StandardCharsets.UTF_8)); + } else { + output.write(Integer.toString(data.length).getBytes(StandardCharsets.UTF_8)); + output.write(CRLF); + output.write(data); + } output.write(CRLF); - output.write(data); + } catch (IOException ex) { + throw new IOException(ex); } - output.write(CRLF); } + } diff --git a/src/main/java/com/itmo/java/protocol/model/RespCommandId.java b/src/main/java/com/itmo/java/protocol/model/RespCommandId.java index d7213a79..e5bb52de 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespCommandId.java +++ b/src/main/java/com/itmo/java/protocol/model/RespCommandId.java @@ -36,12 +36,16 @@ public String asString() { @Override public void write(OutputStream output) throws IOException { - output.write(CODE); - int commandByte = commandId; - output.write((commandByte >>> 24) & 0xFF); - output.write((commandByte >>> 16) & 0xFF); - output.write((commandByte >>> 8) & 0xFF); - output.write(commandByte &0xFF); - output.write(CRLF); + try { + output.write(CODE); + int commandByte = commandId; + output.write((commandByte >>> 24) & 0xFF); + output.write((commandByte >>> 16) & 0xFF); + output.write((commandByte >>> 8) & 0xFF); + output.write(commandByte & 0xFF); + output.write(CRLF); + } catch (IOException ex) { + throw new IOException(ex); + } } } diff --git a/src/main/java/com/itmo/java/protocol/model/RespError.java b/src/main/java/com/itmo/java/protocol/model/RespError.java index 8688757d..760415c8 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespError.java +++ b/src/main/java/com/itmo/java/protocol/model/RespError.java @@ -35,8 +35,12 @@ public String asString() { @Override public void write(OutputStream output) throws IOException { - output.write(CODE); - output.write(message); - output.write(CRLF); + try { + output.write(CODE); + output.write(message); + output.write(CRLF); + } catch(IOException ex) { + throw new IOException(ex); + } } } From 5383b827df8c554fee791b04181bdb6f76da161a Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 16:55:08 +0300 Subject: [PATCH 258/378] add main --- .../java/com/itmo/java/basics/MainTest.java | 68 ------------------- .../connector/JavaSocketServerConnector.java | 39 +++++++++++ .../itmo/java/basics/resp/CommandReader.java | 26 +++++-- .../command/CreateDatabaseKvsCommand.java | 3 +- src/main/resources/server.properties | 1 + 5 files changed, 63 insertions(+), 74 deletions(-) delete mode 100644 src/main/java/com/itmo/java/basics/MainTest.java diff --git a/src/main/java/com/itmo/java/basics/MainTest.java b/src/main/java/com/itmo/java/basics/MainTest.java deleted file mode 100644 index eec8a891..00000000 --- a/src/main/java/com/itmo/java/basics/MainTest.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.itmo.java.basics; - -import com.itmo.java.basics.config.DatabaseConfig; -import com.itmo.java.basics.console.impl.ExecutionEnvironmentImpl; -import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.initialization.*; -import com.itmo.java.basics.initialization.impl.*; -import com.itmo.java.basics.logic.*; -import com.itmo.java.basics.logic.impl.*; - -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.*; -import java.nio.file.Path; -import java.util.Comparator; -import java.util.Optional; - -public class MainTest { - public static void main(String[] args) throws DatabaseException, IOException { -// Files.walk(Path.of("db", "anime")) -// .sorted(Comparator.reverseOrder()) -// .map(Path::toFile) -// .forEach(File::delete); - try { - Database db = DatabaseImpl.create("anime", Path.of("db")); - db.createTableIfNotExists("naruto"); - db.write("naruto", "key", "value".getBytes(StandardCharsets.UTF_8)); - db.write("naruto", "key", "value2".getBytes(StandardCharsets.UTF_8)); - db.write("naruto", "key", null); - db.write("naruto", "key1", "value1".getBytes(StandardCharsets.UTF_8)); - db.write("naruto", "key2", "".getBytes(StandardCharsets.UTF_8)); - } - catch (DatabaseException ex) - {throw new DatabaseException(ex);} -// System.out.printf( -// "get = %s expected = %s\n", -// new String(db.read("naruto", "saske").get()), -// "ora" -// ); -// db.write("naruto", "saske", null); -// db.delete("naruto", "saske"); -// System.out.printf( -// "get = %s expected = %s\n", -// db.read("naruto", "saske").toString(), -// Optional.empty().toString() -// ); -// db.write("naruto", "saske", "ora".getBytes(StandardCharsets.UTF_8)); -// System.out.printf( -// "get = %s expected = %s\n", -// new String(db.read("naruto", "saske").get()), -// "ora" -// ); - -// Initializer initializer = -// new DatabaseServerInitializer( -// new DatabaseInitializer( -// new TableInitializer( -// new SegmentInitializer()))); -// var execEnv = new ExecutionEnvironmentImpl( -// new DatabaseConfig("db") -// ); -// var context = new InitializationContextImpl( -// execEnv, null, null, null -// ); -// initializer.perform(context); - } -} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index 4727381c..6d2e45f9 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -1,12 +1,28 @@ package com.itmo.java.basics.connector; import com.itmo.java.basics.DatabaseServer; +import com.itmo.java.basics.config.ConfigLoader; +import com.itmo.java.basics.config.DatabaseConfig; import com.itmo.java.basics.config.ServerConfig; import com.itmo.java.basics.console.DatabaseCommand; import com.itmo.java.basics.console.DatabaseCommandResult; +import com.itmo.java.basics.console.ExecutionEnvironment; +import com.itmo.java.basics.console.impl.ExecutionEnvironmentImpl; +import com.itmo.java.basics.initialization.impl.DatabaseInitializer; +import com.itmo.java.basics.initialization.impl.DatabaseServerInitializer; +import com.itmo.java.basics.initialization.impl.SegmentInitializer; +import com.itmo.java.basics.initialization.impl.TableInitializer; import com.itmo.java.basics.resp.CommandReader; +import com.itmo.java.client.command.CreateDatabaseKvsCommand; +import com.itmo.java.client.command.CreateTableKvsCommand; +import com.itmo.java.client.command.GetKvsCommand; +import com.itmo.java.client.command.SetKvsCommand; +import com.itmo.java.client.connection.ConnectionConfig; +import com.itmo.java.client.connection.SocketKvsConnection; import com.itmo.java.protocol.RespReader; import com.itmo.java.protocol.RespWriter; +import com.itmo.java.protocol.model.RespArray; +import com.itmo.java.protocol.model.RespObject; import java.io.Closeable; @@ -73,6 +89,29 @@ public void close() { public static void main(String[] args) throws Exception { + ServerConfig serverConfig = new ConfigLoader().readConfig().getServerConfig(); + DatabaseConfig databaseConfig = new ConfigLoader().readConfig().getDbConfig(); + ExecutionEnvironment env = new ExecutionEnvironmentImpl(databaseConfig); + DatabaseServerInitializer initializer = + new DatabaseServerInitializer( + new DatabaseInitializer( + new TableInitializer( + new SegmentInitializer()))); + DatabaseServer databaseServer = DatabaseServer.initialize(env, initializer); + + JavaSocketServerConnector j = new JavaSocketServerConnector(databaseServer, serverConfig); + + j.start(); + RespObject q; + try(SocketKvsConnection socketKvsConnection = + new SocketKvsConnection(new ConnectionConfig(serverConfig.getHost(), serverConfig.getPort()))) { + socketKvsConnection.send(1, new CreateDatabaseKvsCommand("t1").serialize()); + socketKvsConnection.send(1, new CreateTableKvsCommand("t1", "da").serialize()); + socketKvsConnection.send(1, new SetKvsCommand("t1", "da", "key1", "value1").serialize()); + q = socketKvsConnection.send(1, new GetKvsCommand("t1", "da", "key1").serialize()); + } + System.out.println(q.asString()); + j.close(); } /** diff --git a/src/main/java/com/itmo/java/basics/resp/CommandReader.java b/src/main/java/com/itmo/java/basics/resp/CommandReader.java index c7850170..2be9c42c 100644 --- a/src/main/java/com/itmo/java/basics/resp/CommandReader.java +++ b/src/main/java/com/itmo/java/basics/resp/CommandReader.java @@ -5,6 +5,9 @@ import com.itmo.java.basics.console.DatabaseCommands; import com.itmo.java.basics.console.ExecutionEnvironment; import com.itmo.java.protocol.RespReader; +import com.itmo.java.protocol.model.RespArray; +import com.itmo.java.protocol.model.RespBulkString; +import com.itmo.java.protocol.model.RespCommandId; import com.itmo.java.protocol.model.RespObject; import java.io.IOException; @@ -32,12 +35,25 @@ public boolean hasNextCommand() throws IOException { * @throws IllegalArgumentException если нет имени команды и id */ public DatabaseCommand readCommand() throws IOException { - List comArgs = respReader.readArray().getObjects(); - if(comArgs.size() < 2) { - throw new IllegalArgumentException("Why we dont have id and command name?"); + RespArray respArray = respReader.readArray(); + if (respArray.getObjects().size() < DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex() + 1){ + throw new IllegalArgumentException("RespArray does not have enough size to have id, name and one object"); } - return DatabaseCommands.valueOf(comArgs.get(DatabaseCommandArgPositions.COMMAND_NAME.getPositionIndex()).asString()) - .getCommand(executionEnvironment,comArgs); + RespObject id = respArray.getObjects().get(DatabaseCommandArgPositions.COMMAND_ID.getPositionIndex()); + if (!(id instanceof RespCommandId)){ + throw new IllegalArgumentException("Command does not have command id"); + } + if (id.asString() == null || id.asString().isEmpty()){ + throw new IllegalArgumentException("Command id does not exist"); + } + RespObject commandName = respArray.getObjects().get(DatabaseCommandArgPositions.COMMAND_NAME.getPositionIndex()); + if (!(commandName instanceof RespBulkString)){ + throw new IllegalArgumentException("Command does not have command name"); + } + if (commandName.asString() == null || commandName.asString().isEmpty()){ + throw new IllegalArgumentException("Command name does not exist"); + } + return DatabaseCommands.valueOf(commandName.asString()).getCommand(executionEnvironment, respArray.getObjects()); } @Override diff --git a/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java b/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java index 964abfab..ce02e682 100644 --- a/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java @@ -21,7 +21,8 @@ public class CreateDatabaseKvsCommand implements KvsCommand { * @param databaseName имя базы данных */ public CreateDatabaseKvsCommand(String databaseName) { - dbID = idGen.get(); + // dbID = idGen.get(); + dbID = idGen.incrementAndGet(); dbName = databaseName; } diff --git a/src/main/resources/server.properties b/src/main/resources/server.properties index e69de29b..0a822229 100644 --- a/src/main/resources/server.properties +++ b/src/main/resources/server.properties @@ -0,0 +1 @@ +kvs.Workingpath=D:\\java\\Enviroment \ No newline at end of file From e18da39a205f0e5b5469b9494bbe87ce765d371c Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 17:03:58 +0300 Subject: [PATCH 259/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82=20=D0=BA?= =?UTF-8?q?=20add=20io?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../itmo/java/client/command/CreateDatabaseKvsCommand.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java b/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java index ce02e682..571f19f8 100644 --- a/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java @@ -21,8 +21,8 @@ public class CreateDatabaseKvsCommand implements KvsCommand { * @param databaseName имя базы данных */ public CreateDatabaseKvsCommand(String databaseName) { - // dbID = idGen.get(); - dbID = idGen.incrementAndGet(); + dbID = idGen.get(); + //dbID = idGen.incrementAndGet(); dbName = databaseName; } From c4a6394b3bf5b2853d60f765b2c09dc56e75be7a Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 17:04:08 +0300 Subject: [PATCH 260/378] add io --- .../itmo/java/basics/resp/CommandReader.java | 23 ++++--------------- 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/resp/CommandReader.java b/src/main/java/com/itmo/java/basics/resp/CommandReader.java index 2be9c42c..0f7855c5 100644 --- a/src/main/java/com/itmo/java/basics/resp/CommandReader.java +++ b/src/main/java/com/itmo/java/basics/resp/CommandReader.java @@ -35,25 +35,12 @@ public boolean hasNextCommand() throws IOException { * @throws IllegalArgumentException если нет имени команды и id */ public DatabaseCommand readCommand() throws IOException { - RespArray respArray = respReader.readArray(); - if (respArray.getObjects().size() < DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex() + 1){ - throw new IllegalArgumentException("RespArray does not have enough size to have id, name and one object"); + List comArgs = respReader.readArray().getObjects(); + if(comArgs.size() < 2) { + throw new IllegalArgumentException("Why we dont have id and command name?"); } - RespObject id = respArray.getObjects().get(DatabaseCommandArgPositions.COMMAND_ID.getPositionIndex()); - if (!(id instanceof RespCommandId)){ - throw new IllegalArgumentException("Command does not have command id"); - } - if (id.asString() == null || id.asString().isEmpty()){ - throw new IllegalArgumentException("Command id does not exist"); - } - RespObject commandName = respArray.getObjects().get(DatabaseCommandArgPositions.COMMAND_NAME.getPositionIndex()); - if (!(commandName instanceof RespBulkString)){ - throw new IllegalArgumentException("Command does not have command name"); - } - if (commandName.asString() == null || commandName.asString().isEmpty()){ - throw new IllegalArgumentException("Command name does not exist"); - } - return DatabaseCommands.valueOf(commandName.asString()).getCommand(executionEnvironment, respArray.getObjects()); + return DatabaseCommands.valueOf(comArgs.get(DatabaseCommandArgPositions.COMMAND_NAME.getPositionIndex()).asString()) + .getCommand(executionEnvironment,comArgs); } @Override From 82634bc2a30a76a0be4a1521f84be7be8067ce4a Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 17:12:09 +0300 Subject: [PATCH 261/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../connector/JavaSocketServerConnector.java | 51 +++---------------- .../itmo/java/basics/resp/CommandReader.java | 9 ++-- 2 files changed, 9 insertions(+), 51 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index 6d2e45f9..63c983bf 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -1,28 +1,12 @@ package com.itmo.java.basics.connector; import com.itmo.java.basics.DatabaseServer; -import com.itmo.java.basics.config.ConfigLoader; -import com.itmo.java.basics.config.DatabaseConfig; import com.itmo.java.basics.config.ServerConfig; import com.itmo.java.basics.console.DatabaseCommand; import com.itmo.java.basics.console.DatabaseCommandResult; -import com.itmo.java.basics.console.ExecutionEnvironment; -import com.itmo.java.basics.console.impl.ExecutionEnvironmentImpl; -import com.itmo.java.basics.initialization.impl.DatabaseInitializer; -import com.itmo.java.basics.initialization.impl.DatabaseServerInitializer; -import com.itmo.java.basics.initialization.impl.SegmentInitializer; -import com.itmo.java.basics.initialization.impl.TableInitializer; import com.itmo.java.basics.resp.CommandReader; -import com.itmo.java.client.command.CreateDatabaseKvsCommand; -import com.itmo.java.client.command.CreateTableKvsCommand; -import com.itmo.java.client.command.GetKvsCommand; -import com.itmo.java.client.command.SetKvsCommand; -import com.itmo.java.client.connection.ConnectionConfig; -import com.itmo.java.client.connection.SocketKvsConnection; import com.itmo.java.protocol.RespReader; import com.itmo.java.protocol.RespWriter; -import com.itmo.java.protocol.model.RespArray; -import com.itmo.java.protocol.model.RespObject; import java.io.Closeable; @@ -60,14 +44,14 @@ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig con * Начинает слушать заданный порт, начинает аксептить клиентские сокеты. На каждый из них начинает клиентскую таску */ public void start() { - connectionAcceptorExecutor.submit(() -> { + connectionAcceptorExecutor.submit(() -> { - while (true) { - Socket clientSocket = serverSocket.accept(); - clientIOWorkers.submit(new ClientTask(clientSocket, dbServer)); - } + while (true) { + Socket clientSocket = serverSocket.accept(); + clientIOWorkers.submit(new ClientTask(clientSocket, dbServer)); + } - }); + }); } /** @@ -89,29 +73,6 @@ public void close() { public static void main(String[] args) throws Exception { - ServerConfig serverConfig = new ConfigLoader().readConfig().getServerConfig(); - DatabaseConfig databaseConfig = new ConfigLoader().readConfig().getDbConfig(); - ExecutionEnvironment env = new ExecutionEnvironmentImpl(databaseConfig); - DatabaseServerInitializer initializer = - new DatabaseServerInitializer( - new DatabaseInitializer( - new TableInitializer( - new SegmentInitializer()))); - DatabaseServer databaseServer = DatabaseServer.initialize(env, initializer); - - JavaSocketServerConnector j = new JavaSocketServerConnector(databaseServer, serverConfig); - - j.start(); - RespObject q; - try(SocketKvsConnection socketKvsConnection = - new SocketKvsConnection(new ConnectionConfig(serverConfig.getHost(), serverConfig.getPort()))) { - socketKvsConnection.send(1, new CreateDatabaseKvsCommand("t1").serialize()); - socketKvsConnection.send(1, new CreateTableKvsCommand("t1", "da").serialize()); - socketKvsConnection.send(1, new SetKvsCommand("t1", "da", "key1", "value1").serialize()); - q = socketKvsConnection.send(1, new GetKvsCommand("t1", "da", "key1").serialize()); - } - System.out.println(q.asString()); - j.close(); } /** diff --git a/src/main/java/com/itmo/java/basics/resp/CommandReader.java b/src/main/java/com/itmo/java/basics/resp/CommandReader.java index 0f7855c5..1c384742 100644 --- a/src/main/java/com/itmo/java/basics/resp/CommandReader.java +++ b/src/main/java/com/itmo/java/basics/resp/CommandReader.java @@ -5,9 +5,6 @@ import com.itmo.java.basics.console.DatabaseCommands; import com.itmo.java.basics.console.ExecutionEnvironment; import com.itmo.java.protocol.RespReader; -import com.itmo.java.protocol.model.RespArray; -import com.itmo.java.protocol.model.RespBulkString; -import com.itmo.java.protocol.model.RespCommandId; import com.itmo.java.protocol.model.RespObject; import java.io.IOException; @@ -26,7 +23,7 @@ public CommandReader(RespReader reader, ExecutionEnvironment env) { * Есть ли следующая команда в ридере? */ public boolean hasNextCommand() throws IOException { - return respReader.hasArray(); + return respReader.hasArray(); } /** @@ -45,6 +42,6 @@ public DatabaseCommand readCommand() throws IOException { @Override public void close() throws Exception { - respReader.close(); + respReader.close(); } -} +} \ No newline at end of file From c609b77effd06d98ef08dc240887ade9e245a04b Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 17:20:08 +0300 Subject: [PATCH 262/378] try respreader --- .../com/itmo/java/protocol/RespReader.java | 235 +++++------------- 1 file changed, 69 insertions(+), 166 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 252fbe37..f2ca5a14 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -1,22 +1,14 @@ package com.itmo.java.protocol; -import com.itmo.java.protocol.model.RespArray; -import com.itmo.java.protocol.model.RespBulkString; -import com.itmo.java.protocol.model.RespCommandId; -import com.itmo.java.protocol.model.RespError; -import com.itmo.java.protocol.model.RespObject; +import com.itmo.java.protocol.model.*; -import java.io.EOFException; -import java.io.IOException; -import java.io.InputStream; -import java.nio.ByteBuffer; +import java.io.*; import java.nio.charset.StandardCharsets; import java.util.ArrayList; -import java.util.List; public class RespReader implements AutoCloseable { - private final InputStream is; - private boolean isHasArray = false; + private static final int READ_AHEAD_LIMIT = 3; + private final InputStreamReader reader; /** * Специальные символы окончания элемента @@ -25,20 +17,18 @@ public class RespReader implements AutoCloseable { private static final byte LF = '\n'; public RespReader(InputStream is) { - this.is = is; + reader = new InputStreamReader(is); } /** * Есть ли следующий массив в стриме? */ public boolean hasArray() throws IOException { - try { - final byte code = is.readNBytes(1)[0]; - - return code == RespArray.CODE; - } catch(IOException ex) { - throw new IOException(ex); - } + BufferedReader bufferedReader = new BufferedReader(reader); + bufferedReader.mark(READ_AHEAD_LIMIT); + byte code = (byte) reader.read(); + bufferedReader.reset(); + return code == RespArray.CODE; } /** @@ -49,23 +39,22 @@ public boolean hasArray() throws IOException { * @throws IOException при ошибке чтения */ public RespObject readObject() throws IOException { - try { - byte[] firstSymbol = is.readNBytes(1); - if (firstSymbol.length == 0){ - throw new EOFException("end of the stream"); - } - if (firstSymbol[0] == RespError.CODE){ - return readError(); - } - if(firstSymbol[0] == RespBulkString.CODE){ + int codeInt = reader.read(); + if (codeInt == -1) { + throw new EOFException("InputStream is empty when try to read RespObject"); + } + byte code = (byte) codeInt; + switch (code) { + case RespArray.CODE: + return readArray(); + case RespBulkString.CODE: return readBulkString(); - } - if(firstSymbol[0] == RespCommandId.CODE){ + case RespCommandId.CODE: return readCommandId(); - } - throw new IOException("unknown byte" + new String(firstSymbol)); - } catch (IOException e){ - throw new IOException("exception in reading object", e); + case RespError.CODE: + return readError(); + default: + throw new IOException("Code character is not correct"); } } @@ -76,42 +65,7 @@ public RespObject readObject() throws IOException { * @throws IOException при ошибке чтения */ public RespError readError() throws IOException { - try { - byte symbol = is.readNBytes(1)[0]; - - final List symbols = new ArrayList<>(); - - boolean isEndOfError = false; - - while (!isEndOfError) { - while (symbol == CR) { - symbol = is.readNBytes(1)[0]; - - if (symbol == LF) { - isEndOfError = true; - } else { - symbols.add(CR); - } - } - - if (!isEndOfError) { - symbols.add(symbol); - symbol = is.readNBytes(1)[0]; - } - } - - final int symbolsCount = symbols.size(); - - final byte[] bytes = new byte[symbolsCount]; - - for (int i = 0; i < symbolsCount; i++) { - bytes[i] = symbols.get(i); - } - - return new RespError(bytes); - } catch (IOException ex) { - throw new IOException(ex); - } + return new RespError(readBytesToEndOfLine()); } /** @@ -121,20 +75,16 @@ public RespError readError() throws IOException { * @throws IOException при ошибке чтения */ public RespBulkString readBulkString() throws IOException { - try{ - int bulkSize = readInt(); - readCompareByte(LF); - if (bulkSize == -1){ - return RespBulkString.NULL_STRING; - } - byte[] bulkString = is.readNBytes(bulkSize); - readCompareByte(CR); - readCompareByte(LF); - return new RespBulkString(bulkString); - } catch (IOException e) { - throw new IOException("IO exception in reading Bulk String", e); + byte[] stringSizeBytes = readBytesToEndOfLine(); + int stringSize = Integer.parseInt(new String(stringSizeBytes, StandardCharsets.UTF_8)); + if (stringSize == RespBulkString.NULL_STRING_SIZE) { + return RespBulkString.NULL_STRING; } - + byte[] stringData = readBytesToEndOfLine(); + if (stringData.length != stringSize) { + throw new IOException("String length is not equal with StringBulk size"); + } + return new RespBulkString(stringData); } /** @@ -144,21 +94,13 @@ public RespBulkString readBulkString() throws IOException { * @throws IOException при ошибке чтения */ public RespArray readArray() throws IOException { - try { - if (!hasArray()) { - readCompareByte(RespArray.CODE); - } - int arraySize = readInt(); - readCompareByte(LF); - RespObject[] listObjects = new RespObject[arraySize]; - for (int i = 0; i < arraySize; i++){ - listObjects[i] = readObject(); - } - return new RespArray(listObjects); - } catch (IOException e) { - throw new IOException("IO exception in reading Array", e); + byte[] arraySizeBytes = readBytesToEndOfLine(); + int arraySize = Integer.parseInt(new String(arraySizeBytes, StandardCharsets.UTF_8)); + RespObject[] respObjectArray = new RespObject[arraySize]; + for (int i = 0; i < arraySize; i++) { + respObjectArray[i] = readObject(); } - + return new RespArray(respObjectArray); } /** @@ -168,87 +110,48 @@ public RespArray readArray() throws IOException { * @throws IOException при ошибке чтения */ public RespCommandId readCommandId() throws IOException { - try { - byte[] commandId1 = is.readNBytes(1); - byte[] commandId2 = is.readNBytes(1); - byte[] commandId3 = is.readNBytes(1); - byte[] commandId4 = is.readNBytes(1); - int commandId = ((commandId1[0] << 24) + (commandId2[0]<< 16) + (commandId3[0] << 8) + (commandId4[0] << 0)); - readCompareByte(CR); - readCompareByte(LF); - return new RespCommandId(commandId); - } catch (IOException e) { - throw new IOException("IO exception in reading command id", e); + byte[] idBytes = readBytesToEndOfLine(); + if (idBytes.length != 4) { + throw new IOException("Command Id is not integer"); } + return new RespCommandId(bytesToInt(idBytes)); } @Override public void close() throws IOException { - try { - is.close(); - } catch (IOException ex) { - throw new IOException(ex); - } + reader.close(); } - private byte[] getStringNumberInBytes() throws IOException { - byte symbol = is.readNBytes(1)[0]; - - final List symbols = new ArrayList<>(); - - while (symbol != CR) { - symbols.add(symbol); - symbol = is.readNBytes(1)[0]; - } - - final int symbolsCount = symbols.size(); - - final byte[] bytes = new byte[symbolsCount]; - - for (int i = 0; i < symbolsCount; i++) { - bytes[i] = symbols.get(i); - } - - return bytes; + private static int bytesToInt(byte[] bytes) { + return (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | (bytes[3]); } - private int readInt() throws IOException { - try{ - StringBuilder size = new StringBuilder(); - byte[] sizeByte = is.readNBytes(1); - if (sizeByte.length == 0){ - throw new EOFException("end of the stream"); + private byte[] readBytesToEndOfLine() throws IOException { + ArrayList message = new ArrayList<>(); + while (true) { + int currentByte = reader.read(); + if (currentByte == -1) { + throw new EOFException("Stream is empty when try to read all bytes before '\\r\\n'"); } - while (sizeByte[0] != CR){ - size.append(new String(sizeByte)); - sizeByte = is.readNBytes(1); - if (sizeByte.length == 0){ - throw new EOFException("end of the stream"); + if (currentByte == CR) { + int nextByte = reader.read(); + if (nextByte == -1) { + throw new EOFException("Stream is empty when try to read all bytes before '\\r\\n'"); + } + if (nextByte == LF){ + break; + }else { + message.add((byte) currentByte); + currentByte = nextByte; } } - try { - return Integer.parseInt(size.toString()); - } catch (NumberFormatException e) { - throw new IOException("expected reading int from this string: " + size.toString()); - } - } catch (IOException e) { - throw new IOException("IO exception in reading int", e); + message.add((byte) currentByte); } - } - - private void readCompareByte(byte compareWith) throws IOException { - byte[] nextByte; - try { - nextByte = is.readNBytes(1); - if (nextByte.length == 0){ - throw new EOFException("end of the stream"); - } else if (nextByte[0] != compareWith) { - throw new IOException("expected symbol: " + String.valueOf(compareWith) + " but get: " + String.valueOf(nextByte[0])); - } - } catch (IOException e) { - throw new IOException("IO exception in reading byte", e); + byte[] bytes = new byte[message.size()]; + for (int i = 0; i < message.size(); i++) { + bytes[i] = message.get(i); } + return bytes; } - -} \ No newline at end of file +} From 1a72bb74157939db7fd43a470732f24518f622d8 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 17:21:39 +0300 Subject: [PATCH 263/378] tetsting reader --- src/main/java/com/itmo/java/protocol/RespReader.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index f2ca5a14..997e6930 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -20,6 +20,7 @@ public RespReader(InputStream is) { reader = new InputStreamReader(is); } + /** * Есть ли следующий массив в стриме? */ From 468b2e6f4452185e81150de151cb8c1429a52238 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 17:29:02 +0300 Subject: [PATCH 264/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82=20comrea?= =?UTF-8?q?der?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../itmo/java/basics/resp/CommandReader.java | 26 +++++++++++++++---- .../com/itmo/java/protocol/RespReader.java | 2 +- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/resp/CommandReader.java b/src/main/java/com/itmo/java/basics/resp/CommandReader.java index 1c384742..b4284046 100644 --- a/src/main/java/com/itmo/java/basics/resp/CommandReader.java +++ b/src/main/java/com/itmo/java/basics/resp/CommandReader.java @@ -5,6 +5,9 @@ import com.itmo.java.basics.console.DatabaseCommands; import com.itmo.java.basics.console.ExecutionEnvironment; import com.itmo.java.protocol.RespReader; +import com.itmo.java.protocol.model.RespArray; +import com.itmo.java.protocol.model.RespBulkString; +import com.itmo.java.protocol.model.RespCommandId; import com.itmo.java.protocol.model.RespObject; import java.io.IOException; @@ -32,12 +35,25 @@ public boolean hasNextCommand() throws IOException { * @throws IllegalArgumentException если нет имени команды и id */ public DatabaseCommand readCommand() throws IOException { - List comArgs = respReader.readArray().getObjects(); - if(comArgs.size() < 2) { - throw new IllegalArgumentException("Why we dont have id and command name?"); + RespArray respArray = respReader.readArray(); + if (respArray.getObjects().size() < DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex() + 1){ + throw new IllegalArgumentException("RespArray does not have enough size to have id, name and one object"); } - return DatabaseCommands.valueOf(comArgs.get(DatabaseCommandArgPositions.COMMAND_NAME.getPositionIndex()).asString()) - .getCommand(executionEnvironment,comArgs); + RespObject id = respArray.getObjects().get(DatabaseCommandArgPositions.COMMAND_ID.getPositionIndex()); + if (!(id instanceof RespCommandId)){ + throw new IllegalArgumentException("Command does not have command id"); + } + if (id.asString() == null || id.asString().isEmpty()){ + throw new IllegalArgumentException("Command id does not exist"); + } + RespObject commandName = respArray.getObjects().get(DatabaseCommandArgPositions.COMMAND_NAME.getPositionIndex()); + if (!(commandName instanceof RespBulkString)){ + throw new IllegalArgumentException("Command does not have command name"); + } + if (commandName.asString() == null || commandName.asString().isEmpty()){ + throw new IllegalArgumentException("Command name does not exist"); + } + return DatabaseCommands.valueOf(commandName.asString()).getCommand(executionEnvironment, respArray.getObjects()); } @Override diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 997e6930..fd889a5d 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -20,7 +20,7 @@ public RespReader(InputStream is) { reader = new InputStreamReader(is); } - + /** * Есть ли следующий массив в стриме? */ From 9a6cf96a82ec0cc7ad6388fb1c3a7182962f6dad Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 17:33:53 +0300 Subject: [PATCH 265/378] testing --- .../connector/JavaSocketServerConnector.java | 55 +++++++++---------- .../connection/SocketKvsConnection.java | 52 ++++++++---------- 2 files changed, 48 insertions(+), 59 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index 63c983bf..0227e52e 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -1,14 +1,20 @@ package com.itmo.java.basics.connector; import com.itmo.java.basics.DatabaseServer; +import com.itmo.java.basics.config.ConfigLoader; +import com.itmo.java.basics.config.DatabaseConfig; +import com.itmo.java.basics.config.DatabaseServerConfig; import com.itmo.java.basics.config.ServerConfig; -import com.itmo.java.basics.console.DatabaseCommand; import com.itmo.java.basics.console.DatabaseCommandResult; +import com.itmo.java.basics.console.impl.ExecutionEnvironmentImpl; +import com.itmo.java.basics.initialization.impl.DatabaseInitializer; +import com.itmo.java.basics.initialization.impl.DatabaseServerInitializer; +import com.itmo.java.basics.initialization.impl.SegmentInitializer; +import com.itmo.java.basics.initialization.impl.TableInitializer; import com.itmo.java.basics.resp.CommandReader; import com.itmo.java.protocol.RespReader; import com.itmo.java.protocol.RespWriter; - import java.io.Closeable; import java.io.IOException; import java.net.ServerSocket; @@ -26,18 +32,18 @@ public class JavaSocketServerConnector implements Closeable { * Экзекьютор для выполнения ClientTask */ private final ExecutorService clientIOWorkers = Executors.newSingleThreadExecutor(); - private final ServerSocket serverSocket; // todo uncomment + private final ServerSocket serverSocket; private final ExecutorService connectionAcceptorExecutor = Executors.newSingleThreadExecutor(); - private DatabaseServer dbServer; + private final DatabaseServer server; /** * Стартует сервер. По аналогии с сокетом открывает коннекшн в конструкторе. */ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig config) throws IOException { - serverSocket = new ServerSocket(config.getPort()); - dbServer = databaseServer; + this.serverSocket = new ServerSocket(config.getPort()); + this.server = databaseServer; } /** @@ -45,12 +51,10 @@ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig con */ public void start() { connectionAcceptorExecutor.submit(() -> { - while (true) { Socket clientSocket = serverSocket.accept(); - clientIOWorkers.submit(new ClientTask(clientSocket, dbServer)); + clientIOWorkers.submit(new ClientTask(clientSocket, server)); } - }); } @@ -65,8 +69,8 @@ public void close() { if (serverSocket != null) { try { serverSocket.close(); - } catch (IOException exception) { - exception.printStackTrace(); + } catch (IOException e) { + throw new RuntimeException("IOException when try to close connection", e); } } } @@ -79,26 +83,21 @@ public static void main(String[] args) throws Exception { * Runnable, описывающий исполнение клиентской команды. */ static class ClientTask implements Runnable, Closeable { - - private RespWriter respWriter; - //private RespReader respReader; private final Socket client; - private final DatabaseServer databaseServer; + private final DatabaseServer server; + private final RespWriter respWriter; + /** * @param client клиентский сокет * @param server сервер, на котором исполняется задача */ public ClientTask(Socket client, DatabaseServer server) { - - databaseServer = server; this.client = client; + this.server = server; try { -// databaseServer = server; -// this.client = client; -// respReader = new RespReader(client.getInputStream()); this.respWriter = new RespWriter(client.getOutputStream()); - } catch (IOException e) { - e.printStackTrace(); + } catch (IOException e){ + throw new RuntimeException("IOException when open socket streams", e); } } @@ -111,9 +110,9 @@ public ClientTask(Socket client, DatabaseServer server) { */ @Override public void run() { - try (CommandReader commandReader = new CommandReader(new RespReader(client.getInputStream()), databaseServer.getEnv())) { + try (CommandReader commandReader = new CommandReader(new RespReader(client.getInputStream()), server.getEnv())) { while (commandReader.hasNextCommand()) { - CompletableFuture commandResult = databaseServer.executeNextCommand(commandReader.readCommand()); + CompletableFuture commandResult = server.executeNextCommand(commandReader.readCommand()); respWriter.write(commandResult.get().serialize()); } close(); @@ -131,11 +130,9 @@ public void close() { try { respWriter.close(); client.close(); -// respReader.close(); -// respWriter.close(); - } catch (IOException exception) { - exception.printStackTrace(); + } catch (IOException e){ + throw new RuntimeException("When try to close client connection", e); } } } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index fdf05541..855baf72 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -8,28 +8,27 @@ import java.io.IOException; import java.net.Socket; +import java.net.UnknownHostException; /** * С помощью {@link RespWriter} и {@link RespReader} читает/пишет в сокет */ public class SocketKvsConnection implements KvsConnection { - //final ConnectionConfig config; - final Socket socket; - final int port; - final String host; - final RespWriter respWriter; - final RespReader respReader; + private final int port; + private final String host; + private final Socket clientSocket; + private final RespWriter respWriter; + private final RespReader respReader; public SocketKvsConnection(ConnectionConfig config) { - port = config.getPort(); - host = config.getHost(); - + this.port = config.getPort(); + this.host = config.getHost(); try { - socket = new Socket(host, port); - respWriter = new RespWriter(socket.getOutputStream()); - respReader = new RespReader(socket.getInputStream()); - } catch (IOException exception) { - throw new RuntimeException("Creation socket error", exception); + this.clientSocket = new Socket(host, port); + this.respReader = new RespReader(clientSocket.getInputStream()); + respWriter = new RespWriter(clientSocket.getOutputStream()); + } catch (IOException e) { + throw new RuntimeException("IOException when try to connect by " + host + " " + port, e); } } @@ -42,20 +41,13 @@ public SocketKvsConnection(ConnectionConfig config) { @Override public synchronized RespObject send(int commandId, RespArray command) throws ConnectionException { try { - RespWriter respWriter = new RespWriter(socket.getOutputStream()); - + RespWriter respWriter = new RespWriter(clientSocket.getOutputStream()); respWriter.write(command); - - RespReader respReader = new RespReader(socket.getInputStream()); -// final RespObject respObject = respReader.readObject(); -// -// if (respObject.isError()) { -// throw new ConnectionException("Response error"); -// } - + RespReader respReader = new RespReader(clientSocket.getInputStream()); return respReader.readObject(); - } catch (IOException exception) { - throw new ConnectionException("Connection exception", exception); + } catch (IOException e) { + close(); + throw new ConnectionException("IOException when send " + command.asString() + " with " + host + " and port " + port + " ___IOMessage___: " + e.getMessage(), e); } } @@ -67,9 +59,9 @@ public void close() { try { respWriter.close(); respReader.close(); - socket.close(); - } catch (IOException exception) { - throw new RuntimeException("Closing client socket error", exception); + clientSocket.close(); + } catch (IOException e) { + throw new RuntimeException("IOException when try to close client socket"); } } -} \ No newline at end of file +} From 62b70385cc45e6845b15333ecf25e3bba5cf7fdb Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 17:36:44 +0300 Subject: [PATCH 266/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82=20reader?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/itmo/java/protocol/RespReader.java | 213 +++++++++++------- 1 file changed, 133 insertions(+), 80 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index fd889a5d..fd4a5291 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -1,14 +1,19 @@ package com.itmo.java.protocol; -import com.itmo.java.protocol.model.*; - -import java.io.*; +import com.itmo.java.protocol.model.RespArray; +import com.itmo.java.protocol.model.RespBulkString; +import com.itmo.java.protocol.model.RespCommandId; +import com.itmo.java.protocol.model.RespError; +import com.itmo.java.protocol.model.RespObject; + +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; public class RespReader implements AutoCloseable { - private static final int READ_AHEAD_LIMIT = 3; - private final InputStreamReader reader; + private final InputStream is; + private boolean isHasArray = false; /** * Специальные символы окончания элемента @@ -17,19 +22,22 @@ public class RespReader implements AutoCloseable { private static final byte LF = '\n'; public RespReader(InputStream is) { - reader = new InputStreamReader(is); + this.is = is; } - /** * Есть ли следующий массив в стриме? */ public boolean hasArray() throws IOException { - BufferedReader bufferedReader = new BufferedReader(reader); - bufferedReader.mark(READ_AHEAD_LIMIT); - byte code = (byte) reader.read(); - bufferedReader.reset(); - return code == RespArray.CODE; + if (isHasArray) { + return true; + } + byte[] currentRespObjectType = is.readNBytes(1); + if (currentRespObjectType[0] == RespArray.CODE){ + isHasArray = true; + return true; + } + return false; } /** @@ -40,22 +48,48 @@ public boolean hasArray() throws IOException { * @throws IOException при ошибке чтения */ public RespObject readObject() throws IOException { - int codeInt = reader.read(); - if (codeInt == -1) { - throw new EOFException("InputStream is empty when try to read RespObject"); - } - byte code = (byte) codeInt; - switch (code) { - case RespArray.CODE: - return readArray(); - case RespBulkString.CODE: + try { + byte[] firstSymbol = is.readNBytes(1); + if (firstSymbol.length == 0){ + throw new EOFException("end of the stream"); + } + if (firstSymbol[0] == RespError.CODE){ + return readError(); + } + if(firstSymbol[0] == RespBulkString.CODE){ return readBulkString(); - case RespCommandId.CODE: + } + if(firstSymbol[0] == RespCommandId.CODE){ return readCommandId(); - case RespError.CODE: - return readError(); - default: - throw new IOException("Code character is not correct"); + } + throw new IOException("unknown byte" + new String(firstSymbol)); + } catch (IOException e){ + throw new IOException("exception in reading object", e); + } + } + + + private int readInt() throws IOException { + try{ + StringBuilder size = new StringBuilder(); + byte[] sizeByte = is.readNBytes(1); + if (sizeByte.length == 0){ + throw new EOFException("end of the stream"); + } + while (sizeByte[0] != CR){ + size.append(new String(sizeByte)); + sizeByte = is.readNBytes(1); + if (sizeByte.length == 0){ + throw new EOFException("end of the stream"); + } + } + try { + return Integer.parseInt(size.toString()); + } catch (NumberFormatException e) { + throw new IOException("expected reading int from this string: " + size.toString()); + } + } catch (IOException e) { + throw new IOException("IO exception in reading int", e); } } @@ -66,7 +100,24 @@ public RespObject readObject() throws IOException { * @throws IOException при ошибке чтения */ public RespError readError() throws IOException { - return new RespError(readBytesToEndOfLine()); + try{ + StringBuilder errorMessage = new StringBuilder(); + byte[] currentSymbol = is.readNBytes(1); + if (currentSymbol.length == 0){ + throw new EOFException("end of the stream"); + } + while (currentSymbol[0] != CR){ + errorMessage.append(new String(currentSymbol)); + currentSymbol = is.readNBytes(1); + if (currentSymbol.length == 0){ + throw new EOFException("end of the stream"); + } + } + readCompareByte(LF); + return new RespError(errorMessage.toString().getBytes(StandardCharsets.UTF_8)); + } catch (IOException e) { + throw new IOException("IO exception in reading Error", e); + } } /** @@ -76,16 +127,20 @@ public RespError readError() throws IOException { * @throws IOException при ошибке чтения */ public RespBulkString readBulkString() throws IOException { - byte[] stringSizeBytes = readBytesToEndOfLine(); - int stringSize = Integer.parseInt(new String(stringSizeBytes, StandardCharsets.UTF_8)); - if (stringSize == RespBulkString.NULL_STRING_SIZE) { - return RespBulkString.NULL_STRING; - } - byte[] stringData = readBytesToEndOfLine(); - if (stringData.length != stringSize) { - throw new IOException("String length is not equal with StringBulk size"); + try{ + int bulkSize = readInt(); + readCompareByte(LF); + if (bulkSize == -1){ + return RespBulkString.NULL_STRING; + } + byte[] bulkString = is.readNBytes(bulkSize); + readCompareByte(CR); + readCompareByte(LF); + return new RespBulkString(bulkString); + } catch (IOException e) { + throw new IOException("IO exception in reading Bulk String", e); } - return new RespBulkString(stringData); + } /** @@ -95,13 +150,21 @@ public RespBulkString readBulkString() throws IOException { * @throws IOException при ошибке чтения */ public RespArray readArray() throws IOException { - byte[] arraySizeBytes = readBytesToEndOfLine(); - int arraySize = Integer.parseInt(new String(arraySizeBytes, StandardCharsets.UTF_8)); - RespObject[] respObjectArray = new RespObject[arraySize]; - for (int i = 0; i < arraySize; i++) { - respObjectArray[i] = readObject(); + try { + if (!isHasArray) { + readCompareByte(RespArray.CODE); + } + int arraySize = readInt(); + readCompareByte(LF); + RespObject[] listObjects = new RespObject[arraySize]; + for (int i = 0; i < arraySize; i++){ + listObjects[i] = readObject(); + } + return new RespArray(listObjects); + } catch (IOException e) { + throw new IOException("IO exception in reading Array", e); } - return new RespArray(respObjectArray); + } /** @@ -111,48 +174,38 @@ public RespArray readArray() throws IOException { * @throws IOException при ошибке чтения */ public RespCommandId readCommandId() throws IOException { - byte[] idBytes = readBytesToEndOfLine(); - if (idBytes.length != 4) { - throw new IOException("Command Id is not integer"); + try { + byte[] commandId1 = is.readNBytes(1); + byte[] commandId2 = is.readNBytes(1); + byte[] commandId3 = is.readNBytes(1); + byte[] commandId4 = is.readNBytes(1); + int commandId = ((commandId1[0] << 24) + (commandId2[0]<< 16) + (commandId3[0] << 8) + (commandId4[0] << 0)); + readCompareByte(CR); + readCompareByte(LF); + return new RespCommandId(commandId); + } catch (IOException e) { + throw new IOException("IO exception in reading command id", e); } - return new RespCommandId(bytesToInt(idBytes)); } - - @Override - public void close() throws IOException { - reader.close(); + private void readCompareByte(byte compareWith) throws IOException { + byte[] nextByte; + try { + nextByte = is.readNBytes(1); + if (nextByte.length == 0){ + throw new EOFException("end of the stream"); + } else if (nextByte[0] != compareWith) { + throw new IOException("expected symbol: " + String.valueOf(compareWith) + " but get: " + String.valueOf(nextByte[0])); + } + } catch (IOException e) { + throw new IOException("IO exception in reading byte", e); + } } - private static int bytesToInt(byte[] bytes) { - return (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | (bytes[3]); - } - private byte[] readBytesToEndOfLine() throws IOException { - ArrayList message = new ArrayList<>(); - while (true) { - int currentByte = reader.read(); - if (currentByte == -1) { - throw new EOFException("Stream is empty when try to read all bytes before '\\r\\n'"); - } - if (currentByte == CR) { - int nextByte = reader.read(); - if (nextByte == -1) { - throw new EOFException("Stream is empty when try to read all bytes before '\\r\\n'"); - } - if (nextByte == LF){ - break; - }else { - message.add((byte) currentByte); - currentByte = nextByte; - } - } - message.add((byte) currentByte); - } - byte[] bytes = new byte[message.size()]; - for (int i = 0; i < message.size(); i++) { - bytes[i] = message.get(i); - } - return bytes; + @Override + public void close() throws IOException { + is.close(); } } + \ No newline at end of file From 1d8a10e5c48ec2df1b35a9be5688514cf5d8009f Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 17:44:43 +0300 Subject: [PATCH 267/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../connector/JavaSocketServerConnector.java | 55 ++++--- .../itmo/java/basics/resp/CommandReader.java | 26 +-- .../connection/SocketKvsConnection.java | 52 +++--- .../com/itmo/java/protocol/RespReader.java | 155 +++++++++++------- .../com/itmo/java/protocol/RespWriter.java | 4 +- 5 files changed, 165 insertions(+), 127 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index 0227e52e..63c983bf 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -1,20 +1,14 @@ package com.itmo.java.basics.connector; import com.itmo.java.basics.DatabaseServer; -import com.itmo.java.basics.config.ConfigLoader; -import com.itmo.java.basics.config.DatabaseConfig; -import com.itmo.java.basics.config.DatabaseServerConfig; import com.itmo.java.basics.config.ServerConfig; +import com.itmo.java.basics.console.DatabaseCommand; import com.itmo.java.basics.console.DatabaseCommandResult; -import com.itmo.java.basics.console.impl.ExecutionEnvironmentImpl; -import com.itmo.java.basics.initialization.impl.DatabaseInitializer; -import com.itmo.java.basics.initialization.impl.DatabaseServerInitializer; -import com.itmo.java.basics.initialization.impl.SegmentInitializer; -import com.itmo.java.basics.initialization.impl.TableInitializer; import com.itmo.java.basics.resp.CommandReader; import com.itmo.java.protocol.RespReader; import com.itmo.java.protocol.RespWriter; + import java.io.Closeable; import java.io.IOException; import java.net.ServerSocket; @@ -32,18 +26,18 @@ public class JavaSocketServerConnector implements Closeable { * Экзекьютор для выполнения ClientTask */ private final ExecutorService clientIOWorkers = Executors.newSingleThreadExecutor(); + private final ServerSocket serverSocket; // todo uncomment - private final ServerSocket serverSocket; private final ExecutorService connectionAcceptorExecutor = Executors.newSingleThreadExecutor(); - private final DatabaseServer server; + private DatabaseServer dbServer; /** * Стартует сервер. По аналогии с сокетом открывает коннекшн в конструкторе. */ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig config) throws IOException { - this.serverSocket = new ServerSocket(config.getPort()); - this.server = databaseServer; + serverSocket = new ServerSocket(config.getPort()); + dbServer = databaseServer; } /** @@ -51,10 +45,12 @@ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig con */ public void start() { connectionAcceptorExecutor.submit(() -> { + while (true) { Socket clientSocket = serverSocket.accept(); - clientIOWorkers.submit(new ClientTask(clientSocket, server)); + clientIOWorkers.submit(new ClientTask(clientSocket, dbServer)); } + }); } @@ -69,8 +65,8 @@ public void close() { if (serverSocket != null) { try { serverSocket.close(); - } catch (IOException e) { - throw new RuntimeException("IOException when try to close connection", e); + } catch (IOException exception) { + exception.printStackTrace(); } } } @@ -83,21 +79,26 @@ public static void main(String[] args) throws Exception { * Runnable, описывающий исполнение клиентской команды. */ static class ClientTask implements Runnable, Closeable { - private final Socket client; - private final DatabaseServer server; - private final RespWriter respWriter; + private RespWriter respWriter; + //private RespReader respReader; + private final Socket client; + private final DatabaseServer databaseServer; /** * @param client клиентский сокет * @param server сервер, на котором исполняется задача */ public ClientTask(Socket client, DatabaseServer server) { + + databaseServer = server; this.client = client; - this.server = server; try { +// databaseServer = server; +// this.client = client; +// respReader = new RespReader(client.getInputStream()); this.respWriter = new RespWriter(client.getOutputStream()); - } catch (IOException e){ - throw new RuntimeException("IOException when open socket streams", e); + } catch (IOException e) { + e.printStackTrace(); } } @@ -110,9 +111,9 @@ public ClientTask(Socket client, DatabaseServer server) { */ @Override public void run() { - try (CommandReader commandReader = new CommandReader(new RespReader(client.getInputStream()), server.getEnv())) { + try (CommandReader commandReader = new CommandReader(new RespReader(client.getInputStream()), databaseServer.getEnv())) { while (commandReader.hasNextCommand()) { - CompletableFuture commandResult = server.executeNextCommand(commandReader.readCommand()); + CompletableFuture commandResult = databaseServer.executeNextCommand(commandReader.readCommand()); respWriter.write(commandResult.get().serialize()); } close(); @@ -130,9 +131,11 @@ public void close() { try { respWriter.close(); client.close(); - } catch (IOException e){ - throw new RuntimeException("When try to close client connection", e); +// respReader.close(); +// respWriter.close(); + } catch (IOException exception) { + exception.printStackTrace(); } } } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/resp/CommandReader.java b/src/main/java/com/itmo/java/basics/resp/CommandReader.java index b4284046..1c384742 100644 --- a/src/main/java/com/itmo/java/basics/resp/CommandReader.java +++ b/src/main/java/com/itmo/java/basics/resp/CommandReader.java @@ -5,9 +5,6 @@ import com.itmo.java.basics.console.DatabaseCommands; import com.itmo.java.basics.console.ExecutionEnvironment; import com.itmo.java.protocol.RespReader; -import com.itmo.java.protocol.model.RespArray; -import com.itmo.java.protocol.model.RespBulkString; -import com.itmo.java.protocol.model.RespCommandId; import com.itmo.java.protocol.model.RespObject; import java.io.IOException; @@ -35,25 +32,12 @@ public boolean hasNextCommand() throws IOException { * @throws IllegalArgumentException если нет имени команды и id */ public DatabaseCommand readCommand() throws IOException { - RespArray respArray = respReader.readArray(); - if (respArray.getObjects().size() < DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex() + 1){ - throw new IllegalArgumentException("RespArray does not have enough size to have id, name and one object"); + List comArgs = respReader.readArray().getObjects(); + if(comArgs.size() < 2) { + throw new IllegalArgumentException("Why we dont have id and command name?"); } - RespObject id = respArray.getObjects().get(DatabaseCommandArgPositions.COMMAND_ID.getPositionIndex()); - if (!(id instanceof RespCommandId)){ - throw new IllegalArgumentException("Command does not have command id"); - } - if (id.asString() == null || id.asString().isEmpty()){ - throw new IllegalArgumentException("Command id does not exist"); - } - RespObject commandName = respArray.getObjects().get(DatabaseCommandArgPositions.COMMAND_NAME.getPositionIndex()); - if (!(commandName instanceof RespBulkString)){ - throw new IllegalArgumentException("Command does not have command name"); - } - if (commandName.asString() == null || commandName.asString().isEmpty()){ - throw new IllegalArgumentException("Command name does not exist"); - } - return DatabaseCommands.valueOf(commandName.asString()).getCommand(executionEnvironment, respArray.getObjects()); + return DatabaseCommands.valueOf(comArgs.get(DatabaseCommandArgPositions.COMMAND_NAME.getPositionIndex()).asString()) + .getCommand(executionEnvironment,comArgs); } @Override diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index 855baf72..fdf05541 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -8,27 +8,28 @@ import java.io.IOException; import java.net.Socket; -import java.net.UnknownHostException; /** * С помощью {@link RespWriter} и {@link RespReader} читает/пишет в сокет */ public class SocketKvsConnection implements KvsConnection { - private final int port; - private final String host; - private final Socket clientSocket; - private final RespWriter respWriter; - private final RespReader respReader; + //final ConnectionConfig config; + final Socket socket; + final int port; + final String host; + final RespWriter respWriter; + final RespReader respReader; public SocketKvsConnection(ConnectionConfig config) { - this.port = config.getPort(); - this.host = config.getHost(); + port = config.getPort(); + host = config.getHost(); + try { - this.clientSocket = new Socket(host, port); - this.respReader = new RespReader(clientSocket.getInputStream()); - respWriter = new RespWriter(clientSocket.getOutputStream()); - } catch (IOException e) { - throw new RuntimeException("IOException when try to connect by " + host + " " + port, e); + socket = new Socket(host, port); + respWriter = new RespWriter(socket.getOutputStream()); + respReader = new RespReader(socket.getInputStream()); + } catch (IOException exception) { + throw new RuntimeException("Creation socket error", exception); } } @@ -41,13 +42,20 @@ public SocketKvsConnection(ConnectionConfig config) { @Override public synchronized RespObject send(int commandId, RespArray command) throws ConnectionException { try { - RespWriter respWriter = new RespWriter(clientSocket.getOutputStream()); + RespWriter respWriter = new RespWriter(socket.getOutputStream()); + respWriter.write(command); - RespReader respReader = new RespReader(clientSocket.getInputStream()); + + RespReader respReader = new RespReader(socket.getInputStream()); +// final RespObject respObject = respReader.readObject(); +// +// if (respObject.isError()) { +// throw new ConnectionException("Response error"); +// } + return respReader.readObject(); - } catch (IOException e) { - close(); - throw new ConnectionException("IOException when send " + command.asString() + " with " + host + " and port " + port + " ___IOMessage___: " + e.getMessage(), e); + } catch (IOException exception) { + throw new ConnectionException("Connection exception", exception); } } @@ -59,9 +67,9 @@ public void close() { try { respWriter.close(); respReader.close(); - clientSocket.close(); - } catch (IOException e) { - throw new RuntimeException("IOException when try to close client socket"); + socket.close(); + } catch (IOException exception) { + throw new RuntimeException("Closing client socket error", exception); } } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index fd4a5291..252fbe37 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -9,7 +9,10 @@ import java.io.EOFException; import java.io.IOException; import java.io.InputStream; +import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; public class RespReader implements AutoCloseable { private final InputStream is; @@ -29,15 +32,13 @@ public RespReader(InputStream is) { * Есть ли следующий массив в стриме? */ public boolean hasArray() throws IOException { - if (isHasArray) { - return true; - } - byte[] currentRespObjectType = is.readNBytes(1); - if (currentRespObjectType[0] == RespArray.CODE){ - isHasArray = true; - return true; + try { + final byte code = is.readNBytes(1)[0]; + + return code == RespArray.CODE; + } catch(IOException ex) { + throw new IOException(ex); } - return false; } /** @@ -68,31 +69,6 @@ public RespObject readObject() throws IOException { } } - - private int readInt() throws IOException { - try{ - StringBuilder size = new StringBuilder(); - byte[] sizeByte = is.readNBytes(1); - if (sizeByte.length == 0){ - throw new EOFException("end of the stream"); - } - while (sizeByte[0] != CR){ - size.append(new String(sizeByte)); - sizeByte = is.readNBytes(1); - if (sizeByte.length == 0){ - throw new EOFException("end of the stream"); - } - } - try { - return Integer.parseInt(size.toString()); - } catch (NumberFormatException e) { - throw new IOException("expected reading int from this string: " + size.toString()); - } - } catch (IOException e) { - throw new IOException("IO exception in reading int", e); - } - } - /** * Считывает объект ошибки * @@ -100,23 +76,41 @@ private int readInt() throws IOException { * @throws IOException при ошибке чтения */ public RespError readError() throws IOException { - try{ - StringBuilder errorMessage = new StringBuilder(); - byte[] currentSymbol = is.readNBytes(1); - if (currentSymbol.length == 0){ - throw new EOFException("end of the stream"); - } - while (currentSymbol[0] != CR){ - errorMessage.append(new String(currentSymbol)); - currentSymbol = is.readNBytes(1); - if (currentSymbol.length == 0){ - throw new EOFException("end of the stream"); + try { + byte symbol = is.readNBytes(1)[0]; + + final List symbols = new ArrayList<>(); + + boolean isEndOfError = false; + + while (!isEndOfError) { + while (symbol == CR) { + symbol = is.readNBytes(1)[0]; + + if (symbol == LF) { + isEndOfError = true; + } else { + symbols.add(CR); + } + } + + if (!isEndOfError) { + symbols.add(symbol); + symbol = is.readNBytes(1)[0]; } } - readCompareByte(LF); - return new RespError(errorMessage.toString().getBytes(StandardCharsets.UTF_8)); - } catch (IOException e) { - throw new IOException("IO exception in reading Error", e); + + final int symbolsCount = symbols.size(); + + final byte[] bytes = new byte[symbolsCount]; + + for (int i = 0; i < symbolsCount; i++) { + bytes[i] = symbols.get(i); + } + + return new RespError(bytes); + } catch (IOException ex) { + throw new IOException(ex); } } @@ -151,7 +145,7 @@ public RespBulkString readBulkString() throws IOException { */ public RespArray readArray() throws IOException { try { - if (!isHasArray) { + if (!hasArray()) { readCompareByte(RespArray.CODE); } int arraySize = readInt(); @@ -188,6 +182,61 @@ public RespCommandId readCommandId() throws IOException { } } + + @Override + public void close() throws IOException { + try { + is.close(); + } catch (IOException ex) { + throw new IOException(ex); + } + } + + private byte[] getStringNumberInBytes() throws IOException { + byte symbol = is.readNBytes(1)[0]; + + final List symbols = new ArrayList<>(); + + while (symbol != CR) { + symbols.add(symbol); + symbol = is.readNBytes(1)[0]; + } + + final int symbolsCount = symbols.size(); + + final byte[] bytes = new byte[symbolsCount]; + + for (int i = 0; i < symbolsCount; i++) { + bytes[i] = symbols.get(i); + } + + return bytes; + } + + private int readInt() throws IOException { + try{ + StringBuilder size = new StringBuilder(); + byte[] sizeByte = is.readNBytes(1); + if (sizeByte.length == 0){ + throw new EOFException("end of the stream"); + } + while (sizeByte[0] != CR){ + size.append(new String(sizeByte)); + sizeByte = is.readNBytes(1); + if (sizeByte.length == 0){ + throw new EOFException("end of the stream"); + } + } + try { + return Integer.parseInt(size.toString()); + } catch (NumberFormatException e) { + throw new IOException("expected reading int from this string: " + size.toString()); + } + } catch (IOException e) { + throw new IOException("IO exception in reading int", e); + } + } + private void readCompareByte(byte compareWith) throws IOException { byte[] nextByte; try { @@ -202,10 +251,4 @@ private void readCompareByte(byte compareWith) throws IOException { } } - - @Override - public void close() throws IOException { - is.close(); - } -} - \ No newline at end of file +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/protocol/RespWriter.java b/src/main/java/com/itmo/java/protocol/RespWriter.java index 448177c0..fc21f3e9 100644 --- a/src/main/java/com/itmo/java/protocol/RespWriter.java +++ b/src/main/java/com/itmo/java/protocol/RespWriter.java @@ -11,7 +11,7 @@ public class RespWriter implements AutoCloseable{ public RespWriter(OutputStream os) { - outputStream = os; + outputStream = os; } /** @@ -33,4 +33,4 @@ public void close() throws IOException { throw new IOException(ex); } } -} +} \ No newline at end of file From 6f96aaf32f5a07d7cca0f7d0f8638dabd88a466f Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 18:09:17 +0300 Subject: [PATCH 268/378] try respreader --- .../com/itmo/java/protocol/RespReader.java | 235 +++++------------- 1 file changed, 69 insertions(+), 166 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 252fbe37..df06aac1 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -1,22 +1,14 @@ package com.itmo.java.protocol; -import com.itmo.java.protocol.model.RespArray; -import com.itmo.java.protocol.model.RespBulkString; -import com.itmo.java.protocol.model.RespCommandId; -import com.itmo.java.protocol.model.RespError; -import com.itmo.java.protocol.model.RespObject; - -import java.io.EOFException; -import java.io.IOException; -import java.io.InputStream; -import java.nio.ByteBuffer; +import com.itmo.java.protocol.model.*; + +import java.io.*; import java.nio.charset.StandardCharsets; import java.util.ArrayList; -import java.util.List; public class RespReader implements AutoCloseable { - private final InputStream is; - private boolean isHasArray = false; + private static final int READ_AHEAD_LIMIT = 3; + private final InputStreamReader reader; /** * Специальные символы окончания элемента @@ -25,20 +17,16 @@ public class RespReader implements AutoCloseable { private static final byte LF = '\n'; public RespReader(InputStream is) { - this.is = is; + reader = new InputStreamReader(is); } + /** * Есть ли следующий массив в стриме? */ public boolean hasArray() throws IOException { - try { - final byte code = is.readNBytes(1)[0]; - - return code == RespArray.CODE; - } catch(IOException ex) { - throw new IOException(ex); - } + byte code = (byte) reader.read(); + return code == RespArray.CODE; } /** @@ -49,23 +37,22 @@ public boolean hasArray() throws IOException { * @throws IOException при ошибке чтения */ public RespObject readObject() throws IOException { - try { - byte[] firstSymbol = is.readNBytes(1); - if (firstSymbol.length == 0){ - throw new EOFException("end of the stream"); - } - if (firstSymbol[0] == RespError.CODE){ - return readError(); - } - if(firstSymbol[0] == RespBulkString.CODE){ + int codeInt = reader.read(); + if (codeInt == -1) { + throw new EOFException("InputStream is empty when try to read RespObject"); + } + byte code = (byte) codeInt; + switch (code) { + case RespArray.CODE: + return readArray(); + case RespBulkString.CODE: return readBulkString(); - } - if(firstSymbol[0] == RespCommandId.CODE){ + case RespCommandId.CODE: return readCommandId(); - } - throw new IOException("unknown byte" + new String(firstSymbol)); - } catch (IOException e){ - throw new IOException("exception in reading object", e); + case RespError.CODE: + return readError(); + default: + throw new IOException("Code character is not correct"); } } @@ -76,42 +63,7 @@ public RespObject readObject() throws IOException { * @throws IOException при ошибке чтения */ public RespError readError() throws IOException { - try { - byte symbol = is.readNBytes(1)[0]; - - final List symbols = new ArrayList<>(); - - boolean isEndOfError = false; - - while (!isEndOfError) { - while (symbol == CR) { - symbol = is.readNBytes(1)[0]; - - if (symbol == LF) { - isEndOfError = true; - } else { - symbols.add(CR); - } - } - - if (!isEndOfError) { - symbols.add(symbol); - symbol = is.readNBytes(1)[0]; - } - } - - final int symbolsCount = symbols.size(); - - final byte[] bytes = new byte[symbolsCount]; - - for (int i = 0; i < symbolsCount; i++) { - bytes[i] = symbols.get(i); - } - - return new RespError(bytes); - } catch (IOException ex) { - throw new IOException(ex); - } + return new RespError(readBytesToEndOfLine()); } /** @@ -121,20 +73,16 @@ public RespError readError() throws IOException { * @throws IOException при ошибке чтения */ public RespBulkString readBulkString() throws IOException { - try{ - int bulkSize = readInt(); - readCompareByte(LF); - if (bulkSize == -1){ - return RespBulkString.NULL_STRING; - } - byte[] bulkString = is.readNBytes(bulkSize); - readCompareByte(CR); - readCompareByte(LF); - return new RespBulkString(bulkString); - } catch (IOException e) { - throw new IOException("IO exception in reading Bulk String", e); + byte[] stringSizeBytes = readBytesToEndOfLine(); + int stringSize = Integer.parseInt(new String(stringSizeBytes, StandardCharsets.UTF_8)); + if (stringSize == RespBulkString.NULL_STRING_SIZE) { + return RespBulkString.NULL_STRING; } - + byte[] stringData = readBytesToEndOfLine(); + if (stringData.length != stringSize) { + throw new IOException("String length is not equal with StringBulk size"); + } + return new RespBulkString(stringData); } /** @@ -144,21 +92,13 @@ public RespBulkString readBulkString() throws IOException { * @throws IOException при ошибке чтения */ public RespArray readArray() throws IOException { - try { - if (!hasArray()) { - readCompareByte(RespArray.CODE); - } - int arraySize = readInt(); - readCompareByte(LF); - RespObject[] listObjects = new RespObject[arraySize]; - for (int i = 0; i < arraySize; i++){ - listObjects[i] = readObject(); - } - return new RespArray(listObjects); - } catch (IOException e) { - throw new IOException("IO exception in reading Array", e); + byte[] arraySizeBytes = readBytesToEndOfLine(); + int arraySize = Integer.parseInt(new String(arraySizeBytes, StandardCharsets.UTF_8)); + RespObject[] respObjectArray = new RespObject[arraySize]; + for (int i = 0; i < arraySize; i++) { + respObjectArray[i] = readObject(); } - + return new RespArray(respObjectArray); } /** @@ -168,87 +108,50 @@ public RespArray readArray() throws IOException { * @throws IOException при ошибке чтения */ public RespCommandId readCommandId() throws IOException { - try { - byte[] commandId1 = is.readNBytes(1); - byte[] commandId2 = is.readNBytes(1); - byte[] commandId3 = is.readNBytes(1); - byte[] commandId4 = is.readNBytes(1); - int commandId = ((commandId1[0] << 24) + (commandId2[0]<< 16) + (commandId3[0] << 8) + (commandId4[0] << 0)); - readCompareByte(CR); - readCompareByte(LF); - return new RespCommandId(commandId); - } catch (IOException e) { - throw new IOException("IO exception in reading command id", e); + byte[] idBytes = readBytesToEndOfLine(); + if (idBytes.length != 4) { + throw new IOException("Command Id is not integer"); } + return new RespCommandId(bytesToInt(idBytes)); } @Override public void close() throws IOException { - try { - is.close(); - } catch (IOException ex) { - throw new IOException(ex); - } + reader.close(); } - private byte[] getStringNumberInBytes() throws IOException { - byte symbol = is.readNBytes(1)[0]; - - final List symbols = new ArrayList<>(); - - while (symbol != CR) { - symbols.add(symbol); - symbol = is.readNBytes(1)[0]; - } - - final int symbolsCount = symbols.size(); - - final byte[] bytes = new byte[symbolsCount]; - - for (int i = 0; i < symbolsCount; i++) { - bytes[i] = symbols.get(i); - } - - return bytes; + private static int bytesToInt(byte[] bytes) { + return (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | (bytes[3]); } - private int readInt() throws IOException { - try{ - StringBuilder size = new StringBuilder(); - byte[] sizeByte = is.readNBytes(1); - if (sizeByte.length == 0){ - throw new EOFException("end of the stream"); + private byte[] readBytesToEndOfLine() throws IOException { + ArrayList message = new ArrayList<>(); + while (true) { + int currentByte = reader.read(); + if (currentByte == -1) { + throw new EOFException("Stream is empty when try to read all bytes before '\\r\\n'"); } - while (sizeByte[0] != CR){ - size.append(new String(sizeByte)); - sizeByte = is.readNBytes(1); - if (sizeByte.length == 0){ - throw new EOFException("end of the stream"); + if (currentByte == CR) { + reader.mark(READ_AHEAD_LIMIT); + int nextByte = reader.read(); + if (nextByte == -1) { + throw new EOFException("Stream is empty when try to read all bytes before '\\r\\n'"); + } + if (nextByte == LF){ + reader.reset(); + reader.read(); + break; + }else { + reader.reset(); } } - try { - return Integer.parseInt(size.toString()); - } catch (NumberFormatException e) { - throw new IOException("expected reading int from this string: " + size.toString()); - } - } catch (IOException e) { - throw new IOException("IO exception in reading int", e); + message.add((byte) currentByte); } - } - - private void readCompareByte(byte compareWith) throws IOException { - byte[] nextByte; - try { - nextByte = is.readNBytes(1); - if (nextByte.length == 0){ - throw new EOFException("end of the stream"); - } else if (nextByte[0] != compareWith) { - throw new IOException("expected symbol: " + String.valueOf(compareWith) + " but get: " + String.valueOf(nextByte[0])); - } - } catch (IOException e) { - throw new IOException("IO exception in reading byte", e); + byte[] bytes = new byte[message.size()]; + for (int i = 0; i < message.size(); i++) { + bytes[i] = message.get(i); } + return bytes; } - } \ No newline at end of file From 63ce2af95eaf70b5db242e876a3f2afaece0d8e2 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 18:17:01 +0300 Subject: [PATCH 269/378] =?UTF-8?q?update=20+=20=D0=BE=D1=82=D0=BA=D0=B0?= =?UTF-8?q?=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../connector/JavaSocketServerConnector.java | 63 ++++++++++--------- .../itmo/java/basics/resp/CommandReader.java | 43 +++++++++---- .../connection/SocketKvsConnection.java | 52 +++++++-------- 3 files changed, 86 insertions(+), 72 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index 63c983bf..3bb88ac1 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -1,14 +1,20 @@ package com.itmo.java.basics.connector; import com.itmo.java.basics.DatabaseServer; +import com.itmo.java.basics.config.ConfigLoader; +import com.itmo.java.basics.config.DatabaseConfig; +import com.itmo.java.basics.config.DatabaseServerConfig; import com.itmo.java.basics.config.ServerConfig; -import com.itmo.java.basics.console.DatabaseCommand; import com.itmo.java.basics.console.DatabaseCommandResult; +import com.itmo.java.basics.console.impl.ExecutionEnvironmentImpl; +import com.itmo.java.basics.initialization.impl.DatabaseInitializer; +import com.itmo.java.basics.initialization.impl.DatabaseServerInitializer; +import com.itmo.java.basics.initialization.impl.SegmentInitializer; +import com.itmo.java.basics.initialization.impl.TableInitializer; import com.itmo.java.basics.resp.CommandReader; import com.itmo.java.protocol.RespReader; import com.itmo.java.protocol.RespWriter; - import java.io.Closeable; import java.io.IOException; import java.net.ServerSocket; @@ -26,18 +32,18 @@ public class JavaSocketServerConnector implements Closeable { * Экзекьютор для выполнения ClientTask */ private final ExecutorService clientIOWorkers = Executors.newSingleThreadExecutor(); - private final ServerSocket serverSocket; // todo uncomment + private final ServerSocket serverSocket; private final ExecutorService connectionAcceptorExecutor = Executors.newSingleThreadExecutor(); - private DatabaseServer dbServer; + private final DatabaseServer server; /** * Стартует сервер. По аналогии с сокетом открывает коннекшн в конструкторе. */ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig config) throws IOException { - serverSocket = new ServerSocket(config.getPort()); - dbServer = databaseServer; + this.serverSocket = new ServerSocket(config.getPort()); + this.server = databaseServer; } /** @@ -45,12 +51,10 @@ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig con */ public void start() { connectionAcceptorExecutor.submit(() -> { - while (true) { Socket clientSocket = serverSocket.accept(); - clientIOWorkers.submit(new ClientTask(clientSocket, dbServer)); + clientIOWorkers.submit(new ClientTask(clientSocket, server)); } - }); } @@ -65,40 +69,43 @@ public void close() { if (serverSocket != null) { try { serverSocket.close(); - } catch (IOException exception) { - exception.printStackTrace(); + } catch (IOException e) { + throw new RuntimeException("IOException when try to close connection", e); } } } public static void main(String[] args) throws Exception { + DatabaseServerConfig config = new ConfigLoader().readConfig(); + System.out.println(config.getDbConfig().getWorkingPath()); + System.out.println(config.getServerConfig().getPort()); + System.out.println(config.getServerConfig().getHost()); + DatabaseServer server = DatabaseServer.initialize(new ExecutionEnvironmentImpl(config.getDbConfig()), + new DatabaseServerInitializer(new DatabaseInitializer(new TableInitializer(new SegmentInitializer())))); + JavaSocketServerConnector connector = new JavaSocketServerConnector(server, config.getServerConfig()); + connector.start(); } /** * Runnable, описывающий исполнение клиентской команды. */ static class ClientTask implements Runnable, Closeable { - - private RespWriter respWriter; - //private RespReader respReader; private final Socket client; - private final DatabaseServer databaseServer; + private final DatabaseServer server; + private final RespWriter respWriter; + /** * @param client клиентский сокет * @param server сервер, на котором исполняется задача */ public ClientTask(Socket client, DatabaseServer server) { - - databaseServer = server; this.client = client; + this.server = server; try { -// databaseServer = server; -// this.client = client; -// respReader = new RespReader(client.getInputStream()); this.respWriter = new RespWriter(client.getOutputStream()); - } catch (IOException e) { - e.printStackTrace(); + } catch (IOException e){ + throw new RuntimeException("IOException when open socket streams", e); } } @@ -111,9 +118,9 @@ public ClientTask(Socket client, DatabaseServer server) { */ @Override public void run() { - try (CommandReader commandReader = new CommandReader(new RespReader(client.getInputStream()), databaseServer.getEnv())) { + try (CommandReader commandReader = new CommandReader(new RespReader(client.getInputStream()), server.getEnv())) { while (commandReader.hasNextCommand()) { - CompletableFuture commandResult = databaseServer.executeNextCommand(commandReader.readCommand()); + CompletableFuture commandResult = server.executeNextCommand(commandReader.readCommand()); respWriter.write(commandResult.get().serialize()); } close(); @@ -131,11 +138,9 @@ public void close() { try { respWriter.close(); client.close(); -// respReader.close(); -// respWriter.close(); - } catch (IOException exception) { - exception.printStackTrace(); + } catch (IOException e){ + throw new RuntimeException("When try to close client connection", e); } } } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/basics/resp/CommandReader.java b/src/main/java/com/itmo/java/basics/resp/CommandReader.java index 1c384742..ae5fea60 100644 --- a/src/main/java/com/itmo/java/basics/resp/CommandReader.java +++ b/src/main/java/com/itmo/java/basics/resp/CommandReader.java @@ -4,26 +4,29 @@ import com.itmo.java.basics.console.DatabaseCommandArgPositions; import com.itmo.java.basics.console.DatabaseCommands; import com.itmo.java.basics.console.ExecutionEnvironment; +import com.itmo.java.basics.console.impl.CreateDatabaseCommand; import com.itmo.java.protocol.RespReader; +import com.itmo.java.protocol.model.RespArray; +import com.itmo.java.protocol.model.RespBulkString; +import com.itmo.java.protocol.model.RespCommandId; import com.itmo.java.protocol.model.RespObject; import java.io.IOException; -import java.util.List; public class CommandReader implements AutoCloseable { + private final RespReader reader; + private final ExecutionEnvironment env; - private final RespReader respReader; - private final ExecutionEnvironment executionEnvironment; public CommandReader(RespReader reader, ExecutionEnvironment env) { - respReader = reader; - executionEnvironment = env; + this.reader = reader; + this.env = env; } /** * Есть ли следующая команда в ридере? */ public boolean hasNextCommand() throws IOException { - return respReader.hasArray(); + return reader.hasArray(); } /** @@ -32,16 +35,30 @@ public boolean hasNextCommand() throws IOException { * @throws IllegalArgumentException если нет имени команды и id */ public DatabaseCommand readCommand() throws IOException { - List comArgs = respReader.readArray().getObjects(); - if(comArgs.size() < 2) { - throw new IllegalArgumentException("Why we dont have id and command name?"); + RespArray respArray = reader.readArray(); + if (respArray.getObjects().size() < DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex() + 1){ + throw new IllegalArgumentException("RespArray does not have enough size to have id, name and one object"); } - return DatabaseCommands.valueOf(comArgs.get(DatabaseCommandArgPositions.COMMAND_NAME.getPositionIndex()).asString()) - .getCommand(executionEnvironment,comArgs); + RespObject id = respArray.getObjects().get(DatabaseCommandArgPositions.COMMAND_ID.getPositionIndex()); + if (!(id instanceof RespCommandId)){ + throw new IllegalArgumentException("Command does not have command id"); + } + if (id.asString() == null || id.asString().isEmpty()){ + throw new IllegalArgumentException("Command id does not exist"); + } + RespObject commandName = respArray.getObjects().get(DatabaseCommandArgPositions.COMMAND_NAME.getPositionIndex()); + if (!(commandName instanceof RespBulkString)){ + throw new IllegalArgumentException("Command does not have command name"); + } + if (commandName.asString() == null || commandName.asString().isEmpty()){ + throw new IllegalArgumentException("Command name does not exist"); + } + + return DatabaseCommands.valueOf(commandName.asString()).getCommand(env, respArray.getObjects()); } @Override public void close() throws Exception { - respReader.close(); + reader.close(); } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index fdf05541..855baf72 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -8,28 +8,27 @@ import java.io.IOException; import java.net.Socket; +import java.net.UnknownHostException; /** * С помощью {@link RespWriter} и {@link RespReader} читает/пишет в сокет */ public class SocketKvsConnection implements KvsConnection { - //final ConnectionConfig config; - final Socket socket; - final int port; - final String host; - final RespWriter respWriter; - final RespReader respReader; + private final int port; + private final String host; + private final Socket clientSocket; + private final RespWriter respWriter; + private final RespReader respReader; public SocketKvsConnection(ConnectionConfig config) { - port = config.getPort(); - host = config.getHost(); - + this.port = config.getPort(); + this.host = config.getHost(); try { - socket = new Socket(host, port); - respWriter = new RespWriter(socket.getOutputStream()); - respReader = new RespReader(socket.getInputStream()); - } catch (IOException exception) { - throw new RuntimeException("Creation socket error", exception); + this.clientSocket = new Socket(host, port); + this.respReader = new RespReader(clientSocket.getInputStream()); + respWriter = new RespWriter(clientSocket.getOutputStream()); + } catch (IOException e) { + throw new RuntimeException("IOException when try to connect by " + host + " " + port, e); } } @@ -42,20 +41,13 @@ public SocketKvsConnection(ConnectionConfig config) { @Override public synchronized RespObject send(int commandId, RespArray command) throws ConnectionException { try { - RespWriter respWriter = new RespWriter(socket.getOutputStream()); - + RespWriter respWriter = new RespWriter(clientSocket.getOutputStream()); respWriter.write(command); - - RespReader respReader = new RespReader(socket.getInputStream()); -// final RespObject respObject = respReader.readObject(); -// -// if (respObject.isError()) { -// throw new ConnectionException("Response error"); -// } - + RespReader respReader = new RespReader(clientSocket.getInputStream()); return respReader.readObject(); - } catch (IOException exception) { - throw new ConnectionException("Connection exception", exception); + } catch (IOException e) { + close(); + throw new ConnectionException("IOException when send " + command.asString() + " with " + host + " and port " + port + " ___IOMessage___: " + e.getMessage(), e); } } @@ -67,9 +59,9 @@ public void close() { try { respWriter.close(); respReader.close(); - socket.close(); - } catch (IOException exception) { - throw new RuntimeException("Closing client socket error", exception); + clientSocket.close(); + } catch (IOException e) { + throw new RuntimeException("IOException when try to close client socket"); } } -} \ No newline at end of file +} From 705fedc57b8b81b2adc524e2b72b492a26d7951b Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 18:19:29 +0300 Subject: [PATCH 270/378] trying without --- src/main/java/com/itmo/java/protocol/RespReader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index df06aac1..636c2eb3 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -133,7 +133,7 @@ private byte[] readBytesToEndOfLine() throws IOException { throw new EOFException("Stream is empty when try to read all bytes before '\\r\\n'"); } if (currentByte == CR) { - reader.mark(READ_AHEAD_LIMIT); + // reader.mark(READ_AHEAD_LIMIT); int nextByte = reader.read(); if (nextByte == -1) { throw new EOFException("Stream is empty when try to read all bytes before '\\r\\n'"); From 12eba85a7c604d4f38f2f47570ae8c4d8c225f08 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 18:24:14 +0300 Subject: [PATCH 271/378] trying --- src/main/java/com/itmo/java/protocol/RespReader.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 636c2eb3..71c7b24e 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -20,7 +20,6 @@ public RespReader(InputStream is) { reader = new InputStreamReader(is); } - /** * Есть ли следующий массив в стриме? */ @@ -133,17 +132,15 @@ private byte[] readBytesToEndOfLine() throws IOException { throw new EOFException("Stream is empty when try to read all bytes before '\\r\\n'"); } if (currentByte == CR) { - // reader.mark(READ_AHEAD_LIMIT); int nextByte = reader.read(); if (nextByte == -1) { throw new EOFException("Stream is empty when try to read all bytes before '\\r\\n'"); } if (nextByte == LF){ - reader.reset(); - reader.read(); break; }else { - reader.reset(); + message.add((byte) currentByte); + currentByte = nextByte; } } message.add((byte) currentByte); @@ -154,4 +151,4 @@ private byte[] readBytesToEndOfLine() throws IOException { } return bytes; } -} \ No newline at end of file +} From 7e2dbe73b39aa426f25cb006373d3dd6ab0c4e97 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 18:36:14 +0300 Subject: [PATCH 272/378] try --- .../basics/connector/JavaSocketServerConnector.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index 3bb88ac1..0ae3576d 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -51,13 +51,16 @@ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig con */ public void start() { connectionAcceptorExecutor.submit(() -> { - while (true) { - Socket clientSocket = serverSocket.accept(); - clientIOWorkers.submit(new ClientTask(clientSocket, server)); + try { + final Socket client = serverSocket.accept(); + final ClientTask clientTask = new ClientTask(client, server); + + clientIOWorkers.submit(clientTask); + } catch (IOException exception) { + exception.printStackTrace(); } }); } - /** * Закрывает все, что нужно ¯\_(ツ)_/¯ */ From fd670ac21c75d892981bca915adb3df73adfff63 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 18:39:43 +0300 Subject: [PATCH 273/378] test --- .../com/itmo/java/client/connection/SocketKvsConnection.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index 855baf72..9c9ca09d 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -28,7 +28,7 @@ public SocketKvsConnection(ConnectionConfig config) { this.respReader = new RespReader(clientSocket.getInputStream()); respWriter = new RespWriter(clientSocket.getOutputStream()); } catch (IOException e) { - throw new RuntimeException("IOException when try to connect by " + host + " " + port, e); + throw new RuntimeException("SocketKvsConnection IOException when try to connect by " + host + " " + port, e); } } From 6f3e33f983fa82886ea99dc08a2bc27df7e8b8d1 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 18:50:56 +0300 Subject: [PATCH 274/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82=20socket?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../connection/SocketKvsConnection.java | 47 +++++++++---------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index 9c9ca09d..484a7d4e 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -8,27 +8,21 @@ import java.io.IOException; import java.net.Socket; -import java.net.UnknownHostException; /** * С помощью {@link RespWriter} и {@link RespReader} читает/пишет в сокет */ public class SocketKvsConnection implements KvsConnection { - private final int port; - private final String host; - private final Socket clientSocket; - private final RespWriter respWriter; - private final RespReader respReader; + final ConnectionConfig config; + final Socket socket; public SocketKvsConnection(ConnectionConfig config) { - this.port = config.getPort(); - this.host = config.getHost(); + this.config = config; + try { - this.clientSocket = new Socket(host, port); - this.respReader = new RespReader(clientSocket.getInputStream()); - respWriter = new RespWriter(clientSocket.getOutputStream()); - } catch (IOException e) { - throw new RuntimeException("SocketKvsConnection IOException when try to connect by " + host + " " + port, e); + this.socket = new Socket(this.config.getHost(), this.config.getPort()); + } catch (IOException exception) { + throw new RuntimeException("Creation socket error", exception); } } @@ -41,13 +35,20 @@ public SocketKvsConnection(ConnectionConfig config) { @Override public synchronized RespObject send(int commandId, RespArray command) throws ConnectionException { try { - RespWriter respWriter = new RespWriter(clientSocket.getOutputStream()); + final RespWriter respWriter = new RespWriter(socket.getOutputStream()); + respWriter.write(command); - RespReader respReader = new RespReader(clientSocket.getInputStream()); - return respReader.readObject(); - } catch (IOException e) { - close(); - throw new ConnectionException("IOException when send " + command.asString() + " with " + host + " and port " + port + " ___IOMessage___: " + e.getMessage(), e); + + final RespReader respReader = new RespReader(socket.getInputStream()); + final RespObject respObject = respReader.readObject(); + + if (respObject.isError()) { + throw new ConnectionException("Response error"); + } + + return respObject; + } catch (IOException exception) { + throw new ConnectionException("Connection exception", exception); } } @@ -57,11 +58,9 @@ public synchronized RespObject send(int commandId, RespArray command) throws Con @Override public void close() { try { - respWriter.close(); - respReader.close(); - clientSocket.close(); - } catch (IOException e) { - throw new RuntimeException("IOException when try to close client socket"); + socket.close(); + } catch (IOException exception) { + throw new RuntimeException("Closing client socket error", exception); } } } From 99f7829c094099780d7cb33460cda0506122301b Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 19:05:48 +0300 Subject: [PATCH 275/378] test server --- .../com/itmo/java/basics/DatabaseServer.java | 31 ++++++++++++------- .../connection/SocketKvsConnection.java | 1 - 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/DatabaseServer.java b/src/main/java/com/itmo/java/basics/DatabaseServer.java index 7ad13938..b17a15b5 100644 --- a/src/main/java/com/itmo/java/basics/DatabaseServer.java +++ b/src/main/java/com/itmo/java/basics/DatabaseServer.java @@ -2,37 +2,44 @@ import com.itmo.java.basics.console.*; import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.initialization.impl.*; +import com.itmo.java.basics.initialization.impl.DatabaseServerInitializer; +import com.itmo.java.basics.initialization.impl.InitializationContextImpl; import com.itmo.java.protocol.model.RespArray; +import com.itmo.java.protocol.model.RespObject; +import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class DatabaseServer { - private final ExecutorService executorService = Executors.newSingleThreadExecutor(); - private final ExecutionEnvironment enviroment; + private final ExecutionEnvironment environment; + + private DatabaseServer(ExecutionEnvironment env) { + environment = env; + } /** - * Con structor + * Конструктор * - * @param env env для инициализации. Далее работа происходит с заполненым объектом + * @param env env для инициализации. Далее работа происходит с заполненным объектом * @param initializer готовый чейн инициализации * @throws DatabaseException если произошла ошибка инициализации */ public static DatabaseServer initialize(ExecutionEnvironment env, DatabaseServerInitializer initializer) throws DatabaseException { initializer.perform(new InitializationContextImpl(env, null, null, null)); - return new DatabaseServer(env); - } - private DatabaseServer(ExecutionEnvironment env) { - this.enviroment = env; + return new DatabaseServer(env); } public CompletableFuture executeNextCommand(RespArray message) { - return CompletableFuture.supplyAsync(() -> - DatabaseCommands.valueOf(message.getObjects().get(DatabaseCommandArgPositions.COMMAND_NAME.getPositionIndex()).asString()).getCommand(enviroment, message.getObjects()).execute(), executorService); + return CompletableFuture.supplyAsync(() -> { + final List commandArgs = message.getObjects(); + return DatabaseCommands.valueOf(commandArgs + .get(DatabaseCommandArgPositions.COMMAND_NAME.getPositionIndex()).asString()) + .getCommand(environment, commandArgs).execute(); + }, executorService); } public CompletableFuture executeNextCommand(DatabaseCommand command) { @@ -40,6 +47,6 @@ public CompletableFuture executeNextCommand(DatabaseComma } public ExecutionEnvironment getEnv() { - return enviroment; + return environment; } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index 484a7d4e..5f539b08 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -18,7 +18,6 @@ public class SocketKvsConnection implements KvsConnection { public SocketKvsConnection(ConnectionConfig config) { this.config = config; - try { this.socket = new Socket(this.config.getHost(), this.config.getPort()); } catch (IOException exception) { From 765ef0afec9350272bf7006a81f130e3df57ff89 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 19:12:30 +0300 Subject: [PATCH 276/378] =?UTF-8?q?javasocket=20+=20=D0=BE=D1=82=D0=BA?= =?UTF-8?q?=D0=B0=D1=82=20dbserver?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/itmo/java/basics/DatabaseServer.java | 31 +++++++------------ .../connector/JavaSocketServerConnector.java | 26 ++++++---------- 2 files changed, 21 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/DatabaseServer.java b/src/main/java/com/itmo/java/basics/DatabaseServer.java index b17a15b5..7ad13938 100644 --- a/src/main/java/com/itmo/java/basics/DatabaseServer.java +++ b/src/main/java/com/itmo/java/basics/DatabaseServer.java @@ -2,44 +2,37 @@ import com.itmo.java.basics.console.*; import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.initialization.impl.DatabaseServerInitializer; -import com.itmo.java.basics.initialization.impl.InitializationContextImpl; +import com.itmo.java.basics.initialization.impl.*; import com.itmo.java.protocol.model.RespArray; -import com.itmo.java.protocol.model.RespObject; -import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class DatabaseServer { - private final ExecutorService executorService = Executors.newSingleThreadExecutor(); - private final ExecutionEnvironment environment; - private DatabaseServer(ExecutionEnvironment env) { - environment = env; - } + private final ExecutorService executorService = Executors.newSingleThreadExecutor(); + private final ExecutionEnvironment enviroment; /** - * Конструктор + * Con structor * - * @param env env для инициализации. Далее работа происходит с заполненным объектом + * @param env env для инициализации. Далее работа происходит с заполненым объектом * @param initializer готовый чейн инициализации * @throws DatabaseException если произошла ошибка инициализации */ public static DatabaseServer initialize(ExecutionEnvironment env, DatabaseServerInitializer initializer) throws DatabaseException { initializer.perform(new InitializationContextImpl(env, null, null, null)); - return new DatabaseServer(env); } + private DatabaseServer(ExecutionEnvironment env) { + this.enviroment = env; + } + public CompletableFuture executeNextCommand(RespArray message) { - return CompletableFuture.supplyAsync(() -> { - final List commandArgs = message.getObjects(); - return DatabaseCommands.valueOf(commandArgs - .get(DatabaseCommandArgPositions.COMMAND_NAME.getPositionIndex()).asString()) - .getCommand(environment, commandArgs).execute(); - }, executorService); + return CompletableFuture.supplyAsync(() -> + DatabaseCommands.valueOf(message.getObjects().get(DatabaseCommandArgPositions.COMMAND_NAME.getPositionIndex()).asString()).getCommand(enviroment, message.getObjects()).execute(), executorService); } public CompletableFuture executeNextCommand(DatabaseCommand command) { @@ -47,6 +40,6 @@ public CompletableFuture executeNextCommand(DatabaseComma } public ExecutionEnvironment getEnv() { - return environment; + return enviroment; } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index 0ae3576d..c20ba32e 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -42,8 +42,12 @@ public class JavaSocketServerConnector implements Closeable { * Стартует сервер. По аналогии с сокетом открывает коннекшн в конструкторе. */ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig config) throws IOException { - this.serverSocket = new ServerSocket(config.getPort()); - this.server = databaseServer; + try { + this.serverSocket = new ServerSocket(config.getPort()); + this.server = databaseServer; + } catch (IOException ex) { + throw new IOException(ex); + } } /** @@ -51,13 +55,9 @@ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig con */ public void start() { connectionAcceptorExecutor.submit(() -> { - try { - final Socket client = serverSocket.accept(); - final ClientTask clientTask = new ClientTask(client, server); - - clientIOWorkers.submit(clientTask); - } catch (IOException exception) { - exception.printStackTrace(); + while(true) { + Socket clientSocket = serverSocket.accept(); + clientIOWorkers.submit(new ClientTask(clientSocket,server)); } }); } @@ -80,14 +80,6 @@ public void close() { public static void main(String[] args) throws Exception { - DatabaseServerConfig config = new ConfigLoader().readConfig(); - System.out.println(config.getDbConfig().getWorkingPath()); - System.out.println(config.getServerConfig().getPort()); - System.out.println(config.getServerConfig().getHost()); - DatabaseServer server = DatabaseServer.initialize(new ExecutionEnvironmentImpl(config.getDbConfig()), - new DatabaseServerInitializer(new DatabaseInitializer(new TableInitializer(new SegmentInitializer())))); - JavaSocketServerConnector connector = new JavaSocketServerConnector(server, config.getServerConfig()); - connector.start(); } /** From 9e5592f433690be582775159ff35960bbc45a960 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 19:19:45 +0300 Subject: [PATCH 277/378] =?UTF-8?q?trying=20with=20=D0=BE=D1=82=D0=BA?= =?UTF-8?q?=D0=B0=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../connector/JavaSocketServerConnector.java | 78 ++++++++----------- .../connection/SocketKvsConnection.java | 1 + 2 files changed, 33 insertions(+), 46 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index c20ba32e..260b3091 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -1,25 +1,17 @@ package com.itmo.java.basics.connector; import com.itmo.java.basics.DatabaseServer; -import com.itmo.java.basics.config.ConfigLoader; -import com.itmo.java.basics.config.DatabaseConfig; -import com.itmo.java.basics.config.DatabaseServerConfig; import com.itmo.java.basics.config.ServerConfig; +import com.itmo.java.basics.console.DatabaseCommand; import com.itmo.java.basics.console.DatabaseCommandResult; -import com.itmo.java.basics.console.impl.ExecutionEnvironmentImpl; -import com.itmo.java.basics.initialization.impl.DatabaseInitializer; -import com.itmo.java.basics.initialization.impl.DatabaseServerInitializer; -import com.itmo.java.basics.initialization.impl.SegmentInitializer; -import com.itmo.java.basics.initialization.impl.TableInitializer; import com.itmo.java.basics.resp.CommandReader; import com.itmo.java.protocol.RespReader; import com.itmo.java.protocol.RespWriter; - import java.io.Closeable; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; -import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -32,22 +24,16 @@ public class JavaSocketServerConnector implements Closeable { * Экзекьютор для выполнения ClientTask */ private final ExecutorService clientIOWorkers = Executors.newSingleThreadExecutor(); - private final ServerSocket serverSocket; private final ExecutorService connectionAcceptorExecutor = Executors.newSingleThreadExecutor(); - - private final DatabaseServer server; + private final DatabaseServer databaseServer; /** * Стартует сервер. По аналогии с сокетом открывает коннекшн в конструкторе. */ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig config) throws IOException { - try { - this.serverSocket = new ServerSocket(config.getPort()); - this.server = databaseServer; - } catch (IOException ex) { - throw new IOException(ex); - } + this.databaseServer = databaseServer; + this.serverSocket = new ServerSocket(config.getPort()); } /** @@ -55,26 +41,30 @@ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig con */ public void start() { connectionAcceptorExecutor.submit(() -> { - while(true) { - Socket clientSocket = serverSocket.accept(); - clientIOWorkers.submit(new ClientTask(clientSocket,server)); + try { + final Socket client = serverSocket.accept(); + final ClientTask clientTask = new ClientTask(client, databaseServer); + + clientIOWorkers.submit(clientTask); + } catch (IOException exception) { + exception.printStackTrace(); } }); } + /** * Закрывает все, что нужно ¯\_(ツ)_/¯ */ @Override public void close() { System.out.println("Stopping socket connector"); - connectionAcceptorExecutor.shutdownNow(); - clientIOWorkers.shutdownNow(); - if (serverSocket != null) { - try { - serverSocket.close(); - } catch (IOException e) { - throw new RuntimeException("IOException when try to close connection", e); - } + + try { + serverSocket.close(); + connectionAcceptorExecutor.shutdown(); + clientIOWorkers.shutdown(); + } catch (IOException exception) { + throw new RuntimeException("Closing server socket error", exception); } } @@ -88,7 +78,6 @@ public static void main(String[] args) throws Exception { static class ClientTask implements Runnable, Closeable { private final Socket client; private final DatabaseServer server; - private final RespWriter respWriter; /** * @param client клиентский сокет @@ -97,11 +86,6 @@ static class ClientTask implements Runnable, Closeable { public ClientTask(Socket client, DatabaseServer server) { this.client = client; this.server = server; - try { - this.respWriter = new RespWriter(client.getOutputStream()); - } catch (IOException e){ - throw new RuntimeException("IOException when open socket streams", e); - } } /** @@ -113,15 +97,18 @@ public ClientTask(Socket client, DatabaseServer server) { */ @Override public void run() { - try (CommandReader commandReader = new CommandReader(new RespReader(client.getInputStream()), server.getEnv())) { + try { + final CommandReader commandReader = new CommandReader(new RespReader(client.getInputStream()), server.getEnv()); + final RespWriter respWriter = new RespWriter(client.getOutputStream()); + while (commandReader.hasNextCommand()) { - CompletableFuture commandResult = server.executeNextCommand(commandReader.readCommand()); - respWriter.write(commandResult.get().serialize()); + final DatabaseCommand command = commandReader.readCommand(); + final DatabaseCommandResult commandResult = server.executeNextCommand(command).get(); + + respWriter.write(commandResult.serialize()); } - close(); - } catch (Exception e) { - close(); - throw new RuntimeException("When try to read, write or execute command", e); + } catch (ExecutionException | IOException | InterruptedException exception) { + exception.printStackTrace(); } } @@ -131,10 +118,9 @@ public void run() { @Override public void close() { try { - respWriter.close(); client.close(); - } catch (IOException e){ - throw new RuntimeException("When try to close client connection", e); + } catch (IOException exception) { + throw new RuntimeException("Closing client socket error", exception); } } } diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index 5f539b08..484a7d4e 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -18,6 +18,7 @@ public class SocketKvsConnection implements KvsConnection { public SocketKvsConnection(ConnectionConfig config) { this.config = config; + try { this.socket = new Socket(this.config.getHost(), this.config.getPort()); } catch (IOException exception) { From 6c1bc9731bec03d0d3c5f0759070c2e229ba1362 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 19:26:36 +0300 Subject: [PATCH 278/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82=20=D0=BA?= =?UTF-8?q?=20test=20server?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../connector/JavaSocketServerConnector.java | 74 ++++++++++++------- .../connection/SocketKvsConnection.java | 3 +- .../com/itmo/java/protocol/RespReader.java | 2 +- 3 files changed, 50 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index 260b3091..fb5c6995 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -1,17 +1,25 @@ package com.itmo.java.basics.connector; import com.itmo.java.basics.DatabaseServer; +import com.itmo.java.basics.config.ConfigLoader; +import com.itmo.java.basics.config.DatabaseConfig; +import com.itmo.java.basics.config.DatabaseServerConfig; import com.itmo.java.basics.config.ServerConfig; -import com.itmo.java.basics.console.DatabaseCommand; import com.itmo.java.basics.console.DatabaseCommandResult; +import com.itmo.java.basics.console.impl.ExecutionEnvironmentImpl; +import com.itmo.java.basics.initialization.impl.DatabaseInitializer; +import com.itmo.java.basics.initialization.impl.DatabaseServerInitializer; +import com.itmo.java.basics.initialization.impl.SegmentInitializer; +import com.itmo.java.basics.initialization.impl.TableInitializer; import com.itmo.java.basics.resp.CommandReader; import com.itmo.java.protocol.RespReader; import com.itmo.java.protocol.RespWriter; + import java.io.Closeable; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; -import java.util.concurrent.ExecutionException; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -24,16 +32,18 @@ public class JavaSocketServerConnector implements Closeable { * Экзекьютор для выполнения ClientTask */ private final ExecutorService clientIOWorkers = Executors.newSingleThreadExecutor(); + private final ServerSocket serverSocket; private final ExecutorService connectionAcceptorExecutor = Executors.newSingleThreadExecutor(); - private final DatabaseServer databaseServer; + + private final DatabaseServer server; /** * Стартует сервер. По аналогии с сокетом открывает коннекшн в конструкторе. */ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig config) throws IOException { - this.databaseServer = databaseServer; this.serverSocket = new ServerSocket(config.getPort()); + this.server = databaseServer; } /** @@ -43,7 +53,7 @@ public void start() { connectionAcceptorExecutor.submit(() -> { try { final Socket client = serverSocket.accept(); - final ClientTask clientTask = new ClientTask(client, databaseServer); + final ClientTask clientTask = new ClientTask(client, server); clientIOWorkers.submit(clientTask); } catch (IOException exception) { @@ -51,25 +61,33 @@ public void start() { } }); } - /** * Закрывает все, что нужно ¯\_(ツ)_/¯ */ @Override public void close() { System.out.println("Stopping socket connector"); - - try { - serverSocket.close(); - connectionAcceptorExecutor.shutdown(); - clientIOWorkers.shutdown(); - } catch (IOException exception) { - throw new RuntimeException("Closing server socket error", exception); + connectionAcceptorExecutor.shutdownNow(); + clientIOWorkers.shutdownNow(); + if (serverSocket != null) { + try { + serverSocket.close(); + } catch (IOException e) { + throw new RuntimeException("IOException when try to close connection", e); + } } } public static void main(String[] args) throws Exception { + DatabaseServerConfig config = new ConfigLoader().readConfig(); + System.out.println(config.getDbConfig().getWorkingPath()); + System.out.println(config.getServerConfig().getPort()); + System.out.println(config.getServerConfig().getHost()); + DatabaseServer server = DatabaseServer.initialize(new ExecutionEnvironmentImpl(config.getDbConfig()), + new DatabaseServerInitializer(new DatabaseInitializer(new TableInitializer(new SegmentInitializer())))); + JavaSocketServerConnector connector = new JavaSocketServerConnector(server, config.getServerConfig()); + connector.start(); } /** @@ -78,6 +96,7 @@ public static void main(String[] args) throws Exception { static class ClientTask implements Runnable, Closeable { private final Socket client; private final DatabaseServer server; + private final RespWriter respWriter; /** * @param client клиентский сокет @@ -86,6 +105,11 @@ static class ClientTask implements Runnable, Closeable { public ClientTask(Socket client, DatabaseServer server) { this.client = client; this.server = server; + try { + this.respWriter = new RespWriter(client.getOutputStream()); + } catch (IOException e){ + throw new RuntimeException("IOException when open socket streams", e); + } } /** @@ -97,18 +121,15 @@ public ClientTask(Socket client, DatabaseServer server) { */ @Override public void run() { - try { - final CommandReader commandReader = new CommandReader(new RespReader(client.getInputStream()), server.getEnv()); - final RespWriter respWriter = new RespWriter(client.getOutputStream()); - + try (CommandReader commandReader = new CommandReader(new RespReader(client.getInputStream()), server.getEnv())) { while (commandReader.hasNextCommand()) { - final DatabaseCommand command = commandReader.readCommand(); - final DatabaseCommandResult commandResult = server.executeNextCommand(command).get(); - - respWriter.write(commandResult.serialize()); + CompletableFuture commandResult = server.executeNextCommand(commandReader.readCommand()); + respWriter.write(commandResult.get().serialize()); } - } catch (ExecutionException | IOException | InterruptedException exception) { - exception.printStackTrace(); + close(); + } catch (Exception e) { + close(); + throw new RuntimeException("When try to read, write or execute command", e); } } @@ -118,10 +139,11 @@ public void run() { @Override public void close() { try { + respWriter.close(); client.close(); - } catch (IOException exception) { - throw new RuntimeException("Closing client socket error", exception); + } catch (IOException e){ + throw new RuntimeException("When try to close client connection", e); } } } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index 484a7d4e..beeda0c1 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -18,7 +18,6 @@ public class SocketKvsConnection implements KvsConnection { public SocketKvsConnection(ConnectionConfig config) { this.config = config; - try { this.socket = new Socket(this.config.getHost(), this.config.getPort()); } catch (IOException exception) { @@ -63,4 +62,4 @@ public void close() { throw new RuntimeException("Closing client socket error", exception); } } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 71c7b24e..088fc56b 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -151,4 +151,4 @@ private byte[] readBytesToEndOfLine() throws IOException { } return bytes; } -} +} \ No newline at end of file From 93df907a3f108576bcf13d535c8bc1448e6855de Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 19:30:43 +0300 Subject: [PATCH 279/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../connector/JavaSocketServerConnector.java | 28 +++++++------------ .../connection/SocketKvsConnection.java | 2 +- .../com/itmo/java/protocol/RespReader.java | 2 +- 3 files changed, 12 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index fb5c6995..c20ba32e 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -42,8 +42,12 @@ public class JavaSocketServerConnector implements Closeable { * Стартует сервер. По аналогии с сокетом открывает коннекшн в конструкторе. */ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig config) throws IOException { - this.serverSocket = new ServerSocket(config.getPort()); - this.server = databaseServer; + try { + this.serverSocket = new ServerSocket(config.getPort()); + this.server = databaseServer; + } catch (IOException ex) { + throw new IOException(ex); + } } /** @@ -51,13 +55,9 @@ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig con */ public void start() { connectionAcceptorExecutor.submit(() -> { - try { - final Socket client = serverSocket.accept(); - final ClientTask clientTask = new ClientTask(client, server); - - clientIOWorkers.submit(clientTask); - } catch (IOException exception) { - exception.printStackTrace(); + while(true) { + Socket clientSocket = serverSocket.accept(); + clientIOWorkers.submit(new ClientTask(clientSocket,server)); } }); } @@ -80,14 +80,6 @@ public void close() { public static void main(String[] args) throws Exception { - DatabaseServerConfig config = new ConfigLoader().readConfig(); - System.out.println(config.getDbConfig().getWorkingPath()); - System.out.println(config.getServerConfig().getPort()); - System.out.println(config.getServerConfig().getHost()); - DatabaseServer server = DatabaseServer.initialize(new ExecutionEnvironmentImpl(config.getDbConfig()), - new DatabaseServerInitializer(new DatabaseInitializer(new TableInitializer(new SegmentInitializer())))); - JavaSocketServerConnector connector = new JavaSocketServerConnector(server, config.getServerConfig()); - connector.start(); } /** @@ -146,4 +138,4 @@ public void close() { } } } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index beeda0c1..5f539b08 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -62,4 +62,4 @@ public void close() { throw new RuntimeException("Closing client socket error", exception); } } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 088fc56b..71c7b24e 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -151,4 +151,4 @@ private byte[] readBytesToEndOfLine() throws IOException { } return bytes; } -} \ No newline at end of file +} From ce24b91a7c98b987969ed37a77a734083bfd7337 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 19:34:20 +0300 Subject: [PATCH 280/378] maybe? --- src/main/java/com/itmo/java/protocol/RespReader.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 71c7b24e..6f5d8066 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -8,7 +8,7 @@ public class RespReader implements AutoCloseable { private static final int READ_AHEAD_LIMIT = 3; - private final InputStreamReader reader; + private final BufferedReader reader; /** * Специальные символы окончания элемента @@ -17,7 +17,7 @@ public class RespReader implements AutoCloseable { private static final byte LF = '\n'; public RespReader(InputStream is) { - reader = new InputStreamReader(is); + reader = new BufferedReader(new InputStreamReader(is)); } /** @@ -132,15 +132,17 @@ private byte[] readBytesToEndOfLine() throws IOException { throw new EOFException("Stream is empty when try to read all bytes before '\\r\\n'"); } if (currentByte == CR) { + reader.mark(READ_AHEAD_LIMIT); int nextByte = reader.read(); if (nextByte == -1) { throw new EOFException("Stream is empty when try to read all bytes before '\\r\\n'"); } if (nextByte == LF){ + reader.reset(); + reader.read(); break; }else { - message.add((byte) currentByte); - currentByte = nextByte; + reader.reset(); } } message.add((byte) currentByte); From 712391cd4fed7d149f629a1114868ef5eda30669 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 19:47:26 +0300 Subject: [PATCH 281/378] new id --- .../itmo/java/client/command/CreateDatabaseKvsCommand.java | 4 ++-- .../com/itmo/java/client/command/CreateTableKvsCommand.java | 2 +- .../java/com/itmo/java/client/command/DeleteKvsCommand.java | 2 +- src/main/java/com/itmo/java/client/command/GetKvsCommand.java | 2 +- src/main/java/com/itmo/java/client/command/SetKvsCommand.java | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java b/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java index 571f19f8..ce02e682 100644 --- a/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java @@ -21,8 +21,8 @@ public class CreateDatabaseKvsCommand implements KvsCommand { * @param databaseName имя базы данных */ public CreateDatabaseKvsCommand(String databaseName) { - dbID = idGen.get(); - //dbID = idGen.incrementAndGet(); + // dbID = idGen.get(); + dbID = idGen.incrementAndGet(); dbName = databaseName; } diff --git a/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java b/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java index edcd1746..4b66e2fb 100644 --- a/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java @@ -19,7 +19,7 @@ public class CreateTableKvsCommand implements KvsCommand { public CreateTableKvsCommand(String databaseName, String tableName) { dbName = databaseName; tbName = tableName; - tbID = idGen.get(); + tbID = idGen.incrementAndGet(); } /** diff --git a/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java b/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java index ea7e1827..618038c9 100644 --- a/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java @@ -18,7 +18,7 @@ public DeleteKvsCommand(String databaseName, String tableName, String key) { dbName = databaseName; tbName = tableName; Key = key; - delID = idGen.get(); + delID = idGen.incrementAndGet(); } /** diff --git a/src/main/java/com/itmo/java/client/command/GetKvsCommand.java b/src/main/java/com/itmo/java/client/command/GetKvsCommand.java index 43009e30..fbd5e2ae 100644 --- a/src/main/java/com/itmo/java/client/command/GetKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/GetKvsCommand.java @@ -18,7 +18,7 @@ public GetKvsCommand(String databaseName, String tableName, String key) { dbName = databaseName; tbName = tableName; Key = key; - getID = idGen.get(); + getID = idGen.incrementAndGet(); } /** diff --git a/src/main/java/com/itmo/java/client/command/SetKvsCommand.java b/src/main/java/com/itmo/java/client/command/SetKvsCommand.java index cb704e90..ac9c57c5 100644 --- a/src/main/java/com/itmo/java/client/command/SetKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/SetKvsCommand.java @@ -19,7 +19,7 @@ public SetKvsCommand(String databaseName, String tableName, String key, String v dbName = databaseName; tbName = tableName; Key = key; - setID = idGen.get(); + setID = idGen.incrementAndGet(); Value = value; } From e667343114b224031c6dc3335cca79a5e9dc5470 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 20:06:04 +0300 Subject: [PATCH 282/378] main --- .../connector/JavaSocketServerConnector.java | 58 ++++++++++++++++--- 1 file changed, 51 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index c20ba32e..bc20feaf 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -5,15 +5,24 @@ import com.itmo.java.basics.config.DatabaseConfig; import com.itmo.java.basics.config.DatabaseServerConfig; import com.itmo.java.basics.config.ServerConfig; +import com.itmo.java.basics.console.DatabaseCommand; import com.itmo.java.basics.console.DatabaseCommandResult; +import com.itmo.java.basics.console.ExecutionEnvironment; import com.itmo.java.basics.console.impl.ExecutionEnvironmentImpl; import com.itmo.java.basics.initialization.impl.DatabaseInitializer; import com.itmo.java.basics.initialization.impl.DatabaseServerInitializer; import com.itmo.java.basics.initialization.impl.SegmentInitializer; import com.itmo.java.basics.initialization.impl.TableInitializer; import com.itmo.java.basics.resp.CommandReader; +import com.itmo.java.client.command.CreateDatabaseKvsCommand; +import com.itmo.java.client.command.CreateTableKvsCommand; +import com.itmo.java.client.command.GetKvsCommand; +import com.itmo.java.client.command.SetKvsCommand; +import com.itmo.java.client.connection.ConnectionConfig; +import com.itmo.java.client.connection.SocketKvsConnection; import com.itmo.java.protocol.RespReader; import com.itmo.java.protocol.RespWriter; +import com.itmo.java.protocol.model.RespObject; import java.io.Closeable; import java.io.IOException; @@ -80,6 +89,34 @@ public void close() { public static void main(String[] args) throws Exception { + ServerConfig serverConfig = new ConfigLoader().readConfig().getServerConfig(); + DatabaseConfig databaseConfig = new ConfigLoader().readConfig().getDbConfig(); + ExecutionEnvironment env = new ExecutionEnvironmentImpl(databaseConfig); + DatabaseServerInitializer initializer = + new DatabaseServerInitializer( + new DatabaseInitializer( + new TableInitializer( + new SegmentInitializer()))); + DatabaseServer databaseServer = DatabaseServer.initialize(env, initializer); + + JavaSocketServerConnector j = new JavaSocketServerConnector(databaseServer, serverConfig); + + j.start(); + RespObject q; + try { + SocketKvsConnection socketKvsConnection = new SocketKvsConnection(new ConnectionConfig(serverConfig.getHost(), serverConfig.getPort())); + } catch (Exception ex) { + ex.printStackTrace(); + } +// try(SocketKvsConnection socketKvsConnection = +// new SocketKvsConnection(new ConnectionConfig(serverConfig.getHost(), serverConfig.getPort()))) { +// socketKvsConnection.send(1, new CreateDatabaseKvsCommand("t1").serialize()); +// socketKvsConnection.send(1, new CreateTableKvsCommand("t1", "da").serialize()); +// socketKvsConnection.send(1, new SetKvsCommand("t1", "da", "key1", "value1").serialize()); +// q = socketKvsConnection.send(1, new GetKvsCommand("t1", "da", "key1").serialize()); +// } + // System.out.println(q.asString()); + j.close(); } /** @@ -89,6 +126,7 @@ static class ClientTask implements Runnable, Closeable { private final Socket client; private final DatabaseServer server; private final RespWriter respWriter; + private final RespReader respReader; /** * @param client клиентский сокет @@ -99,6 +137,7 @@ public ClientTask(Socket client, DatabaseServer server) { this.server = server; try { this.respWriter = new RespWriter(client.getOutputStream()); + this.respReader = new RespReader(client.getInputStream()); } catch (IOException e){ throw new RuntimeException("IOException when open socket streams", e); } @@ -113,15 +152,20 @@ public ClientTask(Socket client, DatabaseServer server) { */ @Override public void run() { - try (CommandReader commandReader = new CommandReader(new RespReader(client.getInputStream()), server.getEnv())) { - while (commandReader.hasNextCommand()) { - CompletableFuture commandResult = server.executeNextCommand(commandReader.readCommand()); - respWriter.write(commandResult.get().serialize()); + CommandReader commandReader = new CommandReader(respReader, server.getEnv()); + try { + while (!Thread.currentThread().isInterrupted() && !client.isClosed()) { + if (commandReader.hasNextCommand()) { + DatabaseCommand dbCommand = commandReader.readCommand(); + respWriter.write(dbCommand.execute().serialize()); + } else { + commandReader.close(); + break; + } } - close(); + commandReader.close(); } catch (Exception e) { - close(); - throw new RuntimeException("When try to read, write or execute command", e); + e.printStackTrace(); } } From 0a2afe11f89e586b9b9852de0bcfa9d4166114b7 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 20:08:36 +0300 Subject: [PATCH 283/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../connector/JavaSocketServerConnector.java | 22 ++++++------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index bc20feaf..d85bcf14 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -5,7 +5,6 @@ import com.itmo.java.basics.config.DatabaseConfig; import com.itmo.java.basics.config.DatabaseServerConfig; import com.itmo.java.basics.config.ServerConfig; -import com.itmo.java.basics.console.DatabaseCommand; import com.itmo.java.basics.console.DatabaseCommandResult; import com.itmo.java.basics.console.ExecutionEnvironment; import com.itmo.java.basics.console.impl.ExecutionEnvironmentImpl; @@ -126,7 +125,6 @@ static class ClientTask implements Runnable, Closeable { private final Socket client; private final DatabaseServer server; private final RespWriter respWriter; - private final RespReader respReader; /** * @param client клиентский сокет @@ -137,7 +135,6 @@ public ClientTask(Socket client, DatabaseServer server) { this.server = server; try { this.respWriter = new RespWriter(client.getOutputStream()); - this.respReader = new RespReader(client.getInputStream()); } catch (IOException e){ throw new RuntimeException("IOException when open socket streams", e); } @@ -152,20 +149,15 @@ public ClientTask(Socket client, DatabaseServer server) { */ @Override public void run() { - CommandReader commandReader = new CommandReader(respReader, server.getEnv()); - try { - while (!Thread.currentThread().isInterrupted() && !client.isClosed()) { - if (commandReader.hasNextCommand()) { - DatabaseCommand dbCommand = commandReader.readCommand(); - respWriter.write(dbCommand.execute().serialize()); - } else { - commandReader.close(); - break; - } + try (CommandReader commandReader = new CommandReader(new RespReader(client.getInputStream()), server.getEnv())) { + while (commandReader.hasNextCommand()) { + CompletableFuture commandResult = server.executeNextCommand(commandReader.readCommand()); + respWriter.write(commandResult.get().serialize()); } - commandReader.close(); + close(); } catch (Exception e) { - e.printStackTrace(); + close(); + throw new RuntimeException("When try to read, write or execute command", e); } } From 80bf674ede9ae7177161bc0fe42eb7865211bfe6 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 20:11:53 +0300 Subject: [PATCH 284/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../connector/JavaSocketServerConnector.java | 38 +------------------ .../connection/SocketKvsConnection.java | 2 +- 2 files changed, 2 insertions(+), 38 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index d85bcf14..9d99814b 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -6,22 +6,14 @@ import com.itmo.java.basics.config.DatabaseServerConfig; import com.itmo.java.basics.config.ServerConfig; import com.itmo.java.basics.console.DatabaseCommandResult; -import com.itmo.java.basics.console.ExecutionEnvironment; import com.itmo.java.basics.console.impl.ExecutionEnvironmentImpl; import com.itmo.java.basics.initialization.impl.DatabaseInitializer; import com.itmo.java.basics.initialization.impl.DatabaseServerInitializer; import com.itmo.java.basics.initialization.impl.SegmentInitializer; import com.itmo.java.basics.initialization.impl.TableInitializer; import com.itmo.java.basics.resp.CommandReader; -import com.itmo.java.client.command.CreateDatabaseKvsCommand; -import com.itmo.java.client.command.CreateTableKvsCommand; -import com.itmo.java.client.command.GetKvsCommand; -import com.itmo.java.client.command.SetKvsCommand; -import com.itmo.java.client.connection.ConnectionConfig; -import com.itmo.java.client.connection.SocketKvsConnection; import com.itmo.java.protocol.RespReader; import com.itmo.java.protocol.RespWriter; -import com.itmo.java.protocol.model.RespObject; import java.io.Closeable; import java.io.IOException; @@ -88,34 +80,6 @@ public void close() { public static void main(String[] args) throws Exception { - ServerConfig serverConfig = new ConfigLoader().readConfig().getServerConfig(); - DatabaseConfig databaseConfig = new ConfigLoader().readConfig().getDbConfig(); - ExecutionEnvironment env = new ExecutionEnvironmentImpl(databaseConfig); - DatabaseServerInitializer initializer = - new DatabaseServerInitializer( - new DatabaseInitializer( - new TableInitializer( - new SegmentInitializer()))); - DatabaseServer databaseServer = DatabaseServer.initialize(env, initializer); - - JavaSocketServerConnector j = new JavaSocketServerConnector(databaseServer, serverConfig); - - j.start(); - RespObject q; - try { - SocketKvsConnection socketKvsConnection = new SocketKvsConnection(new ConnectionConfig(serverConfig.getHost(), serverConfig.getPort())); - } catch (Exception ex) { - ex.printStackTrace(); - } -// try(SocketKvsConnection socketKvsConnection = -// new SocketKvsConnection(new ConnectionConfig(serverConfig.getHost(), serverConfig.getPort()))) { -// socketKvsConnection.send(1, new CreateDatabaseKvsCommand("t1").serialize()); -// socketKvsConnection.send(1, new CreateTableKvsCommand("t1", "da").serialize()); -// socketKvsConnection.send(1, new SetKvsCommand("t1", "da", "key1", "value1").serialize()); -// q = socketKvsConnection.send(1, new GetKvsCommand("t1", "da", "key1").serialize()); -// } - // System.out.println(q.asString()); - j.close(); } /** @@ -174,4 +138,4 @@ public void close() { } } } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index 5f539b08..beeda0c1 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -62,4 +62,4 @@ public void close() { throw new RuntimeException("Closing client socket error", exception); } } -} +} \ No newline at end of file From 85a439472459777762c7959ac9d26eba1d8f6127 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 20:20:46 +0300 Subject: [PATCH 285/378] run --- .../java/basics/connector/JavaSocketServerConnector.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index 9d99814b..6f52718a 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -5,6 +5,7 @@ import com.itmo.java.basics.config.DatabaseConfig; import com.itmo.java.basics.config.DatabaseServerConfig; import com.itmo.java.basics.config.ServerConfig; +import com.itmo.java.basics.console.DatabaseCommand; import com.itmo.java.basics.console.DatabaseCommandResult; import com.itmo.java.basics.console.impl.ExecutionEnvironmentImpl; import com.itmo.java.basics.initialization.impl.DatabaseInitializer; @@ -115,8 +116,9 @@ public ClientTask(Socket client, DatabaseServer server) { public void run() { try (CommandReader commandReader = new CommandReader(new RespReader(client.getInputStream()), server.getEnv())) { while (commandReader.hasNextCommand()) { - CompletableFuture commandResult = server.executeNextCommand(commandReader.readCommand()); - respWriter.write(commandResult.get().serialize()); + DatabaseCommand databaseCommand = commandReader.readCommand(); + // CompletableFuture commandResult = server.executeNextCommand(commandReader.readCommand()); + respWriter.write(databaseCommand.execute().serialize()); } close(); } catch (Exception e) { From 0cd8c3c446f0c8e733e20c289d749a83c4099cd7 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 20:32:06 +0300 Subject: [PATCH 286/378] trying --- .../connector/JavaSocketServerConnector.java | 6 +- .../connection/SocketKvsConnection.java | 58 +++++++++++-------- 2 files changed, 36 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index 6f52718a..9d99814b 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -5,7 +5,6 @@ import com.itmo.java.basics.config.DatabaseConfig; import com.itmo.java.basics.config.DatabaseServerConfig; import com.itmo.java.basics.config.ServerConfig; -import com.itmo.java.basics.console.DatabaseCommand; import com.itmo.java.basics.console.DatabaseCommandResult; import com.itmo.java.basics.console.impl.ExecutionEnvironmentImpl; import com.itmo.java.basics.initialization.impl.DatabaseInitializer; @@ -116,9 +115,8 @@ public ClientTask(Socket client, DatabaseServer server) { public void run() { try (CommandReader commandReader = new CommandReader(new RespReader(client.getInputStream()), server.getEnv())) { while (commandReader.hasNextCommand()) { - DatabaseCommand databaseCommand = commandReader.readCommand(); - // CompletableFuture commandResult = server.executeNextCommand(commandReader.readCommand()); - respWriter.write(databaseCommand.execute().serialize()); + CompletableFuture commandResult = server.executeNextCommand(commandReader.readCommand()); + respWriter.write(commandResult.get().serialize()); } close(); } catch (Exception e) { diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index beeda0c1..3869179c 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -1,5 +1,6 @@ package com.itmo.java.client.connection; + import com.itmo.java.client.exception.ConnectionException; import com.itmo.java.protocol.RespReader; import com.itmo.java.protocol.RespWriter; @@ -8,20 +9,34 @@ import java.io.IOException; import java.net.Socket; +import java.net.UnknownHostException; /** * С помощью {@link RespWriter} и {@link RespReader} читает/пишет в сокет */ public class SocketKvsConnection implements KvsConnection { - final ConnectionConfig config; - final Socket socket; + private final int port; + private final String host; + private final Socket clientSocket; + private final RespWriter respWriter; + private final RespReader respReader; + // public static final String DEFAULT_HOST = "localhost"; + public SocketKvsConnection(ConnectionConfig config) { + this.port = config.getPort(); + this.host = config.getHost(); + if (host == null){ + throw new RuntimeException("null host"); + } + if (port == 0){ + throw new RuntimeException("null port"); + } - public SocketKvsConnection(ConnectionConfig config) { - this.config = config; try { - this.socket = new Socket(this.config.getHost(), this.config.getPort()); - } catch (IOException exception) { - throw new RuntimeException("Creation socket error", exception); + this.clientSocket = new Socket(host, port); + this.respReader = new RespReader(clientSocket.getInputStream()); + respWriter = new RespWriter(clientSocket.getOutputStream()); + } catch (IOException e) { + throw new RuntimeException("IOException when try to connect by " + host + " " + port, e); } } @@ -34,20 +49,13 @@ public SocketKvsConnection(ConnectionConfig config) { @Override public synchronized RespObject send(int commandId, RespArray command) throws ConnectionException { try { - final RespWriter respWriter = new RespWriter(socket.getOutputStream()); - + RespWriter respWriter = new RespWriter(clientSocket.getOutputStream()); respWriter.write(command); - - final RespReader respReader = new RespReader(socket.getInputStream()); - final RespObject respObject = respReader.readObject(); - - if (respObject.isError()) { - throw new ConnectionException("Response error"); - } - - return respObject; - } catch (IOException exception) { - throw new ConnectionException("Connection exception", exception); + RespReader respReader = new RespReader(clientSocket.getInputStream()); + return respReader.readObject(); + } catch (IOException e) { + close(); + throw new ConnectionException("IOException when send " + command.asString() + " with " + host + " and port " + port + " ___IOMessage___: " + e.getMessage(), e); } } @@ -57,9 +65,11 @@ public synchronized RespObject send(int commandId, RespArray command) throws Con @Override public void close() { try { - socket.close(); - } catch (IOException exception) { - throw new RuntimeException("Closing client socket error", exception); + respWriter.close(); + respReader.close(); + clientSocket.close(); + } catch (IOException e) { + throw new RuntimeException("IOException when try to close client socket"); } } -} \ No newline at end of file +} From 1f432b6477fbf89f6508950cae7b0a710cba10d4 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 21:48:35 +0300 Subject: [PATCH 287/378] fix config --- .../itmo/java/basics/config/ConfigLoader.java | 60 +++++++------------ .../java/basics/config/DatabaseConfig.java | 2 + .../connection/SocketKvsConnection.java | 10 +--- 3 files changed, 27 insertions(+), 45 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/config/ConfigLoader.java b/src/main/java/com/itmo/java/basics/config/ConfigLoader.java index 81bb26fb..fb9610f9 100644 --- a/src/main/java/com/itmo/java/basics/config/ConfigLoader.java +++ b/src/main/java/com/itmo/java/basics/config/ConfigLoader.java @@ -1,43 +1,26 @@ package com.itmo.java.basics.config; -import java.io.FileInputStream; -import java.io.IOException; +import java.io.*; +import java.net.URL; import java.util.Properties; /** * Класс, отвечающий за подгрузку данных из конфигурационного файла формата .properties */ public class ConfigLoader { + private final String fileName; + /** * По умолчанию читает из server.properties */ - - private static final String AUTO_NAME = "server.properties"; - private final Properties properties = new Properties(); public ConfigLoader() { - try{ - properties.load(this.getClass().getClassLoader().getResourceAsStream(AUTO_NAME)); - } catch (IOException ex) { - ex.printStackTrace(); - } - + fileName = "server.properties"; } /** * @param name Имя конфикурационного файла, откуда читать */ - public ConfigLoader(String name) { - try{ - if (this.getClass().getClassLoader().getResourceAsStream(name) != null) { - properties.load(this.getClass().getClassLoader().getResourceAsStream(name)); - } else { - FileInputStream inputStream = new FileInputStream(name); - properties.load(inputStream); - } - } catch( IOException ex) { - ex.printStackTrace(); - } - } + public ConfigLoader(String name) { fileName = name; } /** * Считывает конфиг из указанного в конструкторе файла. @@ -47,20 +30,23 @@ public ConfigLoader(String name) { * Читаются: "kvs.workingPath", "kvs.host", "kvs.port" (но в конфигурационном файле допустимы и другие проперти) */ public DatabaseServerConfig readConfig() { - String workingPath = properties.getProperty("kvs.workingPath"); - if (workingPath == null){ - workingPath = DatabaseConfig.DEFAULT_WORKING_PATH; - } - String host = properties.getProperty("kvs.host"); - if (host == null) { - host = ServerConfig.DEFAULT_HOST; - } - int port; - if (properties.getProperty("kvs.port") == null){ - port = ServerConfig.DEFAULT_PORT; - }else { - port = Integer.parseInt(properties.getProperty("kvs.port")); + final Properties properties = new Properties(); + final URL resource = this.getClass().getClassLoader().getResource(fileName); + final String filepath = resource == null ? fileName : resource.getPath(); + + try (final InputStream stream = new FileInputStream(filepath)) { + properties.load(stream); + + final String workingPath = properties.getProperty("kvs.workingPath", DatabaseConfig.DEFAULT_WORKING_PATH); + final String host = properties.getProperty("kvs.host", ServerConfig.DEFAULT_HOST); + final int port = Integer.parseInt(properties.getProperty("kvs.port", String.valueOf(ServerConfig.DEFAULT_PORT))); + + return new DatabaseServerConfig(new ServerConfig(host, port), new DatabaseConfig(workingPath)); + } catch (IOException exception){ + return new DatabaseServerConfig( + new ServerConfig(ServerConfig.DEFAULT_HOST, ServerConfig.DEFAULT_PORT), + new DatabaseConfig(DatabaseConfig.DEFAULT_WORKING_PATH) + ); } - return new DatabaseServerConfig(new ServerConfig(host, port), new DatabaseConfig(workingPath)); } } diff --git a/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java b/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java index 6ae46737..96a3331b 100644 --- a/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java +++ b/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java @@ -9,6 +9,8 @@ public DatabaseConfig(String workingPath) { this.workingPath = workingPath; } + public DatabaseConfig() { workingPath = DEFAULT_WORKING_PATH;}; + public String getWorkingPath() { return workingPath; } diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index 3869179c..a2a7d28c 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -20,16 +20,10 @@ public class SocketKvsConnection implements KvsConnection { private final Socket clientSocket; private final RespWriter respWriter; private final RespReader respReader; - // public static final String DEFAULT_HOST = "localhost"; - public SocketKvsConnection(ConnectionConfig config) { + + public SocketKvsConnection(ConnectionConfig config) { this.port = config.getPort(); this.host = config.getHost(); - if (host == null){ - throw new RuntimeException("null host"); - } - if (port == 0){ - throw new RuntimeException("null port"); - } try { this.clientSocket = new Socket(host, port); From 44422b10e720969a382ef303b25174ad4511b754 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 21:59:14 +0300 Subject: [PATCH 288/378] fixing config --- src/main/java/com/itmo/java/basics/config/ConfigLoader.java | 2 +- .../java/com/itmo/java/basics/config/DatabaseConfig.java | 3 ++- src/main/java/com/itmo/java/basics/config/ServerConfig.java | 6 +++++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/config/ConfigLoader.java b/src/main/java/com/itmo/java/basics/config/ConfigLoader.java index fb9610f9..45e120b5 100644 --- a/src/main/java/com/itmo/java/basics/config/ConfigLoader.java +++ b/src/main/java/com/itmo/java/basics/config/ConfigLoader.java @@ -45,7 +45,7 @@ public DatabaseServerConfig readConfig() { } catch (IOException exception){ return new DatabaseServerConfig( new ServerConfig(ServerConfig.DEFAULT_HOST, ServerConfig.DEFAULT_PORT), - new DatabaseConfig(DatabaseConfig.DEFAULT_WORKING_PATH) + new DatabaseConfig() ); } } diff --git a/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java b/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java index 96a3331b..1189551d 100644 --- a/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java +++ b/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java @@ -5,11 +5,12 @@ public class DatabaseConfig { public static final String DEFAULT_WORKING_PATH = "db_files"; private final String workingPath; + public DatabaseConfig() { workingPath = DEFAULT_WORKING_PATH;} + public DatabaseConfig(String workingPath) { this.workingPath = workingPath; } - public DatabaseConfig() { workingPath = DEFAULT_WORKING_PATH;}; public String getWorkingPath() { return workingPath; diff --git a/src/main/java/com/itmo/java/basics/config/ServerConfig.java b/src/main/java/com/itmo/java/basics/config/ServerConfig.java index d9d71f32..58df8056 100644 --- a/src/main/java/com/itmo/java/basics/config/ServerConfig.java +++ b/src/main/java/com/itmo/java/basics/config/ServerConfig.java @@ -7,7 +7,6 @@ * Какой хост и какой порт будет слушать наш сервер */ @Getter -@AllArgsConstructor public class ServerConfig { public static final String DEFAULT_HOST = "localhost"; @@ -15,4 +14,9 @@ public class ServerConfig { private final String host; private final int port; + + public ServerConfig(String host , int port) { + this.host = host; + this.port = port; + } } From 0f35901cc677fbd2ea66665aa221aa03e08de6bf Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 22:14:02 +0300 Subject: [PATCH 289/378] test config --- .../itmo/java/basics/config/ConfigLoader.java | 62 ++++++++++++------- .../connection/SocketKvsConnection.java | 1 + 2 files changed, 41 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/config/ConfigLoader.java b/src/main/java/com/itmo/java/basics/config/ConfigLoader.java index 45e120b5..c4f7825a 100644 --- a/src/main/java/com/itmo/java/basics/config/ConfigLoader.java +++ b/src/main/java/com/itmo/java/basics/config/ConfigLoader.java @@ -1,26 +1,44 @@ package com.itmo.java.basics.config; -import java.io.*; -import java.net.URL; +import java.io.FileInputStream; +import java.io.IOException; import java.util.Properties; /** * Класс, отвечающий за подгрузку данных из конфигурационного файла формата .properties */ public class ConfigLoader { - private final String fileName; + Properties configFileProp = new Properties(); + private String workingPath; + private String host; + private int port; /** * По умолчанию читает из server.properties */ public ConfigLoader() { - fileName = "server.properties"; + try { + configFileProp.load(this.getClass().getClassLoader().getResourceAsStream("server.properties")); + } catch (IOException e) { + e.printStackTrace(); + } } /** * @param name Имя конфикурационного файла, откуда читать */ - public ConfigLoader(String name) { fileName = name; } + public ConfigLoader(String name) { + try { + if (this.getClass().getClassLoader().getResourceAsStream(name) != null){ + configFileProp.load(this.getClass().getClassLoader().getResourceAsStream(name)); + } else { + FileInputStream fileInputStream = new FileInputStream(name); + configFileProp.load(fileInputStream); + } + } catch (IOException e) { + e.printStackTrace(); + } + } /** * Считывает конфиг из указанного в конструкторе файла. @@ -30,23 +48,23 @@ public ConfigLoader() { * Читаются: "kvs.workingPath", "kvs.host", "kvs.port" (но в конфигурационном файле допустимы и другие проперти) */ public DatabaseServerConfig readConfig() { - final Properties properties = new Properties(); - final URL resource = this.getClass().getClassLoader().getResource(fileName); - final String filepath = resource == null ? fileName : resource.getPath(); - - try (final InputStream stream = new FileInputStream(filepath)) { - properties.load(stream); - - final String workingPath = properties.getProperty("kvs.workingPath", DatabaseConfig.DEFAULT_WORKING_PATH); - final String host = properties.getProperty("kvs.host", ServerConfig.DEFAULT_HOST); - final int port = Integer.parseInt(properties.getProperty("kvs.port", String.valueOf(ServerConfig.DEFAULT_PORT))); - - return new DatabaseServerConfig(new ServerConfig(host, port), new DatabaseConfig(workingPath)); - } catch (IOException exception){ - return new DatabaseServerConfig( - new ServerConfig(ServerConfig.DEFAULT_HOST, ServerConfig.DEFAULT_PORT), - new DatabaseConfig() - ); + workingPath = configFileProp.getProperty("kvs.workingPath"); + host = configFileProp.getProperty("kvs.host"); + String stringPort = configFileProp.getProperty("kvs.port"); + if (host == null){ + host = ServerConfig.DEFAULT_HOST; + } + if (stringPort == null) { + port = ServerConfig.DEFAULT_PORT; + } else { + port = Integer.parseInt(stringPort); } + if (workingPath == null){ + workingPath = DatabaseConfig.DEFAULT_WORKING_PATH; + } + ServerConfig serverConfig = new ServerConfig(host, port); + DatabaseConfig databaseConfig = new DatabaseConfig(workingPath); + return new DatabaseServerConfig(serverConfig, databaseConfig); } } + diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index a2a7d28c..cb0daf17 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -25,6 +25,7 @@ public SocketKvsConnection(ConnectionConfig config) { this.port = config.getPort(); this.host = config.getHost(); + try { this.clientSocket = new Socket(host, port); this.respReader = new RespReader(clientSocket.getInputStream()); From c20eaf8095cd1293b8dde387da8b0ef6e985cc41 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 23:39:14 +0300 Subject: [PATCH 290/378] test constructor socket --- .../com/itmo/java/client/connection/SocketKvsConnection.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index cb0daf17..63eb5ac6 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -27,7 +27,7 @@ public SocketKvsConnection(ConnectionConfig config) { try { - this.clientSocket = new Socket(host, port); + this.clientSocket = new Socket((String) null, config.getPort()); this.respReader = new RespReader(clientSocket.getInputStream()); respWriter = new RespWriter(clientSocket.getOutputStream()); } catch (IOException e) { From c3087539397fa42ceb726d177d389f3f0832126c Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Wed, 9 Jun 2021 23:51:07 +0300 Subject: [PATCH 291/378] fix config --- .../itmo/java/basics/config/ConfigLoader.java | 68 ++++++++++++------- .../java/basics/config/DatabaseConfig.java | 3 +- .../itmo/java/basics/config/ServerConfig.java | 5 +- .../connection/SocketKvsConnection.java | 2 +- 4 files changed, 48 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/config/ConfigLoader.java b/src/main/java/com/itmo/java/basics/config/ConfigLoader.java index c4f7825a..7878bb3c 100644 --- a/src/main/java/com/itmo/java/basics/config/ConfigLoader.java +++ b/src/main/java/com/itmo/java/basics/config/ConfigLoader.java @@ -2,25 +2,32 @@ import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStream; import java.util.Properties; /** * Класс, отвечающий за подгрузку данных из конфигурационного файла формата .properties */ public class ConfigLoader { + + private final String DEAFULT_PROPERTY = "server.properties"; Properties configFileProp = new Properties(); private String workingPath; private String host; private int port; + private InputStream inputStream; /** * По умолчанию читает из server.properties */ public ConfigLoader() { + inputStream = getClass().getClassLoader().getResourceAsStream(DEAFULT_PROPERTY); try { - configFileProp.load(this.getClass().getClassLoader().getResourceAsStream("server.properties")); + if (inputStream == null) { + inputStream = new FileInputStream(DEAFULT_PROPERTY); + } } catch (IOException e) { - e.printStackTrace(); + inputStream = null; } } @@ -28,15 +35,13 @@ public ConfigLoader() { * @param name Имя конфикурационного файла, откуда читать */ public ConfigLoader(String name) { + inputStream = getClass().getClassLoader().getResourceAsStream(name); try { - if (this.getClass().getClassLoader().getResourceAsStream(name) != null){ - configFileProp.load(this.getClass().getClassLoader().getResourceAsStream(name)); - } else { - FileInputStream fileInputStream = new FileInputStream(name); - configFileProp.load(fileInputStream); + if (inputStream == null) { + inputStream = new FileInputStream(name); } } catch (IOException e) { - e.printStackTrace(); + inputStream = null; } } @@ -48,23 +53,38 @@ public ConfigLoader(String name) { * Читаются: "kvs.workingPath", "kvs.host", "kvs.port" (но в конфигурационном файле допустимы и другие проперти) */ public DatabaseServerConfig readConfig() { - workingPath = configFileProp.getProperty("kvs.workingPath"); - host = configFileProp.getProperty("kvs.host"); - String stringPort = configFileProp.getProperty("kvs.port"); - if (host == null){ - host = ServerConfig.DEFAULT_HOST; - } - if (stringPort == null) { - port = ServerConfig.DEFAULT_PORT; - } else { - port = Integer.parseInt(stringPort); - } - if (workingPath == null){ - workingPath = DatabaseConfig.DEFAULT_WORKING_PATH; + Properties properties = new Properties(); + try { + if (inputStream == null) { + throw new IOException("Config file not found"); + } + properties.load(inputStream); + String workingPath = properties.getProperty("kvs.workingPath"); + String host = properties.getProperty("kvs.host"); + String port = properties.getProperty("kvs.port"); + DatabaseConfig databaseConfig; + ServerConfig serverConfig; + if (workingPath == null) { + databaseConfig = new DatabaseConfig(); + } else { + databaseConfig = new DatabaseConfig(workingPath); + } + if (host == null){ + host = ServerConfig.DEFAULT_HOST; + } + try { + int portConfig = Integer.parseInt(port); + serverConfig = new ServerConfig(host,portConfig); + } catch (NumberFormatException e) { + serverConfig = new ServerConfig(host, ServerConfig.DEFAULT_PORT); + } + return DatabaseServerConfig.builder().dbConfig(databaseConfig) + .serverConfig(serverConfig).build(); + } catch (IOException e) { + return DatabaseServerConfig.builder() + .dbConfig(new DatabaseConfig()).serverConfig(new ServerConfig(ServerConfig.DEFAULT_HOST, ServerConfig.DEFAULT_PORT)) + .build(); } - ServerConfig serverConfig = new ServerConfig(host, port); - DatabaseConfig databaseConfig = new DatabaseConfig(workingPath); - return new DatabaseServerConfig(serverConfig, databaseConfig); } } diff --git a/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java b/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java index 1189551d..f5435599 100644 --- a/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java +++ b/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java @@ -5,12 +5,13 @@ public class DatabaseConfig { public static final String DEFAULT_WORKING_PATH = "db_files"; private final String workingPath; - public DatabaseConfig() { workingPath = DEFAULT_WORKING_PATH;} public DatabaseConfig(String workingPath) { this.workingPath = workingPath; } + public DatabaseConfig() { this.workingPath = DEFAULT_WORKING_PATH;} + public String getWorkingPath() { return workingPath; diff --git a/src/main/java/com/itmo/java/basics/config/ServerConfig.java b/src/main/java/com/itmo/java/basics/config/ServerConfig.java index 58df8056..617adda3 100644 --- a/src/main/java/com/itmo/java/basics/config/ServerConfig.java +++ b/src/main/java/com/itmo/java/basics/config/ServerConfig.java @@ -7,6 +7,7 @@ * Какой хост и какой порт будет слушать наш сервер */ @Getter +@AllArgsConstructor public class ServerConfig { public static final String DEFAULT_HOST = "localhost"; @@ -15,8 +16,4 @@ public class ServerConfig { private final String host; private final int port; - public ServerConfig(String host , int port) { - this.host = host; - this.port = port; - } } diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index 63eb5ac6..cb0daf17 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -27,7 +27,7 @@ public SocketKvsConnection(ConnectionConfig config) { try { - this.clientSocket = new Socket((String) null, config.getPort()); + this.clientSocket = new Socket(host, port); this.respReader = new RespReader(clientSocket.getInputStream()); respWriter = new RespWriter(clientSocket.getOutputStream()); } catch (IOException e) { From 48565aa4eade8e175d9c0d8a6da4d970b1975ddf Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 00:01:48 +0300 Subject: [PATCH 292/378] fix Dbservice --- .../com/itmo/java/basics/DatabaseServer.java | 22 ++++++++++--------- .../impl/InitializationContextImpl.java | 3 ++- .../com/itmo/java/protocol/RespWriter.java | 4 ++-- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/DatabaseServer.java b/src/main/java/com/itmo/java/basics/DatabaseServer.java index 7ad13938..d09b06d3 100644 --- a/src/main/java/com/itmo/java/basics/DatabaseServer.java +++ b/src/main/java/com/itmo/java/basics/DatabaseServer.java @@ -2,7 +2,10 @@ import com.itmo.java.basics.console.*; import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.initialization.impl.*; +import com.itmo.java.basics.initialization.InitializationContext; +import com.itmo.java.basics.initialization.impl.DatabaseServerInitializer; +import com.itmo.java.basics.initialization.impl.InitializationContextImpl; +import com.itmo.java.basics.logic.Database; import com.itmo.java.protocol.model.RespArray; import java.util.concurrent.CompletableFuture; @@ -15,31 +18,30 @@ public class DatabaseServer { private final ExecutionEnvironment enviroment; /** - * Con structor + * Конструктор * - * @param env env для инициализации. Далее работа происходит с заполненым объектом + * @param env env для инициализации. Далее работа происходит с заполненным объектом * @param initializer готовый чейн инициализации * @throws DatabaseException если произошла ошибка инициализации */ public static DatabaseServer initialize(ExecutionEnvironment env, DatabaseServerInitializer initializer) throws DatabaseException { - initializer.perform(new InitializationContextImpl(env, null, null, null)); + InitializationContext context = InitializationContextImpl.builder().executionEnvironment(env).build(); + initializer.perform(context); return new DatabaseServer(env); } - private DatabaseServer(ExecutionEnvironment env) { + private DatabaseServer(ExecutionEnvironment env){ this.enviroment = env; } public CompletableFuture executeNextCommand(RespArray message) { - return CompletableFuture.supplyAsync(() -> - DatabaseCommands.valueOf(message.getObjects().get(DatabaseCommandArgPositions.COMMAND_NAME.getPositionIndex()).asString()).getCommand(enviroment, message.getObjects()).execute(), executorService); + return CompletableFuture.supplyAsync(() -> DatabaseCommands.valueOf(message.getObjects().get(DatabaseCommandArgPositions. + COMMAND_NAME.getPositionIndex()).asString()).getCommand(enviroment, message.getObjects()).execute(), executorService); } public CompletableFuture executeNextCommand(DatabaseCommand command) { return CompletableFuture.supplyAsync(command::execute, executorService); } - public ExecutionEnvironment getEnv() { - return enviroment; - } + public ExecutionEnvironment getEnv() { return enviroment; } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/InitializationContextImpl.java b/src/main/java/com/itmo/java/basics/initialization/impl/InitializationContextImpl.java index 114e0dae..bc67bfb8 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/InitializationContextImpl.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/InitializationContextImpl.java @@ -5,6 +5,7 @@ import com.itmo.java.basics.initialization.InitializationContext; import com.itmo.java.basics.initialization.SegmentInitializationContext; import com.itmo.java.basics.initialization.TableInitializationContext; +import lombok.Builder; public class InitializationContextImpl implements InitializationContext { @@ -12,7 +13,7 @@ public class InitializationContextImpl implements InitializationContext { private final DatabaseInitializationContext currentDatabaseContext; private final TableInitializationContext currentTableContext; private final SegmentInitializationContext currentSegmentContext; - +@Builder public InitializationContextImpl(ExecutionEnvironment executionEnvironment, DatabaseInitializationContext currentDatabaseContext, TableInitializationContext currentTableContext, diff --git a/src/main/java/com/itmo/java/protocol/RespWriter.java b/src/main/java/com/itmo/java/protocol/RespWriter.java index fc21f3e9..48a0bd5c 100644 --- a/src/main/java/com/itmo/java/protocol/RespWriter.java +++ b/src/main/java/com/itmo/java/protocol/RespWriter.java @@ -21,7 +21,7 @@ public void write(RespObject object) throws IOException { try { object.write(outputStream); } catch (IOException ex) { - throw new IOException(ex); + ex.printStackTrace(); } } @@ -30,7 +30,7 @@ public void close() throws IOException { try { outputStream.close(); } catch (IOException ex) { - throw new IOException(ex); + ex.printStackTrace(); } } } \ No newline at end of file From 3d8ff677950d0a1b00c5e7d78a0044c3bb0c1a59 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 00:10:36 +0300 Subject: [PATCH 293/378] add output.flush() --- src/main/java/com/itmo/java/protocol/model/RespArray.java | 3 ++- .../java/com/itmo/java/protocol/model/RespBulkString.java | 3 ++- .../java/com/itmo/java/protocol/model/RespCommandId.java | 1 + src/main/java/com/itmo/java/protocol/model/RespError.java | 7 ++++++- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/model/RespArray.java b/src/main/java/com/itmo/java/protocol/model/RespArray.java index ccba34f6..8e80b496 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespArray.java +++ b/src/main/java/com/itmo/java/protocol/model/RespArray.java @@ -16,7 +16,7 @@ public class RespArray implements RespObject { * Код объекта */ public static final byte CODE = '*'; - private List objects; + private final List objects; public RespArray(RespObject... obj) { objects = Arrays.asList(obj); @@ -48,6 +48,7 @@ public void write(OutputStream output) throws IOException { output.write(CODE); output.write(Integer.toString(objects.size()).getBytes(StandardCharsets.UTF_8)); output.write(CRLF); + output.flush(); for (RespObject obj : objects) { obj.write(output); } diff --git a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java index 6ef8d5d4..f3bdbf24 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java +++ b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java @@ -38,7 +38,7 @@ public boolean isError() { */ @Override public String asString() { - return new String(data); + return new String(data ,StandardCharsets.UTF_8); } @Override @@ -53,6 +53,7 @@ public void write(OutputStream output) throws IOException { output.write(data); } output.write(CRLF); + output.flush(); } catch (IOException ex) { throw new IOException(ex); } diff --git a/src/main/java/com/itmo/java/protocol/model/RespCommandId.java b/src/main/java/com/itmo/java/protocol/model/RespCommandId.java index e5bb52de..6584c583 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespCommandId.java +++ b/src/main/java/com/itmo/java/protocol/model/RespCommandId.java @@ -44,6 +44,7 @@ public void write(OutputStream output) throws IOException { output.write((commandByte >>> 8) & 0xFF); output.write(commandByte & 0xFF); output.write(CRLF); + output.flush(); } catch (IOException ex) { throw new IOException(ex); } diff --git a/src/main/java/com/itmo/java/protocol/model/RespError.java b/src/main/java/com/itmo/java/protocol/model/RespError.java index 760415c8..99d0edfb 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespError.java +++ b/src/main/java/com/itmo/java/protocol/model/RespError.java @@ -2,6 +2,7 @@ import java.io.IOException; import java.io.OutputStream; +import java.nio.charset.StandardCharsets; /** * Сообщение об ошибке в RESP протоколе @@ -30,7 +31,10 @@ public boolean isError() { @Override public String asString() { - return new String(message); + if (message == null) { + return null; + } + return new String(message , StandardCharsets.UTF_8); } @Override @@ -39,6 +43,7 @@ public void write(OutputStream output) throws IOException { output.write(CODE); output.write(message); output.write(CRLF); + output.flush(); } catch(IOException ex) { throw new IOException(ex); } From 633915308bf14a8eade733c6e771bca2e7b9e138 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 00:19:22 +0300 Subject: [PATCH 294/378] check connection --- .../connector/JavaSocketServerConnector.java | 15 ++++++--------- .../connection/DirectReferenceKvsConnection.java | 10 +++++++--- .../client/connection/SocketKvsConnection.java | 3 --- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index 9d99814b..0227e52e 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -42,12 +42,8 @@ public class JavaSocketServerConnector implements Closeable { * Стартует сервер. По аналогии с сокетом открывает коннекшн в конструкторе. */ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig config) throws IOException { - try { - this.serverSocket = new ServerSocket(config.getPort()); - this.server = databaseServer; - } catch (IOException ex) { - throw new IOException(ex); - } + this.serverSocket = new ServerSocket(config.getPort()); + this.server = databaseServer; } /** @@ -55,12 +51,13 @@ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig con */ public void start() { connectionAcceptorExecutor.submit(() -> { - while(true) { + while (true) { Socket clientSocket = serverSocket.accept(); - clientIOWorkers.submit(new ClientTask(clientSocket,server)); + clientIOWorkers.submit(new ClientTask(clientSocket, server)); } }); } + /** * Закрывает все, что нужно ¯\_(ツ)_/¯ */ @@ -138,4 +135,4 @@ public void close() { } } } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java b/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java index 40d0ccbd..c70e9842 100644 --- a/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java @@ -3,6 +3,7 @@ import com.itmo.java.basics.DatabaseServer; import com.itmo.java.client.exception.ConnectionException; import com.itmo.java.protocol.model.RespArray; +import com.itmo.java.protocol.model.RespCommandId; import com.itmo.java.protocol.model.RespObject; import java.util.concurrent.ExecutionException; @@ -12,7 +13,6 @@ * (пока еще нет реализации сокетов) */ public class DirectReferenceKvsConnection implements KvsConnection { - private final DatabaseServer dbServer; public DirectReferenceKvsConnection(DatabaseServer databaseServer) { @@ -23,8 +23,12 @@ public DirectReferenceKvsConnection(DatabaseServer databaseServer) { public RespObject send(int commandId, RespArray command) throws ConnectionException { try { return dbServer.executeNextCommand(command).get().serialize(); - } catch (ExecutionException | InterruptedException ex) { - throw new ConnectionException(ex.getMessage(), ex.getCause()); + } catch (InterruptedException e) { + throw new ConnectionException("ConnectionException when try to get result from server because of interruption when message is '" + + command.asString() + "'", e); + } catch (ExecutionException e) { + throw new ConnectionException("ConnectionException when try to get result from server because of ExecutionException when message is '" + + command.asString() + "'", e); } } diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index cb0daf17..855baf72 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -1,6 +1,5 @@ package com.itmo.java.client.connection; - import com.itmo.java.client.exception.ConnectionException; import com.itmo.java.protocol.RespReader; import com.itmo.java.protocol.RespWriter; @@ -24,8 +23,6 @@ public class SocketKvsConnection implements KvsConnection { public SocketKvsConnection(ConnectionConfig config) { this.port = config.getPort(); this.host = config.getHost(); - - try { this.clientSocket = new Socket(host, port); this.respReader = new RespReader(clientSocket.getInputStream()); From dec093100451c0f0593ec012fc34737a0062000f Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 00:32:05 +0300 Subject: [PATCH 295/378] getAndIncrement --- .../com/itmo/java/client/command/CreateDatabaseKvsCommand.java | 2 +- .../com/itmo/java/client/command/CreateTableKvsCommand.java | 2 +- .../java/com/itmo/java/client/command/DeleteKvsCommand.java | 2 +- src/main/java/com/itmo/java/client/command/GetKvsCommand.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java b/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java index ce02e682..d433017d 100644 --- a/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java @@ -22,7 +22,7 @@ public class CreateDatabaseKvsCommand implements KvsCommand { */ public CreateDatabaseKvsCommand(String databaseName) { // dbID = idGen.get(); - dbID = idGen.incrementAndGet(); + dbID = idGen.getAndIncrement(); dbName = databaseName; } diff --git a/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java b/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java index 4b66e2fb..7b7a98d0 100644 --- a/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java @@ -19,7 +19,7 @@ public class CreateTableKvsCommand implements KvsCommand { public CreateTableKvsCommand(String databaseName, String tableName) { dbName = databaseName; tbName = tableName; - tbID = idGen.incrementAndGet(); + tbID = idGen.getAndIncrement(); } /** diff --git a/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java b/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java index 618038c9..06ef5269 100644 --- a/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java @@ -18,7 +18,7 @@ public DeleteKvsCommand(String databaseName, String tableName, String key) { dbName = databaseName; tbName = tableName; Key = key; - delID = idGen.incrementAndGet(); + delID = idGen.getAndIncrement(); } /** diff --git a/src/main/java/com/itmo/java/client/command/GetKvsCommand.java b/src/main/java/com/itmo/java/client/command/GetKvsCommand.java index fbd5e2ae..045e5ea3 100644 --- a/src/main/java/com/itmo/java/client/command/GetKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/GetKvsCommand.java @@ -18,7 +18,7 @@ public GetKvsCommand(String databaseName, String tableName, String key) { dbName = databaseName; tbName = tableName; Key = key; - getID = idGen.incrementAndGet(); + getID = idGen.getAndIncrement(); } /** From 51f7b8afddbb449e207500f44d02a3ea713d41cd Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 01:57:48 +0300 Subject: [PATCH 296/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82(=D1=85?= =?UTF-8?q?=D0=B7=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B8=D0=BB=D1=81=D1=8F?= =?UTF-8?q?=20=D0=BB=D0=B8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../itmo/java/basics/config/ConfigLoader.java | 68 ++++++----------- .../console/impl/CreateDatabaseCommand.java | 10 ++- .../console/impl/CreateTableCommand.java | 12 ++- .../basics/console/impl/DeleteKeyCommand.java | 19 +++-- .../impl/ExecutionEnvironmentImpl.java | 10 +-- .../basics/console/impl/GetKeyCommand.java | 18 +++-- .../basics/console/impl/SetKeyCommand.java | 24 ++++-- .../java/basics/logic/impl/DatabaseImpl.java | 6 ++ .../basics/logic/io/DatabaseOutputStream.java | 3 +- .../java/client/client/SimpleKvsClient.java | 76 ++++++------------- .../java/client/command/DeleteKvsCommand.java | 24 +++--- .../java/client/command/GetKvsCommand.java | 2 +- .../DirectReferenceKvsConnection.java | 2 +- .../com/itmo/java/protocol/RespWriter.java | 19 ++--- .../itmo/java/protocol/model/RespArray.java | 35 ++++----- .../java/protocol/model/RespBulkString.java | 41 +++++----- .../java/protocol/model/RespCommandId.java | 35 ++++----- .../itmo/java/protocol/model/RespError.java | 22 +++--- 18 files changed, 201 insertions(+), 225 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/config/ConfigLoader.java b/src/main/java/com/itmo/java/basics/config/ConfigLoader.java index 7878bb3c..c4f7825a 100644 --- a/src/main/java/com/itmo/java/basics/config/ConfigLoader.java +++ b/src/main/java/com/itmo/java/basics/config/ConfigLoader.java @@ -2,32 +2,25 @@ import java.io.FileInputStream; import java.io.IOException; -import java.io.InputStream; import java.util.Properties; /** * Класс, отвечающий за подгрузку данных из конфигурационного файла формата .properties */ public class ConfigLoader { - - private final String DEAFULT_PROPERTY = "server.properties"; Properties configFileProp = new Properties(); private String workingPath; private String host; private int port; - private InputStream inputStream; /** * По умолчанию читает из server.properties */ public ConfigLoader() { - inputStream = getClass().getClassLoader().getResourceAsStream(DEAFULT_PROPERTY); try { - if (inputStream == null) { - inputStream = new FileInputStream(DEAFULT_PROPERTY); - } + configFileProp.load(this.getClass().getClassLoader().getResourceAsStream("server.properties")); } catch (IOException e) { - inputStream = null; + e.printStackTrace(); } } @@ -35,13 +28,15 @@ public ConfigLoader() { * @param name Имя конфикурационного файла, откуда читать */ public ConfigLoader(String name) { - inputStream = getClass().getClassLoader().getResourceAsStream(name); try { - if (inputStream == null) { - inputStream = new FileInputStream(name); + if (this.getClass().getClassLoader().getResourceAsStream(name) != null){ + configFileProp.load(this.getClass().getClassLoader().getResourceAsStream(name)); + } else { + FileInputStream fileInputStream = new FileInputStream(name); + configFileProp.load(fileInputStream); } } catch (IOException e) { - inputStream = null; + e.printStackTrace(); } } @@ -53,38 +48,23 @@ public ConfigLoader(String name) { * Читаются: "kvs.workingPath", "kvs.host", "kvs.port" (но в конфигурационном файле допустимы и другие проперти) */ public DatabaseServerConfig readConfig() { - Properties properties = new Properties(); - try { - if (inputStream == null) { - throw new IOException("Config file not found"); - } - properties.load(inputStream); - String workingPath = properties.getProperty("kvs.workingPath"); - String host = properties.getProperty("kvs.host"); - String port = properties.getProperty("kvs.port"); - DatabaseConfig databaseConfig; - ServerConfig serverConfig; - if (workingPath == null) { - databaseConfig = new DatabaseConfig(); - } else { - databaseConfig = new DatabaseConfig(workingPath); - } - if (host == null){ - host = ServerConfig.DEFAULT_HOST; - } - try { - int portConfig = Integer.parseInt(port); - serverConfig = new ServerConfig(host,portConfig); - } catch (NumberFormatException e) { - serverConfig = new ServerConfig(host, ServerConfig.DEFAULT_PORT); - } - return DatabaseServerConfig.builder().dbConfig(databaseConfig) - .serverConfig(serverConfig).build(); - } catch (IOException e) { - return DatabaseServerConfig.builder() - .dbConfig(new DatabaseConfig()).serverConfig(new ServerConfig(ServerConfig.DEFAULT_HOST, ServerConfig.DEFAULT_PORT)) - .build(); + workingPath = configFileProp.getProperty("kvs.workingPath"); + host = configFileProp.getProperty("kvs.host"); + String stringPort = configFileProp.getProperty("kvs.port"); + if (host == null){ + host = ServerConfig.DEFAULT_HOST; + } + if (stringPort == null) { + port = ServerConfig.DEFAULT_PORT; + } else { + port = Integer.parseInt(stringPort); + } + if (workingPath == null){ + workingPath = DatabaseConfig.DEFAULT_WORKING_PATH; } + ServerConfig serverConfig = new ServerConfig(host, port); + DatabaseConfig databaseConfig = new DatabaseConfig(workingPath); + return new DatabaseServerConfig(serverConfig, databaseConfig); } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java index f1f0b5b1..f326572c 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java @@ -20,6 +20,7 @@ public class CreateDatabaseCommand implements DatabaseCommand { private final DatabaseFactory dbfactory; private final List commandargs; private static final int numberOfAgrguments = 3; + private final String dbName; /** * Создает команду. @@ -39,6 +40,7 @@ public CreateDatabaseCommand(ExecutionEnvironment env, DatabaseFactory factory, environment = env; dbfactory = factory; commandargs = comArgs; + dbName = comArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); } /** @@ -48,15 +50,17 @@ public CreateDatabaseCommand(ExecutionEnvironment env, DatabaseFactory factory, */ @Override public DatabaseCommandResult execute() { + String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); try { - String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + // String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); if (dbName == null) { throw new DatabaseException("Why dbname is null? "); } environment.addDatabase(dbfactory.createNonExistent(dbName, environment.getWorkingPath())); - return DatabaseCommandResult.success(("Success add " + dbName).getBytes(StandardCharsets.UTF_8)); + // return DatabaseCommandResult.success(("Success add " + dbName).getBytes(StandardCharsets.UTF_8)); } catch (DatabaseException ex) { - return new FailedDatabaseCommandResult(ex.getMessage()); + return DatabaseCommandResult.error("Error while create db "); } + return DatabaseCommandResult.success(("Success add " + dbName).getBytes(StandardCharsets.UTF_8)); } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java index 0ab1ee5f..2de34fd6 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java @@ -21,6 +21,8 @@ public class CreateTableCommand implements DatabaseCommand { private final ExecutionEnvironment environment; private final List commandargs; private static final int numberOfAgrguments = 4; + private final String dbName; + private final String tbName; /** * Создает команду @@ -38,6 +40,8 @@ public CreateTableCommand(ExecutionEnvironment env, List comArgs) { } environment = env; commandargs = comArgs; + dbName = comArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + tbName = comArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); } /** @@ -47,12 +51,13 @@ public CreateTableCommand(ExecutionEnvironment env, List comArgs) { */ @Override public DatabaseCommandResult execute() { + try { - String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + if (dbName == null) { throw new DatabaseException("Why dbname is null?"); } - String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + if (tbName == null) { throw new DatabaseException("Why tbName is null?"); } @@ -61,9 +66,10 @@ public DatabaseCommandResult execute() { throw new DatabaseException("We dont have" + dbName); } dataBase.get().createTableIfNotExists(tbName); - return DatabaseCommandResult.success(("Success add " + dbName + tbName).getBytes(StandardCharsets.UTF_8)); + } catch (DatabaseException ex) { return new FailedDatabaseCommandResult(ex.getMessage()); } + return DatabaseCommandResult.success(("Success add " + dbName + tbName).getBytes(StandardCharsets.UTF_8)); } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java index c02e0551..65a0cda8 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java @@ -21,6 +21,9 @@ public class DeleteKeyCommand implements DatabaseCommand { private final ExecutionEnvironment environment; private final List commandargs; private static final int numberOfAgrguments = 5; + private final String tbName; + private final String dbName; + private final String key; /** * Создает команду. @@ -32,13 +35,16 @@ public class DeleteKeyCommand implements DatabaseCommand { * Id команды, имя команды, имя бд, таблицы, ключ * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { + public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { if (comArgs.size() != numberOfAgrguments) { throw new IllegalArgumentException("Why " + comArgs.size() + "!= 5 , in CreateTableCommand"); } environment = env; commandargs = comArgs; + dbName = comArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + tbName = comArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + key = comArgs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); } /** @@ -49,15 +55,12 @@ public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { @Override public DatabaseCommandResult execute() { try { - String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); if (dbName == null) { throw new DatabaseException("Why dbname is null?"); } - String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); if (tbName == null) { throw new DatabaseException("Why tbName is null?"); } - String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); if (key == null) { throw new DatabaseException("Why key is null?"); } @@ -65,10 +68,14 @@ public DatabaseCommandResult execute() { if (dataBase.isEmpty()) { throw new DatabaseException("We dont have" + dbName); } - dataBase.get().delete(tbName, key); + Optional previous = dataBase.get().read(tbName, key); + if (previous.isEmpty()) { + return DatabaseCommandResult.error("Value is not found"); + } + dataBase.get().delete(tbName, key); return DatabaseCommandResult.success(("Success del " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); } catch (DatabaseException ex) { - return new FailedDatabaseCommandResult(ex.getMessage()); + return DatabaseCommandResult.error("Error while dbComRes Delete"); } } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java index 61006344..8d2a9dc5 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java +++ b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java @@ -5,18 +5,18 @@ import com.itmo.java.basics.logic.Database; import java.nio.file.Path; +import java.nio.file.Paths; import java.util.HashMap; import java.util.Map; import java.util.Optional; public class ExecutionEnvironmentImpl implements ExecutionEnvironment { - private final DatabaseConfig dbConfig; - private final Map dataBase; + public Path workingPath; + public Map dataBase = new HashMap<>(); public ExecutionEnvironmentImpl(DatabaseConfig config) { - dbConfig = config; - dataBase = new HashMap<>(); + workingPath = Paths.get(config.getWorkingPath()); } @Override @@ -31,6 +31,6 @@ public void addDatabase(Database db) { @Override public Path getWorkingPath() { - return Path.of(dbConfig.getWorkingPath()); + return workingPath; } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java index b88255ff..50c9f0ee 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java @@ -20,6 +20,9 @@ public class GetKeyCommand implements DatabaseCommand { private final ExecutionEnvironment environment; private final List commandargs; private static final int numberOfAgrguments = 5; + private final String dbName; + private final String tbName; + private final String key; /** * Создает команду. @@ -37,6 +40,9 @@ public GetKeyCommand(ExecutionEnvironment env, List comArgs) { } environment = env; commandargs = comArgs; + dbName = comArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + tbName = comArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + key = comArgs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); } /** @@ -47,15 +53,15 @@ public GetKeyCommand(ExecutionEnvironment env, List comArgs) { @Override public DatabaseCommandResult execute() { try { - String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + if (dbName == null) { throw new DatabaseException("Why dbname is null?"); } - String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + if (tbName == null) { throw new DatabaseException("Why tbName is null?"); } - String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); + if (key == null) { throw new DatabaseException("Why key is null?"); } @@ -65,11 +71,11 @@ public DatabaseCommandResult execute() { } Optional value = dataBase.get().read(tbName, key); if (value.isEmpty()) { - throw new DatabaseException("We dont have" + dbName + tbName + key); + return DatabaseCommandResult.error("DataBase is not found"); } - return DatabaseCommandResult.success(value.get()); + return DatabaseCommandResult.success(value.orElse(null)); } catch (DatabaseException ex) { - return new FailedDatabaseCommandResult(ex.getMessage()); + return DatabaseCommandResult.error("DataBase exception while try get key"); } } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java index e6326d41..f354abc4 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java @@ -21,6 +21,10 @@ public class SetKeyCommand implements DatabaseCommand { private final ExecutionEnvironment environment; private final List commandargs; private static final int numberOfAgrguments = 6; + private final String dbName; + private final String tbName; + private final String key; + private final String value; /** * Создает команду. @@ -38,6 +42,10 @@ public SetKeyCommand(ExecutionEnvironment env, List comArgs) { } environment = env; commandargs = comArgs; + dbName = comArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + tbName = comArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + key = comArgs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); + value = comArgs.get(DatabaseCommandArgPositions.VALUE.getPositionIndex()).asString(); } /** @@ -48,27 +56,27 @@ public SetKeyCommand(ExecutionEnvironment env, List comArgs) { @Override public DatabaseCommandResult execute() { try { - String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + if (dbName == null) { throw new DatabaseException("Why dbname is null?"); } - String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + if (tbName == null) { throw new DatabaseException("Why tbName is null?"); } - String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); + if (key == null) { throw new DatabaseException("Why key is null?"); } Optional dataBase = environment.getDatabase(dbName); if (dataBase.isEmpty()) { - throw new DatabaseException("We dont have" + dbName); + return DatabaseCommandResult.error("DB is not found"); } - byte[] value = commandargs.get(DatabaseCommandArgPositions.VALUE.getPositionIndex()).asString().getBytes(StandardCharsets.UTF_8); - dataBase.get().write(tbName, key, value); - return DatabaseCommandResult.success(("Success add key " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); + Optional previous = dataBase.get().read(tbName,key); + dataBase.get().write(tbName, key, value.getBytes(StandardCharsets.UTF_8)); + return DatabaseCommandResult.success(previous.orElse(null)); } catch (DatabaseException ex) { - return new FailedDatabaseCommandResult(ex.getMessage()); + return DatabaseCommandResult.error("Error while setkey"); } } } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index 14f5ffb2..b96002a5 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -82,6 +82,9 @@ public void write(String tableName, String objectKey, byte[] objectValue) throws } Table table = tableDictionary.get(tableName); + if (table == null) { + throw new DatabaseException("Table not found"); + } table.write(objectKey, objectValue); } @@ -103,6 +106,9 @@ public void delete(String tableName, String objectKey) throws DatabaseException{ throw new DatabaseException("Writing in database error"); } Table tableImpl = tableDictionary.get(tableName); + if (tableName == null) { + throw new DatabaseException("Error while reading in database , null name"); + } tableImpl.delete(objectKey); } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java index ec1ad1c4..6b7c1cf2 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java @@ -42,9 +42,8 @@ public int write(WritableDatabaseRecord databaseRecord) throws IOException { if (databaseRecord.isValuePresented()) { write(databaseRecord.getValue()); } - flush(); - return (int) databaseRecord.size(); + return size(); } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java b/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java index 0cd550af..ef055bbb 100644 --- a/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java +++ b/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java @@ -1,18 +1,17 @@ package com.itmo.java.client.client; -import com.itmo.java.basics.console.DatabaseCommandResult; import com.itmo.java.client.command.*; import com.itmo.java.client.connection.KvsConnection; import com.itmo.java.client.exception.ConnectionException; import com.itmo.java.client.exception.DatabaseExecutionException; import com.itmo.java.protocol.model.RespObject; +import java.util.Arrays; import java.util.function.Supplier; public class SimpleKvsClient implements KvsClient { - private final String dbName; - private final KvsConnection connectionSupplier; + private final KvsConnection kvsConnection; /** * Конструктор @@ -21,77 +20,50 @@ public class SimpleKvsClient implements KvsClient { * @param connectionSupplier метод создания подключения к базе */ public SimpleKvsClient(String databaseName, Supplier connectionSupplier) { - dbName = databaseName; - this.connectionSupplier = connectionSupplier.get(); + this.dbName = databaseName; + this.kvsConnection = connectionSupplier.get(); } @Override public String createDatabase() throws DatabaseExecutionException { - try { - CreateDatabaseKvsCommand dbKvsCom = new CreateDatabaseKvsCommand(dbName); - RespObject obj = connectionSupplier.send(dbKvsCom.getCommandId(), dbKvsCom.serialize()); - if (obj.isError()) { - throw new DatabaseExecutionException(obj.asString()); - } - return obj.asString(); - } catch (ConnectionException ex) { - return DatabaseCommandResult.error(ex).getPayLoad(); - } + KvsCommand command = new CreateDatabaseKvsCommand(dbName); + return tryToSend(command); } @Override public String createTable(String tableName) throws DatabaseExecutionException { - try { - CreateTableKvsCommand tbKvsCom = new CreateTableKvsCommand(dbName, tableName); - RespObject obj = connectionSupplier.send(tbKvsCom.getCommandId(), tbKvsCom.serialize()); - if (obj.isError()) { - throw new DatabaseExecutionException(obj.asString()); - } - return obj.asString(); - } catch (ConnectionException ex) { - return DatabaseCommandResult.error(ex).getPayLoad(); - } + KvsCommand command = new CreateTableKvsCommand(dbName, tableName); + return tryToSend(command); } @Override public String get(String tableName, String key) throws DatabaseExecutionException { - try { - GetKvsCommand getKvsCom = new GetKvsCommand(dbName, tableName, key); - RespObject obj = connectionSupplier.send(getKvsCom.getCommandId(), getKvsCom.serialize()); - if (obj.isError()) { - throw new DatabaseExecutionException(obj.asString()); - } - return obj.asString(); - } catch (ConnectionException ex) { - return DatabaseCommandResult.error(ex).getPayLoad(); - } + KvsCommand command = new GetKvsCommand(dbName, tableName, key); + return tryToSend(command); } @Override public String set(String tableName, String key, String value) throws DatabaseExecutionException { - try { - SetKvsCommand setKvsCom = new SetKvsCommand(dbName, tableName, key, value); - RespObject obj = connectionSupplier.send(setKvsCom.getCommandId(), setKvsCom.serialize()); - if (obj.isError()) { - throw new DatabaseExecutionException(obj.asString()); - } - return obj.asString(); - } catch (ConnectionException ex) { - return DatabaseCommandResult.error(ex).getPayLoad(); - } + KvsCommand command = new SetKvsCommand(dbName, tableName, key, value); + return tryToSend(command); } @Override public String delete(String tableName, String key) throws DatabaseExecutionException { + KvsCommand command = new DeleteKvsCommand(dbName, tableName, key); + return tryToSend(command); + } + + private String tryToSend(KvsCommand command) throws DatabaseExecutionException { try { - DeleteKvsCommand delKvsCom = new DeleteKvsCommand(dbName, tableName, key); - RespObject obj = connectionSupplier.send(delKvsCom.getCommandId(), delKvsCom.serialize()); - if (obj.isError()) { - throw new DatabaseExecutionException(obj.asString()); + RespObject result = kvsConnection.send(command.getCommandId(), command.serialize()); + if (result.isError()) { + throw new DatabaseExecutionException(result.asString()); } - return obj.asString(); - } catch (ConnectionException ex) { - return DatabaseCommandResult.error(ex).getPayLoad(); + return result.asString(); + } catch (ConnectionException e) { + throw new DatabaseExecutionException(String.format("DatabaseExecutionException when try to send '%s' with kvsConnection" + " Message:: " + e.getMessage() + " StackTrace:: " + Arrays.toString(e.getStackTrace()), + command.serialize().asString()), e); } } } diff --git a/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java b/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java index 06ef5269..a67e017b 100644 --- a/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java @@ -7,18 +7,18 @@ import java.nio.charset.StandardCharsets; public class DeleteKvsCommand implements KvsCommand { - private static final String COMMAND_NAME = "DELETE_KEY"; private final String dbName; private final String tbName; - private final String Key; - private final int delID; + private final int delId; + private final String key; + public DeleteKvsCommand(String databaseName, String tableName, String key) { - dbName = databaseName; - tbName = tableName; - Key = key; - delID = idGen.getAndIncrement(); + this.dbName = databaseName; + this.tbName = tableName; + this.key = key; + this.delId = idGen.getAndIncrement(); } /** @@ -28,15 +28,13 @@ public DeleteKvsCommand(String databaseName, String tableName, String key) { */ @Override public RespArray serialize() { - return new RespArray(new RespCommandId(delID), - new RespBulkString(COMMAND_NAME.getBytes(StandardCharsets.UTF_8)), - new RespBulkString(dbName.getBytes(StandardCharsets.UTF_8)), - new RespBulkString(tbName.getBytes(StandardCharsets.UTF_8)), - new RespBulkString(Key.getBytes(StandardCharsets.UTF_8))); + return new RespArray(new RespCommandId(delId), new RespBulkString(COMMAND_NAME.getBytes(StandardCharsets.UTF_8)), + new RespBulkString(dbName.getBytes(StandardCharsets.UTF_8)), new RespBulkString(tbName.getBytes(StandardCharsets.UTF_8)), + new RespBulkString(key.getBytes(StandardCharsets.UTF_8))); } @Override public int getCommandId() { - return delID; + return delId; } } diff --git a/src/main/java/com/itmo/java/client/command/GetKvsCommand.java b/src/main/java/com/itmo/java/client/command/GetKvsCommand.java index 045e5ea3..fbd5e2ae 100644 --- a/src/main/java/com/itmo/java/client/command/GetKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/GetKvsCommand.java @@ -18,7 +18,7 @@ public GetKvsCommand(String databaseName, String tableName, String key) { dbName = databaseName; tbName = tableName; Key = key; - getID = idGen.getAndIncrement(); + getID = idGen.incrementAndGet(); } /** diff --git a/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java b/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java index c70e9842..e49d9d24 100644 --- a/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java @@ -16,7 +16,7 @@ public class DirectReferenceKvsConnection implements KvsConnection { private final DatabaseServer dbServer; public DirectReferenceKvsConnection(DatabaseServer databaseServer) { - dbServer = databaseServer; + this.dbServer = databaseServer; } @Override diff --git a/src/main/java/com/itmo/java/protocol/RespWriter.java b/src/main/java/com/itmo/java/protocol/RespWriter.java index 48a0bd5c..cd0a3c24 100644 --- a/src/main/java/com/itmo/java/protocol/RespWriter.java +++ b/src/main/java/com/itmo/java/protocol/RespWriter.java @@ -4,33 +4,24 @@ import java.io.IOException; import java.io.OutputStream; +import java.nio.charset.StandardCharsets; public class RespWriter implements AutoCloseable{ - private final OutputStream outputStream; public RespWriter(OutputStream os) { - - outputStream = os; + this.outputStream = os; } /** * Записывает в output stream объект */ public void write(RespObject object) throws IOException { - try { - object.write(outputStream); - } catch (IOException ex) { - ex.printStackTrace(); - } + object.write(outputStream); } @Override public void close() throws IOException { - try { - outputStream.close(); - } catch (IOException ex) { - ex.printStackTrace(); - } + outputStream.close(); } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/protocol/model/RespArray.java b/src/main/java/com/itmo/java/protocol/model/RespArray.java index 8e80b496..9d260a66 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespArray.java +++ b/src/main/java/com/itmo/java/protocol/model/RespArray.java @@ -5,21 +5,20 @@ import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; /** * Массив RESP объектов */ public class RespArray implements RespObject { + private final List objects; /** * Код объекта */ public static final byte CODE = '*'; - private final List objects; - public RespArray(RespObject... obj) { - objects = Arrays.asList(obj); + public RespArray(RespObject... objects) { + this.objects = Arrays.asList(objects); } /** @@ -39,21 +38,23 @@ public boolean isError() { */ @Override public String asString() { - return objects.stream().map(RespObject::asString).collect(Collectors.joining(" ")); - } // check + StringBuilder stringBuilder = new StringBuilder(); + for (RespObject object : objects) { + stringBuilder.append(object.asString()); + stringBuilder.append(" "); + } + stringBuilder.deleteCharAt(stringBuilder.length() - 1); + return stringBuilder.toString(); + } @Override - public void write(OutputStream output) throws IOException { - try { - output.write(CODE); - output.write(Integer.toString(objects.size()).getBytes(StandardCharsets.UTF_8)); - output.write(CRLF); - output.flush(); - for (RespObject obj : objects) { - obj.write(output); - } - } catch (IOException ex){ - throw new IOException(ex); + public void write(OutputStream os) throws IOException { + os.write(CODE); + os.write(String.valueOf(objects.size()).getBytes(StandardCharsets.UTF_8)); + os.write(CRLF); + os.flush(); + for (RespObject object : objects) { + object.write(os); } } diff --git a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java index f3bdbf24..7ad4fc18 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java +++ b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java @@ -8,17 +8,19 @@ * Строка */ public class RespBulkString implements RespObject { + private final byte[] data; + /** * Код объекта */ public static final byte CODE = '$'; + public static final int NULL_STRING_SIZE = -1; - private final byte[] data; - public static final RespBulkString NULL_STRING = new RespBulkString(null); + public static final RespBulkString NULL_STRING = new RespBulkString(null); - public RespBulkString(byte[] inform) { - data = inform; + public RespBulkString(byte[] data) { + this.data = data; } /** @@ -38,25 +40,24 @@ public boolean isError() { */ @Override public String asString() { - return new String(data ,StandardCharsets.UTF_8); + if (data == null) { + return null; + } + return new String(data, StandardCharsets.UTF_8); } @Override - public void write(OutputStream output) throws IOException { - try { - output.write(CODE); - if (data == null) { - output.write(Integer.toString(NULL_STRING_SIZE).getBytes(StandardCharsets.UTF_8)); - } else { - output.write(Integer.toString(data.length).getBytes(StandardCharsets.UTF_8)); - output.write(CRLF); - output.write(data); - } - output.write(CRLF); - output.flush(); - } catch (IOException ex) { - throw new IOException(ex); + public void write(OutputStream os) throws IOException { + os.write(CODE); + if (data == null) { + os.write(String.valueOf(NULL_STRING_SIZE).getBytes(StandardCharsets.UTF_8)); } + else { + os.write(String.valueOf(data.length).getBytes(StandardCharsets.UTF_8)); + os.write(CRLF); + os.write(data); + } + os.write(CRLF); + os.flush(); } - } diff --git a/src/main/java/com/itmo/java/protocol/model/RespCommandId.java b/src/main/java/com/itmo/java/protocol/model/RespCommandId.java index 6584c583..696deaf0 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespCommandId.java +++ b/src/main/java/com/itmo/java/protocol/model/RespCommandId.java @@ -8,15 +8,15 @@ * Id */ public class RespCommandId implements RespObject { + private final int commandId; /** * Код объекта */ public static final byte CODE = '!'; - private final int commandId; - public RespCommandId(int comId) { - commandId = comId; + public RespCommandId(int commandId) { + this.commandId = commandId; } /** @@ -31,22 +31,23 @@ public boolean isError() { @Override public String asString() { - return Integer.toString(commandId); + return String.valueOf(commandId); } @Override - public void write(OutputStream output) throws IOException { - try { - output.write(CODE); - int commandByte = commandId; - output.write((commandByte >>> 24) & 0xFF); - output.write((commandByte >>> 16) & 0xFF); - output.write((commandByte >>> 8) & 0xFF); - output.write(commandByte & 0xFF); - output.write(CRLF); - output.flush(); - } catch (IOException ex) { - throw new IOException(ex); - } + public void write(OutputStream os) throws IOException { + os.write(CODE); + os.write(intToByteArray(commandId)); + os.write(CRLF); + os.flush(); + } + + static byte[] intToByteArray(int data) { + byte[] result = new byte[4]; + result[0] = (byte) ((data & 0xFF000000) >> 24); + result[1] = (byte) ((data & 0x00FF0000) >> 16); + result[2] = (byte) ((data & 0x0000FF00) >> 8); + result[3] = (byte) ((data & 0x000000FF)); + return result; } } diff --git a/src/main/java/com/itmo/java/protocol/model/RespError.java b/src/main/java/com/itmo/java/protocol/model/RespError.java index 99d0edfb..44c9baea 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespError.java +++ b/src/main/java/com/itmo/java/protocol/model/RespError.java @@ -8,15 +8,15 @@ * Сообщение об ошибке в RESP протоколе */ public class RespError implements RespObject { + private final byte[] message; /** * Код объекта */ public static final byte CODE = '-'; - public byte[] message; - public RespError(byte[] mes) { - message = mes; + public RespError(byte[] message) { + this.message = message; } /** @@ -34,18 +34,14 @@ public String asString() { if (message == null) { return null; } - return new String(message , StandardCharsets.UTF_8); + return new String(message, StandardCharsets.UTF_8); } @Override - public void write(OutputStream output) throws IOException { - try { - output.write(CODE); - output.write(message); - output.write(CRLF); - output.flush(); - } catch(IOException ex) { - throw new IOException(ex); - } + public void write(OutputStream os) throws IOException { + os.write(CODE); + os.write(message); + os.write(CRLF); + os.flush(); } } From 5d580735208264ac63be8848f99e8074a5059381 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 00:46:11 +0300 Subject: [PATCH 297/378] DelKey --- .../basics/console/impl/DeleteKeyCommand.java | 21 ++---- .../java/client/client/SimpleKvsClient.java | 74 +++++++++++++------ 2 files changed, 59 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java index 65a0cda8..09fa57d3 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java @@ -21,9 +21,6 @@ public class DeleteKeyCommand implements DatabaseCommand { private final ExecutionEnvironment environment; private final List commandargs; private static final int numberOfAgrguments = 5; - private final String tbName; - private final String dbName; - private final String key; /** * Создает команду. @@ -35,16 +32,13 @@ public class DeleteKeyCommand implements DatabaseCommand { * Id команды, имя команды, имя бд, таблицы, ключ * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { + public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { if (comArgs.size() != numberOfAgrguments) { throw new IllegalArgumentException("Why " + comArgs.size() + "!= 5 , in CreateTableCommand"); } environment = env; commandargs = comArgs; - dbName = comArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - tbName = comArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); - key = comArgs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); } /** @@ -55,12 +49,15 @@ public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { @Override public DatabaseCommandResult execute() { try { + String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); if (dbName == null) { throw new DatabaseException("Why dbname is null?"); } + String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); if (tbName == null) { throw new DatabaseException("Why tbName is null?"); } + String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); if (key == null) { throw new DatabaseException("Why key is null?"); } @@ -68,14 +65,12 @@ public DatabaseCommandResult execute() { if (dataBase.isEmpty()) { throw new DatabaseException("We dont have" + dbName); } - Optional previous = dataBase.get().read(tbName, key); - if (previous.isEmpty()) { - return DatabaseCommandResult.error("Value is not found"); - } + Optional prev; + prev = environment.getDatabase(dbName).get().read(tbName,key); dataBase.get().delete(tbName, key); - return DatabaseCommandResult.success(("Success del " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); + return DatabaseCommandResult.success((new String(prev.get())).getBytes(StandardCharsets.UTF_8)); } catch (DatabaseException ex) { - return DatabaseCommandResult.error("Error while dbComRes Delete"); + return new FailedDatabaseCommandResult(ex.getMessage()); } } } diff --git a/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java b/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java index ef055bbb..0716eede 100644 --- a/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java +++ b/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java @@ -1,17 +1,18 @@ package com.itmo.java.client.client; +import com.itmo.java.basics.console.DatabaseCommandResult; import com.itmo.java.client.command.*; import com.itmo.java.client.connection.KvsConnection; import com.itmo.java.client.exception.ConnectionException; import com.itmo.java.client.exception.DatabaseExecutionException; import com.itmo.java.protocol.model.RespObject; -import java.util.Arrays; import java.util.function.Supplier; public class SimpleKvsClient implements KvsClient { + private final String dbName; - private final KvsConnection kvsConnection; + private final KvsConnection connectionSupplier; /** * Конструктор @@ -21,49 +22,76 @@ public class SimpleKvsClient implements KvsClient { */ public SimpleKvsClient(String databaseName, Supplier connectionSupplier) { this.dbName = databaseName; - this.kvsConnection = connectionSupplier.get(); + this.connectionSupplier = connectionSupplier.get(); } @Override public String createDatabase() throws DatabaseExecutionException { - KvsCommand command = new CreateDatabaseKvsCommand(dbName); - return tryToSend(command); + try { + CreateDatabaseKvsCommand dbKvsCom = new CreateDatabaseKvsCommand(dbName); + RespObject obj = connectionSupplier.send(dbKvsCom.getCommandId(), dbKvsCom.serialize()); + if (obj.isError()) { + throw new DatabaseExecutionException(obj.asString()); + } + return obj.asString(); + } catch (ConnectionException ex) { + return DatabaseCommandResult.error(ex).getPayLoad(); + } } @Override public String createTable(String tableName) throws DatabaseExecutionException { - KvsCommand command = new CreateTableKvsCommand(dbName, tableName); - return tryToSend(command); + try { + CreateTableKvsCommand tbKvsCom = new CreateTableKvsCommand(dbName, tableName); + RespObject obj = connectionSupplier.send(tbKvsCom.getCommandId(), tbKvsCom.serialize()); + if (obj.isError()) { + throw new DatabaseExecutionException(obj.asString()); + } + return obj.asString(); + } catch (ConnectionException ex) { + return DatabaseCommandResult.error(ex).getPayLoad(); + } } @Override public String get(String tableName, String key) throws DatabaseExecutionException { - KvsCommand command = new GetKvsCommand(dbName, tableName, key); - return tryToSend(command); + try { + GetKvsCommand getKvsCom = new GetKvsCommand(dbName, tableName, key); + RespObject obj = connectionSupplier.send(getKvsCom.getCommandId(), getKvsCom.serialize()); + if (obj.isError()) { + throw new DatabaseExecutionException(obj.asString()); + } + return obj.asString(); + } catch (ConnectionException ex) { + return DatabaseCommandResult.error(ex).getPayLoad(); + } } @Override public String set(String tableName, String key, String value) throws DatabaseExecutionException { - KvsCommand command = new SetKvsCommand(dbName, tableName, key, value); - return tryToSend(command); + try { + SetKvsCommand setKvsCom = new SetKvsCommand(dbName, tableName, key, value); + RespObject obj = connectionSupplier.send(setKvsCom.getCommandId(), setKvsCom.serialize()); + if (obj.isError()) { + throw new DatabaseExecutionException(obj.asString()); + } + return obj.asString(); + } catch (ConnectionException ex) { + return DatabaseCommandResult.error(ex).getPayLoad(); + } } @Override public String delete(String tableName, String key) throws DatabaseExecutionException { - KvsCommand command = new DeleteKvsCommand(dbName, tableName, key); - return tryToSend(command); - } - - private String tryToSend(KvsCommand command) throws DatabaseExecutionException { try { - RespObject result = kvsConnection.send(command.getCommandId(), command.serialize()); - if (result.isError()) { - throw new DatabaseExecutionException(result.asString()); + DeleteKvsCommand delKvsCom = new DeleteKvsCommand(dbName, tableName, key); + RespObject obj = connectionSupplier.send(delKvsCom.getCommandId(), delKvsCom.serialize()); + if (obj.isError()) { + throw new DatabaseExecutionException(obj.asString()); } - return result.asString(); - } catch (ConnectionException e) { - throw new DatabaseExecutionException(String.format("DatabaseExecutionException when try to send '%s' with kvsConnection" + " Message:: " + e.getMessage() + " StackTrace:: " + Arrays.toString(e.getStackTrace()), - command.serialize().asString()), e); + return obj.asString(); + } catch (ConnectionException ex) { + return DatabaseCommandResult.error(ex).getPayLoad(); } } } From a7e2d59c551f8163da9a57b8234ebb65b98168e4 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 00:49:10 +0300 Subject: [PATCH 298/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/itmo/java/basics/console/impl/DeleteKeyCommand.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java index 09fa57d3..c02e0551 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java @@ -65,10 +65,8 @@ public DatabaseCommandResult execute() { if (dataBase.isEmpty()) { throw new DatabaseException("We dont have" + dbName); } - Optional prev; - prev = environment.getDatabase(dbName).get().read(tbName,key); - dataBase.get().delete(tbName, key); - return DatabaseCommandResult.success((new String(prev.get())).getBytes(StandardCharsets.UTF_8)); + dataBase.get().delete(tbName, key); + return DatabaseCommandResult.success(("Success del " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); } catch (DatabaseException ex) { return new FailedDatabaseCommandResult(ex.getMessage()); } From 9eb73575ed36a9e2563fe749a953e931b6c31639 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 01:21:27 +0300 Subject: [PATCH 299/378] try fix console --- .../basics/console/impl/DeleteKeyCommand.java | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java index c02e0551..65a0cda8 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java @@ -21,6 +21,9 @@ public class DeleteKeyCommand implements DatabaseCommand { private final ExecutionEnvironment environment; private final List commandargs; private static final int numberOfAgrguments = 5; + private final String tbName; + private final String dbName; + private final String key; /** * Создает команду. @@ -32,13 +35,16 @@ public class DeleteKeyCommand implements DatabaseCommand { * Id команды, имя команды, имя бд, таблицы, ключ * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { + public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { if (comArgs.size() != numberOfAgrguments) { throw new IllegalArgumentException("Why " + comArgs.size() + "!= 5 , in CreateTableCommand"); } environment = env; commandargs = comArgs; + dbName = comArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + tbName = comArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + key = comArgs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); } /** @@ -49,15 +55,12 @@ public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { @Override public DatabaseCommandResult execute() { try { - String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); if (dbName == null) { throw new DatabaseException("Why dbname is null?"); } - String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); if (tbName == null) { throw new DatabaseException("Why tbName is null?"); } - String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); if (key == null) { throw new DatabaseException("Why key is null?"); } @@ -65,10 +68,14 @@ public DatabaseCommandResult execute() { if (dataBase.isEmpty()) { throw new DatabaseException("We dont have" + dbName); } - dataBase.get().delete(tbName, key); + Optional previous = dataBase.get().read(tbName, key); + if (previous.isEmpty()) { + return DatabaseCommandResult.error("Value is not found"); + } + dataBase.get().delete(tbName, key); return DatabaseCommandResult.success(("Success del " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); } catch (DatabaseException ex) { - return new FailedDatabaseCommandResult(ex.getMessage()); + return DatabaseCommandResult.error("Error while dbComRes Delete"); } } } From f26b10d140f72e0b1df7698efca3d2361cf8864e Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 02:03:52 +0300 Subject: [PATCH 300/378] mm --- src/main/resources/server.properties | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/resources/server.properties b/src/main/resources/server.properties index 0a822229..e69de29b 100644 --- a/src/main/resources/server.properties +++ b/src/main/resources/server.properties @@ -1 +0,0 @@ -kvs.Workingpath=D:\\java\\Enviroment \ No newline at end of file From 8564d99677416f10854d3c310c933dc5a8d86ccf Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 02:33:21 +0300 Subject: [PATCH 301/378] try fix --- .../com/itmo/java/basics/DatabaseServer.java | 12 ++-- .../java/client/client/SimpleKvsClient.java | 70 ++++++------------- .../command/CreateDatabaseKvsCommand.java | 3 +- .../client/command/CreateTableKvsCommand.java | 1 - 4 files changed, 29 insertions(+), 57 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/DatabaseServer.java b/src/main/java/com/itmo/java/basics/DatabaseServer.java index d09b06d3..8f847dc9 100644 --- a/src/main/java/com/itmo/java/basics/DatabaseServer.java +++ b/src/main/java/com/itmo/java/basics/DatabaseServer.java @@ -14,8 +14,8 @@ public class DatabaseServer { - private final ExecutorService executorService = Executors.newSingleThreadExecutor(); - private final ExecutionEnvironment enviroment; + private ExecutorService executorService = Executors.newSingleThreadExecutor(); + private final ExecutionEnvironment environment; /** * Конструктор @@ -31,17 +31,19 @@ public static DatabaseServer initialize(ExecutionEnvironment env, DatabaseServer } private DatabaseServer(ExecutionEnvironment env){ - this.enviroment = env; + this.environment = env; } public CompletableFuture executeNextCommand(RespArray message) { return CompletableFuture.supplyAsync(() -> DatabaseCommands.valueOf(message.getObjects().get(DatabaseCommandArgPositions. - COMMAND_NAME.getPositionIndex()).asString()).getCommand(enviroment, message.getObjects()).execute(), executorService); + COMMAND_NAME.getPositionIndex()).asString()).getCommand(environment, message.getObjects()).execute(), executorService); } public CompletableFuture executeNextCommand(DatabaseCommand command) { return CompletableFuture.supplyAsync(command::execute, executorService); } - public ExecutionEnvironment getEnv() { return enviroment; } + public ExecutionEnvironment getEnv() { + return environment; + } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java b/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java index 0716eede..6dd3f3fb 100644 --- a/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java +++ b/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java @@ -1,16 +1,15 @@ package com.itmo.java.client.client; -import com.itmo.java.basics.console.DatabaseCommandResult; import com.itmo.java.client.command.*; import com.itmo.java.client.connection.KvsConnection; import com.itmo.java.client.exception.ConnectionException; import com.itmo.java.client.exception.DatabaseExecutionException; import com.itmo.java.protocol.model.RespObject; +import java.util.Arrays; import java.util.function.Supplier; public class SimpleKvsClient implements KvsClient { - private final String dbName; private final KvsConnection connectionSupplier; @@ -27,71 +26,44 @@ public SimpleKvsClient(String databaseName, Supplier connectionSu @Override public String createDatabase() throws DatabaseExecutionException { - try { - CreateDatabaseKvsCommand dbKvsCom = new CreateDatabaseKvsCommand(dbName); - RespObject obj = connectionSupplier.send(dbKvsCom.getCommandId(), dbKvsCom.serialize()); - if (obj.isError()) { - throw new DatabaseExecutionException(obj.asString()); - } - return obj.asString(); - } catch (ConnectionException ex) { - return DatabaseCommandResult.error(ex).getPayLoad(); - } + KvsCommand command = new CreateDatabaseKvsCommand(dbName); + return tryToSend(command); } @Override public String createTable(String tableName) throws DatabaseExecutionException { - try { - CreateTableKvsCommand tbKvsCom = new CreateTableKvsCommand(dbName, tableName); - RespObject obj = connectionSupplier.send(tbKvsCom.getCommandId(), tbKvsCom.serialize()); - if (obj.isError()) { - throw new DatabaseExecutionException(obj.asString()); - } - return obj.asString(); - } catch (ConnectionException ex) { - return DatabaseCommandResult.error(ex).getPayLoad(); - } + KvsCommand command = new CreateTableKvsCommand(dbName, tableName); + return tryToSend(command); } @Override public String get(String tableName, String key) throws DatabaseExecutionException { - try { - GetKvsCommand getKvsCom = new GetKvsCommand(dbName, tableName, key); - RespObject obj = connectionSupplier.send(getKvsCom.getCommandId(), getKvsCom.serialize()); - if (obj.isError()) { - throw new DatabaseExecutionException(obj.asString()); - } - return obj.asString(); - } catch (ConnectionException ex) { - return DatabaseCommandResult.error(ex).getPayLoad(); - } + KvsCommand command = new GetKvsCommand(dbName, tableName, key); + return tryToSend(command); } @Override public String set(String tableName, String key, String value) throws DatabaseExecutionException { - try { - SetKvsCommand setKvsCom = new SetKvsCommand(dbName, tableName, key, value); - RespObject obj = connectionSupplier.send(setKvsCom.getCommandId(), setKvsCom.serialize()); - if (obj.isError()) { - throw new DatabaseExecutionException(obj.asString()); - } - return obj.asString(); - } catch (ConnectionException ex) { - return DatabaseCommandResult.error(ex).getPayLoad(); - } + KvsCommand command = new SetKvsCommand(dbName, tableName, key, value); + return tryToSend(command); } @Override public String delete(String tableName, String key) throws DatabaseExecutionException { + KvsCommand command = new DeleteKvsCommand(dbName, tableName, key); + return tryToSend(command); + } + + private String tryToSend(KvsCommand command) throws DatabaseExecutionException { try { - DeleteKvsCommand delKvsCom = new DeleteKvsCommand(dbName, tableName, key); - RespObject obj = connectionSupplier.send(delKvsCom.getCommandId(), delKvsCom.serialize()); - if (obj.isError()) { - throw new DatabaseExecutionException(obj.asString()); + RespObject result = connectionSupplier.send(command.getCommandId(), command.serialize()); + if (result.isError()) { + throw new DatabaseExecutionException(result.asString()); } - return obj.asString(); - } catch (ConnectionException ex) { - return DatabaseCommandResult.error(ex).getPayLoad(); + return result.asString(); + } catch (ConnectionException e) { + throw new DatabaseExecutionException(String.format("DatabaseExecutionException when try to send '%s' with kvsConnection" + " Message:: " + e.getMessage() + " StackTrace:: " + Arrays.toString(e.getStackTrace()), + command.serialize().asString()), e); } } } diff --git a/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java b/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java index d433017d..5e29d5ac 100644 --- a/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java @@ -10,7 +10,6 @@ * Команда для создания бд */ public class CreateDatabaseKvsCommand implements KvsCommand { - private static final String COMMAND_NAME = "CREATE_DATABASE"; private final String dbName; private final int dbID; @@ -21,7 +20,7 @@ public class CreateDatabaseKvsCommand implements KvsCommand { * @param databaseName имя базы данных */ public CreateDatabaseKvsCommand(String databaseName) { - // dbID = idGen.get(); + // dbID = idGen.get(); dbID = idGen.getAndIncrement(); dbName = databaseName; } diff --git a/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java b/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java index 7b7a98d0..6d1ac725 100644 --- a/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java @@ -10,7 +10,6 @@ * Команда для создания таблицы */ public class CreateTableKvsCommand implements KvsCommand { - private static final String COMMAND_NAME = "CREATE_TABLE"; private final String dbName; private final int tbID; From 5836d8488f1f117c1058fb2e16568d84add01f7f Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 02:38:55 +0300 Subject: [PATCH 302/378] =?UTF-8?q?=D0=BC=D0=B1=3F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/basics/console/DatabaseCommandResult.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java b/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java index fb491ece..1d44c7b1 100644 --- a/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java +++ b/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java @@ -4,6 +4,8 @@ import com.itmo.java.basics.console.impl.SuccessDatabaseCommandResult; import com.itmo.java.protocol.model.RespObject; +import java.util.Arrays; + public interface DatabaseCommandResult extends DatabaseApiSerializable { /** @@ -28,13 +30,17 @@ static DatabaseCommandResult error(String message) { /** * Формирует результат команды, при выполнении которой произошла ошибка. - * Берется сообщение из исключения. Если в исключении нет сообщения - стэктрейст + * Берется сообщение из исключения. Если в исключении нет сообщения - стэктрейс * * @param exception исключение, из которого нужно сформировать результат выполнения команды * @return результат команды, при выполнении которой произошла ошибка */ static DatabaseCommandResult error(Exception exception) { - return new FailedDatabaseCommandResult(exception.getMessage()); + if (exception.getMessage().isEmpty()) { + return new FailedDatabaseCommandResult(Arrays.toString(exception.getStackTrace())); + } else { + return new FailedDatabaseCommandResult(exception.getMessage()); + } } /** From 37f6491519b07cd8efb768999d6a227853b16293 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 02:57:00 +0300 Subject: [PATCH 303/378] try fix --- .../console/impl/CreateDatabaseCommand.java | 39 ++++-------- .../console/impl/CreateTableCommand.java | 46 ++++---------- .../basics/console/impl/DeleteKeyCommand.java | 57 ++++++------------ .../impl/ExecutionEnvironmentImpl.java | 4 +- .../impl/FailedDatabaseCommandResult.java | 12 ++-- .../basics/console/impl/GetKeyCommand.java | 59 ++++++------------ .../basics/console/impl/SetKeyCommand.java | 60 +++++++------------ .../impl/SuccessDatabaseCommandResult.java | 13 ++-- 8 files changed, 97 insertions(+), 193 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java index f326572c..ecf3b922 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java @@ -15,11 +15,8 @@ * Команда для создания базы данных */ public class CreateDatabaseCommand implements DatabaseCommand { - private final ExecutionEnvironment environment; - private final DatabaseFactory dbfactory; - private final List commandargs; - private static final int numberOfAgrguments = 3; + private final DatabaseFactory factory; private final String dbName; /** @@ -27,20 +24,16 @@ public class CreateDatabaseCommand implements DatabaseCommand { *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * - * @param env env - * @param factory функция создания базы данных (пример: DatabaseImpl::create) - * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. - * Id команды, имя команды, имя создаваемой бд + * @param env env + * @param factory функция создания базы данных (пример: DatabaseImpl::create) + * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * Id команды, имя команды, имя создаваемой бд * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public CreateDatabaseCommand(ExecutionEnvironment env, DatabaseFactory factory, List comArgs) { - if (comArgs.size() != numberOfAgrguments) { - throw new IllegalArgumentException("Why " + comArgs.size() + "!= 3 , in CreateDataBaseCommand"); - } - environment = env; - dbfactory = factory; - commandargs = comArgs; - dbName = comArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + public CreateDatabaseCommand(ExecutionEnvironment env, DatabaseFactory factory, List commandArgs) { + this.environment = env; + this.factory = factory; + this.dbName = commandArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); } /** @@ -50,17 +43,11 @@ public CreateDatabaseCommand(ExecutionEnvironment env, DatabaseFactory factory, */ @Override public DatabaseCommandResult execute() { - String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); try { - // String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - if (dbName == null) { - throw new DatabaseException("Why dbname is null? "); - } - environment.addDatabase(dbfactory.createNonExistent(dbName, environment.getWorkingPath())); - // return DatabaseCommandResult.success(("Success add " + dbName).getBytes(StandardCharsets.UTF_8)); - } catch (DatabaseException ex) { - return DatabaseCommandResult.error("Error while create db "); + environment.addDatabase(factory.createNonExistent(dbName, environment.getWorkingPath())); + } catch (DatabaseException e){ + return DatabaseCommandResult.error(""); } - return DatabaseCommandResult.success(("Success add " + dbName).getBytes(StandardCharsets.UTF_8)); + return DatabaseCommandResult.success(("").getBytes(StandardCharsets.UTF_8)); } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java index 2de34fd6..154bb2a4 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java @@ -5,13 +5,10 @@ import com.itmo.java.basics.console.DatabaseCommandResult; import com.itmo.java.basics.console.ExecutionEnvironment; import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.logic.Database; import com.itmo.java.protocol.model.RespObject; -import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.List; -import java.util.Optional; /** * Команда для создания базы таблицы @@ -19,8 +16,6 @@ public class CreateTableCommand implements DatabaseCommand { private final ExecutionEnvironment environment; - private final List commandargs; - private static final int numberOfAgrguments = 4; private final String dbName; private final String tbName; @@ -29,19 +24,15 @@ public class CreateTableCommand implements DatabaseCommand { *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * - * @param env env - * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. - * Id команды, имя команды, имя бд, имя таблицы + * @param env env + * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * Id команды, имя команды, имя бд, имя таблицы * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public CreateTableCommand(ExecutionEnvironment env, List comArgs) { - if (comArgs.size() != numberOfAgrguments) { - throw new IllegalArgumentException("Why " + comArgs.size() + "!= 4 , in CreateTableCommand"); - } - environment = env; - commandargs = comArgs; - dbName = comArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - tbName = comArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + public CreateTableCommand(ExecutionEnvironment env, List commandArgs) { + this.environment = env; + this.dbName = commandArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + this.tbName = commandArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); } /** @@ -51,25 +42,14 @@ public CreateTableCommand(ExecutionEnvironment env, List comArgs) { */ @Override public DatabaseCommandResult execute() { - try { - - if (dbName == null) { - throw new DatabaseException("Why dbname is null?"); + if (environment.getDatabase(dbName).isEmpty()){ + return DatabaseCommandResult.error(""); } - - if (tbName == null) { - throw new DatabaseException("Why tbName is null?"); - } - Optional dataBase = environment.getDatabase(dbName); - if (dataBase.isEmpty()) { - throw new DatabaseException("We dont have" + dbName); - } - dataBase.get().createTableIfNotExists(tbName); - - } catch (DatabaseException ex) { - return new FailedDatabaseCommandResult(ex.getMessage()); + environment.getDatabase(dbName).get().createTableIfNotExists(tbName); + } catch (DatabaseException e){ + return DatabaseCommandResult.error(""); } - return DatabaseCommandResult.success(("Success add " + dbName + tbName).getBytes(StandardCharsets.UTF_8)); + return DatabaseCommandResult.success(("").getBytes(StandardCharsets.UTF_8)); } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java index 65a0cda8..c55f7e09 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java @@ -8,8 +8,6 @@ import com.itmo.java.basics.logic.Database; import com.itmo.java.protocol.model.RespObject; -import java.io.IOException; -import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Optional; @@ -17,12 +15,9 @@ * Команда для создания удаления значения по ключу */ public class DeleteKeyCommand implements DatabaseCommand { - private final ExecutionEnvironment environment; - private final List commandargs; - private static final int numberOfAgrguments = 5; - private final String tbName; private final String dbName; + private final String tbName; private final String key; /** @@ -30,21 +25,16 @@ public class DeleteKeyCommand implements DatabaseCommand { *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * - * @param env env - * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. - * Id команды, имя команды, имя бд, таблицы, ключ + * @param env env + * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * Id команды, имя команды, имя бд, таблицы, ключ * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { - - if (comArgs.size() != numberOfAgrguments) { - throw new IllegalArgumentException("Why " + comArgs.size() + "!= 5 , in CreateTableCommand"); - } - environment = env; - commandargs = comArgs; - dbName = comArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - tbName = comArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); - key = comArgs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); + public DeleteKeyCommand(ExecutionEnvironment env, List commandArgs) { + this.environment = env; + this.dbName = commandArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + this.tbName = commandArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + this.key = commandArgs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); } /** @@ -55,27 +45,18 @@ public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { @Override public DatabaseCommandResult execute() { try { - if (dbName == null) { - throw new DatabaseException("Why dbname is null?"); - } - if (tbName == null) { - throw new DatabaseException("Why tbName is null?"); - } - if (key == null) { - throw new DatabaseException("Why key is null?"); - } - Optional dataBase = environment.getDatabase(dbName); - if (dataBase.isEmpty()) { - throw new DatabaseException("We dont have" + dbName); + Optional database = environment.getDatabase(dbName); + if (database.isEmpty()){ + return DatabaseCommandResult.error(""); } - Optional previous = dataBase.get().read(tbName, key); - if (previous.isEmpty()) { - return DatabaseCommandResult.error("Value is not found"); + Optional value = database.get().read(tbName, key); + if (value.isEmpty()){ + return DatabaseCommandResult.error(""); } - dataBase.get().delete(tbName, key); - return DatabaseCommandResult.success(("Success del " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); - } catch (DatabaseException ex) { - return DatabaseCommandResult.error("Error while dbComRes Delete"); + database.get().delete(tbName, key); + return DatabaseCommandResult.success(value.get()); + } catch (DatabaseException e){ + return DatabaseCommandResult.error(""); } } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java index 8d2a9dc5..333219b2 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java +++ b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java @@ -12,8 +12,8 @@ public class ExecutionEnvironmentImpl implements ExecutionEnvironment { - public Path workingPath; - public Map dataBase = new HashMap<>(); + public Path workingPath; + public Map dataBase = new HashMap<>(); public ExecutionEnvironmentImpl(DatabaseConfig config) { workingPath = Paths.get(config.getWorkingPath()); diff --git a/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java b/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java index fc08c3c1..80f0d182 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java +++ b/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java @@ -10,12 +10,10 @@ * Зафейленная команда */ public class FailedDatabaseCommandResult implements DatabaseCommandResult { + private final String payload; - - private final String payLoad; - - public FailedDatabaseCommandResult(String pload) { - payLoad = pload; + public FailedDatabaseCommandResult(String payload) { + this.payload = payload; } /** @@ -23,7 +21,7 @@ public FailedDatabaseCommandResult(String pload) { */ @Override public String getPayLoad() { - return payLoad; + return payload; } @Override @@ -36,6 +34,6 @@ public boolean isSuccess() { */ @Override public RespObject serialize() { - return new RespError(payLoad.getBytes(StandardCharsets.UTF_8)); + return new RespError(payload.getBytes(StandardCharsets.UTF_8)); } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java index 50c9f0ee..9cda66ce 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java @@ -8,7 +8,7 @@ import com.itmo.java.basics.logic.Database; import com.itmo.java.protocol.model.RespObject; -import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Optional; @@ -16,33 +16,25 @@ * Команда для чтения данных по ключу */ public class GetKeyCommand implements DatabaseCommand { - private final ExecutionEnvironment environment; - private final List commandargs; - private static final int numberOfAgrguments = 5; - private final String dbName; - private final String tbName; - private final String key; - + private final String dbName; + private final String tbName; + private final String key; /** * Создает команду. *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * - * @param env env - * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. - * Id команды, имя команды, имя бд, таблицы, ключ + * @param env env + * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * Id команды, имя команды, имя бд, таблицы, ключ * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public GetKeyCommand(ExecutionEnvironment env, List comArgs) { - if (comArgs.size() != numberOfAgrguments) { - throw new IllegalArgumentException("Why " + comArgs.size() + "!= 5 , in CreateTableCommand"); - } - environment = env; - commandargs = comArgs; - dbName = comArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - tbName = comArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); - key = comArgs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); + public GetKeyCommand(ExecutionEnvironment env, List commandArgs) { + this.environment = env; + this.dbName = commandArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + this.tbName = commandArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + this.key = commandArgs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); } /** @@ -53,29 +45,14 @@ public GetKeyCommand(ExecutionEnvironment env, List comArgs) { @Override public DatabaseCommandResult execute() { try { - - if (dbName == null) { - throw new DatabaseException("Why dbname is null?"); - } - - if (tbName == null) { - throw new DatabaseException("Why tbName is null?"); - } - - if (key == null) { - throw new DatabaseException("Why key is null?"); - } - Optional dataBase = environment.getDatabase(dbName); - if (dataBase.isEmpty()) { - throw new DatabaseException("We dont have" + dbName); - } - Optional value = dataBase.get().read(tbName, key); - if (value.isEmpty()) { - return DatabaseCommandResult.error("DataBase is not found"); + Optional database = environment.getDatabase(dbName); + if (database.isEmpty()){ + return DatabaseCommandResult.error(""); } + Optional value = database.get().read(tbName, key); return DatabaseCommandResult.success(value.orElse(null)); - } catch (DatabaseException ex) { - return DatabaseCommandResult.error("DataBase exception while try get key"); + } catch (DatabaseException e){ + return DatabaseCommandResult.error(""); } } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java index f354abc4..6ae2b67d 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java @@ -8,7 +8,6 @@ import com.itmo.java.basics.logic.Database; import com.itmo.java.protocol.model.RespObject; -import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Optional; @@ -17,13 +16,10 @@ * Команда для создания записи значения */ public class SetKeyCommand implements DatabaseCommand { - private final ExecutionEnvironment environment; - private final List commandargs; - private static final int numberOfAgrguments = 6; - private final String dbName; - private final String tbName; - private final String key; + private final String dbName; + private final String tbName; + private final String key; private final String value; /** @@ -31,21 +27,17 @@ public class SetKeyCommand implements DatabaseCommand { *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * - * @param env env - * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. - * Id команды, имя команды, имя бд, таблицы, ключ, значение + * @param env env + * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * Id команды, имя команды, имя бд, таблицы, ключ, значение * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public SetKeyCommand(ExecutionEnvironment env, List comArgs) { - if (comArgs.size() != numberOfAgrguments) { - throw new IllegalArgumentException("Why " + comArgs.size() + "!= 5 , in CreateTableCommand"); - } - environment = env; - commandargs = comArgs; - dbName = comArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - tbName = comArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); - key = comArgs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); - value = comArgs.get(DatabaseCommandArgPositions.VALUE.getPositionIndex()).asString(); + public SetKeyCommand(ExecutionEnvironment env, List commandArgs) { + this.environment = env; + this.dbName = commandArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + this.tbName = commandArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + this.key = commandArgs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); + this.value = commandArgs.get(DatabaseCommandArgPositions.VALUE.getPositionIndex()).asString(); } /** @@ -56,27 +48,15 @@ public SetKeyCommand(ExecutionEnvironment env, List comArgs) { @Override public DatabaseCommandResult execute() { try { - - if (dbName == null) { - throw new DatabaseException("Why dbname is null?"); - } - - if (tbName == null) { - throw new DatabaseException("Why tbName is null?"); - } - - if (key == null) { - throw new DatabaseException("Why key is null?"); - } - Optional dataBase = environment.getDatabase(dbName); - if (dataBase.isEmpty()) { - return DatabaseCommandResult.error("DB is not found"); + Optional database = environment.getDatabase(dbName); + if (database.isEmpty()){ + return DatabaseCommandResult.error(""); } - Optional previous = dataBase.get().read(tbName,key); - dataBase.get().write(tbName, key, value.getBytes(StandardCharsets.UTF_8)); - return DatabaseCommandResult.success(previous.orElse(null)); - } catch (DatabaseException ex) { - return DatabaseCommandResult.error("Error while setkey"); + Optional previousValue = database.get().read(tbName, key); + database.get().write(tbName, key, value.getBytes(StandardCharsets.UTF_8)); + return DatabaseCommandResult.success(previousValue.orElse(null)); + } catch (DatabaseException e){ + return DatabaseCommandResult.error(""); } } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java b/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java index ae8fad44..31981a12 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java +++ b/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java @@ -4,23 +4,24 @@ import com.itmo.java.protocol.model.RespBulkString; import com.itmo.java.protocol.model.RespObject; +import java.nio.charset.StandardCharsets; + /** * Результат успешной команды */ public class SuccessDatabaseCommandResult implements DatabaseCommandResult { - private final byte[] payLoad; - public SuccessDatabaseCommandResult(byte[] pload) { - payLoad = pload; + public SuccessDatabaseCommandResult(byte[] payload) { + payLoad = payload; } @Override public String getPayLoad() { - if(payLoad != null) { - return new String(payLoad); - } else { + if (payLoad == null) return null; + else { + return new String(payLoad, StandardCharsets.UTF_8); } } From bd475632ec58122d3c3d07c63623c0568d6d756b Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 03:01:13 +0300 Subject: [PATCH 304/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82=20config?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../itmo/java/basics/config/ConfigLoader.java | 85 ++++++++++++------- .../java/basics/config/DatabaseConfig.java | 8 +- 2 files changed, 56 insertions(+), 37 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/config/ConfigLoader.java b/src/main/java/com/itmo/java/basics/config/ConfigLoader.java index c4f7825a..6a43990f 100644 --- a/src/main/java/com/itmo/java/basics/config/ConfigLoader.java +++ b/src/main/java/com/itmo/java/basics/config/ConfigLoader.java @@ -1,26 +1,30 @@ package com.itmo.java.basics.config; import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.IOException; +import java.io.InputStream; import java.util.Properties; /** * Класс, отвечающий за подгрузку данных из конфигурационного файла формата .properties */ public class ConfigLoader { - Properties configFileProp = new Properties(); - private String workingPath; - private String host; - private int port; + private static final String DEFAULT_PROPERTY_FILE = "server.properties"; + + private InputStream propertyInputStream; /** * По умолчанию читает из server.properties */ public ConfigLoader() { - try { - configFileProp.load(this.getClass().getClassLoader().getResourceAsStream("server.properties")); - } catch (IOException e) { - e.printStackTrace(); + propertyInputStream = getClass().getClassLoader().getResourceAsStream(DEFAULT_PROPERTY_FILE); + if (this.propertyInputStream == null) { + try { + this.propertyInputStream = new FileInputStream(DEFAULT_PROPERTY_FILE); + } catch (FileNotFoundException e) { + this.propertyInputStream = null; + } } } @@ -28,15 +32,13 @@ public ConfigLoader() { * @param name Имя конфикурационного файла, откуда читать */ public ConfigLoader(String name) { - try { - if (this.getClass().getClassLoader().getResourceAsStream(name) != null){ - configFileProp.load(this.getClass().getClassLoader().getResourceAsStream(name)); - } else { - FileInputStream fileInputStream = new FileInputStream(name); - configFileProp.load(fileInputStream); + this.propertyInputStream = getClass().getClassLoader().getResourceAsStream(name); + if (this.propertyInputStream == null) { + try { + this.propertyInputStream = new FileInputStream(name); + } catch (FileNotFoundException e) { + this.propertyInputStream = null; } - } catch (IOException e) { - e.printStackTrace(); } } @@ -48,23 +50,40 @@ public ConfigLoader(String name) { * Читаются: "kvs.workingPath", "kvs.host", "kvs.port" (но в конфигурационном файле допустимы и другие проперти) */ public DatabaseServerConfig readConfig() { - workingPath = configFileProp.getProperty("kvs.workingPath"); - host = configFileProp.getProperty("kvs.host"); - String stringPort = configFileProp.getProperty("kvs.port"); - if (host == null){ - host = ServerConfig.DEFAULT_HOST; - } - if (stringPort == null) { - port = ServerConfig.DEFAULT_PORT; - } else { - port = Integer.parseInt(stringPort); - } - if (workingPath == null){ - workingPath = DatabaseConfig.DEFAULT_WORKING_PATH; + Properties properties = new Properties(); + try { + if (propertyInputStream == null) { + throw new IOException("Config file not found"); + } + properties.load(propertyInputStream); + String workingPath = properties.getProperty("kvs.workingPath"); + String host = properties.getProperty("kvs.host"); + String portStr = properties.getProperty("kvs.port"); + DatabaseConfig databaseConfig; + ServerConfig serverConfig; + if (workingPath == null) { + databaseConfig = new DatabaseConfig(); + } else { + databaseConfig = new DatabaseConfig(workingPath); + } + if (host == null){ + host = ServerConfig.DEFAULT_HOST; + } + try { + int port = Integer.parseInt(portStr); + serverConfig = new ServerConfig(host, port); + } catch (NumberFormatException e) { + serverConfig = new ServerConfig(host, ServerConfig.DEFAULT_PORT); + } + return DatabaseServerConfig.builder() + .dbConfig(databaseConfig) + .serverConfig(serverConfig) + .build(); + } catch (IOException e) { + return DatabaseServerConfig.builder() + .dbConfig(new DatabaseConfig()) + .serverConfig(new ServerConfig(ServerConfig.DEFAULT_HOST, ServerConfig.DEFAULT_PORT)) + .build(); } - ServerConfig serverConfig = new ServerConfig(host, port); - DatabaseConfig databaseConfig = new DatabaseConfig(workingPath); - return new DatabaseServerConfig(serverConfig, databaseConfig); } } - diff --git a/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java b/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java index f5435599..9cab7e3a 100644 --- a/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java +++ b/src/main/java/com/itmo/java/basics/config/DatabaseConfig.java @@ -1,17 +1,17 @@ package com.itmo.java.basics.config; -public class DatabaseConfig { +public class DatabaseConfig { public static final String DEFAULT_WORKING_PATH = "db_files"; private final String workingPath; - public DatabaseConfig(String workingPath) { this.workingPath = workingPath; } - public DatabaseConfig() { this.workingPath = DEFAULT_WORKING_PATH;} - + public DatabaseConfig(){ + this.workingPath = DEFAULT_WORKING_PATH; + } public String getWorkingPath() { return workingPath; From 164ddb3db7f66a0ca5b6dd19d6d4db9367d67bda Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 03:05:39 +0300 Subject: [PATCH 305/378] - gradle --- .gradle/6.7/fileChanges/last-build.bin | Bin 1 -> 0 bytes .gradle/6.7/fileHashes/fileHashes.lock | Bin 17 -> 0 bytes .gradle/6.7/gc.properties | 0 .gradle/buildOutputCleanup/buildOutputCleanup.lock | Bin 17 -> 0 bytes .gradle/buildOutputCleanup/cache.properties | 2 -- .gradle/checksums/checksums.lock | Bin 17 -> 0 bytes .gradle/configuration-cache/gc.properties | 0 .gradle/vcs-1/gc.properties | 0 .../connector/JavaSocketServerConnector.java | 5 +++++ src/main/resources/server.properties | 0 10 files changed, 5 insertions(+), 2 deletions(-) delete mode 100644 .gradle/6.7/fileChanges/last-build.bin delete mode 100644 .gradle/6.7/fileHashes/fileHashes.lock delete mode 100644 .gradle/6.7/gc.properties delete mode 100644 .gradle/buildOutputCleanup/buildOutputCleanup.lock delete mode 100644 .gradle/buildOutputCleanup/cache.properties delete mode 100644 .gradle/checksums/checksums.lock delete mode 100644 .gradle/configuration-cache/gc.properties delete mode 100644 .gradle/vcs-1/gc.properties delete mode 100644 src/main/resources/server.properties diff --git a/.gradle/6.7/fileChanges/last-build.bin b/.gradle/6.7/fileChanges/last-build.bin deleted file mode 100644 index f76dd238ade08917e6712764a16a22005a50573d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1 IcmZPo000310RR91 diff --git a/.gradle/6.7/fileHashes/fileHashes.lock b/.gradle/6.7/fileHashes/fileHashes.lock deleted file mode 100644 index 7f336de7535c1530479936f7ef826631dfe95f44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 ScmZSX)fVDVly9EH00jUVcmg#5 diff --git a/.gradle/6.7/gc.properties b/.gradle/6.7/gc.properties deleted file mode 100644 index e69de29b..00000000 diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock deleted file mode 100644 index 5ee92ba22f2047174073963a92d48209a888b1eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 TcmZQh^(_4#X!C=e0Rk8SE`$TK diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties deleted file mode 100644 index fba80e9b..00000000 --- a/.gradle/buildOutputCleanup/cache.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Mon Jun 07 15:01:23 MSK 2021 -gradle.version=6.7 diff --git a/.gradle/checksums/checksums.lock b/.gradle/checksums/checksums.lock deleted file mode 100644 index f80330cb572ef661db3bbe46620bcc5f74b912b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 TcmZQ}j(XrNvCZ@f0~7!NEI|XK diff --git a/.gradle/configuration-cache/gc.properties b/.gradle/configuration-cache/gc.properties deleted file mode 100644 index e69de29b..00000000 diff --git a/.gradle/vcs-1/gc.properties b/.gradle/vcs-1/gc.properties deleted file mode 100644 index e69de29b..00000000 diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index 0227e52e..cf4a9f8c 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -77,6 +77,11 @@ public void close() { public static void main(String[] args) throws Exception { + DatabaseServerConfig config = new ConfigLoader().readConfig(); + DatabaseServer server = DatabaseServer.initialize(new ExecutionEnvironmentImpl(config.getDbConfig()), + new DatabaseServerInitializer(new DatabaseInitializer(new TableInitializer(new SegmentInitializer())))); + JavaSocketServerConnector connector = new JavaSocketServerConnector(server, config.getServerConfig()); + connector.start(); } /** diff --git a/src/main/resources/server.properties b/src/main/resources/server.properties deleted file mode 100644 index e69de29b..00000000 From a717d44e69b6178b475af843e4cca9016a825de7 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 04:03:12 +0300 Subject: [PATCH 306/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82=20=D0=BA?= =?UTF-8?q?=20123=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B8=D1=82=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/itmo/java/basics/DatabaseServer.java | 26 +++---- .../java/client/client/SimpleKvsClient.java | 74 +++++++++++++------ .../command/CreateDatabaseKvsCommand.java | 5 +- .../client/command/CreateTableKvsCommand.java | 5 +- .../java/client/command/DeleteKvsCommand.java | 26 ++++--- .../java/client/command/GetKvsCommand.java | 2 +- .../java/client/command/SetKvsCommand.java | 2 +- .../DirectReferenceKvsConnection.java | 14 ++-- .../connection/SocketKvsConnection.java | 4 +- .../com/itmo/java/protocol/RespReader.java | 2 +- .../com/itmo/java/protocol/RespWriter.java | 19 +++-- .../itmo/java/protocol/model/RespArray.java | 36 +++++---- .../java/protocol/model/RespBulkString.java | 42 +++++------ .../java/protocol/model/RespCommandId.java | 36 +++++---- .../itmo/java/protocol/model/RespError.java | 27 ++++--- 15 files changed, 174 insertions(+), 146 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/DatabaseServer.java b/src/main/java/com/itmo/java/basics/DatabaseServer.java index 8f847dc9..4aaa197f 100644 --- a/src/main/java/com/itmo/java/basics/DatabaseServer.java +++ b/src/main/java/com/itmo/java/basics/DatabaseServer.java @@ -2,10 +2,7 @@ import com.itmo.java.basics.console.*; import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.initialization.InitializationContext; -import com.itmo.java.basics.initialization.impl.DatabaseServerInitializer; -import com.itmo.java.basics.initialization.impl.InitializationContextImpl; -import com.itmo.java.basics.logic.Database; +import com.itmo.java.basics.initialization.impl.*; import com.itmo.java.protocol.model.RespArray; import java.util.concurrent.CompletableFuture; @@ -14,29 +11,28 @@ public class DatabaseServer { - private ExecutorService executorService = Executors.newSingleThreadExecutor(); - private final ExecutionEnvironment environment; + private final ExecutorService executorService = Executors.newSingleThreadExecutor(); + private final ExecutionEnvironment enviroment; /** - * Конструктор + * Con structor * - * @param env env для инициализации. Далее работа происходит с заполненным объектом + * @param env env для инициализации. Далее работа происходит с заполненым объектом * @param initializer готовый чейн инициализации * @throws DatabaseException если произошла ошибка инициализации */ public static DatabaseServer initialize(ExecutionEnvironment env, DatabaseServerInitializer initializer) throws DatabaseException { - InitializationContext context = InitializationContextImpl.builder().executionEnvironment(env).build(); - initializer.perform(context); + initializer.perform(new InitializationContextImpl(env, null, null, null)); return new DatabaseServer(env); } - private DatabaseServer(ExecutionEnvironment env){ - this.environment = env; + private DatabaseServer(ExecutionEnvironment env) { + this.enviroment = env; } public CompletableFuture executeNextCommand(RespArray message) { - return CompletableFuture.supplyAsync(() -> DatabaseCommands.valueOf(message.getObjects().get(DatabaseCommandArgPositions. - COMMAND_NAME.getPositionIndex()).asString()).getCommand(environment, message.getObjects()).execute(), executorService); + return CompletableFuture.supplyAsync(() -> + DatabaseCommands.valueOf(message.getObjects().get(DatabaseCommandArgPositions.COMMAND_NAME.getPositionIndex()).asString()).getCommand(enviroment, message.getObjects()).execute(), executorService); } public CompletableFuture executeNextCommand(DatabaseCommand command) { @@ -44,6 +40,6 @@ public CompletableFuture executeNextCommand(DatabaseComma } public ExecutionEnvironment getEnv() { - return environment; + return enviroment; } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java b/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java index 6dd3f3fb..9ad82ccd 100644 --- a/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java +++ b/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java @@ -1,15 +1,16 @@ package com.itmo.java.client.client; +import com.itmo.java.basics.console.DatabaseCommandResult; import com.itmo.java.client.command.*; import com.itmo.java.client.connection.KvsConnection; import com.itmo.java.client.exception.ConnectionException; import com.itmo.java.client.exception.DatabaseExecutionException; import com.itmo.java.protocol.model.RespObject; -import java.util.Arrays; import java.util.function.Supplier; public class SimpleKvsClient implements KvsClient { + private final String dbName; private final KvsConnection connectionSupplier; @@ -20,50 +21,77 @@ public class SimpleKvsClient implements KvsClient { * @param connectionSupplier метод создания подключения к базе */ public SimpleKvsClient(String databaseName, Supplier connectionSupplier) { - this.dbName = databaseName; + dbName = databaseName; this.connectionSupplier = connectionSupplier.get(); } @Override public String createDatabase() throws DatabaseExecutionException { - KvsCommand command = new CreateDatabaseKvsCommand(dbName); - return tryToSend(command); + try { + CreateDatabaseKvsCommand dbKvsCom = new CreateDatabaseKvsCommand(dbName); + RespObject obj = connectionSupplier.send(dbKvsCom.getCommandId(), dbKvsCom.serialize()); + if (obj.isError()) { + throw new DatabaseExecutionException(obj.asString()); + } + return obj.asString(); + } catch (ConnectionException ex) { + return DatabaseCommandResult.error(ex).getPayLoad(); + } } @Override public String createTable(String tableName) throws DatabaseExecutionException { - KvsCommand command = new CreateTableKvsCommand(dbName, tableName); - return tryToSend(command); + try { + CreateTableKvsCommand tbKvsCom = new CreateTableKvsCommand(dbName, tableName); + RespObject obj = connectionSupplier.send(tbKvsCom.getCommandId(), tbKvsCom.serialize()); + if (obj.isError()) { + throw new DatabaseExecutionException(obj.asString()); + } + return obj.asString(); + } catch (ConnectionException ex) { + return DatabaseCommandResult.error(ex).getPayLoad(); + } } @Override public String get(String tableName, String key) throws DatabaseExecutionException { - KvsCommand command = new GetKvsCommand(dbName, tableName, key); - return tryToSend(command); + try { + GetKvsCommand getKvsCom = new GetKvsCommand(dbName, tableName, key); + RespObject obj = connectionSupplier.send(getKvsCom.getCommandId(), getKvsCom.serialize()); + if (obj.isError()) { + throw new DatabaseExecutionException(obj.asString()); + } + return obj.asString(); + } catch (ConnectionException ex) { + return DatabaseCommandResult.error(ex).getPayLoad(); + } } @Override public String set(String tableName, String key, String value) throws DatabaseExecutionException { - KvsCommand command = new SetKvsCommand(dbName, tableName, key, value); - return tryToSend(command); + try { + SetKvsCommand setKvsCom = new SetKvsCommand(dbName, tableName, key, value); + RespObject obj = connectionSupplier.send(setKvsCom.getCommandId(), setKvsCom.serialize()); + if (obj.isError()) { + throw new DatabaseExecutionException(obj.asString()); + } + return obj.asString(); + } catch (ConnectionException ex) { + return DatabaseCommandResult.error(ex).getPayLoad(); + } } @Override public String delete(String tableName, String key) throws DatabaseExecutionException { - KvsCommand command = new DeleteKvsCommand(dbName, tableName, key); - return tryToSend(command); - } - - private String tryToSend(KvsCommand command) throws DatabaseExecutionException { try { - RespObject result = connectionSupplier.send(command.getCommandId(), command.serialize()); - if (result.isError()) { - throw new DatabaseExecutionException(result.asString()); + DeleteKvsCommand delKvsCom = new DeleteKvsCommand(dbName, tableName, key); + RespObject obj = connectionSupplier.send(delKvsCom.getCommandId(), delKvsCom.serialize()); + if (obj.isError()) { + throw new DatabaseExecutionException(obj.asString()); } - return result.asString(); - } catch (ConnectionException e) { - throw new DatabaseExecutionException(String.format("DatabaseExecutionException when try to send '%s' with kvsConnection" + " Message:: " + e.getMessage() + " StackTrace:: " + Arrays.toString(e.getStackTrace()), - command.serialize().asString()), e); + return obj.asString(); + } catch (ConnectionException ex) { + return DatabaseCommandResult.error(ex).getPayLoad(); } } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java b/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java index 5e29d5ac..633f17f6 100644 --- a/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java @@ -10,6 +10,7 @@ * Команда для создания бд */ public class CreateDatabaseKvsCommand implements KvsCommand { + private static final String COMMAND_NAME = "CREATE_DATABASE"; private final String dbName; private final int dbID; @@ -21,7 +22,7 @@ public class CreateDatabaseKvsCommand implements KvsCommand { */ public CreateDatabaseKvsCommand(String databaseName) { // dbID = idGen.get(); - dbID = idGen.getAndIncrement(); + dbID = idGen.incrementAndGet(); dbName = databaseName; } @@ -41,4 +42,4 @@ public RespArray serialize() { public int getCommandId() { return dbID; } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java b/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java index 6d1ac725..06da3b1c 100644 --- a/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java @@ -10,6 +10,7 @@ * Команда для создания таблицы */ public class CreateTableKvsCommand implements KvsCommand { + private static final String COMMAND_NAME = "CREATE_TABLE"; private final String dbName; private final int tbID; @@ -18,7 +19,7 @@ public class CreateTableKvsCommand implements KvsCommand { public CreateTableKvsCommand(String databaseName, String tableName) { dbName = databaseName; tbName = tableName; - tbID = idGen.getAndIncrement(); + tbID = idGen.incrementAndGet(); } /** @@ -38,4 +39,4 @@ public RespArray serialize() { public int getCommandId() { return tbID; } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java b/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java index a67e017b..bc4d6fea 100644 --- a/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java @@ -7,18 +7,18 @@ import java.nio.charset.StandardCharsets; public class DeleteKvsCommand implements KvsCommand { + private static final String COMMAND_NAME = "DELETE_KEY"; private final String dbName; private final String tbName; - private final int delId; - private final String key; - + private final String Key; + private final int delID; public DeleteKvsCommand(String databaseName, String tableName, String key) { - this.dbName = databaseName; - this.tbName = tableName; - this.key = key; - this.delId = idGen.getAndIncrement(); + dbName = databaseName; + tbName = tableName; + Key = key; + delID = idGen.incrementAndGet(); } /** @@ -28,13 +28,15 @@ public DeleteKvsCommand(String databaseName, String tableName, String key) { */ @Override public RespArray serialize() { - return new RespArray(new RespCommandId(delId), new RespBulkString(COMMAND_NAME.getBytes(StandardCharsets.UTF_8)), - new RespBulkString(dbName.getBytes(StandardCharsets.UTF_8)), new RespBulkString(tbName.getBytes(StandardCharsets.UTF_8)), - new RespBulkString(key.getBytes(StandardCharsets.UTF_8))); + return new RespArray(new RespCommandId(delID), + new RespBulkString(COMMAND_NAME.getBytes(StandardCharsets.UTF_8)), + new RespBulkString(dbName.getBytes(StandardCharsets.UTF_8)), + new RespBulkString(tbName.getBytes(StandardCharsets.UTF_8)), + new RespBulkString(Key.getBytes(StandardCharsets.UTF_8))); } @Override public int getCommandId() { - return delId; + return delID; } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/client/command/GetKvsCommand.java b/src/main/java/com/itmo/java/client/command/GetKvsCommand.java index fbd5e2ae..5c73639a 100644 --- a/src/main/java/com/itmo/java/client/command/GetKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/GetKvsCommand.java @@ -39,4 +39,4 @@ public RespArray serialize() { public int getCommandId() { return getID; } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/client/command/SetKvsCommand.java b/src/main/java/com/itmo/java/client/command/SetKvsCommand.java index ac9c57c5..1d5ff0fb 100644 --- a/src/main/java/com/itmo/java/client/command/SetKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/SetKvsCommand.java @@ -42,4 +42,4 @@ public RespArray serialize() { public int getCommandId() { return setID; } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java b/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java index e49d9d24..5c80f902 100644 --- a/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java @@ -3,7 +3,6 @@ import com.itmo.java.basics.DatabaseServer; import com.itmo.java.client.exception.ConnectionException; import com.itmo.java.protocol.model.RespArray; -import com.itmo.java.protocol.model.RespCommandId; import com.itmo.java.protocol.model.RespObject; import java.util.concurrent.ExecutionException; @@ -13,22 +12,19 @@ * (пока еще нет реализации сокетов) */ public class DirectReferenceKvsConnection implements KvsConnection { + private final DatabaseServer dbServer; public DirectReferenceKvsConnection(DatabaseServer databaseServer) { - this.dbServer = databaseServer; + dbServer = databaseServer; } @Override public RespObject send(int commandId, RespArray command) throws ConnectionException { try { return dbServer.executeNextCommand(command).get().serialize(); - } catch (InterruptedException e) { - throw new ConnectionException("ConnectionException when try to get result from server because of interruption when message is '" + - command.asString() + "'", e); - } catch (ExecutionException e) { - throw new ConnectionException("ConnectionException when try to get result from server because of ExecutionException when message is '" + - command.asString() + "'", e); + } catch (ExecutionException | InterruptedException ex) { + throw new ConnectionException(ex.getMessage(), ex.getCause()); } } @@ -38,4 +34,4 @@ public RespObject send(int commandId, RespArray command) throws ConnectionExcept @Override public void close() { } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index 855baf72..bfee8ab6 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -1,5 +1,6 @@ package com.itmo.java.client.connection; + import com.itmo.java.client.exception.ConnectionException; import com.itmo.java.protocol.RespReader; import com.itmo.java.protocol.RespWriter; @@ -23,6 +24,7 @@ public class SocketKvsConnection implements KvsConnection { public SocketKvsConnection(ConnectionConfig config) { this.port = config.getPort(); this.host = config.getHost(); + try { this.clientSocket = new Socket(host, port); this.respReader = new RespReader(clientSocket.getInputStream()); @@ -64,4 +66,4 @@ public void close() { throw new RuntimeException("IOException when try to close client socket"); } } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 6f5d8066..b1e0d479 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -153,4 +153,4 @@ private byte[] readBytesToEndOfLine() throws IOException { } return bytes; } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/protocol/RespWriter.java b/src/main/java/com/itmo/java/protocol/RespWriter.java index cd0a3c24..fc21f3e9 100644 --- a/src/main/java/com/itmo/java/protocol/RespWriter.java +++ b/src/main/java/com/itmo/java/protocol/RespWriter.java @@ -4,24 +4,33 @@ import java.io.IOException; import java.io.OutputStream; -import java.nio.charset.StandardCharsets; public class RespWriter implements AutoCloseable{ + private final OutputStream outputStream; public RespWriter(OutputStream os) { - this.outputStream = os; + + outputStream = os; } /** * Записывает в output stream объект */ public void write(RespObject object) throws IOException { - object.write(outputStream); + try { + object.write(outputStream); + } catch (IOException ex) { + throw new IOException(ex); + } } @Override public void close() throws IOException { - outputStream.close(); + try { + outputStream.close(); + } catch (IOException ex) { + throw new IOException(ex); + } } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/protocol/model/RespArray.java b/src/main/java/com/itmo/java/protocol/model/RespArray.java index 9d260a66..4616df11 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespArray.java +++ b/src/main/java/com/itmo/java/protocol/model/RespArray.java @@ -5,20 +5,21 @@ import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; /** * Массив RESP объектов */ public class RespArray implements RespObject { - private final List objects; /** * Код объекта */ public static final byte CODE = '*'; + private List objects; - public RespArray(RespObject... objects) { - this.objects = Arrays.asList(objects); + public RespArray(RespObject... obj) { + objects = Arrays.asList(obj); } /** @@ -38,27 +39,24 @@ public boolean isError() { */ @Override public String asString() { - StringBuilder stringBuilder = new StringBuilder(); - for (RespObject object : objects) { - stringBuilder.append(object.asString()); - stringBuilder.append(" "); - } - stringBuilder.deleteCharAt(stringBuilder.length() - 1); - return stringBuilder.toString(); - } + return objects.stream().map(RespObject::asString).collect(Collectors.joining(" ")); + } // check @Override - public void write(OutputStream os) throws IOException { - os.write(CODE); - os.write(String.valueOf(objects.size()).getBytes(StandardCharsets.UTF_8)); - os.write(CRLF); - os.flush(); - for (RespObject object : objects) { - object.write(os); + public void write(OutputStream output) throws IOException { + try { + output.write(CODE); + output.write(Integer.toString(objects.size()).getBytes(StandardCharsets.UTF_8)); + output.write(CRLF); + for (RespObject obj : objects) { + obj.write(output); + } + } catch (IOException ex){ + throw new IOException(ex); } } public List getObjects() { return objects; } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java index 7ad4fc18..9a012df6 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java +++ b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java @@ -8,19 +8,17 @@ * Строка */ public class RespBulkString implements RespObject { - private final byte[] data; - /** * Код объекта */ public static final byte CODE = '$'; - public static final int NULL_STRING_SIZE = -1; - + private final byte[] data; public static final RespBulkString NULL_STRING = new RespBulkString(null); - public RespBulkString(byte[] data) { - this.data = data; + + public RespBulkString(byte[] inform) { + data = inform; } /** @@ -40,24 +38,24 @@ public boolean isError() { */ @Override public String asString() { - if (data == null) { - return null; - } - return new String(data, StandardCharsets.UTF_8); + return new String(data); } @Override - public void write(OutputStream os) throws IOException { - os.write(CODE); - if (data == null) { - os.write(String.valueOf(NULL_STRING_SIZE).getBytes(StandardCharsets.UTF_8)); + public void write(OutputStream output) throws IOException { + try { + output.write(CODE); + if (data == null) { + output.write(Integer.toString(NULL_STRING_SIZE).getBytes(StandardCharsets.UTF_8)); + } else { + output.write(Integer.toString(data.length).getBytes(StandardCharsets.UTF_8)); + output.write(CRLF); + output.write(data); + } + output.write(CRLF); + } catch (IOException ex) { + throw new IOException(ex); } - else { - os.write(String.valueOf(data.length).getBytes(StandardCharsets.UTF_8)); - os.write(CRLF); - os.write(data); - } - os.write(CRLF); - os.flush(); } -} + +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/protocol/model/RespCommandId.java b/src/main/java/com/itmo/java/protocol/model/RespCommandId.java index 696deaf0..19cfda32 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespCommandId.java +++ b/src/main/java/com/itmo/java/protocol/model/RespCommandId.java @@ -8,15 +8,15 @@ * Id */ public class RespCommandId implements RespObject { - private final int commandId; /** * Код объекта */ public static final byte CODE = '!'; + private final int commandId; - public RespCommandId(int commandId) { - this.commandId = commandId; + public RespCommandId(int comId) { + commandId = comId; } /** @@ -31,23 +31,21 @@ public boolean isError() { @Override public String asString() { - return String.valueOf(commandId); + return Integer.toString(commandId); } @Override - public void write(OutputStream os) throws IOException { - os.write(CODE); - os.write(intToByteArray(commandId)); - os.write(CRLF); - os.flush(); - } - - static byte[] intToByteArray(int data) { - byte[] result = new byte[4]; - result[0] = (byte) ((data & 0xFF000000) >> 24); - result[1] = (byte) ((data & 0x00FF0000) >> 16); - result[2] = (byte) ((data & 0x0000FF00) >> 8); - result[3] = (byte) ((data & 0x000000FF)); - return result; + public void write(OutputStream output) throws IOException { + try { + output.write(CODE); + int commandByte = commandId; + output.write((commandByte >>> 24) & 0xFF); + output.write((commandByte >>> 16) & 0xFF); + output.write((commandByte >>> 8) & 0xFF); + output.write(commandByte & 0xFF); + output.write(CRLF); + } catch (IOException ex) { + throw new IOException(ex); + } } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/protocol/model/RespError.java b/src/main/java/com/itmo/java/protocol/model/RespError.java index 44c9baea..79f106c5 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespError.java +++ b/src/main/java/com/itmo/java/protocol/model/RespError.java @@ -2,21 +2,20 @@ import java.io.IOException; import java.io.OutputStream; -import java.nio.charset.StandardCharsets; /** * Сообщение об ошибке в RESP протоколе */ public class RespError implements RespObject { - private final byte[] message; /** * Код объекта */ public static final byte CODE = '-'; + public byte[] message; - public RespError(byte[] message) { - this.message = message; + public RespError(byte[] mes) { + message = mes; } /** @@ -31,17 +30,17 @@ public boolean isError() { @Override public String asString() { - if (message == null) { - return null; - } - return new String(message, StandardCharsets.UTF_8); + return new String(message); } @Override - public void write(OutputStream os) throws IOException { - os.write(CODE); - os.write(message); - os.write(CRLF); - os.flush(); + public void write(OutputStream output) throws IOException { + try { + output.write(CODE); + output.write(message); + output.write(CRLF); + } catch(IOException ex) { + throw new IOException(ex); + } } -} +} \ No newline at end of file From 85584103921c972381d56b2255294727cb50756f Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 04:10:15 +0300 Subject: [PATCH 307/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82=20123?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../itmo/java/basics/config/ConfigLoader.java | 83 +++++-------------- .../connector/JavaSocketServerConnector.java | 20 ++--- .../java/basics/logic/impl/DatabaseImpl.java | 6 -- .../basics/logic/io/DatabaseOutputStream.java | 3 +- 4 files changed, 34 insertions(+), 78 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/config/ConfigLoader.java b/src/main/java/com/itmo/java/basics/config/ConfigLoader.java index 6a43990f..da00f4d2 100644 --- a/src/main/java/com/itmo/java/basics/config/ConfigLoader.java +++ b/src/main/java/com/itmo/java/basics/config/ConfigLoader.java @@ -1,46 +1,26 @@ package com.itmo.java.basics.config; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; +import java.io.*; +import java.net.URL; import java.util.Properties; /** * Класс, отвечающий за подгрузку данных из конфигурационного файла формата .properties */ public class ConfigLoader { - private static final String DEFAULT_PROPERTY_FILE = "server.properties"; - - private InputStream propertyInputStream; + private final String fileName; /** * По умолчанию читает из server.properties */ public ConfigLoader() { - propertyInputStream = getClass().getClassLoader().getResourceAsStream(DEFAULT_PROPERTY_FILE); - if (this.propertyInputStream == null) { - try { - this.propertyInputStream = new FileInputStream(DEFAULT_PROPERTY_FILE); - } catch (FileNotFoundException e) { - this.propertyInputStream = null; - } - } + fileName = "server.properties"; } /** * @param name Имя конфикурационного файла, откуда читать */ - public ConfigLoader(String name) { - this.propertyInputStream = getClass().getClassLoader().getResourceAsStream(name); - if (this.propertyInputStream == null) { - try { - this.propertyInputStream = new FileInputStream(name); - } catch (FileNotFoundException e) { - this.propertyInputStream = null; - } - } - } + public ConfigLoader(String name) { fileName = name; } /** * Считывает конфиг из указанного в конструкторе файла. @@ -50,40 +30,23 @@ public ConfigLoader(String name) { * Читаются: "kvs.workingPath", "kvs.host", "kvs.port" (но в конфигурационном файле допустимы и другие проперти) */ public DatabaseServerConfig readConfig() { - Properties properties = new Properties(); - try { - if (propertyInputStream == null) { - throw new IOException("Config file not found"); - } - properties.load(propertyInputStream); - String workingPath = properties.getProperty("kvs.workingPath"); - String host = properties.getProperty("kvs.host"); - String portStr = properties.getProperty("kvs.port"); - DatabaseConfig databaseConfig; - ServerConfig serverConfig; - if (workingPath == null) { - databaseConfig = new DatabaseConfig(); - } else { - databaseConfig = new DatabaseConfig(workingPath); - } - if (host == null){ - host = ServerConfig.DEFAULT_HOST; - } - try { - int port = Integer.parseInt(portStr); - serverConfig = new ServerConfig(host, port); - } catch (NumberFormatException e) { - serverConfig = new ServerConfig(host, ServerConfig.DEFAULT_PORT); - } - return DatabaseServerConfig.builder() - .dbConfig(databaseConfig) - .serverConfig(serverConfig) - .build(); - } catch (IOException e) { - return DatabaseServerConfig.builder() - .dbConfig(new DatabaseConfig()) - .serverConfig(new ServerConfig(ServerConfig.DEFAULT_HOST, ServerConfig.DEFAULT_PORT)) - .build(); + final Properties properties = new Properties(); + final URL resource = this.getClass().getClassLoader().getResource(fileName); + final String filepath = resource == null ? fileName : resource.getPath(); + + try (final InputStream stream = new FileInputStream(filepath)) { + properties.load(stream); + + final String workingPath = properties.getProperty("kvs.workingPath", DatabaseConfig.DEFAULT_WORKING_PATH); + final String host = properties.getProperty("kvs.host", ServerConfig.DEFAULT_HOST); + final int port = Integer.parseInt(properties.getProperty("kvs.port", String.valueOf(ServerConfig.DEFAULT_PORT))); + + return new DatabaseServerConfig(new ServerConfig(host, port), new DatabaseConfig(workingPath)); + } catch (IOException exception){ + return new DatabaseServerConfig( + new ServerConfig(ServerConfig.DEFAULT_HOST, ServerConfig.DEFAULT_PORT), + new DatabaseConfig(DatabaseConfig.DEFAULT_WORKING_PATH) + ); } } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index cf4a9f8c..9d99814b 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -42,8 +42,12 @@ public class JavaSocketServerConnector implements Closeable { * Стартует сервер. По аналогии с сокетом открывает коннекшн в конструкторе. */ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig config) throws IOException { - this.serverSocket = new ServerSocket(config.getPort()); - this.server = databaseServer; + try { + this.serverSocket = new ServerSocket(config.getPort()); + this.server = databaseServer; + } catch (IOException ex) { + throw new IOException(ex); + } } /** @@ -51,13 +55,12 @@ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig con */ public void start() { connectionAcceptorExecutor.submit(() -> { - while (true) { + while(true) { Socket clientSocket = serverSocket.accept(); - clientIOWorkers.submit(new ClientTask(clientSocket, server)); + clientIOWorkers.submit(new ClientTask(clientSocket,server)); } }); } - /** * Закрывает все, что нужно ¯\_(ツ)_/¯ */ @@ -77,11 +80,6 @@ public void close() { public static void main(String[] args) throws Exception { - DatabaseServerConfig config = new ConfigLoader().readConfig(); - DatabaseServer server = DatabaseServer.initialize(new ExecutionEnvironmentImpl(config.getDbConfig()), - new DatabaseServerInitializer(new DatabaseInitializer(new TableInitializer(new SegmentInitializer())))); - JavaSocketServerConnector connector = new JavaSocketServerConnector(server, config.getServerConfig()); - connector.start(); } /** @@ -140,4 +138,4 @@ public void close() { } } } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java index b96002a5..14f5ffb2 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/DatabaseImpl.java @@ -82,9 +82,6 @@ public void write(String tableName, String objectKey, byte[] objectValue) throws } Table table = tableDictionary.get(tableName); - if (table == null) { - throw new DatabaseException("Table not found"); - } table.write(objectKey, objectValue); } @@ -106,9 +103,6 @@ public void delete(String tableName, String objectKey) throws DatabaseException{ throw new DatabaseException("Writing in database error"); } Table tableImpl = tableDictionary.get(tableName); - if (tableName == null) { - throw new DatabaseException("Error while reading in database , null name"); - } tableImpl.delete(objectKey); } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java index 6b7c1cf2..ec1ad1c4 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseOutputStream.java @@ -42,8 +42,9 @@ public int write(WritableDatabaseRecord databaseRecord) throws IOException { if (databaseRecord.isValuePresented()) { write(databaseRecord.getValue()); } + flush(); - return size(); + return (int) databaseRecord.size(); } } \ No newline at end of file From d976aefe82067f515b3e9f176685236148e07bbd Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 04:14:54 +0300 Subject: [PATCH 308/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82=20123=20?= =?UTF-8?q?end?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basics/console/DatabaseCommandResult.java | 10 +--- .../console/impl/CreateDatabaseCommand.java | 39 ++++++++----- .../console/impl/CreateTableCommand.java | 46 +++++++++------ .../basics/console/impl/DeleteKeyCommand.java | 56 +++++++++++------- .../impl/ExecutionEnvironmentImpl.java | 12 ++-- .../impl/FailedDatabaseCommandResult.java | 14 +++-- .../basics/console/impl/GetKeyCommand.java | 57 ++++++++++++------- .../basics/console/impl/SetKeyCommand.java | 56 +++++++++++------- .../impl/SuccessDatabaseCommandResult.java | 15 +++-- 9 files changed, 182 insertions(+), 123 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java b/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java index 1d44c7b1..fb491ece 100644 --- a/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java +++ b/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java @@ -4,8 +4,6 @@ import com.itmo.java.basics.console.impl.SuccessDatabaseCommandResult; import com.itmo.java.protocol.model.RespObject; -import java.util.Arrays; - public interface DatabaseCommandResult extends DatabaseApiSerializable { /** @@ -30,17 +28,13 @@ static DatabaseCommandResult error(String message) { /** * Формирует результат команды, при выполнении которой произошла ошибка. - * Берется сообщение из исключения. Если в исключении нет сообщения - стэктрейс + * Берется сообщение из исключения. Если в исключении нет сообщения - стэктрейст * * @param exception исключение, из которого нужно сформировать результат выполнения команды * @return результат команды, при выполнении которой произошла ошибка */ static DatabaseCommandResult error(Exception exception) { - if (exception.getMessage().isEmpty()) { - return new FailedDatabaseCommandResult(Arrays.toString(exception.getStackTrace())); - } else { - return new FailedDatabaseCommandResult(exception.getMessage()); - } + return new FailedDatabaseCommandResult(exception.getMessage()); } /** diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java index ecf3b922..9cc7ee89 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java @@ -15,25 +15,30 @@ * Команда для создания базы данных */ public class CreateDatabaseCommand implements DatabaseCommand { + private final ExecutionEnvironment environment; - private final DatabaseFactory factory; - private final String dbName; + private final DatabaseFactory dbfactory; + private final List commandargs; + private static final int numberOfAgrguments = 3; /** * Создает команду. *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * - * @param env env - * @param factory функция создания базы данных (пример: DatabaseImpl::create) - * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. - * Id команды, имя команды, имя создаваемой бд + * @param env env + * @param factory функция создания базы данных (пример: DatabaseImpl::create) + * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * Id команды, имя команды, имя создаваемой бд * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public CreateDatabaseCommand(ExecutionEnvironment env, DatabaseFactory factory, List commandArgs) { - this.environment = env; - this.factory = factory; - this.dbName = commandArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + public CreateDatabaseCommand(ExecutionEnvironment env, DatabaseFactory factory, List comArgs) { + if (comArgs.size() != numberOfAgrguments) { + throw new IllegalArgumentException("Why " + comArgs.size() + "!= 3 , in CreateDataBaseCommand"); + } + environment = env; + dbfactory = factory; + commandargs = comArgs; } /** @@ -44,10 +49,14 @@ public CreateDatabaseCommand(ExecutionEnvironment env, DatabaseFactory factory, @Override public DatabaseCommandResult execute() { try { - environment.addDatabase(factory.createNonExistent(dbName, environment.getWorkingPath())); - } catch (DatabaseException e){ - return DatabaseCommandResult.error(""); + String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + if (dbName == null) { + throw new DatabaseException("Why dbname is null? "); + } + environment.addDatabase(dbfactory.createNonExistent(dbName, environment.getWorkingPath())); + return DatabaseCommandResult.success(("Success add " + dbName).getBytes(StandardCharsets.UTF_8)); + } catch (DatabaseException ex) { + return new FailedDatabaseCommandResult(ex.getMessage()); } - return DatabaseCommandResult.success(("").getBytes(StandardCharsets.UTF_8)); } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java index 154bb2a4..2bacaf78 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java @@ -5,10 +5,13 @@ import com.itmo.java.basics.console.DatabaseCommandResult; import com.itmo.java.basics.console.ExecutionEnvironment; import com.itmo.java.basics.exceptions.DatabaseException; +import com.itmo.java.basics.logic.Database; import com.itmo.java.protocol.model.RespObject; +import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.List; +import java.util.Optional; /** * Команда для создания базы таблицы @@ -16,23 +19,25 @@ public class CreateTableCommand implements DatabaseCommand { private final ExecutionEnvironment environment; - private final String dbName; - private final String tbName; + private final List commandargs; + private static final int numberOfAgrguments = 4; /** * Создает команду *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * - * @param env env - * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. - * Id команды, имя команды, имя бд, имя таблицы + * @param env env + * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * Id команды, имя команды, имя бд, имя таблицы * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public CreateTableCommand(ExecutionEnvironment env, List commandArgs) { - this.environment = env; - this.dbName = commandArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - this.tbName = commandArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + public CreateTableCommand(ExecutionEnvironment env, List comArgs) { + if (comArgs.size() != numberOfAgrguments) { + throw new IllegalArgumentException("Why " + comArgs.size() + "!= 4 , in CreateTableCommand"); + } + environment = env; + commandargs = comArgs; } /** @@ -43,13 +48,22 @@ public CreateTableCommand(ExecutionEnvironment env, List commandArgs @Override public DatabaseCommandResult execute() { try { - if (environment.getDatabase(dbName).isEmpty()){ - return DatabaseCommandResult.error(""); + String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + if (dbName == null) { + throw new DatabaseException("Why dbname is null?"); + } + String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + if (tbName == null) { + throw new DatabaseException("Why tbName is null?"); + } + Optional dataBase = environment.getDatabase(dbName); + if (dataBase.isEmpty()) { + throw new DatabaseException("We dont have" + dbName); } - environment.getDatabase(dbName).get().createTableIfNotExists(tbName); - } catch (DatabaseException e){ - return DatabaseCommandResult.error(""); + dataBase.get().createTableIfNotExists(tbName); + return DatabaseCommandResult.success(("Success add " + dbName + tbName).getBytes(StandardCharsets.UTF_8)); + } catch (DatabaseException ex) { + return new FailedDatabaseCommandResult(ex.getMessage()); } - return DatabaseCommandResult.success(("").getBytes(StandardCharsets.UTF_8)); } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java index c55f7e09..acbafaf4 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java @@ -8,6 +8,8 @@ import com.itmo.java.basics.logic.Database; import com.itmo.java.protocol.model.RespObject; +import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Optional; @@ -15,26 +17,28 @@ * Команда для создания удаления значения по ключу */ public class DeleteKeyCommand implements DatabaseCommand { + private final ExecutionEnvironment environment; - private final String dbName; - private final String tbName; - private final String key; + private final List commandargs; + private static final int numberOfAgrguments = 5; /** * Создает команду. *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * - * @param env env - * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. - * Id команды, имя команды, имя бд, таблицы, ключ + * @param env env + * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * Id команды, имя команды, имя бд, таблицы, ключ * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public DeleteKeyCommand(ExecutionEnvironment env, List commandArgs) { - this.environment = env; - this.dbName = commandArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - this.tbName = commandArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); - this.key = commandArgs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); + public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { + + if (comArgs.size() != numberOfAgrguments) { + throw new IllegalArgumentException("Why " + comArgs.size() + "!= 5 , in CreateTableCommand"); + } + environment = env; + commandargs = comArgs; } /** @@ -45,18 +49,26 @@ public DeleteKeyCommand(ExecutionEnvironment env, List commandArgs) @Override public DatabaseCommandResult execute() { try { - Optional database = environment.getDatabase(dbName); - if (database.isEmpty()){ - return DatabaseCommandResult.error(""); + String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + if (dbName == null) { + throw new DatabaseException("Why dbname is null?"); + } + String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + if (tbName == null) { + throw new DatabaseException("Why tbName is null?"); + } + String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); + if (key == null) { + throw new DatabaseException("Why key is null?"); } - Optional value = database.get().read(tbName, key); - if (value.isEmpty()){ - return DatabaseCommandResult.error(""); + Optional dataBase = environment.getDatabase(dbName); + if (dataBase.isEmpty()) { + throw new DatabaseException("We dont have" + dbName); } - database.get().delete(tbName, key); - return DatabaseCommandResult.success(value.get()); - } catch (DatabaseException e){ - return DatabaseCommandResult.error(""); + dataBase.get().delete(tbName, key); + return DatabaseCommandResult.success(("Success del " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); + } catch (DatabaseException ex) { + return new FailedDatabaseCommandResult(ex.getMessage()); } } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java index 333219b2..baca5383 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java +++ b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java @@ -5,18 +5,18 @@ import com.itmo.java.basics.logic.Database; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.HashMap; import java.util.Map; import java.util.Optional; public class ExecutionEnvironmentImpl implements ExecutionEnvironment { - public Path workingPath; - public Map dataBase = new HashMap<>(); + private final DatabaseConfig dbConfig; + private final Map dataBase; public ExecutionEnvironmentImpl(DatabaseConfig config) { - workingPath = Paths.get(config.getWorkingPath()); + dbConfig = config; + dataBase = new HashMap<>(); } @Override @@ -31,6 +31,6 @@ public void addDatabase(Database db) { @Override public Path getWorkingPath() { - return workingPath; + return Path.of(dbConfig.getWorkingPath()); } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java b/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java index 80f0d182..2da3d950 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java +++ b/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java @@ -10,10 +10,12 @@ * Зафейленная команда */ public class FailedDatabaseCommandResult implements DatabaseCommandResult { - private final String payload; - public FailedDatabaseCommandResult(String payload) { - this.payload = payload; + + private final String payLoad; + + public FailedDatabaseCommandResult(String pload) { + payLoad = pload; } /** @@ -21,7 +23,7 @@ public FailedDatabaseCommandResult(String payload) { */ @Override public String getPayLoad() { - return payload; + return payLoad; } @Override @@ -34,6 +36,6 @@ public boolean isSuccess() { */ @Override public RespObject serialize() { - return new RespError(payload.getBytes(StandardCharsets.UTF_8)); + return new RespError(payLoad.getBytes(StandardCharsets.UTF_8)); } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java index 9cda66ce..87e4e844 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java @@ -8,7 +8,7 @@ import com.itmo.java.basics.logic.Database; import com.itmo.java.protocol.model.RespObject; -import java.nio.charset.StandardCharsets; +import java.io.IOException; import java.util.List; import java.util.Optional; @@ -16,25 +16,27 @@ * Команда для чтения данных по ключу */ public class GetKeyCommand implements DatabaseCommand { + private final ExecutionEnvironment environment; - private final String dbName; - private final String tbName; - private final String key; + private final List commandargs; + private static final int numberOfAgrguments = 5; + /** * Создает команду. *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * - * @param env env - * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. - * Id команды, имя команды, имя бд, таблицы, ключ + * @param env env + * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * Id команды, имя команды, имя бд, таблицы, ключ * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public GetKeyCommand(ExecutionEnvironment env, List commandArgs) { - this.environment = env; - this.dbName = commandArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - this.tbName = commandArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); - this.key = commandArgs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); + public GetKeyCommand(ExecutionEnvironment env, List comArgs) { + if (comArgs.size() != numberOfAgrguments) { + throw new IllegalArgumentException("Why " + comArgs.size() + "!= 5 , in CreateTableCommand"); + } + environment = env; + commandargs = comArgs; } /** @@ -45,14 +47,29 @@ public GetKeyCommand(ExecutionEnvironment env, List commandArgs) { @Override public DatabaseCommandResult execute() { try { - Optional database = environment.getDatabase(dbName); - if (database.isEmpty()){ - return DatabaseCommandResult.error(""); + String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + if (dbName == null) { + throw new DatabaseException("Why dbname is null?"); + } + String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + if (tbName == null) { + throw new DatabaseException("Why tbName is null?"); + } + String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); + if (key == null) { + throw new DatabaseException("Why key is null?"); + } + Optional dataBase = environment.getDatabase(dbName); + if (dataBase.isEmpty()) { + throw new DatabaseException("We dont have" + dbName); + } + Optional value = dataBase.get().read(tbName, key); + if (value.isEmpty()) { + throw new DatabaseException("We dont have" + dbName + tbName + key); } - Optional value = database.get().read(tbName, key); - return DatabaseCommandResult.success(value.orElse(null)); - } catch (DatabaseException e){ - return DatabaseCommandResult.error(""); + return DatabaseCommandResult.success(value.get()); + } catch (DatabaseException ex) { + return new FailedDatabaseCommandResult(ex.getMessage()); } } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java index 6ae2b67d..2b6b09ec 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java @@ -8,6 +8,7 @@ import com.itmo.java.basics.logic.Database; import com.itmo.java.protocol.model.RespObject; +import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Optional; @@ -16,28 +17,27 @@ * Команда для создания записи значения */ public class SetKeyCommand implements DatabaseCommand { + private final ExecutionEnvironment environment; - private final String dbName; - private final String tbName; - private final String key; - private final String value; + private final List commandargs; + private static final int numberOfAgrguments = 6; /** * Создает команду. *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * - * @param env env - * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. - * Id команды, имя команды, имя бд, таблицы, ключ, значение + * @param env env + * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * Id команды, имя команды, имя бд, таблицы, ключ, значение * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public SetKeyCommand(ExecutionEnvironment env, List commandArgs) { - this.environment = env; - this.dbName = commandArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - this.tbName = commandArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); - this.key = commandArgs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); - this.value = commandArgs.get(DatabaseCommandArgPositions.VALUE.getPositionIndex()).asString(); + public SetKeyCommand(ExecutionEnvironment env, List comArgs) { + if (comArgs.size() != numberOfAgrguments) { + throw new IllegalArgumentException("Why " + comArgs.size() + "!= 5 , in CreateTableCommand"); + } + environment = env; + commandargs = comArgs; } /** @@ -48,15 +48,27 @@ public SetKeyCommand(ExecutionEnvironment env, List commandArgs) { @Override public DatabaseCommandResult execute() { try { - Optional database = environment.getDatabase(dbName); - if (database.isEmpty()){ - return DatabaseCommandResult.error(""); + String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + if (dbName == null) { + throw new DatabaseException("Why dbname is null?"); + } + String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + if (tbName == null) { + throw new DatabaseException("Why tbName is null?"); + } + String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); + if (key == null) { + throw new DatabaseException("Why key is null?"); + } + Optional dataBase = environment.getDatabase(dbName); + if (dataBase.isEmpty()) { + throw new DatabaseException("We dont have" + dbName); } - Optional previousValue = database.get().read(tbName, key); - database.get().write(tbName, key, value.getBytes(StandardCharsets.UTF_8)); - return DatabaseCommandResult.success(previousValue.orElse(null)); - } catch (DatabaseException e){ - return DatabaseCommandResult.error(""); + byte[] value = commandargs.get(DatabaseCommandArgPositions.VALUE.getPositionIndex()).asString().getBytes(StandardCharsets.UTF_8); + dataBase.get().write(tbName, key, value); + return DatabaseCommandResult.success(("Success add key " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); + } catch (DatabaseException ex) { + return new FailedDatabaseCommandResult(ex.getMessage()); } } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java b/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java index 31981a12..daad52fd 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java +++ b/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java @@ -4,24 +4,23 @@ import com.itmo.java.protocol.model.RespBulkString; import com.itmo.java.protocol.model.RespObject; -import java.nio.charset.StandardCharsets; - /** * Результат успешной команды */ public class SuccessDatabaseCommandResult implements DatabaseCommandResult { + private final byte[] payLoad; - public SuccessDatabaseCommandResult(byte[] payload) { - payLoad = payload; + public SuccessDatabaseCommandResult(byte[] pload) { + payLoad = pload; } @Override public String getPayLoad() { - if (payLoad == null) + if(payLoad != null) { + return new String(payLoad); + } else { return null; - else { - return new String(payLoad, StandardCharsets.UTF_8); } } @@ -37,4 +36,4 @@ public boolean isSuccess() { public RespObject serialize() { return new RespBulkString(payLoad); } -} +} \ No newline at end of file From 65b292cc03f4a3c4f8deef165e247367bbd07679 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 04:20:59 +0300 Subject: [PATCH 309/378] test with this config --- .../itmo/java/basics/config/ConfigLoader.java | 64 ++++++++++++------- 1 file changed, 41 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/config/ConfigLoader.java b/src/main/java/com/itmo/java/basics/config/ConfigLoader.java index da00f4d2..6551dcd7 100644 --- a/src/main/java/com/itmo/java/basics/config/ConfigLoader.java +++ b/src/main/java/com/itmo/java/basics/config/ConfigLoader.java @@ -1,26 +1,44 @@ package com.itmo.java.basics.config; -import java.io.*; -import java.net.URL; +import java.io.FileInputStream; +import java.io.IOException; import java.util.Properties; /** * Класс, отвечающий за подгрузку данных из конфигурационного файла формата .properties */ public class ConfigLoader { - private final String fileName; + Properties configFileProp = new Properties(); + private String workingPath; + private String host; + private int port; /** * По умолчанию читает из server.properties */ public ConfigLoader() { - fileName = "server.properties"; + try { + configFileProp.load(this.getClass().getClassLoader().getResourceAsStream("server.properties")); + } catch (IOException e) { + e.printStackTrace(); + } } /** * @param name Имя конфикурационного файла, откуда читать */ - public ConfigLoader(String name) { fileName = name; } + public ConfigLoader(String name) { + try { + if (this.getClass().getClassLoader().getResourceAsStream(name) != null){ + configFileProp.load(this.getClass().getClassLoader().getResourceAsStream(name)); + } else { + FileInputStream fileInputStream = new FileInputStream(name); + configFileProp.load(fileInputStream); + } + } catch (IOException e) { + e.printStackTrace(); + } + } /** * Считывает конфиг из указанного в конструкторе файла. @@ -30,23 +48,23 @@ public ConfigLoader() { * Читаются: "kvs.workingPath", "kvs.host", "kvs.port" (но в конфигурационном файле допустимы и другие проперти) */ public DatabaseServerConfig readConfig() { - final Properties properties = new Properties(); - final URL resource = this.getClass().getClassLoader().getResource(fileName); - final String filepath = resource == null ? fileName : resource.getPath(); - - try (final InputStream stream = new FileInputStream(filepath)) { - properties.load(stream); - - final String workingPath = properties.getProperty("kvs.workingPath", DatabaseConfig.DEFAULT_WORKING_PATH); - final String host = properties.getProperty("kvs.host", ServerConfig.DEFAULT_HOST); - final int port = Integer.parseInt(properties.getProperty("kvs.port", String.valueOf(ServerConfig.DEFAULT_PORT))); - - return new DatabaseServerConfig(new ServerConfig(host, port), new DatabaseConfig(workingPath)); - } catch (IOException exception){ - return new DatabaseServerConfig( - new ServerConfig(ServerConfig.DEFAULT_HOST, ServerConfig.DEFAULT_PORT), - new DatabaseConfig(DatabaseConfig.DEFAULT_WORKING_PATH) - ); + workingPath = configFileProp.getProperty("kvs.workingPath"); + host = configFileProp.getProperty("kvs.host"); + String stringPort = configFileProp.getProperty("kvs.port"); + if (host == null){ + host = ServerConfig.DEFAULT_HOST; + } + if (stringPort == null) { + port = ServerConfig.DEFAULT_PORT; + } else { + port = Integer.parseInt(stringPort); + } + if (workingPath == null){ + workingPath = DatabaseConfig.DEFAULT_WORKING_PATH; } + ServerConfig serverConfig = new ServerConfig(host, port); + DatabaseConfig databaseConfig = new DatabaseConfig(workingPath); + return new DatabaseServerConfig(serverConfig, databaseConfig); } -} \ No newline at end of file +} + \ No newline at end of file From 303536ce03e1b5609b03b1bdb908afaf3212e1bb Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 04:27:44 +0300 Subject: [PATCH 310/378] fix socket --- .../connection/SocketKvsConnection.java | 39 +++++++++---------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index bfee8ab6..77b62d8c 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -15,22 +15,19 @@ * С помощью {@link RespWriter} и {@link RespReader} читает/пишет в сокет */ public class SocketKvsConnection implements KvsConnection { - private final int port; - private final String host; - private final Socket clientSocket; - private final RespWriter respWriter; - private final RespReader respReader; - +// private final int port; +// private final String host; +// private final Socket clientSocket; +// private final RespWriter respWriter; +// private final RespReader respReader; + final ConnectionConfig connectionConfig; + final Socket socket; public SocketKvsConnection(ConnectionConfig config) { - this.port = config.getPort(); - this.host = config.getHost(); - + connectionConfig = config; try { - this.clientSocket = new Socket(host, port); - this.respReader = new RespReader(clientSocket.getInputStream()); - respWriter = new RespWriter(clientSocket.getOutputStream()); + socket = new Socket(connectionConfig.getHost(),connectionConfig.getPort()); } catch (IOException e) { - throw new RuntimeException("IOException when try to connect by " + host + " " + port, e); + throw new RuntimeException("Error in const"); } } @@ -43,13 +40,17 @@ public SocketKvsConnection(ConnectionConfig config) { @Override public synchronized RespObject send(int commandId, RespArray command) throws ConnectionException { try { - RespWriter respWriter = new RespWriter(clientSocket.getOutputStream()); + RespWriter respWriter = new RespWriter(socket.getOutputStream()); respWriter.write(command); - RespReader respReader = new RespReader(clientSocket.getInputStream()); - return respReader.readObject(); + RespReader respReader = new RespReader(socket.getInputStream()); + RespObject respObject = respReader.readObject(); + if (respObject.isError()) { + throw new ConnectionException("Response error"); + } + return respObject; } catch (IOException e) { close(); - throw new ConnectionException("IOException when send " + command.asString() + " with " + host + " and port " + port + " ___IOMessage___: " + e.getMessage(), e); + throw new ConnectionException("IOException when send SocketKvs"); } } @@ -59,9 +60,7 @@ public synchronized RespObject send(int commandId, RespArray command) throws Con @Override public void close() { try { - respWriter.close(); - respReader.close(); - clientSocket.close(); + socket.close(); } catch (IOException e) { throw new RuntimeException("IOException when try to close client socket"); } From c9aa1cf16797a0565330d1372f7507c268e471f8 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 04:36:35 +0300 Subject: [PATCH 311/378] new Server Initializer --- .../impl/DatabaseServerInitializer.java | 31 +++++++++---------- .../java/protocol/model/RespBulkString.java | 2 +- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java index 72f311d7..1ac3c494 100644 --- a/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java +++ b/src/main/java/com/itmo/java/basics/initialization/impl/DatabaseServerInitializer.java @@ -27,29 +27,26 @@ public DatabaseServerInitializer(DatabaseInitializer databaseInitializer) { @Override public void perform(InitializationContext context) throws DatabaseException { - if (context.executionEnvironment() == null) { - throw new DatabaseException("Context executionEnvironment is null"); - } +// if (context.executionEnvironment() == null) { +// throw new DatabaseException("Context executionEnvironment is null"); +// } ExecutionEnvironment ExecutionEnvironment = context.executionEnvironment(); Path path = ExecutionEnvironment.getWorkingPath(); + File workingDir = new File(String.valueOf(path)); - if (!Files.exists(path)) { - try { - Files.createDirectory(path); - } catch (IOException ex) { - throw new DatabaseException("Error while creating " + path.toString(), ex); + if (!workingDir.exists()) { + if (!workingDir.mkdir()) { + throw new DatabaseException("While creating dir DVSIit"); } } - File curFile = new File(path.toString()); - File[] directory = curFile.listFiles(); - if (directory == null) { - throw new DatabaseException("Error while working with" + curFile.toString()); - } - - for (File in : directory) { - DatabaseInitializationContextImpl dbContext = new DatabaseInitializationContextImpl(in.getName(), path); - databaseInitializer.perform(new InitializationContextImpl(context.executionEnvironment(), dbContext, null, null)); + File[] curFiles = workingDir.listFiles(File::isDirectory); + for (File dir : curFiles) { + DatabaseInitializationContextImpl dbContext = new DatabaseInitializationContextImpl(dir.getName(),path); + InitializationContextImpl newContext = InitializationContextImpl.builder() + .currentDatabaseContext(dbContext) + .executionEnvironment(context.executionEnvironment()).build(); + databaseInitializer.perform(newContext); } } } diff --git a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java index 9a012df6..4e94d577 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java +++ b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java @@ -52,7 +52,7 @@ public void write(OutputStream output) throws IOException { output.write(CRLF); output.write(data); } - output.write(CRLF); + // output.write(CRLF); } catch (IOException ex) { throw new IOException(ex); } From bb3ab22585cec7bf9b2f4664597236326b20a647 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 04:38:06 +0300 Subject: [PATCH 312/378] fixxx --- src/main/java/com/itmo/java/protocol/model/RespBulkString.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java index 4e94d577..9a012df6 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java +++ b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java @@ -52,7 +52,7 @@ public void write(OutputStream output) throws IOException { output.write(CRLF); output.write(data); } - // output.write(CRLF); + output.write(CRLF); } catch (IOException ex) { throw new IOException(ex); } From 128e57e64f67d7f0585f23f25803b8823fddde16 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 14:04:21 +0300 Subject: [PATCH 313/378] add DatabaseeExecutionException --- .../com/itmo/java/client/client/SimpleKvsClient.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java b/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java index 9ad82ccd..d0f37d3b 100644 --- a/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java +++ b/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java @@ -35,7 +35,7 @@ public String createDatabase() throws DatabaseExecutionException { } return obj.asString(); } catch (ConnectionException ex) { - return DatabaseCommandResult.error(ex).getPayLoad(); + throw new DatabaseExecutionException("Creating DataBAse SinpleKvsClient, ConnectionException", ex); } } @@ -49,7 +49,7 @@ public String createTable(String tableName) throws DatabaseExecutionException { } return obj.asString(); } catch (ConnectionException ex) { - return DatabaseCommandResult.error(ex).getPayLoad(); + throw new DatabaseExecutionException("Creating table SinpleKvsClient, ConnectionException", ex); } } @@ -63,7 +63,7 @@ public String get(String tableName, String key) throws DatabaseExecutionExceptio } return obj.asString(); } catch (ConnectionException ex) { - return DatabaseCommandResult.error(ex).getPayLoad(); + throw new DatabaseExecutionException("getting SinpleKvsClient, ConnectionException", ex); } } @@ -77,7 +77,7 @@ public String set(String tableName, String key, String value) throws DatabaseExe } return obj.asString(); } catch (ConnectionException ex) { - return DatabaseCommandResult.error(ex).getPayLoad(); + throw new DatabaseExecutionException("setting SinpleKvsClient, ConnectionException", ex); } } @@ -91,7 +91,7 @@ public String delete(String tableName, String key) throws DatabaseExecutionExcep } return obj.asString(); } catch (ConnectionException ex) { - return DatabaseCommandResult.error(ex).getPayLoad(); + throw new DatabaseExecutionException("Deleting SinpleKvsClient, ConnectionException", ex); } } } \ No newline at end of file From b4ab9f77b20af9775ccbea60381aa090ac0296a4 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 14:20:25 +0300 Subject: [PATCH 314/378] DbExEx --- .../java/client/client/SimpleKvsClient.java | 36 +++++++++++++------ 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java b/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java index d0f37d3b..8a3d0b39 100644 --- a/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java +++ b/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java @@ -7,6 +7,7 @@ import com.itmo.java.client.exception.DatabaseExecutionException; import com.itmo.java.protocol.model.RespObject; +import java.util.Arrays; import java.util.function.Supplier; public class SimpleKvsClient implements KvsClient { @@ -27,71 +28,86 @@ public SimpleKvsClient(String databaseName, Supplier connectionSu @Override public String createDatabase() throws DatabaseExecutionException { + CreateDatabaseKvsCommand dbKvsCom = new CreateDatabaseKvsCommand(dbName); try { - CreateDatabaseKvsCommand dbKvsCom = new CreateDatabaseKvsCommand(dbName); + // CreateDatabaseKvsCommand dbKvsCom = new CreateDatabaseKvsCommand(dbName); RespObject obj = connectionSupplier.send(dbKvsCom.getCommandId(), dbKvsCom.serialize()); if (obj.isError()) { throw new DatabaseExecutionException(obj.asString()); } return obj.asString(); } catch (ConnectionException ex) { - throw new DatabaseExecutionException("Creating DataBAse SinpleKvsClient, ConnectionException", ex); + // throw new DatabaseExecutionException("Creating DataBAse SinpleKvsClient, ConnectionException", ex); + throw new DatabaseExecutionException(String.format("DatabaseExecutionException " + ex.getMessage() + Arrays.toString(ex.getStackTrace()), + dbKvsCom.serialize().asString()), ex); } } @Override public String createTable(String tableName) throws DatabaseExecutionException { + CreateTableKvsCommand tbKvsCom = new CreateTableKvsCommand(dbName, tableName); try { - CreateTableKvsCommand tbKvsCom = new CreateTableKvsCommand(dbName, tableName); + // CreateTableKvsCommand tbKvsCom = new CreateTableKvsCommand(dbName, tableName); RespObject obj = connectionSupplier.send(tbKvsCom.getCommandId(), tbKvsCom.serialize()); if (obj.isError()) { throw new DatabaseExecutionException(obj.asString()); } return obj.asString(); } catch (ConnectionException ex) { - throw new DatabaseExecutionException("Creating table SinpleKvsClient, ConnectionException", ex); + // throw new DatabaseExecutionException("Creating table SinpleKvsClient, ConnectionException", ex); + throw new DatabaseExecutionException(String.format("DatabaseExecutionException " + ex.getMessage() + Arrays.toString(ex.getStackTrace()), + tbKvsCom.serialize().asString()), ex); } } @Override public String get(String tableName, String key) throws DatabaseExecutionException { + GetKvsCommand getKvsCom = new GetKvsCommand(dbName, tableName, key); try { - GetKvsCommand getKvsCom = new GetKvsCommand(dbName, tableName, key); + // GetKvsCommand getKvsCom = new GetKvsCommand(dbName, tableName, key); RespObject obj = connectionSupplier.send(getKvsCom.getCommandId(), getKvsCom.serialize()); if (obj.isError()) { throw new DatabaseExecutionException(obj.asString()); } return obj.asString(); } catch (ConnectionException ex) { - throw new DatabaseExecutionException("getting SinpleKvsClient, ConnectionException", ex); + // throw new DatabaseExecutionException("getting SinpleKvsClient, ConnectionException", ex); + throw new DatabaseExecutionException(String.format("DatabaseExecutionException " + ex.getMessage() + Arrays.toString(ex.getStackTrace()), + getKvsCom.serialize().asString()), ex); } } @Override public String set(String tableName, String key, String value) throws DatabaseExecutionException { + SetKvsCommand setKvsCom = new SetKvsCommand(dbName, tableName, key, value); try { - SetKvsCommand setKvsCom = new SetKvsCommand(dbName, tableName, key, value); + // SetKvsCommand setKvsCom = new SetKvsCommand(dbName, tableName, key, value); RespObject obj = connectionSupplier.send(setKvsCom.getCommandId(), setKvsCom.serialize()); if (obj.isError()) { throw new DatabaseExecutionException(obj.asString()); } return obj.asString(); } catch (ConnectionException ex) { - throw new DatabaseExecutionException("setting SinpleKvsClient, ConnectionException", ex); + // throw new DatabaseExecutionException("setting SinpleKvsClient, ConnectionException", ex); + throw new DatabaseExecutionException(String.format("DatabaseExecutionException " + ex.getMessage() + Arrays.toString(ex.getStackTrace()), + setKvsCom.serialize().asString()), ex); } } @Override public String delete(String tableName, String key) throws DatabaseExecutionException { + DeleteKvsCommand delKvsCom = new DeleteKvsCommand(dbName, tableName, key); try { - DeleteKvsCommand delKvsCom = new DeleteKvsCommand(dbName, tableName, key); + // DeleteKvsCommand delKvsCom = new DeleteKvsCommand(dbName, tableName, key); RespObject obj = connectionSupplier.send(delKvsCom.getCommandId(), delKvsCom.serialize()); if (obj.isError()) { throw new DatabaseExecutionException(obj.asString()); } return obj.asString(); } catch (ConnectionException ex) { - throw new DatabaseExecutionException("Deleting SinpleKvsClient, ConnectionException", ex); +// throw new DatabaseExecutionException("Deleting SinpleKvsClient, ConnectionException", ex); + throw new DatabaseExecutionException(String.format("DatabaseExecutionException " + ex.getMessage() + Arrays.toString(ex.getStackTrace()), + delKvsCom.serialize().asString()), ex); } } } \ No newline at end of file From 2868ad4468b8e0d9c53b353e753e9a9789532ac4 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 14:28:16 +0300 Subject: [PATCH 315/378] try --- .../itmo/java/client/connection/SocketKvsConnection.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index 77b62d8c..104c7ae7 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -44,9 +44,9 @@ public synchronized RespObject send(int commandId, RespArray command) throws Con respWriter.write(command); RespReader respReader = new RespReader(socket.getInputStream()); RespObject respObject = respReader.readObject(); - if (respObject.isError()) { - throw new ConnectionException("Response error"); - } +// if (respObject.isError()) { +// throw new ConnectionException("Response error"); +// } return respObject; } catch (IOException e) { close(); From 034a86d84b6f1c903a6c245d905144e90230a149 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 14:48:18 +0300 Subject: [PATCH 316/378] add success and error DatavaseCommandResult --- .../console/impl/CreateDatabaseCommand.java | 2 +- .../console/impl/CreateTableCommand.java | 5 +++-- .../basics/console/impl/DeleteKeyCommand.java | 21 ++++++++++++++----- .../basics/console/impl/GetKeyCommand.java | 10 ++++----- .../basics/console/impl/SetKeyCommand.java | 10 +++++---- 5 files changed, 31 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java index 9cc7ee89..b1f7e774 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java @@ -56,7 +56,7 @@ public DatabaseCommandResult execute() { environment.addDatabase(dbfactory.createNonExistent(dbName, environment.getWorkingPath())); return DatabaseCommandResult.success(("Success add " + dbName).getBytes(StandardCharsets.UTF_8)); } catch (DatabaseException ex) { - return new FailedDatabaseCommandResult(ex.getMessage()); + return DatabaseCommandResult.error("Create db com"); } } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java index 2bacaf78..f855ea21 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java @@ -61,9 +61,10 @@ public DatabaseCommandResult execute() { throw new DatabaseException("We dont have" + dbName); } dataBase.get().createTableIfNotExists(tbName); - return DatabaseCommandResult.success(("Success add " + dbName + tbName).getBytes(StandardCharsets.UTF_8)); +// return DatabaseCommandResult.success(("Success add " + dbName + tbName).getBytes(StandardCharsets.UTF_8)); } catch (DatabaseException ex) { - return new FailedDatabaseCommandResult(ex.getMessage()); + return DatabaseCommandResult.error("Error cr table com"); } + return DatabaseCommandResult.success(("Succes").getBytes(StandardCharsets.UTF_8)); } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java index acbafaf4..17b90bbf 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java @@ -21,6 +21,10 @@ public class DeleteKeyCommand implements DatabaseCommand { private final ExecutionEnvironment environment; private final List commandargs; private static final int numberOfAgrguments = 5; + private final String tbName; + private final String key; + private final String dbName; + /** * Создает команду. @@ -39,6 +43,9 @@ public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { } environment = env; commandargs = comArgs; + dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); } /** @@ -49,15 +56,15 @@ public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { @Override public DatabaseCommandResult execute() { try { - String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); +// String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); if (dbName == null) { throw new DatabaseException("Why dbname is null?"); } - String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); +// String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); if (tbName == null) { throw new DatabaseException("Why tbName is null?"); } - String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); + // String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); if (key == null) { throw new DatabaseException("Why key is null?"); } @@ -65,10 +72,14 @@ public DatabaseCommandResult execute() { if (dataBase.isEmpty()) { throw new DatabaseException("We dont have" + dbName); } + Optional value = dataBase.get().read(tbName,key); + if (value.isEmpty()) { + return DatabaseCommandResult.error("Error deleting"); + } dataBase.get().delete(tbName, key); - return DatabaseCommandResult.success(("Success del " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); + return DatabaseCommandResult.success(value.get()); } catch (DatabaseException ex) { - return new FailedDatabaseCommandResult(ex.getMessage()); + return DatabaseCommandResult.error("Error in exucute "); } } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java index 87e4e844..eadc147a 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java @@ -64,12 +64,12 @@ public DatabaseCommandResult execute() { throw new DatabaseException("We dont have" + dbName); } Optional value = dataBase.get().read(tbName, key); - if (value.isEmpty()) { - throw new DatabaseException("We dont have" + dbName + tbName + key); - } - return DatabaseCommandResult.success(value.get()); +// if (value.isEmpty()) { +// throw new DatabaseException("We dont have" + dbName + tbName + key); +// } + return DatabaseCommandResult.success(value.orElse(null)); } catch (DatabaseException ex) { - return new FailedDatabaseCommandResult(ex.getMessage()); + return DatabaseCommandResult.error("Get key error"); } } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java index 2b6b09ec..2bd47bcd 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java @@ -21,6 +21,7 @@ public class SetKeyCommand implements DatabaseCommand { private final ExecutionEnvironment environment; private final List commandargs; private static final int numberOfAgrguments = 6; + private final String value; /** * Создает команду. @@ -38,6 +39,7 @@ public SetKeyCommand(ExecutionEnvironment env, List comArgs) { } environment = env; commandargs = comArgs; + value = comArgs.get(DatabaseCommandArgPositions.VALUE.getPositionIndex()).asString(); } /** @@ -64,11 +66,11 @@ public DatabaseCommandResult execute() { if (dataBase.isEmpty()) { throw new DatabaseException("We dont have" + dbName); } - byte[] value = commandargs.get(DatabaseCommandArgPositions.VALUE.getPositionIndex()).asString().getBytes(StandardCharsets.UTF_8); - dataBase.get().write(tbName, key, value); - return DatabaseCommandResult.success(("Success add key " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); + Optional previous = dataBase.get().read(tbName,key); + dataBase.get().write(tbName, key, value.getBytes(StandardCharsets.UTF_8)); + return DatabaseCommandResult.success(previous.orElse(null)); } catch (DatabaseException ex) { - return new FailedDatabaseCommandResult(ex.getMessage()); + return DatabaseCommandResult.error("Error while setting"); } } } \ No newline at end of file From ce244aa342097348e98847e8f24274932d7cb72b Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 14:55:42 +0300 Subject: [PATCH 317/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../console/impl/CreateDatabaseCommand.java | 2 +- .../console/impl/CreateTableCommand.java | 5 ++--- .../basics/console/impl/DeleteKeyCommand.java | 21 +++++-------------- .../basics/console/impl/GetKeyCommand.java | 8 +++---- 4 files changed, 12 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java index b1f7e774..9cc7ee89 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java @@ -56,7 +56,7 @@ public DatabaseCommandResult execute() { environment.addDatabase(dbfactory.createNonExistent(dbName, environment.getWorkingPath())); return DatabaseCommandResult.success(("Success add " + dbName).getBytes(StandardCharsets.UTF_8)); } catch (DatabaseException ex) { - return DatabaseCommandResult.error("Create db com"); + return new FailedDatabaseCommandResult(ex.getMessage()); } } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java index f855ea21..2bacaf78 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java @@ -61,10 +61,9 @@ public DatabaseCommandResult execute() { throw new DatabaseException("We dont have" + dbName); } dataBase.get().createTableIfNotExists(tbName); -// return DatabaseCommandResult.success(("Success add " + dbName + tbName).getBytes(StandardCharsets.UTF_8)); + return DatabaseCommandResult.success(("Success add " + dbName + tbName).getBytes(StandardCharsets.UTF_8)); } catch (DatabaseException ex) { - return DatabaseCommandResult.error("Error cr table com"); + return new FailedDatabaseCommandResult(ex.getMessage()); } - return DatabaseCommandResult.success(("Succes").getBytes(StandardCharsets.UTF_8)); } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java index 17b90bbf..acbafaf4 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java @@ -21,10 +21,6 @@ public class DeleteKeyCommand implements DatabaseCommand { private final ExecutionEnvironment environment; private final List commandargs; private static final int numberOfAgrguments = 5; - private final String tbName; - private final String key; - private final String dbName; - /** * Создает команду. @@ -43,9 +39,6 @@ public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { } environment = env; commandargs = comArgs; - dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); - key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); } /** @@ -56,15 +49,15 @@ public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { @Override public DatabaseCommandResult execute() { try { -// String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); if (dbName == null) { throw new DatabaseException("Why dbname is null?"); } -// String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); if (tbName == null) { throw new DatabaseException("Why tbName is null?"); } - // String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); + String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); if (key == null) { throw new DatabaseException("Why key is null?"); } @@ -72,14 +65,10 @@ public DatabaseCommandResult execute() { if (dataBase.isEmpty()) { throw new DatabaseException("We dont have" + dbName); } - Optional value = dataBase.get().read(tbName,key); - if (value.isEmpty()) { - return DatabaseCommandResult.error("Error deleting"); - } dataBase.get().delete(tbName, key); - return DatabaseCommandResult.success(value.get()); + return DatabaseCommandResult.success(("Success del " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); } catch (DatabaseException ex) { - return DatabaseCommandResult.error("Error in exucute "); + return new FailedDatabaseCommandResult(ex.getMessage()); } } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java index eadc147a..72028bd9 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java @@ -64,12 +64,12 @@ public DatabaseCommandResult execute() { throw new DatabaseException("We dont have" + dbName); } Optional value = dataBase.get().read(tbName, key); -// if (value.isEmpty()) { -// throw new DatabaseException("We dont have" + dbName + tbName + key); -// } + if (value.isEmpty()) { + throw new DatabaseException("We dont have" + dbName + tbName + key); + } return DatabaseCommandResult.success(value.orElse(null)); } catch (DatabaseException ex) { - return DatabaseCommandResult.error("Get key error"); + return new FailedDatabaseCommandResult(ex.getMessage()); } } } \ No newline at end of file From 51642148d05e44a40552fd0ad160a17448b33927 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 14:57:46 +0300 Subject: [PATCH 318/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../itmo/java/basics/console/impl/SetKeyCommand.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java index 2bd47bcd..2b6b09ec 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java @@ -21,7 +21,6 @@ public class SetKeyCommand implements DatabaseCommand { private final ExecutionEnvironment environment; private final List commandargs; private static final int numberOfAgrguments = 6; - private final String value; /** * Создает команду. @@ -39,7 +38,6 @@ public SetKeyCommand(ExecutionEnvironment env, List comArgs) { } environment = env; commandargs = comArgs; - value = comArgs.get(DatabaseCommandArgPositions.VALUE.getPositionIndex()).asString(); } /** @@ -66,11 +64,11 @@ public DatabaseCommandResult execute() { if (dataBase.isEmpty()) { throw new DatabaseException("We dont have" + dbName); } - Optional previous = dataBase.get().read(tbName,key); - dataBase.get().write(tbName, key, value.getBytes(StandardCharsets.UTF_8)); - return DatabaseCommandResult.success(previous.orElse(null)); + byte[] value = commandargs.get(DatabaseCommandArgPositions.VALUE.getPositionIndex()).asString().getBytes(StandardCharsets.UTF_8); + dataBase.get().write(tbName, key, value); + return DatabaseCommandResult.success(("Success add key " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); } catch (DatabaseException ex) { - return DatabaseCommandResult.error("Error while setting"); + return new FailedDatabaseCommandResult(ex.getMessage()); } } } \ No newline at end of file From b18a50022f369e91f19c4bc64b140b9f0427ee56 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 15:06:16 +0300 Subject: [PATCH 319/378] - value.isEmpty --- .../com/itmo/java/basics/console/impl/GetKeyCommand.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java index 72028bd9..a6997562 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java @@ -64,9 +64,9 @@ public DatabaseCommandResult execute() { throw new DatabaseException("We dont have" + dbName); } Optional value = dataBase.get().read(tbName, key); - if (value.isEmpty()) { - throw new DatabaseException("We dont have" + dbName + tbName + key); - } + // if (value.isEmpty()) { + // throw new DatabaseException("We dont have" + dbName + tbName + key); + // } return DatabaseCommandResult.success(value.orElse(null)); } catch (DatabaseException ex) { return new FailedDatabaseCommandResult(ex.getMessage()); From 1fa3e975d8404e5eb9d25df4258eb62be4e31b0b Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 15:14:51 +0300 Subject: [PATCH 320/378] value not found --- .../com/itmo/java/basics/console/impl/DeleteKeyCommand.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java index acbafaf4..28b07520 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java @@ -65,6 +65,10 @@ public DatabaseCommandResult execute() { if (dataBase.isEmpty()) { throw new DatabaseException("We dont have" + dbName); } + Optional previous = dataBase.get().read(tbName,key); + if (previous.isEmpty()) { + return DatabaseCommandResult.error("Value not found"); + } dataBase.get().delete(tbName, key); return DatabaseCommandResult.success(("Success del " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); } catch (DatabaseException ex) { From edbe8144189691ddee6a405ffc0a857111bb547c Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 15:26:57 +0300 Subject: [PATCH 321/378] DaleteKey --- .../basics/console/impl/DeleteKeyCommand.java | 38 ++++++++----------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java index 28b07520..7a9b23ce 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java @@ -21,6 +21,9 @@ public class DeleteKeyCommand implements DatabaseCommand { private final ExecutionEnvironment environment; private final List commandargs; private static final int numberOfAgrguments = 5; + private final String databaseName; + private final String tableName; + private final String key; /** * Создает команду. @@ -39,6 +42,9 @@ public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { } environment = env; commandargs = comArgs; + this.databaseName = comArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + this.tableName = comArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + this.key = comArgs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); } /** @@ -49,30 +55,18 @@ public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { @Override public DatabaseCommandResult execute() { try { - String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - if (dbName == null) { - throw new DatabaseException("Why dbname is null?"); + Optional database = environment.getDatabase(databaseName); + if (database.isEmpty()){ + return DatabaseCommandResult.error("Not found database " + databaseName); } - String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); - if (tbName == null) { - throw new DatabaseException("Why tbName is null?"); + Optional value = database.get().read(tableName, key); + if (value.isEmpty()){ + return DatabaseCommandResult.error("Value with key " + key + " in database " + databaseName + " not found"); } - String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); - if (key == null) { - throw new DatabaseException("Why key is null?"); - } - Optional dataBase = environment.getDatabase(dbName); - if (dataBase.isEmpty()) { - throw new DatabaseException("We dont have" + dbName); - } - Optional previous = dataBase.get().read(tbName,key); - if (previous.isEmpty()) { - return DatabaseCommandResult.error("Value not found"); - } - dataBase.get().delete(tbName, key); - return DatabaseCommandResult.success(("Success del " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); - } catch (DatabaseException ex) { - return new FailedDatabaseCommandResult(ex.getMessage()); + database.get().delete(tableName, key); + return DatabaseCommandResult.success(value.get()); + } catch (DatabaseException e){ + return DatabaseCommandResult.error("DatabaseException when try to delete value by key " + key + " in table " + tableName); } } } \ No newline at end of file From 26858b9656840269a37baceafc432bc4e77f9580 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 16:14:59 +0300 Subject: [PATCH 322/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82=20consol?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basics/console/impl/DeleteKeyCommand.java | 34 ++++++++++--------- .../basics/console/impl/GetKeyCommand.java | 8 ++--- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java index 7a9b23ce..acbafaf4 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java @@ -21,9 +21,6 @@ public class DeleteKeyCommand implements DatabaseCommand { private final ExecutionEnvironment environment; private final List commandargs; private static final int numberOfAgrguments = 5; - private final String databaseName; - private final String tableName; - private final String key; /** * Создает команду. @@ -42,9 +39,6 @@ public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { } environment = env; commandargs = comArgs; - this.databaseName = comArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - this.tableName = comArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); - this.key = comArgs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); } /** @@ -55,18 +49,26 @@ public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { @Override public DatabaseCommandResult execute() { try { - Optional database = environment.getDatabase(databaseName); - if (database.isEmpty()){ - return DatabaseCommandResult.error("Not found database " + databaseName); + String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + if (dbName == null) { + throw new DatabaseException("Why dbname is null?"); } - Optional value = database.get().read(tableName, key); - if (value.isEmpty()){ - return DatabaseCommandResult.error("Value with key " + key + " in database " + databaseName + " not found"); + String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + if (tbName == null) { + throw new DatabaseException("Why tbName is null?"); } - database.get().delete(tableName, key); - return DatabaseCommandResult.success(value.get()); - } catch (DatabaseException e){ - return DatabaseCommandResult.error("DatabaseException when try to delete value by key " + key + " in table " + tableName); + String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); + if (key == null) { + throw new DatabaseException("Why key is null?"); + } + Optional dataBase = environment.getDatabase(dbName); + if (dataBase.isEmpty()) { + throw new DatabaseException("We dont have" + dbName); + } + dataBase.get().delete(tbName, key); + return DatabaseCommandResult.success(("Success del " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); + } catch (DatabaseException ex) { + return new FailedDatabaseCommandResult(ex.getMessage()); } } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java index a6997562..87e4e844 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java @@ -64,10 +64,10 @@ public DatabaseCommandResult execute() { throw new DatabaseException("We dont have" + dbName); } Optional value = dataBase.get().read(tbName, key); - // if (value.isEmpty()) { - // throw new DatabaseException("We dont have" + dbName + tbName + key); - // } - return DatabaseCommandResult.success(value.orElse(null)); + if (value.isEmpty()) { + throw new DatabaseException("We dont have" + dbName + tbName + key); + } + return DatabaseCommandResult.success(value.get()); } catch (DatabaseException ex) { return new FailedDatabaseCommandResult(ex.getMessage()); } From d9f3a50236c68e453fb2b9de301b3cf6ae23462a Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 16:38:54 +0300 Subject: [PATCH 323/378] try fix DeleteKeyCommand --- .../com/itmo/java/basics/console/impl/DeleteKeyCommand.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java index acbafaf4..f24d211b 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java @@ -65,6 +65,10 @@ public DatabaseCommandResult execute() { if (dataBase.isEmpty()) { throw new DatabaseException("We dont have" + dbName); } + Optional previous = dataBase.get().read(tbName,key); + if (previous.isEmpty()) { + return DatabaseCommandResult.error("Error deleteKeyCommand"); + } dataBase.get().delete(tbName, key); return DatabaseCommandResult.success(("Success del " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); } catch (DatabaseException ex) { From d36144742a66aa9dbe2e7d8d4eb7ed8eded6efab Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 16:41:14 +0300 Subject: [PATCH 324/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82=20del?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basics/console/impl/DeleteKeyCommand.java | 62 +++++++------------ 1 file changed, 23 insertions(+), 39 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java index f24d211b..7669af72 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java @@ -8,8 +8,6 @@ import com.itmo.java.basics.logic.Database; import com.itmo.java.protocol.model.RespObject; -import java.io.IOException; -import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Optional; @@ -17,28 +15,26 @@ * Команда для создания удаления значения по ключу */ public class DeleteKeyCommand implements DatabaseCommand { - - private final ExecutionEnvironment environment; - private final List commandargs; - private static final int numberOfAgrguments = 5; + private final ExecutionEnvironment env; + private final String databaseName; + private final String tableName; + private final String key; /** * Создает команду. *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * - * @param env env - * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. - * Id команды, имя команды, имя бд, таблицы, ключ + * @param env env + * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * Id команды, имя команды, имя бд, таблицы, ключ * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { - - if (comArgs.size() != numberOfAgrguments) { - throw new IllegalArgumentException("Why " + comArgs.size() + "!= 5 , in CreateTableCommand"); - } - environment = env; - commandargs = comArgs; + public DeleteKeyCommand(ExecutionEnvironment env, List commandArgs) { + this.env = env; + this.databaseName = commandArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + this.tableName = commandArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + this.key = commandArgs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); } /** @@ -49,30 +45,18 @@ public DeleteKeyCommand(ExecutionEnvironment env, List comArgs) { @Override public DatabaseCommandResult execute() { try { - String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - if (dbName == null) { - throw new DatabaseException("Why dbname is null?"); - } - String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); - if (tbName == null) { - throw new DatabaseException("Why tbName is null?"); - } - String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); - if (key == null) { - throw new DatabaseException("Why key is null?"); - } - Optional dataBase = environment.getDatabase(dbName); - if (dataBase.isEmpty()) { - throw new DatabaseException("We dont have" + dbName); + Optional database = env.getDatabase(databaseName); + if (database.isEmpty()){ + return DatabaseCommandResult.error("Not found database " + databaseName); } - Optional previous = dataBase.get().read(tbName,key); - if (previous.isEmpty()) { - return DatabaseCommandResult.error("Error deleteKeyCommand"); + Optional value = database.get().read(tableName, key); + if (value.isEmpty()){ + return DatabaseCommandResult.error("Value with key " + key + " in database " + databaseName + " not found"); } - dataBase.get().delete(tbName, key); - return DatabaseCommandResult.success(("Success del " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); - } catch (DatabaseException ex) { - return new FailedDatabaseCommandResult(ex.getMessage()); + database.get().delete(tableName, key); + return DatabaseCommandResult.success(value.get()); + } catch (DatabaseException e){ + return DatabaseCommandResult.error("DatabaseException when try to delete value by key " + key + " in table " + tableName); } } -} \ No newline at end of file +} From 602933a97997ee401f726cbde0038408a8bc5d25 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 16:45:11 +0300 Subject: [PATCH 325/378] add some new assert for fixing --- .../basics/console/impl/CreateDatabaseCommand.java | 4 ++-- .../java/basics/console/impl/CreateTableCommand.java | 8 ++++---- .../java/basics/console/impl/DeleteKeyCommand.java | 6 +++--- .../itmo/java/basics/console/impl/GetKeyCommand.java | 12 ++++++------ .../itmo/java/basics/console/impl/SetKeyCommand.java | 12 ++++++------ 5 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java index 9cc7ee89..72df68b1 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java @@ -51,10 +51,10 @@ public DatabaseCommandResult execute() { try { String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); if (dbName == null) { - throw new DatabaseException("Why dbname is null? "); + throw new DatabaseException("Why dbname is null? CreateDatabaseCommand "); } environment.addDatabase(dbfactory.createNonExistent(dbName, environment.getWorkingPath())); - return DatabaseCommandResult.success(("Success add " + dbName).getBytes(StandardCharsets.UTF_8)); + return DatabaseCommandResult.success(("Success add CreateDatabaseCommand" + dbName).getBytes(StandardCharsets.UTF_8)); } catch (DatabaseException ex) { return new FailedDatabaseCommandResult(ex.getMessage()); } diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java index 2bacaf78..a6c6a7e8 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java @@ -50,18 +50,18 @@ public DatabaseCommandResult execute() { try { String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); if (dbName == null) { - throw new DatabaseException("Why dbname is null?"); + throw new DatabaseException("Why dbname is null? CreateTableCommand"); } String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); if (tbName == null) { - throw new DatabaseException("Why tbName is null?"); + throw new DatabaseException("Why tbName is null? CreateTableCommand"); } Optional dataBase = environment.getDatabase(dbName); if (dataBase.isEmpty()) { - throw new DatabaseException("We dont have" + dbName); + throw new DatabaseException("We dont have CreateTableCommand" + dbName); } dataBase.get().createTableIfNotExists(tbName); - return DatabaseCommandResult.success(("Success add " + dbName + tbName).getBytes(StandardCharsets.UTF_8)); + return DatabaseCommandResult.success(("Success add CreateTableCommand " + dbName + tbName).getBytes(StandardCharsets.UTF_8)); } catch (DatabaseException ex) { return new FailedDatabaseCommandResult(ex.getMessage()); } diff --git a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java index 7669af72..c1c0ff93 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java @@ -47,16 +47,16 @@ public DatabaseCommandResult execute() { try { Optional database = env.getDatabase(databaseName); if (database.isEmpty()){ - return DatabaseCommandResult.error("Not found database " + databaseName); + return DatabaseCommandResult.error("Not found database DeleteKeyCommand " + databaseName); } Optional value = database.get().read(tableName, key); if (value.isEmpty()){ - return DatabaseCommandResult.error("Value with key " + key + " in database " + databaseName + " not found"); + return DatabaseCommandResult.error("Value with key DeleteKeyCommand " + key + " in database " + databaseName + " not found"); } database.get().delete(tableName, key); return DatabaseCommandResult.success(value.get()); } catch (DatabaseException e){ - return DatabaseCommandResult.error("DatabaseException when try to delete value by key " + key + " in table " + tableName); + return DatabaseCommandResult.error("DatabaseException when try to delete value by key DeleteKeyCommand" + key + " in table " + tableName); } } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java index 87e4e844..3f88c0f4 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java @@ -33,7 +33,7 @@ public class GetKeyCommand implements DatabaseCommand { */ public GetKeyCommand(ExecutionEnvironment env, List comArgs) { if (comArgs.size() != numberOfAgrguments) { - throw new IllegalArgumentException("Why " + comArgs.size() + "!= 5 , in CreateTableCommand"); + throw new IllegalArgumentException("Why " + comArgs.size() + "!= 5 , in GetKeyCommand"); } environment = env; commandargs = comArgs; @@ -49,23 +49,23 @@ public DatabaseCommandResult execute() { try { String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); if (dbName == null) { - throw new DatabaseException("Why dbname is null?"); + throw new DatabaseException("Why dbname is null? GetKeyCommand"); } String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); if (tbName == null) { - throw new DatabaseException("Why tbName is null?"); + throw new DatabaseException("Why tbName is null? GetKeyCommand"); } String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); if (key == null) { - throw new DatabaseException("Why key is null?"); + throw new DatabaseException("Why key is null? GetKeyCommand"); } Optional dataBase = environment.getDatabase(dbName); if (dataBase.isEmpty()) { - throw new DatabaseException("We dont have" + dbName); + throw new DatabaseException("We dont have GetKeyCommand" + dbName); } Optional value = dataBase.get().read(tbName, key); if (value.isEmpty()) { - throw new DatabaseException("We dont have" + dbName + tbName + key); + throw new DatabaseException("We dont have GetKeyCommand" + dbName + tbName + key); } return DatabaseCommandResult.success(value.get()); } catch (DatabaseException ex) { diff --git a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java index 2b6b09ec..0388d3e6 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java @@ -34,7 +34,7 @@ public class SetKeyCommand implements DatabaseCommand { */ public SetKeyCommand(ExecutionEnvironment env, List comArgs) { if (comArgs.size() != numberOfAgrguments) { - throw new IllegalArgumentException("Why " + comArgs.size() + "!= 5 , in CreateTableCommand"); + throw new IllegalArgumentException("Why " + comArgs.size() + "!= 5 , in CreateTableCommand SetKeyCommand"); } environment = env; commandargs = comArgs; @@ -50,23 +50,23 @@ public DatabaseCommandResult execute() { try { String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); if (dbName == null) { - throw new DatabaseException("Why dbname is null?"); + throw new DatabaseException("Why dbname is null SetKeyCommand? "); } String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); if (tbName == null) { - throw new DatabaseException("Why tbName is null?"); + throw new DatabaseException("Why tbName is null SetKeyCommand?"); } String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); if (key == null) { - throw new DatabaseException("Why key is null?"); + throw new DatabaseException("Why key is null? SetKeyCommand"); } Optional dataBase = environment.getDatabase(dbName); if (dataBase.isEmpty()) { - throw new DatabaseException("We dont have" + dbName); + throw new DatabaseException("We dont have SetKeyCommand" + dbName); } byte[] value = commandargs.get(DatabaseCommandArgPositions.VALUE.getPositionIndex()).asString().getBytes(StandardCharsets.UTF_8); dataBase.get().write(tbName, key, value); - return DatabaseCommandResult.success(("Success add key " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); + return DatabaseCommandResult.success(("Success add key SetKeyCommand " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); } catch (DatabaseException ex) { return new FailedDatabaseCommandResult(ex.getMessage()); } From 522890d98271e6c34ba27b29df141d3e4df60464 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 16:53:12 +0300 Subject: [PATCH 326/378] - value is empty in Get Key command --- .../com/itmo/java/basics/console/impl/GetKeyCommand.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java index 3f88c0f4..ec9b42a1 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java @@ -64,9 +64,9 @@ public DatabaseCommandResult execute() { throw new DatabaseException("We dont have GetKeyCommand" + dbName); } Optional value = dataBase.get().read(tbName, key); - if (value.isEmpty()) { - throw new DatabaseException("We dont have GetKeyCommand" + dbName + tbName + key); - } + // if (value.isEmpty()) { + // throw new DatabaseException("We dont have GetKeyCommand" + dbName + tbName + key); + //} return DatabaseCommandResult.success(value.get()); } catch (DatabaseException ex) { return new FailedDatabaseCommandResult(ex.getMessage()); From e3a4bee79e51539bdb5b00d40c8780cff75cbb8b Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 16:55:33 +0300 Subject: [PATCH 327/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82=20socket?= =?UTF-8?q?Kvs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../connection/SocketKvsConnection.java | 41 +++++++++---------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index 104c7ae7..855baf72 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -1,6 +1,5 @@ package com.itmo.java.client.connection; - import com.itmo.java.client.exception.ConnectionException; import com.itmo.java.protocol.RespReader; import com.itmo.java.protocol.RespWriter; @@ -15,19 +14,21 @@ * С помощью {@link RespWriter} и {@link RespReader} читает/пишет в сокет */ public class SocketKvsConnection implements KvsConnection { -// private final int port; -// private final String host; -// private final Socket clientSocket; -// private final RespWriter respWriter; -// private final RespReader respReader; - final ConnectionConfig connectionConfig; - final Socket socket; + private final int port; + private final String host; + private final Socket clientSocket; + private final RespWriter respWriter; + private final RespReader respReader; + public SocketKvsConnection(ConnectionConfig config) { - connectionConfig = config; + this.port = config.getPort(); + this.host = config.getHost(); try { - socket = new Socket(connectionConfig.getHost(),connectionConfig.getPort()); + this.clientSocket = new Socket(host, port); + this.respReader = new RespReader(clientSocket.getInputStream()); + respWriter = new RespWriter(clientSocket.getOutputStream()); } catch (IOException e) { - throw new RuntimeException("Error in const"); + throw new RuntimeException("IOException when try to connect by " + host + " " + port, e); } } @@ -40,17 +41,13 @@ public SocketKvsConnection(ConnectionConfig config) { @Override public synchronized RespObject send(int commandId, RespArray command) throws ConnectionException { try { - RespWriter respWriter = new RespWriter(socket.getOutputStream()); + RespWriter respWriter = new RespWriter(clientSocket.getOutputStream()); respWriter.write(command); - RespReader respReader = new RespReader(socket.getInputStream()); - RespObject respObject = respReader.readObject(); -// if (respObject.isError()) { -// throw new ConnectionException("Response error"); -// } - return respObject; + RespReader respReader = new RespReader(clientSocket.getInputStream()); + return respReader.readObject(); } catch (IOException e) { close(); - throw new ConnectionException("IOException when send SocketKvs"); + throw new ConnectionException("IOException when send " + command.asString() + " with " + host + " and port " + port + " ___IOMessage___: " + e.getMessage(), e); } } @@ -60,9 +57,11 @@ public synchronized RespObject send(int commandId, RespArray command) throws Con @Override public void close() { try { - socket.close(); + respWriter.close(); + respReader.close(); + clientSocket.close(); } catch (IOException e) { throw new RuntimeException("IOException when try to close client socket"); } } -} \ No newline at end of file +} From 71ce8cdbf6b9cbecd03fbdb744e60f6d4d3e86d4 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 17:00:50 +0300 Subject: [PATCH 328/378] testing --- .../java/com/itmo/java/protocol/RespReader.java | 2 +- .../java/com/itmo/java/protocol/RespWriter.java | 17 ++++------------- 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index b1e0d479..6f5d8066 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -153,4 +153,4 @@ private byte[] readBytesToEndOfLine() throws IOException { } return bytes; } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/protocol/RespWriter.java b/src/main/java/com/itmo/java/protocol/RespWriter.java index fc21f3e9..fe29dd3a 100644 --- a/src/main/java/com/itmo/java/protocol/RespWriter.java +++ b/src/main/java/com/itmo/java/protocol/RespWriter.java @@ -5,12 +5,11 @@ import java.io.IOException; import java.io.OutputStream; -public class RespWriter implements AutoCloseable{ +public class RespWriter implements AutoCloseable{ private final OutputStream outputStream; public RespWriter(OutputStream os) { - outputStream = os; } @@ -18,19 +17,11 @@ public RespWriter(OutputStream os) { * Записывает в output stream объект */ public void write(RespObject object) throws IOException { - try { - object.write(outputStream); - } catch (IOException ex) { - throw new IOException(ex); - } + object.write(outputStream); } @Override public void close() throws IOException { - try { - outputStream.close(); - } catch (IOException ex) { - throw new IOException(ex); - } + outputStream.close(); } -} \ No newline at end of file +} From 4be101bee67e0b41464666b3af9b1a08492ba2cd Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 17:09:23 +0300 Subject: [PATCH 329/378] try fix input --- .../logic/impl/RemoveDatabaseRecord.java | 21 +++++----- .../basics/logic/impl/SetDatabaseRecord.java | 25 ++++++------ .../basics/logic/io/DatabaseInputStream.java | 16 ++++---- .../com/itmo/java/protocol/RespReader.java | 38 +++++++++++-------- 4 files changed, 52 insertions(+), 48 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java index 6d09b739..dca289ec 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java @@ -2,14 +2,16 @@ import com.itmo.java.basics.logic.WritableDatabaseRecord; -/** - * Запись в БД, означающая удаление значения по ключу - */ public class RemoveDatabaseRecord implements WritableDatabaseRecord { + private static final int SIZE_OF_KEY_SIZE = 4; + private static final int SIZE_OF_VALUE_SIZE = 4; + private static final int VALUE_SIZE = -1; + private static final byte[] VALUE = null; + private int keySize; private byte[] key; - private byte[] value; - public RemoveDatabaseRecord(byte[] key) { + public RemoveDatabaseRecord(int keySize, byte[] key) { + this.keySize = keySize; this.key = key; } @@ -20,12 +22,12 @@ public byte[] getKey() { @Override public byte[] getValue() { - return null; + return VALUE; } @Override public long size() { - return getKeySize() + 4 + 4; + return SIZE_OF_KEY_SIZE + keySize + SIZE_OF_VALUE_SIZE; } @Override @@ -33,14 +35,13 @@ public boolean isValuePresented() { return false; } - @Override public int getKeySize() { - return key.length; + return keySize; } @Override public int getValueSize() { - return -1; + return VALUE_SIZE; } } diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java index 38ced136..307c0beb 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java @@ -2,20 +2,19 @@ import com.itmo.java.basics.logic.WritableDatabaseRecord; -/** - * Запись в БД, означающая добавление значения по ключу - */ public class SetDatabaseRecord implements WritableDatabaseRecord { + private static final int SIZE_OF_KEY_SIZE = 4; + private static final int SIZE_OF_VALUE_SIZE = 4; + private int keySize, valueSize; + private byte[] key, value; - private byte[] key; - private byte[] value; - - public SetDatabaseRecord(byte[] key, byte[] value) { + public SetDatabaseRecord(int keySize, byte[] key, int valueSize, byte[] value) { + this.keySize = keySize; this.key = key; + this.valueSize = valueSize; this.value = value; } - @Override public byte[] getKey() { return key; @@ -28,21 +27,21 @@ public byte[] getValue() { @Override public long size() { - return getKeySize() + getValueSize() + 4 + 4; + return SIZE_OF_KEY_SIZE + keySize + SIZE_OF_VALUE_SIZE + valueSize; } @Override public boolean isValuePresented() { - return true; + return value != null; } @Override public int getKeySize() { - return key.length; + return keySize; } @Override public int getValueSize() { - return value.length; + return valueSize; } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java index 3e3bc895..e18e5ee5 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java @@ -6,6 +6,7 @@ import com.itmo.java.basics.logic.impl.SetDatabaseRecord; import java.io.DataInputStream; +import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.util.Optional; @@ -30,16 +31,13 @@ public Optional readDbUnit() throws IOException { int keySize = readInt(); byte[] key = readNBytes(keySize); int valueSize = readInt(); - - if (valueSize != REMOVED_OBJECT_SIZE) { - byte[] value = readNBytes(valueSize); - Optional result = Optional.of(new SetDatabaseRecord(key, value)); - return result; - } else { - return Optional.of(new RemoveDatabaseRecord(key)); + if (valueSize == REMOVED_OBJECT_SIZE) { + return Optional.of(new RemoveDatabaseRecord(keySize, key)); } - } catch (IOException ex) { + byte[] value = readNBytes(valueSize); + return Optional.of(new SetDatabaseRecord(keySize, key, valueSize, value)); + }catch (EOFException e){ return Optional.empty(); } } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 6f5d8066..68d4dc45 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -36,22 +36,28 @@ public boolean hasArray() throws IOException { * @throws IOException при ошибке чтения */ public RespObject readObject() throws IOException { - int codeInt = reader.read(); - if (codeInt == -1) { - throw new EOFException("InputStream is empty when try to read RespObject"); - } - byte code = (byte) codeInt; - switch (code) { - case RespArray.CODE: - return readArray(); - case RespBulkString.CODE: - return readBulkString(); - case RespCommandId.CODE: - return readCommandId(); - case RespError.CODE: - return readError(); - default: - throw new IOException("Code character is not correct"); + try { + + int codeInt = reader.read(); + if (codeInt == -1) { + throw new EOFException("InputStream is empty when try to read RespObject"); + } + byte code = (byte) codeInt; + switch (code) { + case RespArray.CODE: + return readArray(); + case RespBulkString.CODE: + return readBulkString(); + case RespCommandId.CODE: + return readCommandId(); + case RespError.CODE: + return readError(); + default: + throw new IOException("Code character is not correct"); + + } + } catch(IOException ex) { + throw new RuntimeException("rer"); } } From 03294011107231a838bd189d67043d7b9150cfb5 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 17:09:33 +0300 Subject: [PATCH 330/378] try input --- .../java/basics/logic/impl/SegmentImpl.java | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index cf7cb752..0e153509 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -10,6 +10,7 @@ import com.itmo.java.basics.logic.io.DatabaseInputStream; import com.itmo.java.basics.logic.io.DatabaseOutputStream; +import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.nio.charset.StandardCharsets; @@ -85,20 +86,21 @@ public String getName() { @Override public boolean write(String objectKey, byte[] objectValue) throws IOException { - if (isReadOnly()) { - outStream.close(); return false; } - if (objectValue == null) { - return delete(objectKey); + try (DatabaseOutputStream outputStream = new DatabaseOutputStream(new FileOutputStream(tableRootPath.toString(), true))) { + int writtenBytes; + if (objectValue == null) { + writtenBytes = outputStream.write(new SetDatabaseRecord(objectKey.length(), objectKey.getBytes(StandardCharsets.UTF_8), -1, new byte[]{})); + } else { + writtenBytes = outputStream.write(new SetDatabaseRecord(objectKey.length(), objectKey.getBytes(StandardCharsets.UTF_8), objectValue.length, objectValue)); + } + segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); + segmentSize += writtenBytes; + return true; } - SetDatabaseRecord newSeg = new SetDatabaseRecord(objectKey.getBytes(StandardCharsets.UTF_8), objectValue); - segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); - segmentSize += outStream.write(newSeg); - return true; } - @Override public Optional read(String objectKey) throws IOException { @@ -130,14 +132,14 @@ public boolean isReadOnly() { @Override public boolean delete(String objectKey) throws IOException { - - if (isReadOnly()) { - outStream.close(); + if (segmentIndex.searchForKey(objectKey).isEmpty()) { return false; } - RemoveDatabaseRecord newSeg = new RemoveDatabaseRecord(objectKey.getBytes()); - segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); - segmentSize += outStream.write(newSeg); - return true; + try (DatabaseOutputStream outputStream = new DatabaseOutputStream(new FileOutputStream(tableRootPath.toString(), true))) { + int writtenBytes = outputStream.write(new RemoveDatabaseRecord(objectKey.length(), objectKey.getBytes(StandardCharsets.UTF_8))); + segmentIndex.onIndexedEntityUpdated(objectKey, null); + segmentSize += writtenBytes; + return true; + } } } \ No newline at end of file From c1e71e01d1e2639e2aa02270eac2a93d134cd5f5 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 17:12:35 +0300 Subject: [PATCH 331/378] fix --- src/main/java/com/itmo/java/protocol/RespReader.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 68d4dc45..e788988c 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -36,7 +36,7 @@ public boolean hasArray() throws IOException { * @throws IOException при ошибке чтения */ public RespObject readObject() throws IOException { - try { + // try { int codeInt = reader.read(); if (codeInt == -1) { @@ -56,9 +56,9 @@ public RespObject readObject() throws IOException { throw new IOException("Code character is not correct"); } - } catch(IOException ex) { - throw new RuntimeException("rer"); - } +// } catch(IOException ex) { +// throw new RuntimeException("rer"); +// } } /** From e375edef28282b8e133cd5703bbdecdf5f6c3d5a Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 17:14:02 +0300 Subject: [PATCH 332/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/itmo/java/protocol/RespReader.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index e788988c..68d4dc45 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -36,7 +36,7 @@ public boolean hasArray() throws IOException { * @throws IOException при ошибке чтения */ public RespObject readObject() throws IOException { - // try { + try { int codeInt = reader.read(); if (codeInt == -1) { @@ -56,9 +56,9 @@ public RespObject readObject() throws IOException { throw new IOException("Code character is not correct"); } -// } catch(IOException ex) { -// throw new RuntimeException("rer"); -// } + } catch(IOException ex) { + throw new RuntimeException("rer"); + } } /** From 269d86ea1e205c7e3253e5a9db2d981612c9f111 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 17:22:05 +0300 Subject: [PATCH 333/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82=20RespRe?= =?UTF-8?q?ader?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/itmo/java/protocol/RespReader.java | 182 ++++++++++-------- .../itmo/java/protocol/model/RespArray.java | 5 +- 2 files changed, 105 insertions(+), 82 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 68d4dc45..dcc36317 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -1,14 +1,21 @@ package com.itmo.java.protocol; -import com.itmo.java.protocol.model.*; - -import java.io.*; +import com.itmo.java.protocol.model.RespArray; +import com.itmo.java.protocol.model.RespBulkString; +import com.itmo.java.protocol.model.RespCommandId; +import com.itmo.java.protocol.model.RespError; +import com.itmo.java.protocol.model.RespObject; + +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.List; public class RespReader implements AutoCloseable { - private static final int READ_AHEAD_LIMIT = 3; - private final BufferedReader reader; + private final InputStream is; /** * Специальные символы окончания элемента @@ -17,14 +24,15 @@ public class RespReader implements AutoCloseable { private static final byte LF = '\n'; public RespReader(InputStream is) { - reader = new BufferedReader(new InputStreamReader(is)); + this.is = is; } /** * Есть ли следующий массив в стриме? */ public boolean hasArray() throws IOException { - byte code = (byte) reader.read(); + final byte code = is.readNBytes(1)[0]; + return code == RespArray.CODE; } @@ -36,28 +44,19 @@ public boolean hasArray() throws IOException { * @throws IOException при ошибке чтения */ public RespObject readObject() throws IOException { - try { - - int codeInt = reader.read(); - if (codeInt == -1) { - throw new EOFException("InputStream is empty when try to read RespObject"); - } - byte code = (byte) codeInt; - switch (code) { - case RespArray.CODE: - return readArray(); - case RespBulkString.CODE: - return readBulkString(); - case RespCommandId.CODE: - return readCommandId(); - case RespError.CODE: - return readError(); - default: - throw new IOException("Code character is not correct"); - - } - } catch(IOException ex) { - throw new RuntimeException("rer"); + final byte code = is.readNBytes(1)[0]; + + switch (code) { + case RespError.CODE: + return this.readError(); + case RespBulkString.CODE: + return this.readBulkString(); + case RespArray.CODE: + return this.readArray(); + case RespCommandId.CODE: + return this.readCommandId(); + default: + throw new IOException("Wrong object code"); } } @@ -68,7 +67,38 @@ public RespObject readObject() throws IOException { * @throws IOException при ошибке чтения */ public RespError readError() throws IOException { - return new RespError(readBytesToEndOfLine()); + byte symbol = is.readNBytes(1)[0]; + + final List symbols = new ArrayList<>(); + + boolean isEndOfError = false; + + while (!isEndOfError) { + while (symbol == CR) { + symbol = is.readNBytes(1)[0]; + + if (symbol == LF) { + isEndOfError = true; + } else { + symbols.add(CR); + } + } + + if (!isEndOfError) { + symbols.add(symbol); + symbol = is.readNBytes(1)[0]; + } + } + + final int symbolsCount = symbols.size(); + + final byte[] bytes = new byte[symbolsCount]; + + for (int i = 0; i < symbolsCount; i++) { + bytes[i] = symbols.get(i); + } + + return new RespError(bytes); } /** @@ -78,16 +108,20 @@ public RespError readError() throws IOException { * @throws IOException при ошибке чтения */ public RespBulkString readBulkString() throws IOException { - byte[] stringSizeBytes = readBytesToEndOfLine(); - int stringSize = Integer.parseInt(new String(stringSizeBytes, StandardCharsets.UTF_8)); - if (stringSize == RespBulkString.NULL_STRING_SIZE) { + final byte[] bytes = this.getStringNumberInBytes(); + final int bytesCount = Integer.parseInt(new String(bytes, StandardCharsets.UTF_8)); + + is.readNBytes(1); + + if (bytesCount == RespBulkString.NULL_STRING_SIZE) { return RespBulkString.NULL_STRING; } - byte[] stringData = readBytesToEndOfLine(); - if (stringData.length != stringSize) { - throw new IOException("String length is not equal with StringBulk size"); - } - return new RespBulkString(stringData); + + final byte[] data = is.readNBytes(bytesCount); + + is.readNBytes(2); + + return new RespBulkString(data); } /** @@ -97,13 +131,18 @@ public RespBulkString readBulkString() throws IOException { * @throws IOException при ошибке чтения */ public RespArray readArray() throws IOException { - byte[] arraySizeBytes = readBytesToEndOfLine(); - int arraySize = Integer.parseInt(new String(arraySizeBytes, StandardCharsets.UTF_8)); - RespObject[] respObjectArray = new RespObject[arraySize]; - for (int i = 0; i < arraySize; i++) { - respObjectArray[i] = readObject(); + final byte[] bytes = this.getStringNumberInBytes(); + final int elementsCount = Integer.parseInt(new String(bytes, StandardCharsets.UTF_8)); + + final RespObject[] objects = new RespObject[elementsCount]; + + is.readNBytes(1); + + for (int i = 0; i < elementsCount; i++) { + objects[i] = this.readObject(); } - return new RespArray(respObjectArray); + + return new RespArray(objects); } /** @@ -113,50 +152,37 @@ public RespArray readArray() throws IOException { * @throws IOException при ошибке чтения */ public RespCommandId readCommandId() throws IOException { - byte[] idBytes = readBytesToEndOfLine(); - if (idBytes.length != 4) { - throw new IOException("Command Id is not integer"); - } - return new RespCommandId(bytesToInt(idBytes)); + final int commandId = ByteBuffer.wrap(is.readNBytes(4)).getInt(); + + is.readNBytes(2); + + return new RespCommandId(commandId); } @Override public void close() throws IOException { - reader.close(); + is.close(); } - private static int bytesToInt(byte[] bytes) { - return (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | (bytes[3]); - } + private byte[] getStringNumberInBytes() throws IOException { + byte symbol = is.readNBytes(1)[0]; - private byte[] readBytesToEndOfLine() throws IOException { - ArrayList message = new ArrayList<>(); - while (true) { - int currentByte = reader.read(); - if (currentByte == -1) { - throw new EOFException("Stream is empty when try to read all bytes before '\\r\\n'"); - } - if (currentByte == CR) { - reader.mark(READ_AHEAD_LIMIT); - int nextByte = reader.read(); - if (nextByte == -1) { - throw new EOFException("Stream is empty when try to read all bytes before '\\r\\n'"); - } - if (nextByte == LF){ - reader.reset(); - reader.read(); - break; - }else { - reader.reset(); - } - } - message.add((byte) currentByte); + final List symbols = new ArrayList<>(); + + while (symbol != CR) { + symbols.add(symbol); + symbol = is.readNBytes(1)[0]; } - byte[] bytes = new byte[message.size()]; - for (int i = 0; i < message.size(); i++) { - bytes[i] = message.get(i); + + final int symbolsCount = symbols.size(); + + final byte[] bytes = new byte[symbolsCount]; + + for (int i = 0; i < symbolsCount; i++) { + bytes[i] = symbols.get(i); } + return bytes; } } diff --git a/src/main/java/com/itmo/java/protocol/model/RespArray.java b/src/main/java/com/itmo/java/protocol/model/RespArray.java index 4616df11..f0eb3db9 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespArray.java +++ b/src/main/java/com/itmo/java/protocol/model/RespArray.java @@ -44,16 +44,13 @@ public String asString() { @Override public void write(OutputStream output) throws IOException { - try { output.write(CODE); output.write(Integer.toString(objects.size()).getBytes(StandardCharsets.UTF_8)); output.write(CRLF); + output.flush(); for (RespObject obj : objects) { obj.write(output); } - } catch (IOException ex){ - throw new IOException(ex); - } } public List getObjects() { From 7a041f89ed16c00eb2d007cefdc721c1b2c473f3 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 17:23:47 +0300 Subject: [PATCH 334/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/itmo/java/protocol/RespReader.java | 184 ++++++++---------- 1 file changed, 79 insertions(+), 105 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index dcc36317..072d880b 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -1,21 +1,14 @@ package com.itmo.java.protocol; -import com.itmo.java.protocol.model.RespArray; -import com.itmo.java.protocol.model.RespBulkString; -import com.itmo.java.protocol.model.RespCommandId; -import com.itmo.java.protocol.model.RespError; -import com.itmo.java.protocol.model.RespObject; - -import java.io.EOFException; -import java.io.IOException; -import java.io.InputStream; -import java.nio.ByteBuffer; +import com.itmo.java.protocol.model.*; + +import java.io.*; import java.nio.charset.StandardCharsets; import java.util.ArrayList; -import java.util.List; public class RespReader implements AutoCloseable { - private final InputStream is; + private static final int READ_AHEAD_LIMIT = 3; + private final BufferedReader reader; /** * Специальные символы окончания элемента @@ -24,15 +17,14 @@ public class RespReader implements AutoCloseable { private static final byte LF = '\n'; public RespReader(InputStream is) { - this.is = is; + reader = new BufferedReader(new InputStreamReader(is)); } /** * Есть ли следующий массив в стриме? */ public boolean hasArray() throws IOException { - final byte code = is.readNBytes(1)[0]; - + byte code = (byte) reader.read(); return code == RespArray.CODE; } @@ -44,20 +36,29 @@ public boolean hasArray() throws IOException { * @throws IOException при ошибке чтения */ public RespObject readObject() throws IOException { - final byte code = is.readNBytes(1)[0]; - - switch (code) { - case RespError.CODE: - return this.readError(); - case RespBulkString.CODE: - return this.readBulkString(); - case RespArray.CODE: - return this.readArray(); - case RespCommandId.CODE: - return this.readCommandId(); - default: - throw new IOException("Wrong object code"); - } +// try { + + int codeInt = reader.read(); + if (codeInt == -1) { + throw new EOFException("InputStream is empty when try to read RespObject"); + } + byte code = (byte) codeInt; + switch (code) { + case RespArray.CODE: + return readArray(); + case RespBulkString.CODE: + return readBulkString(); + case RespCommandId.CODE: + return readCommandId(); + case RespError.CODE: + return readError(); + default: + throw new IOException("Code character is not correct"); + + } +// } catch(IOException ex) { +// throw new RuntimeException("rer"); +// } } /** @@ -67,38 +68,7 @@ public RespObject readObject() throws IOException { * @throws IOException при ошибке чтения */ public RespError readError() throws IOException { - byte symbol = is.readNBytes(1)[0]; - - final List symbols = new ArrayList<>(); - - boolean isEndOfError = false; - - while (!isEndOfError) { - while (symbol == CR) { - symbol = is.readNBytes(1)[0]; - - if (symbol == LF) { - isEndOfError = true; - } else { - symbols.add(CR); - } - } - - if (!isEndOfError) { - symbols.add(symbol); - symbol = is.readNBytes(1)[0]; - } - } - - final int symbolsCount = symbols.size(); - - final byte[] bytes = new byte[symbolsCount]; - - for (int i = 0; i < symbolsCount; i++) { - bytes[i] = symbols.get(i); - } - - return new RespError(bytes); + return new RespError(readBytesToEndOfLine()); } /** @@ -108,20 +78,16 @@ public RespError readError() throws IOException { * @throws IOException при ошибке чтения */ public RespBulkString readBulkString() throws IOException { - final byte[] bytes = this.getStringNumberInBytes(); - final int bytesCount = Integer.parseInt(new String(bytes, StandardCharsets.UTF_8)); - - is.readNBytes(1); - - if (bytesCount == RespBulkString.NULL_STRING_SIZE) { + byte[] stringSizeBytes = readBytesToEndOfLine(); + int stringSize = Integer.parseInt(new String(stringSizeBytes, StandardCharsets.UTF_8)); + if (stringSize == RespBulkString.NULL_STRING_SIZE) { return RespBulkString.NULL_STRING; } - - final byte[] data = is.readNBytes(bytesCount); - - is.readNBytes(2); - - return new RespBulkString(data); + byte[] stringData = readBytesToEndOfLine(); + if (stringData.length != stringSize) { + throw new IOException("String length is not equal with StringBulk size"); + } + return new RespBulkString(stringData); } /** @@ -131,18 +97,13 @@ public RespBulkString readBulkString() throws IOException { * @throws IOException при ошибке чтения */ public RespArray readArray() throws IOException { - final byte[] bytes = this.getStringNumberInBytes(); - final int elementsCount = Integer.parseInt(new String(bytes, StandardCharsets.UTF_8)); - - final RespObject[] objects = new RespObject[elementsCount]; - - is.readNBytes(1); - - for (int i = 0; i < elementsCount; i++) { - objects[i] = this.readObject(); + byte[] arraySizeBytes = readBytesToEndOfLine(); + int arraySize = Integer.parseInt(new String(arraySizeBytes, StandardCharsets.UTF_8)); + RespObject[] respObjectArray = new RespObject[arraySize]; + for (int i = 0; i < arraySize; i++) { + respObjectArray[i] = readObject(); } - - return new RespArray(objects); + return new RespArray(respObjectArray); } /** @@ -152,37 +113,50 @@ public RespArray readArray() throws IOException { * @throws IOException при ошибке чтения */ public RespCommandId readCommandId() throws IOException { - final int commandId = ByteBuffer.wrap(is.readNBytes(4)).getInt(); - - is.readNBytes(2); - - return new RespCommandId(commandId); + byte[] idBytes = readBytesToEndOfLine(); + if (idBytes.length != 4) { + throw new IOException("Command Id is not integer"); + } + return new RespCommandId(bytesToInt(idBytes)); } @Override public void close() throws IOException { - is.close(); + reader.close(); } - private byte[] getStringNumberInBytes() throws IOException { - byte symbol = is.readNBytes(1)[0]; - - final List symbols = new ArrayList<>(); + private static int bytesToInt(byte[] bytes) { + return (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | (bytes[3]); + } - while (symbol != CR) { - symbols.add(symbol); - symbol = is.readNBytes(1)[0]; + private byte[] readBytesToEndOfLine() throws IOException { + ArrayList message = new ArrayList<>(); + while (true) { + int currentByte = reader.read(); + if (currentByte == -1) { + throw new EOFException("Stream is empty when try to read all bytes before '\\r\\n'"); + } + if (currentByte == CR) { + reader.mark(READ_AHEAD_LIMIT); + int nextByte = reader.read(); + if (nextByte == -1) { + throw new EOFException("Stream is empty when try to read all bytes before '\\r\\n'"); + } + if (nextByte == LF){ + reader.reset(); + reader.read(); + break; + }else { + reader.reset(); + } + } + message.add((byte) currentByte); } - - final int symbolsCount = symbols.size(); - - final byte[] bytes = new byte[symbolsCount]; - - for (int i = 0; i < symbolsCount; i++) { - bytes[i] = symbols.get(i); + byte[] bytes = new byte[message.size()]; + for (int i = 0; i < message.size(); i++) { + bytes[i] = message.get(i); } - return bytes; } } From 7fea8494e76a291264160c8072f4f8532c4e8c86 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 17:25:37 +0300 Subject: [PATCH 335/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/itmo/java/protocol/RespReader.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 072d880b..68d4dc45 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -36,7 +36,7 @@ public boolean hasArray() throws IOException { * @throws IOException при ошибке чтения */ public RespObject readObject() throws IOException { -// try { + try { int codeInt = reader.read(); if (codeInt == -1) { @@ -56,9 +56,9 @@ public RespObject readObject() throws IOException { throw new IOException("Code character is not correct"); } -// } catch(IOException ex) { -// throw new RuntimeException("rer"); -// } + } catch(IOException ex) { + throw new RuntimeException("rer"); + } } /** From f9902bedef4823b26acaf17b53b177874989973a Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 17:27:50 +0300 Subject: [PATCH 336/378] try --- src/main/java/com/itmo/java/protocol/RespReader.java | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 68d4dc45..8da3d865 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -36,12 +36,11 @@ public boolean hasArray() throws IOException { * @throws IOException при ошибке чтения */ public RespObject readObject() throws IOException { - try { int codeInt = reader.read(); - if (codeInt == -1) { - throw new EOFException("InputStream is empty when try to read RespObject"); - } +// if (codeInt == -1) { +// throw new EOFException("InputStream is empty when try to read RespObject"); +// } byte code = (byte) codeInt; switch (code) { case RespArray.CODE: @@ -56,9 +55,6 @@ public RespObject readObject() throws IOException { throw new IOException("Code character is not correct"); } - } catch(IOException ex) { - throw new RuntimeException("rer"); - } } /** From 5404702be28a5510013022803df2d60be6507431 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 17:36:22 +0300 Subject: [PATCH 337/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/itmo/java/protocol/RespReader.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 8da3d865..787f8bfb 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -38,9 +38,9 @@ public boolean hasArray() throws IOException { public RespObject readObject() throws IOException { int codeInt = reader.read(); -// if (codeInt == -1) { -// throw new EOFException("InputStream is empty when try to read RespObject"); -// } + if (codeInt == -1) { + throw new EOFException("InputStream is empty when try to read RespObject"); + } byte code = (byte) codeInt; switch (code) { case RespArray.CODE: From 5302658041b5fbda382298d3e49a80f0c4f4ef9e Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 17:45:27 +0300 Subject: [PATCH 338/378] help --- .../com/itmo/java/protocol/RespReader.java | 36 +++++++++---------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 787f8bfb..6f5d8066 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -36,25 +36,23 @@ public boolean hasArray() throws IOException { * @throws IOException при ошибке чтения */ public RespObject readObject() throws IOException { - - int codeInt = reader.read(); - if (codeInt == -1) { - throw new EOFException("InputStream is empty when try to read RespObject"); - } - byte code = (byte) codeInt; - switch (code) { - case RespArray.CODE: - return readArray(); - case RespBulkString.CODE: - return readBulkString(); - case RespCommandId.CODE: - return readCommandId(); - case RespError.CODE: - return readError(); - default: - throw new IOException("Code character is not correct"); - - } + int codeInt = reader.read(); + if (codeInt == -1) { + throw new EOFException("InputStream is empty when try to read RespObject"); + } + byte code = (byte) codeInt; + switch (code) { + case RespArray.CODE: + return readArray(); + case RespBulkString.CODE: + return readBulkString(); + case RespCommandId.CODE: + return readCommandId(); + case RespError.CODE: + return readError(); + default: + throw new IOException("Code character is not correct"); + } } /** From 6b889d434a3e93fc9d6cc177dc9e922fdd48d608 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 17:49:15 +0300 Subject: [PATCH 339/378] try --- .../java/com/itmo/java/protocol/RespReader.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 6f5d8066..f2ca5a14 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -8,7 +8,7 @@ public class RespReader implements AutoCloseable { private static final int READ_AHEAD_LIMIT = 3; - private final BufferedReader reader; + private final InputStreamReader reader; /** * Специальные символы окончания элемента @@ -17,14 +17,17 @@ public class RespReader implements AutoCloseable { private static final byte LF = '\n'; public RespReader(InputStream is) { - reader = new BufferedReader(new InputStreamReader(is)); + reader = new InputStreamReader(is); } /** * Есть ли следующий массив в стриме? */ public boolean hasArray() throws IOException { + BufferedReader bufferedReader = new BufferedReader(reader); + bufferedReader.mark(READ_AHEAD_LIMIT); byte code = (byte) reader.read(); + bufferedReader.reset(); return code == RespArray.CODE; } @@ -132,17 +135,15 @@ private byte[] readBytesToEndOfLine() throws IOException { throw new EOFException("Stream is empty when try to read all bytes before '\\r\\n'"); } if (currentByte == CR) { - reader.mark(READ_AHEAD_LIMIT); int nextByte = reader.read(); if (nextByte == -1) { throw new EOFException("Stream is empty when try to read all bytes before '\\r\\n'"); } if (nextByte == LF){ - reader.reset(); - reader.read(); break; }else { - reader.reset(); + message.add((byte) currentByte); + currentByte = nextByte; } } message.add((byte) currentByte); From 58db56700c640606870c78b0fbc12d5529773cdf Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 17:53:31 +0300 Subject: [PATCH 340/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/itmo/java/protocol/RespReader.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index f2ca5a14..6f5d8066 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -8,7 +8,7 @@ public class RespReader implements AutoCloseable { private static final int READ_AHEAD_LIMIT = 3; - private final InputStreamReader reader; + private final BufferedReader reader; /** * Специальные символы окончания элемента @@ -17,17 +17,14 @@ public class RespReader implements AutoCloseable { private static final byte LF = '\n'; public RespReader(InputStream is) { - reader = new InputStreamReader(is); + reader = new BufferedReader(new InputStreamReader(is)); } /** * Есть ли следующий массив в стриме? */ public boolean hasArray() throws IOException { - BufferedReader bufferedReader = new BufferedReader(reader); - bufferedReader.mark(READ_AHEAD_LIMIT); byte code = (byte) reader.read(); - bufferedReader.reset(); return code == RespArray.CODE; } @@ -135,15 +132,17 @@ private byte[] readBytesToEndOfLine() throws IOException { throw new EOFException("Stream is empty when try to read all bytes before '\\r\\n'"); } if (currentByte == CR) { + reader.mark(READ_AHEAD_LIMIT); int nextByte = reader.read(); if (nextByte == -1) { throw new EOFException("Stream is empty when try to read all bytes before '\\r\\n'"); } if (nextByte == LF){ + reader.reset(); + reader.read(); break; }else { - message.add((byte) currentByte); - currentByte = nextByte; + reader.reset(); } } message.add((byte) currentByte); From ac8e45ab89107e9c1f005074300ff55269cb460d Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 17:54:58 +0300 Subject: [PATCH 341/378] testing elder reader --- .../com/itmo/java/protocol/RespReader.java | 209 +++++++++++------- 1 file changed, 132 insertions(+), 77 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 6f5d8066..fd4a5291 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -1,14 +1,19 @@ package com.itmo.java.protocol; -import com.itmo.java.protocol.model.*; +import com.itmo.java.protocol.model.RespArray; +import com.itmo.java.protocol.model.RespBulkString; +import com.itmo.java.protocol.model.RespCommandId; +import com.itmo.java.protocol.model.RespError; +import com.itmo.java.protocol.model.RespObject; -import java.io.*; +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; public class RespReader implements AutoCloseable { - private static final int READ_AHEAD_LIMIT = 3; - private final BufferedReader reader; + private final InputStream is; + private boolean isHasArray = false; /** * Специальные символы окончания элемента @@ -17,15 +22,22 @@ public class RespReader implements AutoCloseable { private static final byte LF = '\n'; public RespReader(InputStream is) { - reader = new BufferedReader(new InputStreamReader(is)); + this.is = is; } /** * Есть ли следующий массив в стриме? */ public boolean hasArray() throws IOException { - byte code = (byte) reader.read(); - return code == RespArray.CODE; + if (isHasArray) { + return true; + } + byte[] currentRespObjectType = is.readNBytes(1); + if (currentRespObjectType[0] == RespArray.CODE){ + isHasArray = true; + return true; + } + return false; } /** @@ -36,22 +48,48 @@ public boolean hasArray() throws IOException { * @throws IOException при ошибке чтения */ public RespObject readObject() throws IOException { - int codeInt = reader.read(); - if (codeInt == -1) { - throw new EOFException("InputStream is empty when try to read RespObject"); - } - byte code = (byte) codeInt; - switch (code) { - case RespArray.CODE: - return readArray(); - case RespBulkString.CODE: + try { + byte[] firstSymbol = is.readNBytes(1); + if (firstSymbol.length == 0){ + throw new EOFException("end of the stream"); + } + if (firstSymbol[0] == RespError.CODE){ + return readError(); + } + if(firstSymbol[0] == RespBulkString.CODE){ return readBulkString(); - case RespCommandId.CODE: + } + if(firstSymbol[0] == RespCommandId.CODE){ return readCommandId(); - case RespError.CODE: - return readError(); - default: - throw new IOException("Code character is not correct"); + } + throw new IOException("unknown byte" + new String(firstSymbol)); + } catch (IOException e){ + throw new IOException("exception in reading object", e); + } + } + + + private int readInt() throws IOException { + try{ + StringBuilder size = new StringBuilder(); + byte[] sizeByte = is.readNBytes(1); + if (sizeByte.length == 0){ + throw new EOFException("end of the stream"); + } + while (sizeByte[0] != CR){ + size.append(new String(sizeByte)); + sizeByte = is.readNBytes(1); + if (sizeByte.length == 0){ + throw new EOFException("end of the stream"); + } + } + try { + return Integer.parseInt(size.toString()); + } catch (NumberFormatException e) { + throw new IOException("expected reading int from this string: " + size.toString()); + } + } catch (IOException e) { + throw new IOException("IO exception in reading int", e); } } @@ -62,7 +100,24 @@ public RespObject readObject() throws IOException { * @throws IOException при ошибке чтения */ public RespError readError() throws IOException { - return new RespError(readBytesToEndOfLine()); + try{ + StringBuilder errorMessage = new StringBuilder(); + byte[] currentSymbol = is.readNBytes(1); + if (currentSymbol.length == 0){ + throw new EOFException("end of the stream"); + } + while (currentSymbol[0] != CR){ + errorMessage.append(new String(currentSymbol)); + currentSymbol = is.readNBytes(1); + if (currentSymbol.length == 0){ + throw new EOFException("end of the stream"); + } + } + readCompareByte(LF); + return new RespError(errorMessage.toString().getBytes(StandardCharsets.UTF_8)); + } catch (IOException e) { + throw new IOException("IO exception in reading Error", e); + } } /** @@ -72,16 +127,20 @@ public RespError readError() throws IOException { * @throws IOException при ошибке чтения */ public RespBulkString readBulkString() throws IOException { - byte[] stringSizeBytes = readBytesToEndOfLine(); - int stringSize = Integer.parseInt(new String(stringSizeBytes, StandardCharsets.UTF_8)); - if (stringSize == RespBulkString.NULL_STRING_SIZE) { - return RespBulkString.NULL_STRING; - } - byte[] stringData = readBytesToEndOfLine(); - if (stringData.length != stringSize) { - throw new IOException("String length is not equal with StringBulk size"); + try{ + int bulkSize = readInt(); + readCompareByte(LF); + if (bulkSize == -1){ + return RespBulkString.NULL_STRING; + } + byte[] bulkString = is.readNBytes(bulkSize); + readCompareByte(CR); + readCompareByte(LF); + return new RespBulkString(bulkString); + } catch (IOException e) { + throw new IOException("IO exception in reading Bulk String", e); } - return new RespBulkString(stringData); + } /** @@ -91,13 +150,21 @@ public RespBulkString readBulkString() throws IOException { * @throws IOException при ошибке чтения */ public RespArray readArray() throws IOException { - byte[] arraySizeBytes = readBytesToEndOfLine(); - int arraySize = Integer.parseInt(new String(arraySizeBytes, StandardCharsets.UTF_8)); - RespObject[] respObjectArray = new RespObject[arraySize]; - for (int i = 0; i < arraySize; i++) { - respObjectArray[i] = readObject(); + try { + if (!isHasArray) { + readCompareByte(RespArray.CODE); + } + int arraySize = readInt(); + readCompareByte(LF); + RespObject[] listObjects = new RespObject[arraySize]; + for (int i = 0; i < arraySize; i++){ + listObjects[i] = readObject(); + } + return new RespArray(listObjects); + } catch (IOException e) { + throw new IOException("IO exception in reading Array", e); } - return new RespArray(respObjectArray); + } /** @@ -107,50 +174,38 @@ public RespArray readArray() throws IOException { * @throws IOException при ошибке чтения */ public RespCommandId readCommandId() throws IOException { - byte[] idBytes = readBytesToEndOfLine(); - if (idBytes.length != 4) { - throw new IOException("Command Id is not integer"); + try { + byte[] commandId1 = is.readNBytes(1); + byte[] commandId2 = is.readNBytes(1); + byte[] commandId3 = is.readNBytes(1); + byte[] commandId4 = is.readNBytes(1); + int commandId = ((commandId1[0] << 24) + (commandId2[0]<< 16) + (commandId3[0] << 8) + (commandId4[0] << 0)); + readCompareByte(CR); + readCompareByte(LF); + return new RespCommandId(commandId); + } catch (IOException e) { + throw new IOException("IO exception in reading command id", e); } - return new RespCommandId(bytesToInt(idBytes)); } - - @Override - public void close() throws IOException { - reader.close(); + private void readCompareByte(byte compareWith) throws IOException { + byte[] nextByte; + try { + nextByte = is.readNBytes(1); + if (nextByte.length == 0){ + throw new EOFException("end of the stream"); + } else if (nextByte[0] != compareWith) { + throw new IOException("expected symbol: " + String.valueOf(compareWith) + " but get: " + String.valueOf(nextByte[0])); + } + } catch (IOException e) { + throw new IOException("IO exception in reading byte", e); + } } - private static int bytesToInt(byte[] bytes) { - return (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | (bytes[3]); - } - private byte[] readBytesToEndOfLine() throws IOException { - ArrayList message = new ArrayList<>(); - while (true) { - int currentByte = reader.read(); - if (currentByte == -1) { - throw new EOFException("Stream is empty when try to read all bytes before '\\r\\n'"); - } - if (currentByte == CR) { - reader.mark(READ_AHEAD_LIMIT); - int nextByte = reader.read(); - if (nextByte == -1) { - throw new EOFException("Stream is empty when try to read all bytes before '\\r\\n'"); - } - if (nextByte == LF){ - reader.reset(); - reader.read(); - break; - }else { - reader.reset(); - } - } - message.add((byte) currentByte); - } - byte[] bytes = new byte[message.size()]; - for (int i = 0; i < message.size(); i++) { - bytes[i] = message.get(i); - } - return bytes; + @Override + public void close() throws IOException { + is.close(); } } + \ No newline at end of file From f64b11df5bb5ad75f3215f0c83a9929a996e3c13 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 17:57:09 +0300 Subject: [PATCH 342/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/itmo/java/protocol/RespReader.java | 209 +++++++----------- 1 file changed, 77 insertions(+), 132 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index fd4a5291..6f5d8066 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -1,19 +1,14 @@ package com.itmo.java.protocol; -import com.itmo.java.protocol.model.RespArray; -import com.itmo.java.protocol.model.RespBulkString; -import com.itmo.java.protocol.model.RespCommandId; -import com.itmo.java.protocol.model.RespError; -import com.itmo.java.protocol.model.RespObject; +import com.itmo.java.protocol.model.*; -import java.io.EOFException; -import java.io.IOException; -import java.io.InputStream; +import java.io.*; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; public class RespReader implements AutoCloseable { - private final InputStream is; - private boolean isHasArray = false; + private static final int READ_AHEAD_LIMIT = 3; + private final BufferedReader reader; /** * Специальные символы окончания элемента @@ -22,22 +17,15 @@ public class RespReader implements AutoCloseable { private static final byte LF = '\n'; public RespReader(InputStream is) { - this.is = is; + reader = new BufferedReader(new InputStreamReader(is)); } /** * Есть ли следующий массив в стриме? */ public boolean hasArray() throws IOException { - if (isHasArray) { - return true; - } - byte[] currentRespObjectType = is.readNBytes(1); - if (currentRespObjectType[0] == RespArray.CODE){ - isHasArray = true; - return true; - } - return false; + byte code = (byte) reader.read(); + return code == RespArray.CODE; } /** @@ -48,48 +36,22 @@ public boolean hasArray() throws IOException { * @throws IOException при ошибке чтения */ public RespObject readObject() throws IOException { - try { - byte[] firstSymbol = is.readNBytes(1); - if (firstSymbol.length == 0){ - throw new EOFException("end of the stream"); - } - if (firstSymbol[0] == RespError.CODE){ - return readError(); - } - if(firstSymbol[0] == RespBulkString.CODE){ + int codeInt = reader.read(); + if (codeInt == -1) { + throw new EOFException("InputStream is empty when try to read RespObject"); + } + byte code = (byte) codeInt; + switch (code) { + case RespArray.CODE: + return readArray(); + case RespBulkString.CODE: return readBulkString(); - } - if(firstSymbol[0] == RespCommandId.CODE){ + case RespCommandId.CODE: return readCommandId(); - } - throw new IOException("unknown byte" + new String(firstSymbol)); - } catch (IOException e){ - throw new IOException("exception in reading object", e); - } - } - - - private int readInt() throws IOException { - try{ - StringBuilder size = new StringBuilder(); - byte[] sizeByte = is.readNBytes(1); - if (sizeByte.length == 0){ - throw new EOFException("end of the stream"); - } - while (sizeByte[0] != CR){ - size.append(new String(sizeByte)); - sizeByte = is.readNBytes(1); - if (sizeByte.length == 0){ - throw new EOFException("end of the stream"); - } - } - try { - return Integer.parseInt(size.toString()); - } catch (NumberFormatException e) { - throw new IOException("expected reading int from this string: " + size.toString()); - } - } catch (IOException e) { - throw new IOException("IO exception in reading int", e); + case RespError.CODE: + return readError(); + default: + throw new IOException("Code character is not correct"); } } @@ -100,24 +62,7 @@ private int readInt() throws IOException { * @throws IOException при ошибке чтения */ public RespError readError() throws IOException { - try{ - StringBuilder errorMessage = new StringBuilder(); - byte[] currentSymbol = is.readNBytes(1); - if (currentSymbol.length == 0){ - throw new EOFException("end of the stream"); - } - while (currentSymbol[0] != CR){ - errorMessage.append(new String(currentSymbol)); - currentSymbol = is.readNBytes(1); - if (currentSymbol.length == 0){ - throw new EOFException("end of the stream"); - } - } - readCompareByte(LF); - return new RespError(errorMessage.toString().getBytes(StandardCharsets.UTF_8)); - } catch (IOException e) { - throw new IOException("IO exception in reading Error", e); - } + return new RespError(readBytesToEndOfLine()); } /** @@ -127,20 +72,16 @@ public RespError readError() throws IOException { * @throws IOException при ошибке чтения */ public RespBulkString readBulkString() throws IOException { - try{ - int bulkSize = readInt(); - readCompareByte(LF); - if (bulkSize == -1){ - return RespBulkString.NULL_STRING; - } - byte[] bulkString = is.readNBytes(bulkSize); - readCompareByte(CR); - readCompareByte(LF); - return new RespBulkString(bulkString); - } catch (IOException e) { - throw new IOException("IO exception in reading Bulk String", e); + byte[] stringSizeBytes = readBytesToEndOfLine(); + int stringSize = Integer.parseInt(new String(stringSizeBytes, StandardCharsets.UTF_8)); + if (stringSize == RespBulkString.NULL_STRING_SIZE) { + return RespBulkString.NULL_STRING; } - + byte[] stringData = readBytesToEndOfLine(); + if (stringData.length != stringSize) { + throw new IOException("String length is not equal with StringBulk size"); + } + return new RespBulkString(stringData); } /** @@ -150,21 +91,13 @@ public RespBulkString readBulkString() throws IOException { * @throws IOException при ошибке чтения */ public RespArray readArray() throws IOException { - try { - if (!isHasArray) { - readCompareByte(RespArray.CODE); - } - int arraySize = readInt(); - readCompareByte(LF); - RespObject[] listObjects = new RespObject[arraySize]; - for (int i = 0; i < arraySize; i++){ - listObjects[i] = readObject(); - } - return new RespArray(listObjects); - } catch (IOException e) { - throw new IOException("IO exception in reading Array", e); + byte[] arraySizeBytes = readBytesToEndOfLine(); + int arraySize = Integer.parseInt(new String(arraySizeBytes, StandardCharsets.UTF_8)); + RespObject[] respObjectArray = new RespObject[arraySize]; + for (int i = 0; i < arraySize; i++) { + respObjectArray[i] = readObject(); } - + return new RespArray(respObjectArray); } /** @@ -174,38 +107,50 @@ public RespArray readArray() throws IOException { * @throws IOException при ошибке чтения */ public RespCommandId readCommandId() throws IOException { - try { - byte[] commandId1 = is.readNBytes(1); - byte[] commandId2 = is.readNBytes(1); - byte[] commandId3 = is.readNBytes(1); - byte[] commandId4 = is.readNBytes(1); - int commandId = ((commandId1[0] << 24) + (commandId2[0]<< 16) + (commandId3[0] << 8) + (commandId4[0] << 0)); - readCompareByte(CR); - readCompareByte(LF); - return new RespCommandId(commandId); - } catch (IOException e) { - throw new IOException("IO exception in reading command id", e); - } - } - - private void readCompareByte(byte compareWith) throws IOException { - byte[] nextByte; - try { - nextByte = is.readNBytes(1); - if (nextByte.length == 0){ - throw new EOFException("end of the stream"); - } else if (nextByte[0] != compareWith) { - throw new IOException("expected symbol: " + String.valueOf(compareWith) + " but get: " + String.valueOf(nextByte[0])); - } - } catch (IOException e) { - throw new IOException("IO exception in reading byte", e); + byte[] idBytes = readBytesToEndOfLine(); + if (idBytes.length != 4) { + throw new IOException("Command Id is not integer"); } + return new RespCommandId(bytesToInt(idBytes)); } @Override public void close() throws IOException { - is.close(); + reader.close(); + } + + private static int bytesToInt(byte[] bytes) { + return (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | (bytes[3]); + } + + private byte[] readBytesToEndOfLine() throws IOException { + ArrayList message = new ArrayList<>(); + while (true) { + int currentByte = reader.read(); + if (currentByte == -1) { + throw new EOFException("Stream is empty when try to read all bytes before '\\r\\n'"); + } + if (currentByte == CR) { + reader.mark(READ_AHEAD_LIMIT); + int nextByte = reader.read(); + if (nextByte == -1) { + throw new EOFException("Stream is empty when try to read all bytes before '\\r\\n'"); + } + if (nextByte == LF){ + reader.reset(); + reader.read(); + break; + }else { + reader.reset(); + } + } + message.add((byte) currentByte); + } + byte[] bytes = new byte[message.size()]; + for (int i = 0; i < message.size(); i++) { + bytes[i] = message.get(i); + } + return bytes; } } - \ No newline at end of file From a4bf43117b903c65f2205c209c99c524ec49d5b1 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 18:06:10 +0300 Subject: [PATCH 343/378] testing --- .../com/itmo/java/basics/DatabaseServer.java | 26 +-- .../com/itmo/java/protocol/RespReader.java | 181 ++++++++++-------- 2 files changed, 120 insertions(+), 87 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/DatabaseServer.java b/src/main/java/com/itmo/java/basics/DatabaseServer.java index 4aaa197f..c1031bbb 100644 --- a/src/main/java/com/itmo/java/basics/DatabaseServer.java +++ b/src/main/java/com/itmo/java/basics/DatabaseServer.java @@ -2,7 +2,10 @@ import com.itmo.java.basics.console.*; import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.initialization.impl.*; +import com.itmo.java.basics.initialization.InitializationContext; +import com.itmo.java.basics.initialization.impl.DatabaseServerInitializer; +import com.itmo.java.basics.initialization.impl.InitializationContextImpl; +import com.itmo.java.basics.logic.Database; import com.itmo.java.protocol.model.RespArray; import java.util.concurrent.CompletableFuture; @@ -11,28 +14,29 @@ public class DatabaseServer { - private final ExecutorService executorService = Executors.newSingleThreadExecutor(); - private final ExecutionEnvironment enviroment; + private ExecutorService executorService = Executors.newSingleThreadExecutor(); + private final ExecutionEnvironment env; /** - * Con structor + * Конструктор * - * @param env env для инициализации. Далее работа происходит с заполненым объектом + * @param env env для инициализации. Далее работа происходит с заполненным объектом * @param initializer готовый чейн инициализации * @throws DatabaseException если произошла ошибка инициализации */ public static DatabaseServer initialize(ExecutionEnvironment env, DatabaseServerInitializer initializer) throws DatabaseException { - initializer.perform(new InitializationContextImpl(env, null, null, null)); + InitializationContext context = InitializationContextImpl.builder().executionEnvironment(env).build(); + initializer.perform(context); return new DatabaseServer(env); } - private DatabaseServer(ExecutionEnvironment env) { - this.enviroment = env; + private DatabaseServer(ExecutionEnvironment env){ + this.env = env; } public CompletableFuture executeNextCommand(RespArray message) { - return CompletableFuture.supplyAsync(() -> - DatabaseCommands.valueOf(message.getObjects().get(DatabaseCommandArgPositions.COMMAND_NAME.getPositionIndex()).asString()).getCommand(enviroment, message.getObjects()).execute(), executorService); + return CompletableFuture.supplyAsync(() -> DatabaseCommands.valueOf(message.getObjects().get(DatabaseCommandArgPositions. + COMMAND_NAME.getPositionIndex()).asString()).getCommand(env, message.getObjects()).execute(), executorService); } public CompletableFuture executeNextCommand(DatabaseCommand command) { @@ -40,6 +44,6 @@ public CompletableFuture executeNextCommand(DatabaseComma } public ExecutionEnvironment getEnv() { - return enviroment; + return env; } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 6f5d8066..70e86289 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -1,14 +1,18 @@ package com.itmo.java.protocol; -import com.itmo.java.protocol.model.*; +import com.itmo.java.protocol.model.RespArray; +import com.itmo.java.protocol.model.RespBulkString; +import com.itmo.java.protocol.model.RespCommandId; +import com.itmo.java.protocol.model.RespError; +import com.itmo.java.protocol.model.RespObject; import java.io.*; -import java.nio.charset.StandardCharsets; +import java.nio.ByteBuffer; import java.util.ArrayList; +import java.util.List; + public class RespReader implements AutoCloseable { - private static final int READ_AHEAD_LIMIT = 3; - private final BufferedReader reader; /** * Специальные символы окончания элемента @@ -16,16 +20,23 @@ public class RespReader implements AutoCloseable { private static final byte CR = '\r'; private static final byte LF = '\n'; + private final InputStream is; + private String rawData = ""; + public RespReader(InputStream is) { - reader = new BufferedReader(new InputStreamReader(is)); + this.is = is; + try { + rawData = new String(is.readNBytes(4)); + } catch (IOException e) { + e.printStackTrace(); + } } /** * Есть ли следующий массив в стриме? */ public boolean hasArray() throws IOException { - byte code = (byte) reader.read(); - return code == RespArray.CODE; + return rawData.startsWith("*"); } /** @@ -36,22 +47,20 @@ public boolean hasArray() throws IOException { * @throws IOException при ошибке чтения */ public RespObject readObject() throws IOException { - int codeInt = reader.read(); - if (codeInt == -1) { - throw new EOFException("InputStream is empty when try to read RespObject"); + if (rawData.isEmpty()) { + throw new EOFException("Stream is empty"); } - byte code = (byte) codeInt; - switch (code) { - case RespArray.CODE: - return readArray(); - case RespBulkString.CODE: - return readBulkString(); - case RespCommandId.CODE: - return readCommandId(); - case RespError.CODE: - return readError(); - default: - throw new IOException("Code character is not correct"); + + if(rawData.startsWith("-")) { + return readError(); + } else if (rawData.startsWith("$")) { + return readBulkString(); + } else if (rawData.startsWith("!")) { + return readCommandId(); + } else if (rawData.startsWith("*")){ + return readArray(); + } else { + throw new IOException("Error while reading"); } } @@ -62,7 +71,13 @@ public RespObject readObject() throws IOException { * @throws IOException при ошибке чтения */ public RespError readError() throws IOException { - return new RespError(readBytesToEndOfLine()); + if (rawData.length() < 3) { + throw new EOFException("Length of rawData is too small"); + } + String message = rawData.substring(1, rawData.length() - 2); + return new RespError(message.getBytes()); + + } /** @@ -72,16 +87,21 @@ public RespError readError() throws IOException { * @throws IOException при ошибке чтения */ public RespBulkString readBulkString() throws IOException { - byte[] stringSizeBytes = readBytesToEndOfLine(); - int stringSize = Integer.parseInt(new String(stringSizeBytes, StandardCharsets.UTF_8)); - if (stringSize == RespBulkString.NULL_STRING_SIZE) { - return RespBulkString.NULL_STRING; + if (rawData.length() < 3) { + throw new EOFException("Length of rawData is too small"); } - byte[] stringData = readBytesToEndOfLine(); - if (stringData.length != stringSize) { - throw new IOException("String length is not equal with StringBulk size"); + String body = rawData.substring(1, rawData.length() - 2); + String[] split = body.split("\r\n"); + if (split.length != 2) { + throw new IOException("Error while reading"); } - return new RespBulkString(stringData); + byte [] data = split[1].getBytes(); + RespBulkString respBulkString = new RespBulkString(data); + return respBulkString; + + + + } /** @@ -91,13 +111,54 @@ public RespBulkString readBulkString() throws IOException { * @throws IOException при ошибке чтения */ public RespArray readArray() throws IOException { - byte[] arraySizeBytes = readBytesToEndOfLine(); - int arraySize = Integer.parseInt(new String(arraySizeBytes, StandardCharsets.UTF_8)); - RespObject[] respObjectArray = new RespObject[arraySize]; - for (int i = 0; i < arraySize; i++) { - respObjectArray[i] = readObject(); + List respObjectList = new ArrayList<>(); + + if (rawData.length() < 4) { + throw new EOFException("Length of rawData is less then 4"); } - return new RespArray(respObjectArray); + //String body = rawData.substring(1, rawData.length() - 2); + String body = rawData.substring(1); + String[] split = body.split("\r\n"); + int size = Integer.parseInt(split[0]); + String arrayData = body.substring(split[0].length() + 2); + + //String[] elements = arrayData.split("[-$*]"); + for (int i = 0; i < size; i++) { + //String element; + if (arrayData.startsWith("-")) { + arrayData = arrayData.substring(1); + int currentIndex = arrayData.indexOf("\r\n"); + byte[] message = arrayData.substring(0, currentIndex).getBytes(); + respObjectList.add(new RespError(message)); + arrayData = arrayData.substring(currentIndex + 2); + + } else if (arrayData.startsWith("!")) { + arrayData = arrayData.substring(1); + int currentIndex = arrayData.indexOf("\r\n"); + String messageString = arrayData.substring(0, currentIndex); + currentIndex = arrayData.indexOf("\r\n"); + byte[] dataBytes = messageString.substring(0, currentIndex).getBytes(); + int data = ByteBuffer.wrap(dataBytes).getInt(); + //int data = Integer.parseInt(arrayData.substring(0, currentIndex)); //? + respObjectList.add(new RespCommandId(data)); + arrayData = arrayData.substring(currentIndex + 2); + + } else if (arrayData.startsWith("$")) { + int currentIndex = arrayData.indexOf("\r\n"); + arrayData = arrayData.substring(currentIndex + 2); + currentIndex = arrayData.indexOf("\r\n"); + byte[] data = arrayData.substring(0, currentIndex).getBytes(); + respObjectList.add(new RespBulkString(data)); + arrayData = arrayData.substring(currentIndex + 2); + } else { + throw new IOException("Error while reading"); + } + + } + + RespObject[] respArray = new RespObject[respObjectList.size()]; + respObjectList.toArray(respArray); + return new RespArray(respArray); } /** @@ -107,50 +168,18 @@ public RespArray readArray() throws IOException { * @throws IOException при ошибке чтения */ public RespCommandId readCommandId() throws IOException { - byte[] idBytes = readBytesToEndOfLine(); - if (idBytes.length != 4) { - throw new IOException("Command Id is not integer"); + if (rawData.length() <= 3) { + throw new EOFException("Length of rawData is too small"); } - return new RespCommandId(bytesToInt(idBytes)); + String message = rawData.substring(1, rawData.length() - 2); + byte[] messageBytes = message.getBytes(); + return new RespCommandId(ByteBuffer.wrap(messageBytes).getInt()); + //return new RespCommandId(Integer.parseInt(message)); } @Override public void close() throws IOException { - reader.close(); - } - - private static int bytesToInt(byte[] bytes) { - return (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | (bytes[3]); - } - - private byte[] readBytesToEndOfLine() throws IOException { - ArrayList message = new ArrayList<>(); - while (true) { - int currentByte = reader.read(); - if (currentByte == -1) { - throw new EOFException("Stream is empty when try to read all bytes before '\\r\\n'"); - } - if (currentByte == CR) { - reader.mark(READ_AHEAD_LIMIT); - int nextByte = reader.read(); - if (nextByte == -1) { - throw new EOFException("Stream is empty when try to read all bytes before '\\r\\n'"); - } - if (nextByte == LF){ - reader.reset(); - reader.read(); - break; - }else { - reader.reset(); - } - } - message.add((byte) currentByte); - } - byte[] bytes = new byte[message.size()]; - for (int i = 0; i < message.size(); i++) { - bytes[i] = message.get(i); - } - return bytes; + is.close(); } } From 850e8d253bb828af14b5c205ee273161345dcea8 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 18:12:02 +0300 Subject: [PATCH 344/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/itmo/java/protocol/RespReader.java | 181 ++++++++---------- 1 file changed, 76 insertions(+), 105 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 70e86289..6ae54b2d 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -1,18 +1,14 @@ package com.itmo.java.protocol; -import com.itmo.java.protocol.model.RespArray; -import com.itmo.java.protocol.model.RespBulkString; -import com.itmo.java.protocol.model.RespCommandId; -import com.itmo.java.protocol.model.RespError; -import com.itmo.java.protocol.model.RespObject; +import com.itmo.java.protocol.model.*; import java.io.*; -import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; -import java.util.List; - public class RespReader implements AutoCloseable { + private static final int READ_AHEAD_LIMIT = 3; + private final BufferedReader reader; /** * Специальные символы окончания элемента @@ -20,23 +16,16 @@ public class RespReader implements AutoCloseable { private static final byte CR = '\r'; private static final byte LF = '\n'; - private final InputStream is; - private String rawData = ""; - public RespReader(InputStream is) { - this.is = is; - try { - rawData = new String(is.readNBytes(4)); - } catch (IOException e) { - e.printStackTrace(); - } + reader = new BufferedReader(new InputStreamReader(is)); } /** * Есть ли следующий массив в стриме? */ public boolean hasArray() throws IOException { - return rawData.startsWith("*"); + byte code = (byte) reader.read(); + return code == RespArray.CODE; } /** @@ -47,20 +36,22 @@ public boolean hasArray() throws IOException { * @throws IOException при ошибке чтения */ public RespObject readObject() throws IOException { - if (rawData.isEmpty()) { - throw new EOFException("Stream is empty"); - } - - if(rawData.startsWith("-")) { + int codeInt = reader.read(); + if (codeInt == -1) { return readError(); - } else if (rawData.startsWith("$")) { - return readBulkString(); - } else if (rawData.startsWith("!")) { - return readCommandId(); - } else if (rawData.startsWith("*")){ - return readArray(); - } else { - throw new IOException("Error while reading"); + } + byte code = (byte) codeInt; + switch (code) { + case RespArray.CODE: + return readArray(); + case RespBulkString.CODE: + return readBulkString(); + case RespCommandId.CODE: + return readCommandId(); + case RespError.CODE: + return readError(); + default: + throw new IOException("Code character is not correct"); } } @@ -71,13 +62,7 @@ public RespObject readObject() throws IOException { * @throws IOException при ошибке чтения */ public RespError readError() throws IOException { - if (rawData.length() < 3) { - throw new EOFException("Length of rawData is too small"); - } - String message = rawData.substring(1, rawData.length() - 2); - return new RespError(message.getBytes()); - - + return new RespError(readBytesToEndOfLine()); } /** @@ -87,21 +72,16 @@ public RespError readError() throws IOException { * @throws IOException при ошибке чтения */ public RespBulkString readBulkString() throws IOException { - if (rawData.length() < 3) { - throw new EOFException("Length of rawData is too small"); + byte[] stringSizeBytes = readBytesToEndOfLine(); + int stringSize = Integer.parseInt(new String(stringSizeBytes, StandardCharsets.UTF_8)); + if (stringSize == RespBulkString.NULL_STRING_SIZE) { + return RespBulkString.NULL_STRING; } - String body = rawData.substring(1, rawData.length() - 2); - String[] split = body.split("\r\n"); - if (split.length != 2) { - throw new IOException("Error while reading"); + byte[] stringData = readBytesToEndOfLine(); + if (stringData.length != stringSize) { + throw new IOException("String length is not equal with StringBulk size"); } - byte [] data = split[1].getBytes(); - RespBulkString respBulkString = new RespBulkString(data); - return respBulkString; - - - - + return new RespBulkString(stringData); } /** @@ -111,54 +91,13 @@ public RespBulkString readBulkString() throws IOException { * @throws IOException при ошибке чтения */ public RespArray readArray() throws IOException { - List respObjectList = new ArrayList<>(); - - if (rawData.length() < 4) { - throw new EOFException("Length of rawData is less then 4"); + byte[] arraySizeBytes = readBytesToEndOfLine(); + int arraySize = Integer.parseInt(new String(arraySizeBytes, StandardCharsets.UTF_8)); + RespObject[] respObjectArray = new RespObject[arraySize]; + for (int i = 0; i < arraySize; i++) { + respObjectArray[i] = readObject(); } - //String body = rawData.substring(1, rawData.length() - 2); - String body = rawData.substring(1); - String[] split = body.split("\r\n"); - int size = Integer.parseInt(split[0]); - String arrayData = body.substring(split[0].length() + 2); - - //String[] elements = arrayData.split("[-$*]"); - for (int i = 0; i < size; i++) { - //String element; - if (arrayData.startsWith("-")) { - arrayData = arrayData.substring(1); - int currentIndex = arrayData.indexOf("\r\n"); - byte[] message = arrayData.substring(0, currentIndex).getBytes(); - respObjectList.add(new RespError(message)); - arrayData = arrayData.substring(currentIndex + 2); - - } else if (arrayData.startsWith("!")) { - arrayData = arrayData.substring(1); - int currentIndex = arrayData.indexOf("\r\n"); - String messageString = arrayData.substring(0, currentIndex); - currentIndex = arrayData.indexOf("\r\n"); - byte[] dataBytes = messageString.substring(0, currentIndex).getBytes(); - int data = ByteBuffer.wrap(dataBytes).getInt(); - //int data = Integer.parseInt(arrayData.substring(0, currentIndex)); //? - respObjectList.add(new RespCommandId(data)); - arrayData = arrayData.substring(currentIndex + 2); - - } else if (arrayData.startsWith("$")) { - int currentIndex = arrayData.indexOf("\r\n"); - arrayData = arrayData.substring(currentIndex + 2); - currentIndex = arrayData.indexOf("\r\n"); - byte[] data = arrayData.substring(0, currentIndex).getBytes(); - respObjectList.add(new RespBulkString(data)); - arrayData = arrayData.substring(currentIndex + 2); - } else { - throw new IOException("Error while reading"); - } - - } - - RespObject[] respArray = new RespObject[respObjectList.size()]; - respObjectList.toArray(respArray); - return new RespArray(respArray); + return new RespArray(respObjectArray); } /** @@ -168,18 +107,50 @@ public RespArray readArray() throws IOException { * @throws IOException при ошибке чтения */ public RespCommandId readCommandId() throws IOException { - if (rawData.length() <= 3) { - throw new EOFException("Length of rawData is too small"); + byte[] idBytes = readBytesToEndOfLine(); + if (idBytes.length != 4) { + throw new IOException("Command Id is not integer"); } - String message = rawData.substring(1, rawData.length() - 2); - byte[] messageBytes = message.getBytes(); - return new RespCommandId(ByteBuffer.wrap(messageBytes).getInt()); - //return new RespCommandId(Integer.parseInt(message)); + return new RespCommandId(bytesToInt(idBytes)); } @Override public void close() throws IOException { - is.close(); + reader.close(); + } + + private static int bytesToInt(byte[] bytes) { + return (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | (bytes[3]); + } + + private byte[] readBytesToEndOfLine() throws IOException { + ArrayList message = new ArrayList<>(); + while (true) { + int currentByte = reader.read(); + if (currentByte == -1) { + throw new EOFException("Stream is empty when try to read all bytes before '\\r\\n'"); + } + if (currentByte == CR) { + reader.mark(READ_AHEAD_LIMIT); + int nextByte = reader.read(); + if (nextByte == -1) { + throw new EOFException("Stream is empty when try to read all bytes before '\\r\\n'"); + } + if (nextByte == LF){ + reader.reset(); + reader.read(); + break; + }else { + reader.reset(); + } + } + message.add((byte) currentByte); + } + byte[] bytes = new byte[message.size()]; + for (int i = 0; i < message.size(); i++) { + bytes[i] = message.get(i); + } + return bytes; } } From d70cf980eee56922f448192388b7d46abf5cb8a0 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 18:15:52 +0300 Subject: [PATCH 345/378] testing --- .../connection/SocketKvsConnection.java | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index 855baf72..8c28dd0f 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -40,15 +40,31 @@ public SocketKvsConnection(ConnectionConfig config) { */ @Override public synchronized RespObject send(int commandId, RespArray command) throws ConnectionException { +// try { try { RespWriter respWriter = new RespWriter(clientSocket.getOutputStream()); + } catch (IOException ex) { + throw new ConnectionException("1"); + } + try { respWriter.write(command); + } catch (IOException ex) { + throw new ConnectionException("2"); + } + try { RespReader respReader = new RespReader(clientSocket.getInputStream()); + } catch (IOException ex) { + throw new ConnectionException("3"); + } + try { return respReader.readObject(); - } catch (IOException e) { - close(); - throw new ConnectionException("IOException when send " + command.asString() + " with " + host + " and port " + port + " ___IOMessage___: " + e.getMessage(), e); + } catch (IOException ex) { + throw new ConnectionException("4"); } +// } catch (IOException e) { +// close(); +// throw new ConnectionException("IOException when send " + command.asString() + " with " + host + " and port " + port + " ___IOMessage___: " + e.getMessage(), e); +// } } /** From 2d2476cf2a045a628113ed233f89ffde0a258164 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 18:20:30 +0300 Subject: [PATCH 346/378] maybe --- .../basics/console/impl/SuccessDatabaseCommandResult.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java b/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java index daad52fd..04cb0749 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java +++ b/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java @@ -4,6 +4,8 @@ import com.itmo.java.protocol.model.RespBulkString; import com.itmo.java.protocol.model.RespObject; +import java.nio.charset.StandardCharsets; + /** * Результат успешной команды */ @@ -17,10 +19,10 @@ public SuccessDatabaseCommandResult(byte[] pload) { @Override public String getPayLoad() { - if(payLoad != null) { - return new String(payLoad); - } else { + if(payLoad == null) { return null; + } else { + return new String(payLoad , StandardCharsets.UTF_8); } } From 1f79abf3363f8d767d5839e04a5573815edd4792 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 18:23:20 +0300 Subject: [PATCH 347/378] s --- src/main/java/com/itmo/java/protocol/RespReader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 6ae54b2d..daab3330 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -38,7 +38,7 @@ public boolean hasArray() throws IOException { public RespObject readObject() throws IOException { int codeInt = reader.read(); if (codeInt == -1) { - return readError(); + throw new IOException("me too"); } byte code = (byte) codeInt; switch (code) { From 1000d441a1d4daf7916a7a119d25cbed49133053 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 18:35:16 +0300 Subject: [PATCH 348/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82=20=D0=B2?= =?UTF-8?q?=204.40?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/itmo/java/basics/DatabaseServer.java | 26 ++++---- .../logic/impl/RemoveDatabaseRecord.java | 23 ++++--- .../java/basics/logic/impl/SegmentImpl.java | 34 +++++------ .../basics/logic/impl/SetDatabaseRecord.java | 25 ++++---- .../basics/logic/io/DatabaseInputStream.java | 16 ++--- .../itmo/java/basics/resp/CommandReader.java | 2 +- .../java/client/client/SimpleKvsClient.java | 36 +++-------- .../connection/SocketKvsConnection.java | 61 +++++++------------ .../com/itmo/java/protocol/RespReader.java | 4 +- .../com/itmo/java/protocol/RespWriter.java | 17 ++++-- .../itmo/java/protocol/model/RespArray.java | 5 +- 11 files changed, 113 insertions(+), 136 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/DatabaseServer.java b/src/main/java/com/itmo/java/basics/DatabaseServer.java index c1031bbb..4aaa197f 100644 --- a/src/main/java/com/itmo/java/basics/DatabaseServer.java +++ b/src/main/java/com/itmo/java/basics/DatabaseServer.java @@ -2,10 +2,7 @@ import com.itmo.java.basics.console.*; import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.initialization.InitializationContext; -import com.itmo.java.basics.initialization.impl.DatabaseServerInitializer; -import com.itmo.java.basics.initialization.impl.InitializationContextImpl; -import com.itmo.java.basics.logic.Database; +import com.itmo.java.basics.initialization.impl.*; import com.itmo.java.protocol.model.RespArray; import java.util.concurrent.CompletableFuture; @@ -14,29 +11,28 @@ public class DatabaseServer { - private ExecutorService executorService = Executors.newSingleThreadExecutor(); - private final ExecutionEnvironment env; + private final ExecutorService executorService = Executors.newSingleThreadExecutor(); + private final ExecutionEnvironment enviroment; /** - * Конструктор + * Con structor * - * @param env env для инициализации. Далее работа происходит с заполненным объектом + * @param env env для инициализации. Далее работа происходит с заполненым объектом * @param initializer готовый чейн инициализации * @throws DatabaseException если произошла ошибка инициализации */ public static DatabaseServer initialize(ExecutionEnvironment env, DatabaseServerInitializer initializer) throws DatabaseException { - InitializationContext context = InitializationContextImpl.builder().executionEnvironment(env).build(); - initializer.perform(context); + initializer.perform(new InitializationContextImpl(env, null, null, null)); return new DatabaseServer(env); } - private DatabaseServer(ExecutionEnvironment env){ - this.env = env; + private DatabaseServer(ExecutionEnvironment env) { + this.enviroment = env; } public CompletableFuture executeNextCommand(RespArray message) { - return CompletableFuture.supplyAsync(() -> DatabaseCommands.valueOf(message.getObjects().get(DatabaseCommandArgPositions. - COMMAND_NAME.getPositionIndex()).asString()).getCommand(env, message.getObjects()).execute(), executorService); + return CompletableFuture.supplyAsync(() -> + DatabaseCommands.valueOf(message.getObjects().get(DatabaseCommandArgPositions.COMMAND_NAME.getPositionIndex()).asString()).getCommand(enviroment, message.getObjects()).execute(), executorService); } public CompletableFuture executeNextCommand(DatabaseCommand command) { @@ -44,6 +40,6 @@ public CompletableFuture executeNextCommand(DatabaseComma } public ExecutionEnvironment getEnv() { - return env; + return enviroment; } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java index dca289ec..3bccb5fa 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/RemoveDatabaseRecord.java @@ -2,16 +2,14 @@ import com.itmo.java.basics.logic.WritableDatabaseRecord; +/** + * Запись в БД, означающая удаление значения по ключу + */ public class RemoveDatabaseRecord implements WritableDatabaseRecord { - private static final int SIZE_OF_KEY_SIZE = 4; - private static final int SIZE_OF_VALUE_SIZE = 4; - private static final int VALUE_SIZE = -1; - private static final byte[] VALUE = null; - private int keySize; private byte[] key; + private byte[] value; - public RemoveDatabaseRecord(int keySize, byte[] key) { - this.keySize = keySize; + public RemoveDatabaseRecord(byte[] key) { this.key = key; } @@ -22,12 +20,12 @@ public byte[] getKey() { @Override public byte[] getValue() { - return VALUE; + return null; } @Override public long size() { - return SIZE_OF_KEY_SIZE + keySize + SIZE_OF_VALUE_SIZE; + return getKeySize() + 4 + 4; } @Override @@ -35,13 +33,14 @@ public boolean isValuePresented() { return false; } + @Override public int getKeySize() { - return keySize; + return key.length; } @Override public int getValueSize() { - return VALUE_SIZE; + return -1; } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java index 0e153509..cf7cb752 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SegmentImpl.java @@ -10,7 +10,6 @@ import com.itmo.java.basics.logic.io.DatabaseInputStream; import com.itmo.java.basics.logic.io.DatabaseOutputStream; -import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.nio.charset.StandardCharsets; @@ -86,21 +85,20 @@ public String getName() { @Override public boolean write(String objectKey, byte[] objectValue) throws IOException { + if (isReadOnly()) { + outStream.close(); return false; } - try (DatabaseOutputStream outputStream = new DatabaseOutputStream(new FileOutputStream(tableRootPath.toString(), true))) { - int writtenBytes; - if (objectValue == null) { - writtenBytes = outputStream.write(new SetDatabaseRecord(objectKey.length(), objectKey.getBytes(StandardCharsets.UTF_8), -1, new byte[]{})); - } else { - writtenBytes = outputStream.write(new SetDatabaseRecord(objectKey.length(), objectKey.getBytes(StandardCharsets.UTF_8), objectValue.length, objectValue)); - } - segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); - segmentSize += writtenBytes; - return true; + if (objectValue == null) { + return delete(objectKey); } + SetDatabaseRecord newSeg = new SetDatabaseRecord(objectKey.getBytes(StandardCharsets.UTF_8), objectValue); + segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); + segmentSize += outStream.write(newSeg); + return true; } + @Override public Optional read(String objectKey) throws IOException { @@ -132,14 +130,14 @@ public boolean isReadOnly() { @Override public boolean delete(String objectKey) throws IOException { - if (segmentIndex.searchForKey(objectKey).isEmpty()) { + + if (isReadOnly()) { + outStream.close(); return false; } - try (DatabaseOutputStream outputStream = new DatabaseOutputStream(new FileOutputStream(tableRootPath.toString(), true))) { - int writtenBytes = outputStream.write(new RemoveDatabaseRecord(objectKey.length(), objectKey.getBytes(StandardCharsets.UTF_8))); - segmentIndex.onIndexedEntityUpdated(objectKey, null); - segmentSize += writtenBytes; - return true; - } + RemoveDatabaseRecord newSeg = new RemoveDatabaseRecord(objectKey.getBytes()); + segmentIndex.onIndexedEntityUpdated(objectKey, new SegmentOffsetInfoImpl(segmentSize)); + segmentSize += outStream.write(newSeg); + return true; } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java b/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java index 307c0beb..38ced136 100644 --- a/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java +++ b/src/main/java/com/itmo/java/basics/logic/impl/SetDatabaseRecord.java @@ -2,19 +2,20 @@ import com.itmo.java.basics.logic.WritableDatabaseRecord; +/** + * Запись в БД, означающая добавление значения по ключу + */ public class SetDatabaseRecord implements WritableDatabaseRecord { - private static final int SIZE_OF_KEY_SIZE = 4; - private static final int SIZE_OF_VALUE_SIZE = 4; - private int keySize, valueSize; - private byte[] key, value; - public SetDatabaseRecord(int keySize, byte[] key, int valueSize, byte[] value) { - this.keySize = keySize; + private byte[] key; + private byte[] value; + + public SetDatabaseRecord(byte[] key, byte[] value) { this.key = key; - this.valueSize = valueSize; this.value = value; } + @Override public byte[] getKey() { return key; @@ -27,21 +28,21 @@ public byte[] getValue() { @Override public long size() { - return SIZE_OF_KEY_SIZE + keySize + SIZE_OF_VALUE_SIZE + valueSize; + return getKeySize() + getValueSize() + 4 + 4; } @Override public boolean isValuePresented() { - return value != null; + return true; } @Override public int getKeySize() { - return keySize; + return key.length; } @Override public int getValueSize() { - return valueSize; + return value.length; } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java index e18e5ee5..3e3bc895 100644 --- a/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java +++ b/src/main/java/com/itmo/java/basics/logic/io/DatabaseInputStream.java @@ -6,7 +6,6 @@ import com.itmo.java.basics.logic.impl.SetDatabaseRecord; import java.io.DataInputStream; -import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.util.Optional; @@ -31,13 +30,16 @@ public Optional readDbUnit() throws IOException { int keySize = readInt(); byte[] key = readNBytes(keySize); int valueSize = readInt(); - if (valueSize == REMOVED_OBJECT_SIZE) { - return Optional.of(new RemoveDatabaseRecord(keySize, key)); + + if (valueSize != REMOVED_OBJECT_SIZE) { + byte[] value = readNBytes(valueSize); + Optional result = Optional.of(new SetDatabaseRecord(key, value)); + return result; + } else { + return Optional.of(new RemoveDatabaseRecord(key)); } - byte[] value = readNBytes(valueSize); - return Optional.of(new SetDatabaseRecord(keySize, key, valueSize, value)); - }catch (EOFException e){ + } catch (IOException ex) { return Optional.empty(); } } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/resp/CommandReader.java b/src/main/java/com/itmo/java/basics/resp/CommandReader.java index ae5fea60..5199f445 100644 --- a/src/main/java/com/itmo/java/basics/resp/CommandReader.java +++ b/src/main/java/com/itmo/java/basics/resp/CommandReader.java @@ -61,4 +61,4 @@ public DatabaseCommand readCommand() throws IOException { public void close() throws Exception { reader.close(); } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java b/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java index 8a3d0b39..9ad82ccd 100644 --- a/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java +++ b/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java @@ -7,7 +7,6 @@ import com.itmo.java.client.exception.DatabaseExecutionException; import com.itmo.java.protocol.model.RespObject; -import java.util.Arrays; import java.util.function.Supplier; public class SimpleKvsClient implements KvsClient { @@ -28,86 +27,71 @@ public SimpleKvsClient(String databaseName, Supplier connectionSu @Override public String createDatabase() throws DatabaseExecutionException { - CreateDatabaseKvsCommand dbKvsCom = new CreateDatabaseKvsCommand(dbName); try { - // CreateDatabaseKvsCommand dbKvsCom = new CreateDatabaseKvsCommand(dbName); + CreateDatabaseKvsCommand dbKvsCom = new CreateDatabaseKvsCommand(dbName); RespObject obj = connectionSupplier.send(dbKvsCom.getCommandId(), dbKvsCom.serialize()); if (obj.isError()) { throw new DatabaseExecutionException(obj.asString()); } return obj.asString(); } catch (ConnectionException ex) { - // throw new DatabaseExecutionException("Creating DataBAse SinpleKvsClient, ConnectionException", ex); - throw new DatabaseExecutionException(String.format("DatabaseExecutionException " + ex.getMessage() + Arrays.toString(ex.getStackTrace()), - dbKvsCom.serialize().asString()), ex); + return DatabaseCommandResult.error(ex).getPayLoad(); } } @Override public String createTable(String tableName) throws DatabaseExecutionException { - CreateTableKvsCommand tbKvsCom = new CreateTableKvsCommand(dbName, tableName); try { - // CreateTableKvsCommand tbKvsCom = new CreateTableKvsCommand(dbName, tableName); + CreateTableKvsCommand tbKvsCom = new CreateTableKvsCommand(dbName, tableName); RespObject obj = connectionSupplier.send(tbKvsCom.getCommandId(), tbKvsCom.serialize()); if (obj.isError()) { throw new DatabaseExecutionException(obj.asString()); } return obj.asString(); } catch (ConnectionException ex) { - // throw new DatabaseExecutionException("Creating table SinpleKvsClient, ConnectionException", ex); - throw new DatabaseExecutionException(String.format("DatabaseExecutionException " + ex.getMessage() + Arrays.toString(ex.getStackTrace()), - tbKvsCom.serialize().asString()), ex); + return DatabaseCommandResult.error(ex).getPayLoad(); } } @Override public String get(String tableName, String key) throws DatabaseExecutionException { - GetKvsCommand getKvsCom = new GetKvsCommand(dbName, tableName, key); try { - // GetKvsCommand getKvsCom = new GetKvsCommand(dbName, tableName, key); + GetKvsCommand getKvsCom = new GetKvsCommand(dbName, tableName, key); RespObject obj = connectionSupplier.send(getKvsCom.getCommandId(), getKvsCom.serialize()); if (obj.isError()) { throw new DatabaseExecutionException(obj.asString()); } return obj.asString(); } catch (ConnectionException ex) { - // throw new DatabaseExecutionException("getting SinpleKvsClient, ConnectionException", ex); - throw new DatabaseExecutionException(String.format("DatabaseExecutionException " + ex.getMessage() + Arrays.toString(ex.getStackTrace()), - getKvsCom.serialize().asString()), ex); + return DatabaseCommandResult.error(ex).getPayLoad(); } } @Override public String set(String tableName, String key, String value) throws DatabaseExecutionException { - SetKvsCommand setKvsCom = new SetKvsCommand(dbName, tableName, key, value); try { - // SetKvsCommand setKvsCom = new SetKvsCommand(dbName, tableName, key, value); + SetKvsCommand setKvsCom = new SetKvsCommand(dbName, tableName, key, value); RespObject obj = connectionSupplier.send(setKvsCom.getCommandId(), setKvsCom.serialize()); if (obj.isError()) { throw new DatabaseExecutionException(obj.asString()); } return obj.asString(); } catch (ConnectionException ex) { - // throw new DatabaseExecutionException("setting SinpleKvsClient, ConnectionException", ex); - throw new DatabaseExecutionException(String.format("DatabaseExecutionException " + ex.getMessage() + Arrays.toString(ex.getStackTrace()), - setKvsCom.serialize().asString()), ex); + return DatabaseCommandResult.error(ex).getPayLoad(); } } @Override public String delete(String tableName, String key) throws DatabaseExecutionException { - DeleteKvsCommand delKvsCom = new DeleteKvsCommand(dbName, tableName, key); try { - // DeleteKvsCommand delKvsCom = new DeleteKvsCommand(dbName, tableName, key); + DeleteKvsCommand delKvsCom = new DeleteKvsCommand(dbName, tableName, key); RespObject obj = connectionSupplier.send(delKvsCom.getCommandId(), delKvsCom.serialize()); if (obj.isError()) { throw new DatabaseExecutionException(obj.asString()); } return obj.asString(); } catch (ConnectionException ex) { -// throw new DatabaseExecutionException("Deleting SinpleKvsClient, ConnectionException", ex); - throw new DatabaseExecutionException(String.format("DatabaseExecutionException " + ex.getMessage() + Arrays.toString(ex.getStackTrace()), - delKvsCom.serialize().asString()), ex); + return DatabaseCommandResult.error(ex).getPayLoad(); } } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index 8c28dd0f..7db69520 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -1,5 +1,6 @@ package com.itmo.java.client.connection; + import com.itmo.java.client.exception.ConnectionException; import com.itmo.java.protocol.RespReader; import com.itmo.java.protocol.RespWriter; @@ -14,21 +15,19 @@ * С помощью {@link RespWriter} и {@link RespReader} читает/пишет в сокет */ public class SocketKvsConnection implements KvsConnection { - private final int port; - private final String host; - private final Socket clientSocket; - private final RespWriter respWriter; - private final RespReader respReader; - + // private final int port; +// private final String host; +// private final Socket clientSocket; +// private final RespWriter respWriter; +// private final RespReader respReader; + final ConnectionConfig connectionConfig; + final Socket socket; public SocketKvsConnection(ConnectionConfig config) { - this.port = config.getPort(); - this.host = config.getHost(); + connectionConfig = config; try { - this.clientSocket = new Socket(host, port); - this.respReader = new RespReader(clientSocket.getInputStream()); - respWriter = new RespWriter(clientSocket.getOutputStream()); + socket = new Socket(connectionConfig.getHost(),connectionConfig.getPort()); } catch (IOException e) { - throw new RuntimeException("IOException when try to connect by " + host + " " + port, e); + throw new RuntimeException("Error in const"); } } @@ -40,31 +39,19 @@ public SocketKvsConnection(ConnectionConfig config) { */ @Override public synchronized RespObject send(int commandId, RespArray command) throws ConnectionException { -// try { - try { - RespWriter respWriter = new RespWriter(clientSocket.getOutputStream()); - } catch (IOException ex) { - throw new ConnectionException("1"); - } try { + RespWriter respWriter = new RespWriter(socket.getOutputStream()); respWriter.write(command); - } catch (IOException ex) { - throw new ConnectionException("2"); - } - try { - RespReader respReader = new RespReader(clientSocket.getInputStream()); - } catch (IOException ex) { - throw new ConnectionException("3"); - } - try { - return respReader.readObject(); - } catch (IOException ex) { - throw new ConnectionException("4"); + RespReader respReader = new RespReader(socket.getInputStream()); + RespObject respObject = respReader.readObject(); + if (respObject.isError()) { + throw new ConnectionException("Response error"); + } + return respObject; + } catch (IOException e) { + close(); + throw new ConnectionException("IOException when send SocketKvs"); } -// } catch (IOException e) { -// close(); -// throw new ConnectionException("IOException when send " + command.asString() + " with " + host + " and port " + port + " ___IOMessage___: " + e.getMessage(), e); -// } } /** @@ -73,11 +60,9 @@ public synchronized RespObject send(int commandId, RespArray command) throws Con @Override public void close() { try { - respWriter.close(); - respReader.close(); - clientSocket.close(); + socket.close(); } catch (IOException e) { throw new RuntimeException("IOException when try to close client socket"); } } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index daab3330..b1e0d479 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -38,7 +38,7 @@ public boolean hasArray() throws IOException { public RespObject readObject() throws IOException { int codeInt = reader.read(); if (codeInt == -1) { - throw new IOException("me too"); + throw new EOFException("InputStream is empty when try to read RespObject"); } byte code = (byte) codeInt; switch (code) { @@ -153,4 +153,4 @@ private byte[] readBytesToEndOfLine() throws IOException { } return bytes; } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/protocol/RespWriter.java b/src/main/java/com/itmo/java/protocol/RespWriter.java index fe29dd3a..fc21f3e9 100644 --- a/src/main/java/com/itmo/java/protocol/RespWriter.java +++ b/src/main/java/com/itmo/java/protocol/RespWriter.java @@ -5,11 +5,12 @@ import java.io.IOException; import java.io.OutputStream; - public class RespWriter implements AutoCloseable{ + private final OutputStream outputStream; public RespWriter(OutputStream os) { + outputStream = os; } @@ -17,11 +18,19 @@ public RespWriter(OutputStream os) { * Записывает в output stream объект */ public void write(RespObject object) throws IOException { - object.write(outputStream); + try { + object.write(outputStream); + } catch (IOException ex) { + throw new IOException(ex); + } } @Override public void close() throws IOException { - outputStream.close(); + try { + outputStream.close(); + } catch (IOException ex) { + throw new IOException(ex); + } } -} +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/protocol/model/RespArray.java b/src/main/java/com/itmo/java/protocol/model/RespArray.java index f0eb3db9..4616df11 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespArray.java +++ b/src/main/java/com/itmo/java/protocol/model/RespArray.java @@ -44,13 +44,16 @@ public String asString() { @Override public void write(OutputStream output) throws IOException { + try { output.write(CODE); output.write(Integer.toString(objects.size()).getBytes(StandardCharsets.UTF_8)); output.write(CRLF); - output.flush(); for (RespObject obj : objects) { obj.write(output); } + } catch (IOException ex){ + throw new IOException(ex); + } } public List getObjects() { From 725e640cfc1970a7a15f0e4da2c159dfc5989cc0 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 18:38:09 +0300 Subject: [PATCH 349/378] test --- .../com/itmo/java/client/connection/SocketKvsConnection.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index 7db69520..fb29d044 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -50,7 +50,8 @@ public synchronized RespObject send(int commandId, RespArray command) throws Con return respObject; } catch (IOException e) { close(); - throw new ConnectionException("IOException when send SocketKvs"); + return null; + //throw new ConnectionException("IOException when send SocketKvs"); } } From c9ca223e25d8dead16d8beeecc476825e61a0b95 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 18:43:08 +0300 Subject: [PATCH 350/378] deleteKvsCom --- .../com/itmo/java/basics/console/impl/DeleteKeyCommand.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java index c1c0ff93..ff2bb159 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java @@ -54,6 +54,10 @@ public DatabaseCommandResult execute() { return DatabaseCommandResult.error("Value with key DeleteKeyCommand " + key + " in database " + databaseName + " not found"); } database.get().delete(tableName, key); + Optional valuePrev = database.get().read(tableName,key); + if (valuePrev.isEmpty()) { + return DatabaseCommandResult.error("lol DelereKeyCom"); + } return DatabaseCommandResult.success(value.get()); } catch (DatabaseException e){ return DatabaseCommandResult.error("DatabaseException when try to delete value by key DeleteKeyCommand" + key + " in table " + tableName); From 417575cf790af51ed6ebc234c87f33eda43c2394 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 18:44:47 +0300 Subject: [PATCH 351/378] z --- .../com/itmo/java/client/connection/SocketKvsConnection.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index fb29d044..84d8fc51 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -50,8 +50,8 @@ public synchronized RespObject send(int commandId, RespArray command) throws Con return respObject; } catch (IOException e) { close(); - return null; - //throw new ConnectionException("IOException when send SocketKvs"); + // return null; + throw new ConnectionException("IOException when send SocketKvs"); } } From b89e836b87aa196eac5211a622f4e5ec2582bbf2 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 18:50:59 +0300 Subject: [PATCH 352/378] Response --- .../itmo/java/client/connection/SocketKvsConnection.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index 84d8fc51..6d5dbd7f 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -44,9 +44,9 @@ public synchronized RespObject send(int commandId, RespArray command) throws Con respWriter.write(command); RespReader respReader = new RespReader(socket.getInputStream()); RespObject respObject = respReader.readObject(); - if (respObject.isError()) { - throw new ConnectionException("Response error"); - } +// if (respObject.isError()) { +// throw new ConnectionException("Response error"); +// } return respObject; } catch (IOException e) { close(); From 26bac0b7856a0a5b40ecae49938b7abbe0d204e7 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 19:47:05 +0300 Subject: [PATCH 353/378] Update CreateDatabaseCommand.java --- .../itmo/java/basics/console/impl/CreateDatabaseCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java index 72df68b1..e7136400 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java @@ -48,7 +48,7 @@ public CreateDatabaseCommand(ExecutionEnvironment env, DatabaseFactory factory, */ @Override public DatabaseCommandResult execute() { - try { + try { String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); if (dbName == null) { throw new DatabaseException("Why dbname is null? CreateDatabaseCommand "); From a168f26081442da1a964d88dc2962a5c1d66df5d Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 19:54:23 +0300 Subject: [PATCH 354/378] fixing protocol --- .../console/impl/CreateDatabaseCommand.java | 2 +- .../com/itmo/java/protocol/RespReader.java | 40 ++++++++++--------- .../com/itmo/java/protocol/RespWriter.java | 2 +- .../itmo/java/protocol/model/RespArray.java | 4 +- .../java/protocol/model/RespCommandId.java | 1 - .../itmo/java/protocol/model/RespError.java | 2 +- 6 files changed, 27 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java index e7136400..72df68b1 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java @@ -48,7 +48,7 @@ public CreateDatabaseCommand(ExecutionEnvironment env, DatabaseFactory factory, */ @Override public DatabaseCommandResult execute() { - try { + try { String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); if (dbName == null) { throw new DatabaseException("Why dbname is null? CreateDatabaseCommand "); diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index b1e0d479..031590db 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -36,22 +36,26 @@ public boolean hasArray() throws IOException { * @throws IOException при ошибке чтения */ public RespObject readObject() throws IOException { - int codeInt = reader.read(); - if (codeInt == -1) { - throw new EOFException("InputStream is empty when try to read RespObject"); - } - byte code = (byte) codeInt; - switch (code) { - case RespArray.CODE: - return readArray(); - case RespBulkString.CODE: - return readBulkString(); - case RespCommandId.CODE: - return readCommandId(); - case RespError.CODE: - return readError(); - default: - throw new IOException("Code character is not correct"); + try { + int codeInt = reader.read(); + if (codeInt == -1) { + throw new EOFException("InputStream is empty RespObject"); + } + byte code = (byte) codeInt; + switch (code) { + case RespArray.CODE: + return readArray(); + case RespBulkString.CODE: + return readBulkString(); + case RespCommandId.CODE: + return readCommandId(); + case RespError.CODE: + return readError(); + default: + throw new IOException("Code character is not correct"); + } + } catch (IOException ex) { + throw new RuntimeException("Read object fail"); } } @@ -137,11 +141,11 @@ private byte[] readBytesToEndOfLine() throws IOException { if (nextByte == -1) { throw new EOFException("Stream is empty when try to read all bytes before '\\r\\n'"); } - if (nextByte == LF){ + if (nextByte == LF) { reader.reset(); reader.read(); break; - }else { + } else { reader.reset(); } } diff --git a/src/main/java/com/itmo/java/protocol/RespWriter.java b/src/main/java/com/itmo/java/protocol/RespWriter.java index fc21f3e9..24f72955 100644 --- a/src/main/java/com/itmo/java/protocol/RespWriter.java +++ b/src/main/java/com/itmo/java/protocol/RespWriter.java @@ -5,7 +5,7 @@ import java.io.IOException; import java.io.OutputStream; -public class RespWriter implements AutoCloseable{ +public class RespWriter implements AutoCloseable { private final OutputStream outputStream; diff --git a/src/main/java/com/itmo/java/protocol/model/RespArray.java b/src/main/java/com/itmo/java/protocol/model/RespArray.java index 4616df11..fcb17efb 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespArray.java +++ b/src/main/java/com/itmo/java/protocol/model/RespArray.java @@ -40,7 +40,7 @@ public boolean isError() { @Override public String asString() { return objects.stream().map(RespObject::asString).collect(Collectors.joining(" ")); - } // check + } @Override public void write(OutputStream output) throws IOException { @@ -51,7 +51,7 @@ public void write(OutputStream output) throws IOException { for (RespObject obj : objects) { obj.write(output); } - } catch (IOException ex){ + } catch (IOException ex) { throw new IOException(ex); } } diff --git a/src/main/java/com/itmo/java/protocol/model/RespCommandId.java b/src/main/java/com/itmo/java/protocol/model/RespCommandId.java index 19cfda32..8255d758 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespCommandId.java +++ b/src/main/java/com/itmo/java/protocol/model/RespCommandId.java @@ -2,7 +2,6 @@ import java.io.IOException; import java.io.OutputStream; -import java.nio.charset.StandardCharsets; /** * Id diff --git a/src/main/java/com/itmo/java/protocol/model/RespError.java b/src/main/java/com/itmo/java/protocol/model/RespError.java index 79f106c5..8e47a31f 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespError.java +++ b/src/main/java/com/itmo/java/protocol/model/RespError.java @@ -39,7 +39,7 @@ public void write(OutputStream output) throws IOException { output.write(CODE); output.write(message); output.write(CRLF); - } catch(IOException ex) { + } catch (IOException ex) { throw new IOException(ex); } } From 92ad49c9430b72c00afebf87fefe1f069072ff61 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 20:01:41 +0300 Subject: [PATCH 355/378] fix client --- .../command/CreateDatabaseKvsCommand.java | 1 - .../client/connection/SocketKvsConnection.java | 17 +++++------------ 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java b/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java index 633f17f6..df83530e 100644 --- a/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java @@ -21,7 +21,6 @@ public class CreateDatabaseKvsCommand implements KvsCommand { * @param databaseName имя базы данных */ public CreateDatabaseKvsCommand(String databaseName) { - // dbID = idGen.get(); dbID = idGen.incrementAndGet(); dbName = databaseName; } diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index 6d5dbd7f..dd40e2c4 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -9,23 +9,19 @@ import java.io.IOException; import java.net.Socket; -import java.net.UnknownHostException; /** * С помощью {@link RespWriter} и {@link RespReader} читает/пишет в сокет */ public class SocketKvsConnection implements KvsConnection { - // private final int port; -// private final String host; -// private final Socket clientSocket; -// private final RespWriter respWriter; -// private final RespReader respReader; + final ConnectionConfig connectionConfig; - final Socket socket; + final Socket socket; + public SocketKvsConnection(ConnectionConfig config) { connectionConfig = config; try { - socket = new Socket(connectionConfig.getHost(),connectionConfig.getPort()); + socket = new Socket(connectionConfig.getHost(), connectionConfig.getPort()); } catch (IOException e) { throw new RuntimeException("Error in const"); } @@ -33,6 +29,7 @@ public SocketKvsConnection(ConnectionConfig config) { /** * Отправляет с помощью сокета команду и получает результат. + * * @param commandId id команды (номер) * @param command команда * @throws ConnectionException если сокет закрыт или если произошла другая ошибка соединения @@ -44,13 +41,9 @@ public synchronized RespObject send(int commandId, RespArray command) throws Con respWriter.write(command); RespReader respReader = new RespReader(socket.getInputStream()); RespObject respObject = respReader.readObject(); -// if (respObject.isError()) { -// throw new ConnectionException("Response error"); -// } return respObject; } catch (IOException e) { close(); - // return null; throw new ConnectionException("IOException when send SocketKvs"); } } From 96fb0ecba318a5814c6074e850cd307199dd8bb7 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 20:10:26 +0300 Subject: [PATCH 356/378] =?UTF-8?q?fix=20and=20=D0=BE=D1=82=D0=BA=D0=B0?= =?UTF-8?q?=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/itmo/java/basics/DatabaseServer.java | 3 +- .../itmo/java/basics/config/ConfigLoader.java | 6 +- .../connector/JavaSocketServerConnector.java | 76 ++++++++----------- .../itmo/java/basics/resp/CommandReader.java | 13 ++-- .../com/itmo/java/protocol/RespReader.java | 4 +- 5 files changed, 43 insertions(+), 59 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/DatabaseServer.java b/src/main/java/com/itmo/java/basics/DatabaseServer.java index 4aaa197f..785068c0 100644 --- a/src/main/java/com/itmo/java/basics/DatabaseServer.java +++ b/src/main/java/com/itmo/java/basics/DatabaseServer.java @@ -2,7 +2,8 @@ import com.itmo.java.basics.console.*; import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.initialization.impl.*; +import com.itmo.java.basics.initialization.impl.DatabaseServerInitializer; +import com.itmo.java.basics.initialization.impl.InitializationContextImpl; import com.itmo.java.protocol.model.RespArray; import java.util.concurrent.CompletableFuture; diff --git a/src/main/java/com/itmo/java/basics/config/ConfigLoader.java b/src/main/java/com/itmo/java/basics/config/ConfigLoader.java index 6551dcd7..a547d5fb 100644 --- a/src/main/java/com/itmo/java/basics/config/ConfigLoader.java +++ b/src/main/java/com/itmo/java/basics/config/ConfigLoader.java @@ -29,7 +29,7 @@ public ConfigLoader() { */ public ConfigLoader(String name) { try { - if (this.getClass().getClassLoader().getResourceAsStream(name) != null){ + if (this.getClass().getClassLoader().getResourceAsStream(name) != null) { configFileProp.load(this.getClass().getClassLoader().getResourceAsStream(name)); } else { FileInputStream fileInputStream = new FileInputStream(name); @@ -51,7 +51,7 @@ public DatabaseServerConfig readConfig() { workingPath = configFileProp.getProperty("kvs.workingPath"); host = configFileProp.getProperty("kvs.host"); String stringPort = configFileProp.getProperty("kvs.port"); - if (host == null){ + if (host == null) { host = ServerConfig.DEFAULT_HOST; } if (stringPort == null) { @@ -59,7 +59,7 @@ public DatabaseServerConfig readConfig() { } else { port = Integer.parseInt(stringPort); } - if (workingPath == null){ + if (workingPath == null) { workingPath = DatabaseConfig.DEFAULT_WORKING_PATH; } ServerConfig serverConfig = new ServerConfig(host, port); diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index 9d99814b..352008c9 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -1,16 +1,9 @@ package com.itmo.java.basics.connector; import com.itmo.java.basics.DatabaseServer; -import com.itmo.java.basics.config.ConfigLoader; -import com.itmo.java.basics.config.DatabaseConfig; -import com.itmo.java.basics.config.DatabaseServerConfig; import com.itmo.java.basics.config.ServerConfig; +import com.itmo.java.basics.console.DatabaseCommand; import com.itmo.java.basics.console.DatabaseCommandResult; -import com.itmo.java.basics.console.impl.ExecutionEnvironmentImpl; -import com.itmo.java.basics.initialization.impl.DatabaseInitializer; -import com.itmo.java.basics.initialization.impl.DatabaseServerInitializer; -import com.itmo.java.basics.initialization.impl.SegmentInitializer; -import com.itmo.java.basics.initialization.impl.TableInitializer; import com.itmo.java.basics.resp.CommandReader; import com.itmo.java.protocol.RespReader; import com.itmo.java.protocol.RespWriter; @@ -19,7 +12,7 @@ import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; -import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -32,22 +25,16 @@ public class JavaSocketServerConnector implements Closeable { * Экзекьютор для выполнения ClientTask */ private final ExecutorService clientIOWorkers = Executors.newSingleThreadExecutor(); - private final ServerSocket serverSocket; private final ExecutorService connectionAcceptorExecutor = Executors.newSingleThreadExecutor(); - - private final DatabaseServer server; + private final DatabaseServer dbServer; /** * Стартует сервер. По аналогии с сокетом открывает коннекшн в конструкторе. */ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig config) throws IOException { - try { - this.serverSocket = new ServerSocket(config.getPort()); - this.server = databaseServer; - } catch (IOException ex) { - throw new IOException(ex); - } + dbServer = databaseServer; + serverSocket = new ServerSocket(config.getPort()); } /** @@ -55,26 +42,29 @@ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig con */ public void start() { connectionAcceptorExecutor.submit(() -> { - while(true) { - Socket clientSocket = serverSocket.accept(); - clientIOWorkers.submit(new ClientTask(clientSocket,server)); + try { + final Socket client = serverSocket.accept(); + final ClientTask clientTask = new ClientTask(client, dbServer); + + clientIOWorkers.submit(clientTask); + } catch (IOException exception) { + exception.printStackTrace(); } }); } + /** * Закрывает все, что нужно ¯\_(ツ)_/¯ */ @Override public void close() { System.out.println("Stopping socket connector"); - connectionAcceptorExecutor.shutdownNow(); - clientIOWorkers.shutdownNow(); - if (serverSocket != null) { - try { - serverSocket.close(); - } catch (IOException e) { - throw new RuntimeException("IOException when try to close connection", e); - } + try { + serverSocket.close(); + connectionAcceptorExecutor.shutdown(); + clientIOWorkers.shutdown(); + } catch (IOException exception) { + throw new RuntimeException("Closing server socket error", exception); } } @@ -88,7 +78,6 @@ public static void main(String[] args) throws Exception { static class ClientTask implements Runnable, Closeable { private final Socket client; private final DatabaseServer server; - private final RespWriter respWriter; /** * @param client клиентский сокет @@ -97,11 +86,6 @@ static class ClientTask implements Runnable, Closeable { public ClientTask(Socket client, DatabaseServer server) { this.client = client; this.server = server; - try { - this.respWriter = new RespWriter(client.getOutputStream()); - } catch (IOException e){ - throw new RuntimeException("IOException when open socket streams", e); - } } /** @@ -113,15 +97,16 @@ public ClientTask(Socket client, DatabaseServer server) { */ @Override public void run() { - try (CommandReader commandReader = new CommandReader(new RespReader(client.getInputStream()), server.getEnv())) { + try { + final CommandReader commandReader = new CommandReader(new RespReader(client.getInputStream()), server.getEnv()); + final RespWriter respWriter = new RespWriter(client.getOutputStream()); while (commandReader.hasNextCommand()) { - CompletableFuture commandResult = server.executeNextCommand(commandReader.readCommand()); - respWriter.write(commandResult.get().serialize()); + final DatabaseCommand command = commandReader.readCommand(); + final DatabaseCommandResult commandResult = server.executeNextCommand(command).get(); + respWriter.write(commandResult.serialize()); } - close(); - } catch (Exception e) { - close(); - throw new RuntimeException("When try to read, write or execute command", e); + } catch (ExecutionException | IOException | InterruptedException exception) { + exception.printStackTrace(); } } @@ -131,11 +116,10 @@ public void run() { @Override public void close() { try { - respWriter.close(); client.close(); - } catch (IOException e){ - throw new RuntimeException("When try to close client connection", e); + } catch (IOException exception) { + throw new RuntimeException("Closing client socket error", exception); } } } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/basics/resp/CommandReader.java b/src/main/java/com/itmo/java/basics/resp/CommandReader.java index 5199f445..b5135f81 100644 --- a/src/main/java/com/itmo/java/basics/resp/CommandReader.java +++ b/src/main/java/com/itmo/java/basics/resp/CommandReader.java @@ -4,7 +4,6 @@ import com.itmo.java.basics.console.DatabaseCommandArgPositions; import com.itmo.java.basics.console.DatabaseCommands; import com.itmo.java.basics.console.ExecutionEnvironment; -import com.itmo.java.basics.console.impl.CreateDatabaseCommand; import com.itmo.java.protocol.RespReader; import com.itmo.java.protocol.model.RespArray; import com.itmo.java.protocol.model.RespBulkString; @@ -36,21 +35,21 @@ public boolean hasNextCommand() throws IOException { */ public DatabaseCommand readCommand() throws IOException { RespArray respArray = reader.readArray(); - if (respArray.getObjects().size() < DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex() + 1){ - throw new IllegalArgumentException("RespArray does not have enough size to have id, name and one object"); + if (respArray.getObjects().size() < DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex() + 1) { + throw new IllegalArgumentException("RespArray does not have enough size"); } RespObject id = respArray.getObjects().get(DatabaseCommandArgPositions.COMMAND_ID.getPositionIndex()); - if (!(id instanceof RespCommandId)){ + if (!(id instanceof RespCommandId)) { throw new IllegalArgumentException("Command does not have command id"); } - if (id.asString() == null || id.asString().isEmpty()){ + if (id.asString() == null || id.asString().isEmpty()) { throw new IllegalArgumentException("Command id does not exist"); } RespObject commandName = respArray.getObjects().get(DatabaseCommandArgPositions.COMMAND_NAME.getPositionIndex()); - if (!(commandName instanceof RespBulkString)){ + if (!(commandName instanceof RespBulkString)) { throw new IllegalArgumentException("Command does not have command name"); } - if (commandName.asString() == null || commandName.asString().isEmpty()){ + if (commandName.asString() == null || commandName.asString().isEmpty()) { throw new IllegalArgumentException("Command name does not exist"); } diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 031590db..f8029022 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -52,10 +52,10 @@ public RespObject readObject() throws IOException { case RespError.CODE: return readError(); default: - throw new IOException("Code character is not correct"); + throw new IOException("Code is not correct"); } } catch (IOException ex) { - throw new RuntimeException("Read object fail"); + throw new IOException("Error while readObject RespReader"); } } From 2df181b22d17fdce6b012958e75c1daac89a051c Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 20:15:19 +0300 Subject: [PATCH 357/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82=20+=20tr?= =?UTF-8?q?y?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../connector/JavaSocketServerConnector.java | 74 ++++++++++++------- 1 file changed, 47 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index 352008c9..00d135f3 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -1,9 +1,16 @@ package com.itmo.java.basics.connector; import com.itmo.java.basics.DatabaseServer; +import com.itmo.java.basics.config.ConfigLoader; +import com.itmo.java.basics.config.DatabaseConfig; +import com.itmo.java.basics.config.DatabaseServerConfig; import com.itmo.java.basics.config.ServerConfig; -import com.itmo.java.basics.console.DatabaseCommand; import com.itmo.java.basics.console.DatabaseCommandResult; +import com.itmo.java.basics.console.impl.ExecutionEnvironmentImpl; +import com.itmo.java.basics.initialization.impl.DatabaseInitializer; +import com.itmo.java.basics.initialization.impl.DatabaseServerInitializer; +import com.itmo.java.basics.initialization.impl.SegmentInitializer; +import com.itmo.java.basics.initialization.impl.TableInitializer; import com.itmo.java.basics.resp.CommandReader; import com.itmo.java.protocol.RespReader; import com.itmo.java.protocol.RespWriter; @@ -12,7 +19,7 @@ import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; -import java.util.concurrent.ExecutionException; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -25,16 +32,21 @@ public class JavaSocketServerConnector implements Closeable { * Экзекьютор для выполнения ClientTask */ private final ExecutorService clientIOWorkers = Executors.newSingleThreadExecutor(); + private final ServerSocket serverSocket; private final ExecutorService connectionAcceptorExecutor = Executors.newSingleThreadExecutor(); - private final DatabaseServer dbServer; + private final DatabaseServer server; /** * Стартует сервер. По аналогии с сокетом открывает коннекшн в конструкторе. */ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig config) throws IOException { - dbServer = databaseServer; - serverSocket = new ServerSocket(config.getPort()); + try { + this.serverSocket = new ServerSocket(config.getPort()); + this.server = databaseServer; + } catch (IOException ex) { + throw new IOException(ex); + } } /** @@ -42,29 +54,31 @@ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig con */ public void start() { connectionAcceptorExecutor.submit(() -> { +// while(true) { + Socket clientSocket = null; try { - final Socket client = serverSocket.accept(); - final ClientTask clientTask = new ClientTask(client, dbServer); - - clientIOWorkers.submit(clientTask); + clientSocket = serverSocket.accept(); } catch (IOException exception) { exception.printStackTrace(); } + clientIOWorkers.submit(new ClientTask(clientSocket,server)); +// } }); } - /** * Закрывает все, что нужно ¯\_(ツ)_/¯ */ @Override public void close() { System.out.println("Stopping socket connector"); - try { - serverSocket.close(); - connectionAcceptorExecutor.shutdown(); - clientIOWorkers.shutdown(); - } catch (IOException exception) { - throw new RuntimeException("Closing server socket error", exception); + connectionAcceptorExecutor.shutdownNow(); + clientIOWorkers.shutdownNow(); + if (serverSocket != null) { + try { + serverSocket.close(); + } catch (IOException e) { + throw new RuntimeException("IOException when try to close connection", e); + } } } @@ -78,6 +92,7 @@ public static void main(String[] args) throws Exception { static class ClientTask implements Runnable, Closeable { private final Socket client; private final DatabaseServer server; + private final RespWriter respWriter; /** * @param client клиентский сокет @@ -86,6 +101,11 @@ static class ClientTask implements Runnable, Closeable { public ClientTask(Socket client, DatabaseServer server) { this.client = client; this.server = server; + try { + this.respWriter = new RespWriter(client.getOutputStream()); + } catch (IOException e){ + throw new RuntimeException("IOException when open socket streams", e); + } } /** @@ -97,16 +117,15 @@ public ClientTask(Socket client, DatabaseServer server) { */ @Override public void run() { - try { - final CommandReader commandReader = new CommandReader(new RespReader(client.getInputStream()), server.getEnv()); - final RespWriter respWriter = new RespWriter(client.getOutputStream()); + try (CommandReader commandReader = new CommandReader(new RespReader(client.getInputStream()), server.getEnv())) { while (commandReader.hasNextCommand()) { - final DatabaseCommand command = commandReader.readCommand(); - final DatabaseCommandResult commandResult = server.executeNextCommand(command).get(); - respWriter.write(commandResult.serialize()); + CompletableFuture commandResult = server.executeNextCommand(commandReader.readCommand()); + respWriter.write(commandResult.get().serialize()); } - } catch (ExecutionException | IOException | InterruptedException exception) { - exception.printStackTrace(); + close(); + } catch (Exception e) { + close(); + throw new RuntimeException("When try to read, write or execute command", e); } } @@ -116,10 +135,11 @@ public void run() { @Override public void close() { try { + respWriter.close(); client.close(); - } catch (IOException exception) { - throw new RuntimeException("Closing client socket error", exception); + } catch (IOException e){ + throw new RuntimeException("When try to close client connection", e); } } } -} +} \ No newline at end of file From ff77a52fd589f0c2da4cece93b6bf73a0d4ebf73 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 20:31:14 +0300 Subject: [PATCH 358/378] fix console --- .../connector/JavaSocketServerConnector.java | 29 +++++--------- .../basics/console/DatabaseCommandResult.java | 8 +++- .../console/impl/CreateDatabaseCommand.java | 21 +++++----- .../console/impl/CreateTableCommand.java | 39 +++++++++++-------- .../basics/console/impl/DeleteKeyCommand.java | 20 +++++----- 5 files changed, 61 insertions(+), 56 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index 00d135f3..d3b0fde2 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -1,16 +1,8 @@ package com.itmo.java.basics.connector; import com.itmo.java.basics.DatabaseServer; -import com.itmo.java.basics.config.ConfigLoader; -import com.itmo.java.basics.config.DatabaseConfig; -import com.itmo.java.basics.config.DatabaseServerConfig; import com.itmo.java.basics.config.ServerConfig; import com.itmo.java.basics.console.DatabaseCommandResult; -import com.itmo.java.basics.console.impl.ExecutionEnvironmentImpl; -import com.itmo.java.basics.initialization.impl.DatabaseInitializer; -import com.itmo.java.basics.initialization.impl.DatabaseServerInitializer; -import com.itmo.java.basics.initialization.impl.SegmentInitializer; -import com.itmo.java.basics.initialization.impl.TableInitializer; import com.itmo.java.basics.resp.CommandReader; import com.itmo.java.protocol.RespReader; import com.itmo.java.protocol.RespWriter; @@ -54,17 +46,16 @@ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig con */ public void start() { connectionAcceptorExecutor.submit(() -> { -// while(true) { Socket clientSocket = null; try { clientSocket = serverSocket.accept(); } catch (IOException exception) { exception.printStackTrace(); } - clientIOWorkers.submit(new ClientTask(clientSocket,server)); -// } + clientIOWorkers.submit(new ClientTask(clientSocket, server)); }); } + /** * Закрывает все, что нужно ¯\_(ツ)_/¯ */ @@ -76,8 +67,8 @@ public void close() { if (serverSocket != null) { try { serverSocket.close(); - } catch (IOException e) { - throw new RuntimeException("IOException when try to close connection", e); + } catch (IOException ex) { + throw new RuntimeException("IOException when try to close connection", ex); } } } @@ -103,8 +94,8 @@ public ClientTask(Socket client, DatabaseServer server) { this.server = server; try { this.respWriter = new RespWriter(client.getOutputStream()); - } catch (IOException e){ - throw new RuntimeException("IOException when open socket streams", e); + } catch (IOException ex) { + throw new RuntimeException("IOException when open socket streams", ex); } } @@ -123,9 +114,9 @@ public void run() { respWriter.write(commandResult.get().serialize()); } close(); - } catch (Exception e) { + } catch (Exception ex) { close(); - throw new RuntimeException("When try to read, write or execute command", e); + throw new RuntimeException("Write or execute command", ex); } } @@ -137,8 +128,8 @@ public void close() { try { respWriter.close(); client.close(); - } catch (IOException e){ - throw new RuntimeException("When try to close client connection", e); + } catch (IOException ex) { + throw new RuntimeException("When try to close client connection", ex); } } } diff --git a/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java b/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java index fb491ece..45ead06d 100644 --- a/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java +++ b/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java @@ -4,6 +4,8 @@ import com.itmo.java.basics.console.impl.SuccessDatabaseCommandResult; import com.itmo.java.protocol.model.RespObject; +import java.util.Arrays; + public interface DatabaseCommandResult extends DatabaseApiSerializable { /** @@ -34,7 +36,11 @@ static DatabaseCommandResult error(String message) { * @return результат команды, при выполнении которой произошла ошибка */ static DatabaseCommandResult error(Exception exception) { - return new FailedDatabaseCommandResult(exception.getMessage()); + if (exception.getMessage().isEmpty()) { + return new FailedDatabaseCommandResult(Arrays.toString(exception.getStackTrace())); + } else { + return new FailedDatabaseCommandResult(exception.getMessage()); + } } /** diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java index 72df68b1..8167ed0b 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java @@ -19,7 +19,8 @@ public class CreateDatabaseCommand implements DatabaseCommand { private final ExecutionEnvironment environment; private final DatabaseFactory dbfactory; private final List commandargs; - private static final int numberOfAgrguments = 3; + private final String dbName; + // private static final int numberOfAgrguments = 3; /** * Создает команду. @@ -33,12 +34,13 @@ public class CreateDatabaseCommand implements DatabaseCommand { * @throws IllegalArgumentException если передано неправильное количество аргументов */ public CreateDatabaseCommand(ExecutionEnvironment env, DatabaseFactory factory, List comArgs) { - if (comArgs.size() != numberOfAgrguments) { - throw new IllegalArgumentException("Why " + comArgs.size() + "!= 3 , in CreateDataBaseCommand"); - } +// if (comArgs.size() != numberOfAgrguments) { +// throw new IllegalArgumentException("Why " + comArgs.size() + "!= 3 , in CreateDataBaseCommand"); +// } environment = env; dbfactory = factory; commandargs = comArgs; + dbName = comArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); } /** @@ -49,14 +51,15 @@ public CreateDatabaseCommand(ExecutionEnvironment env, DatabaseFactory factory, @Override public DatabaseCommandResult execute() { try { - String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - if (dbName == null) { - throw new DatabaseException("Why dbname is null? CreateDatabaseCommand "); - } +// String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); +// if (dbName == null) { +// throw new DatabaseException("Why dbname is null? CreateDatabaseCommand "); +// } environment.addDatabase(dbfactory.createNonExistent(dbName, environment.getWorkingPath())); - return DatabaseCommandResult.success(("Success add CreateDatabaseCommand" + dbName).getBytes(StandardCharsets.UTF_8)); + // return DatabaseCommandResult.success(("Success add CreateDatabaseCommand" + dbName).getBytes(StandardCharsets.UTF_8)); } catch (DatabaseException ex) { return new FailedDatabaseCommandResult(ex.getMessage()); } + return DatabaseCommandResult.success(("Success add CreateDatabaseCommand" + dbName).getBytes(StandardCharsets.UTF_8)); } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java index a6c6a7e8..2ffc8c53 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java @@ -20,7 +20,10 @@ public class CreateTableCommand implements DatabaseCommand { private final ExecutionEnvironment environment; private final List commandargs; - private static final int numberOfAgrguments = 4; + // private static final int numberOfAgrguments = 4;\ + private final String dbName; + private final String tbName; + /** * Создает команду @@ -33,11 +36,13 @@ public class CreateTableCommand implements DatabaseCommand { * @throws IllegalArgumentException если передано неправильное количество аргументов */ public CreateTableCommand(ExecutionEnvironment env, List comArgs) { - if (comArgs.size() != numberOfAgrguments) { - throw new IllegalArgumentException("Why " + comArgs.size() + "!= 4 , in CreateTableCommand"); - } +// if (comArgs.size() != numberOfAgrguments) { +// throw new IllegalArgumentException("Why " + comArgs.size() + "!= 4 , in CreateTableCommand"); +// } environment = env; commandargs = comArgs; + tbName = comArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + dbName = comArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); } /** @@ -48,22 +53,22 @@ public CreateTableCommand(ExecutionEnvironment env, List comArgs) { @Override public DatabaseCommandResult execute() { try { - String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - if (dbName == null) { - throw new DatabaseException("Why dbname is null? CreateTableCommand"); - } - String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); - if (tbName == null) { - throw new DatabaseException("Why tbName is null? CreateTableCommand"); - } - Optional dataBase = environment.getDatabase(dbName); - if (dataBase.isEmpty()) { - throw new DatabaseException("We dont have CreateTableCommand" + dbName); +// String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); +// if (dbName == null) { +// throw new DatabaseException("Why dbname is null? CreateTableCommand"); +// } +// String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); +// if (tbName == null) { +// throw new DatabaseException("Why tbName is null? CreateTableCommand"); +// } + if (environment.getDatabase(dbName).isEmpty()) { + return DatabaseCommandResult.error("We dont found dataBase" + dbName); } - dataBase.get().createTableIfNotExists(tbName); - return DatabaseCommandResult.success(("Success add CreateTableCommand " + dbName + tbName).getBytes(StandardCharsets.UTF_8)); + environment.getDatabase(dbName).get().createTableIfNotExists(tbName); + // return DatabaseCommandResult.success(("Success add CreateTableCommand " + dbName + tbName).getBytes(StandardCharsets.UTF_8)); } catch (DatabaseException ex) { return new FailedDatabaseCommandResult(ex.getMessage()); } + return DatabaseCommandResult.success(("Success add CreateTableCommand " + dbName + tbName).getBytes(StandardCharsets.UTF_8)); } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java index ff2bb159..02b9b9f2 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java @@ -15,7 +15,7 @@ * Команда для создания удаления значения по ключу */ public class DeleteKeyCommand implements DatabaseCommand { - private final ExecutionEnvironment env; + private final ExecutionEnvironment environment; private final String databaseName; private final String tableName; private final String key; @@ -31,7 +31,7 @@ public class DeleteKeyCommand implements DatabaseCommand { * @throws IllegalArgumentException если передано неправильное количество аргументов */ public DeleteKeyCommand(ExecutionEnvironment env, List commandArgs) { - this.env = env; + this.environment = env; this.databaseName = commandArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); this.tableName = commandArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); this.key = commandArgs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); @@ -45,20 +45,20 @@ public DeleteKeyCommand(ExecutionEnvironment env, List commandArgs) @Override public DatabaseCommandResult execute() { try { - Optional database = env.getDatabase(databaseName); + Optional database = environment.getDatabase(databaseName); if (database.isEmpty()){ return DatabaseCommandResult.error("Not found database DeleteKeyCommand " + databaseName); } - Optional value = database.get().read(tableName, key); - if (value.isEmpty()){ + Optional previous = database.get().read(tableName, key); + if (previous.isEmpty()){ return DatabaseCommandResult.error("Value with key DeleteKeyCommand " + key + " in database " + databaseName + " not found"); } database.get().delete(tableName, key); - Optional valuePrev = database.get().read(tableName,key); - if (valuePrev.isEmpty()) { - return DatabaseCommandResult.error("lol DelereKeyCom"); - } - return DatabaseCommandResult.success(value.get()); +// Optional valuePrev = database.get().read(tableName,key); +// if (valuePrev.isEmpty()) { +// return DatabaseCommandResult.error("lol DelereKeyCom"); +// } + return DatabaseCommandResult.success(previous.get()); } catch (DatabaseException e){ return DatabaseCommandResult.error("DatabaseException when try to delete value by key DeleteKeyCommand" + key + " in table " + tableName); } From 43402840154222729823bf043d464d6fc49c98e4 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 20:42:12 +0300 Subject: [PATCH 359/378] fix console --- .../basics/console/impl/DeleteKeyCommand.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java index 02b9b9f2..d6d52adf 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java @@ -16,8 +16,8 @@ */ public class DeleteKeyCommand implements DatabaseCommand { private final ExecutionEnvironment environment; - private final String databaseName; - private final String tableName; + private final String dbName; + private final String tbName; private final String key; /** @@ -32,8 +32,8 @@ public class DeleteKeyCommand implements DatabaseCommand { */ public DeleteKeyCommand(ExecutionEnvironment env, List commandArgs) { this.environment = env; - this.databaseName = commandArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - this.tableName = commandArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + this.dbName = commandArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + this.tbName = commandArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); this.key = commandArgs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); } @@ -45,22 +45,22 @@ public DeleteKeyCommand(ExecutionEnvironment env, List commandArgs) @Override public DatabaseCommandResult execute() { try { - Optional database = environment.getDatabase(databaseName); + Optional database = environment.getDatabase(dbName); if (database.isEmpty()){ - return DatabaseCommandResult.error("Not found database DeleteKeyCommand " + databaseName); + return DatabaseCommandResult.error("Not found database DeleteKeyCommand " + dbName); } - Optional previous = database.get().read(tableName, key); + Optional previous = database.get().read(tbName, key); if (previous.isEmpty()){ - return DatabaseCommandResult.error("Value with key DeleteKeyCommand " + key + " in database " + databaseName + " not found"); + return DatabaseCommandResult.error("Value with key DeleteKeyCommand " + key + " in database " + dbName + " not found"); } - database.get().delete(tableName, key); + database.get().delete(tbName, key); // Optional valuePrev = database.get().read(tableName,key); // if (valuePrev.isEmpty()) { // return DatabaseCommandResult.error("lol DelereKeyCom"); // } return DatabaseCommandResult.success(previous.get()); } catch (DatabaseException e){ - return DatabaseCommandResult.error("DatabaseException when try to delete value by key DeleteKeyCommand" + key + " in table " + tableName); + return DatabaseCommandResult.error("DatabaseException when try to delete value by key DeleteKeyCommand" + key + " in table " + tbName); } } } From f3c067ed689f897bf75ff390ae9aeb4bbd149986 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 20:42:19 +0300 Subject: [PATCH 360/378] fix console --- .../basics/console/impl/GetKeyCommand.java | 44 +++++++++------- .../basics/console/impl/SetKeyCommand.java | 50 +++++++++++-------- 2 files changed, 54 insertions(+), 40 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java index ec9b42a1..4a5282c8 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java @@ -19,7 +19,10 @@ public class GetKeyCommand implements DatabaseCommand { private final ExecutionEnvironment environment; private final List commandargs; - private static final int numberOfAgrguments = 5; + // private static final int numberOfAgrguments = 5; + private final String dbName; + private final String tbName; + private final String key; /** * Создает команду. @@ -32,11 +35,14 @@ public class GetKeyCommand implements DatabaseCommand { * @throws IllegalArgumentException если передано неправильное количество аргументов */ public GetKeyCommand(ExecutionEnvironment env, List comArgs) { - if (comArgs.size() != numberOfAgrguments) { - throw new IllegalArgumentException("Why " + comArgs.size() + "!= 5 , in GetKeyCommand"); - } +// if (comArgs.size() != numberOfAgrguments) { +// throw new IllegalArgumentException("Why " + comArgs.size() + "!= 5 , in GetKeyCommand"); +// } environment = env; commandargs = comArgs; + this.dbName = comArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + this.tbName = comArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + this.key = comArgs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); } /** @@ -47,29 +53,29 @@ public GetKeyCommand(ExecutionEnvironment env, List comArgs) { @Override public DatabaseCommandResult execute() { try { - String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - if (dbName == null) { - throw new DatabaseException("Why dbname is null? GetKeyCommand"); - } - String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); - if (tbName == null) { - throw new DatabaseException("Why tbName is null? GetKeyCommand"); - } - String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); - if (key == null) { - throw new DatabaseException("Why key is null? GetKeyCommand"); - } +// String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); +// if (dbName == null) { +// throw new DatabaseException("Why dbname is null? GetKeyCommand"); +// } +// String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); +// if (tbName == null) { +// throw new DatabaseException("Why tbName is null? GetKeyCommand"); +// } +// String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); +// if (key == null) { +// throw new DatabaseException("Why key is null? GetKeyCommand"); +// } Optional dataBase = environment.getDatabase(dbName); if (dataBase.isEmpty()) { - throw new DatabaseException("We dont have GetKeyCommand" + dbName); + return DatabaseCommandResult.error("We dont have GetKeyCommand"); } Optional value = dataBase.get().read(tbName, key); // if (value.isEmpty()) { // throw new DatabaseException("We dont have GetKeyCommand" + dbName + tbName + key); //} - return DatabaseCommandResult.success(value.get()); + return DatabaseCommandResult.success(value.orElse(null)); } catch (DatabaseException ex) { - return new FailedDatabaseCommandResult(ex.getMessage()); + return DatabaseCommandResult.error("Error when try ti get value bu key"); } } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java index 0388d3e6..0d966a2c 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java @@ -20,7 +20,11 @@ public class SetKeyCommand implements DatabaseCommand { private final ExecutionEnvironment environment; private final List commandargs; - private static final int numberOfAgrguments = 6; + // private static final int numberOfAgrguments = 6; + private final String dbName; + private final String tbName; + private final String key; + private final String value; /** * Создает команду. @@ -33,11 +37,15 @@ public class SetKeyCommand implements DatabaseCommand { * @throws IllegalArgumentException если передано неправильное количество аргументов */ public SetKeyCommand(ExecutionEnvironment env, List comArgs) { - if (comArgs.size() != numberOfAgrguments) { - throw new IllegalArgumentException("Why " + comArgs.size() + "!= 5 , in CreateTableCommand SetKeyCommand"); - } +// if (comArgs.size() != numberOfAgrguments) { +// throw new IllegalArgumentException("Why " + comArgs.size() + "!= 5 , in CreateTableCommand SetKeyCommand"); +// } environment = env; commandargs = comArgs; + this.value = comArgs.get(DatabaseCommandArgPositions.VALUE.getPositionIndex()).asString(); + this.dbName = comArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + this.tbName = comArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + this.key = comArgs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); } /** @@ -48,27 +56,27 @@ public SetKeyCommand(ExecutionEnvironment env, List comArgs) { @Override public DatabaseCommandResult execute() { try { - String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - if (dbName == null) { - throw new DatabaseException("Why dbname is null SetKeyCommand? "); - } - String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); - if (tbName == null) { - throw new DatabaseException("Why tbName is null SetKeyCommand?"); - } - String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); - if (key == null) { - throw new DatabaseException("Why key is null? SetKeyCommand"); - } +// String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); +// if (dbName == null) { +// throw new DatabaseException("Why dbname is null SetKeyCommand? "); +// } +// String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); +// if (tbName == null) { +// throw new DatabaseException("Why tbName is null SetKeyCommand?"); +// } +// String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); +// if (key == null) { +// throw new DatabaseException("Why key is null? SetKeyCommand"); +// } Optional dataBase = environment.getDatabase(dbName); if (dataBase.isEmpty()) { - throw new DatabaseException("We dont have SetKeyCommand" + dbName); + return DatabaseCommandResult.error("We dont have SetKeyCommand" + dbName); } - byte[] value = commandargs.get(DatabaseCommandArgPositions.VALUE.getPositionIndex()).asString().getBytes(StandardCharsets.UTF_8); - dataBase.get().write(tbName, key, value); - return DatabaseCommandResult.success(("Success add key SetKeyCommand " + dbName + tbName + key).getBytes(StandardCharsets.UTF_8)); + Optional previous = dataBase.get().read(tbName,key); + dataBase.get().write(tbName, key, value.getBytes(StandardCharsets.UTF_8)); + return DatabaseCommandResult.success(previous.orElse(null)); } catch (DatabaseException ex) { - return new FailedDatabaseCommandResult(ex.getMessage()); + return DatabaseCommandResult.error("Error when try to set value by key"); } } } \ No newline at end of file From 65a1e79eb0017234f323f9ca50fcf63fa5017983 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 20:53:32 +0300 Subject: [PATCH 361/378] try --- .../console/impl/CreateDatabaseCommand.java | 11 ---------- .../console/impl/CreateTableCommand.java | 15 ------------- .../basics/console/impl/DeleteKeyCommand.java | 4 ---- .../basics/console/impl/GetKeyCommand.java | 21 ------------------- .../basics/console/impl/SetKeyCommand.java | 18 ---------------- .../com/itmo/java/protocol/RespReader.java | 8 +++---- .../com/itmo/java/protocol/RespWriter.java | 9 -------- 7 files changed, 4 insertions(+), 82 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java index 8167ed0b..5da16628 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java @@ -18,9 +18,7 @@ public class CreateDatabaseCommand implements DatabaseCommand { private final ExecutionEnvironment environment; private final DatabaseFactory dbfactory; - private final List commandargs; private final String dbName; - // private static final int numberOfAgrguments = 3; /** * Создает команду. @@ -34,12 +32,8 @@ public class CreateDatabaseCommand implements DatabaseCommand { * @throws IllegalArgumentException если передано неправильное количество аргументов */ public CreateDatabaseCommand(ExecutionEnvironment env, DatabaseFactory factory, List comArgs) { -// if (comArgs.size() != numberOfAgrguments) { -// throw new IllegalArgumentException("Why " + comArgs.size() + "!= 3 , in CreateDataBaseCommand"); -// } environment = env; dbfactory = factory; - commandargs = comArgs; dbName = comArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); } @@ -51,12 +45,7 @@ public CreateDatabaseCommand(ExecutionEnvironment env, DatabaseFactory factory, @Override public DatabaseCommandResult execute() { try { -// String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); -// if (dbName == null) { -// throw new DatabaseException("Why dbname is null? CreateDatabaseCommand "); -// } environment.addDatabase(dbfactory.createNonExistent(dbName, environment.getWorkingPath())); - // return DatabaseCommandResult.success(("Success add CreateDatabaseCommand" + dbName).getBytes(StandardCharsets.UTF_8)); } catch (DatabaseException ex) { return new FailedDatabaseCommandResult(ex.getMessage()); } diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java index 2ffc8c53..7428945c 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java @@ -19,8 +19,6 @@ public class CreateTableCommand implements DatabaseCommand { private final ExecutionEnvironment environment; - private final List commandargs; - // private static final int numberOfAgrguments = 4;\ private final String dbName; private final String tbName; @@ -36,11 +34,7 @@ public class CreateTableCommand implements DatabaseCommand { * @throws IllegalArgumentException если передано неправильное количество аргументов */ public CreateTableCommand(ExecutionEnvironment env, List comArgs) { -// if (comArgs.size() != numberOfAgrguments) { -// throw new IllegalArgumentException("Why " + comArgs.size() + "!= 4 , in CreateTableCommand"); -// } environment = env; - commandargs = comArgs; tbName = comArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); dbName = comArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); } @@ -53,19 +47,10 @@ public CreateTableCommand(ExecutionEnvironment env, List comArgs) { @Override public DatabaseCommandResult execute() { try { -// String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); -// if (dbName == null) { -// throw new DatabaseException("Why dbname is null? CreateTableCommand"); -// } -// String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); -// if (tbName == null) { -// throw new DatabaseException("Why tbName is null? CreateTableCommand"); -// } if (environment.getDatabase(dbName).isEmpty()) { return DatabaseCommandResult.error("We dont found dataBase" + dbName); } environment.getDatabase(dbName).get().createTableIfNotExists(tbName); - // return DatabaseCommandResult.success(("Success add CreateTableCommand " + dbName + tbName).getBytes(StandardCharsets.UTF_8)); } catch (DatabaseException ex) { return new FailedDatabaseCommandResult(ex.getMessage()); } diff --git a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java index d6d52adf..96e70eae 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java @@ -54,10 +54,6 @@ public DatabaseCommandResult execute() { return DatabaseCommandResult.error("Value with key DeleteKeyCommand " + key + " in database " + dbName + " not found"); } database.get().delete(tbName, key); -// Optional valuePrev = database.get().read(tableName,key); -// if (valuePrev.isEmpty()) { -// return DatabaseCommandResult.error("lol DelereKeyCom"); -// } return DatabaseCommandResult.success(previous.get()); } catch (DatabaseException e){ return DatabaseCommandResult.error("DatabaseException when try to delete value by key DeleteKeyCommand" + key + " in table " + tbName); diff --git a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java index 4a5282c8..62f44aa1 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java @@ -18,8 +18,6 @@ public class GetKeyCommand implements DatabaseCommand { private final ExecutionEnvironment environment; - private final List commandargs; - // private static final int numberOfAgrguments = 5; private final String dbName; private final String tbName; private final String key; @@ -35,11 +33,7 @@ public class GetKeyCommand implements DatabaseCommand { * @throws IllegalArgumentException если передано неправильное количество аргументов */ public GetKeyCommand(ExecutionEnvironment env, List comArgs) { -// if (comArgs.size() != numberOfAgrguments) { -// throw new IllegalArgumentException("Why " + comArgs.size() + "!= 5 , in GetKeyCommand"); -// } environment = env; - commandargs = comArgs; this.dbName = comArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); this.tbName = comArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); this.key = comArgs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); @@ -53,26 +47,11 @@ public GetKeyCommand(ExecutionEnvironment env, List comArgs) { @Override public DatabaseCommandResult execute() { try { -// String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); -// if (dbName == null) { -// throw new DatabaseException("Why dbname is null? GetKeyCommand"); -// } -// String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); -// if (tbName == null) { -// throw new DatabaseException("Why tbName is null? GetKeyCommand"); -// } -// String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); -// if (key == null) { -// throw new DatabaseException("Why key is null? GetKeyCommand"); -// } Optional dataBase = environment.getDatabase(dbName); if (dataBase.isEmpty()) { return DatabaseCommandResult.error("We dont have GetKeyCommand"); } Optional value = dataBase.get().read(tbName, key); - // if (value.isEmpty()) { - // throw new DatabaseException("We dont have GetKeyCommand" + dbName + tbName + key); - //} return DatabaseCommandResult.success(value.orElse(null)); } catch (DatabaseException ex) { return DatabaseCommandResult.error("Error when try ti get value bu key"); diff --git a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java index 0d966a2c..3b597211 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java @@ -19,8 +19,6 @@ public class SetKeyCommand implements DatabaseCommand { private final ExecutionEnvironment environment; - private final List commandargs; - // private static final int numberOfAgrguments = 6; private final String dbName; private final String tbName; private final String key; @@ -37,11 +35,7 @@ public class SetKeyCommand implements DatabaseCommand { * @throws IllegalArgumentException если передано неправильное количество аргументов */ public SetKeyCommand(ExecutionEnvironment env, List comArgs) { -// if (comArgs.size() != numberOfAgrguments) { -// throw new IllegalArgumentException("Why " + comArgs.size() + "!= 5 , in CreateTableCommand SetKeyCommand"); -// } environment = env; - commandargs = comArgs; this.value = comArgs.get(DatabaseCommandArgPositions.VALUE.getPositionIndex()).asString(); this.dbName = comArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); this.tbName = comArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); @@ -56,18 +50,6 @@ public SetKeyCommand(ExecutionEnvironment env, List comArgs) { @Override public DatabaseCommandResult execute() { try { -// String dbName = commandargs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); -// if (dbName == null) { -// throw new DatabaseException("Why dbname is null SetKeyCommand? "); -// } -// String tbName = commandargs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); -// if (tbName == null) { -// throw new DatabaseException("Why tbName is null SetKeyCommand?"); -// } -// String key = commandargs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); -// if (key == null) { -// throw new DatabaseException("Why key is null? SetKeyCommand"); -// } Optional dataBase = environment.getDatabase(dbName); if (dataBase.isEmpty()) { return DatabaseCommandResult.error("We dont have SetKeyCommand" + dbName); diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index f8029022..1b220787 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -36,7 +36,7 @@ public boolean hasArray() throws IOException { * @throws IOException при ошибке чтения */ public RespObject readObject() throws IOException { - try { + // try { int codeInt = reader.read(); if (codeInt == -1) { throw new EOFException("InputStream is empty RespObject"); @@ -54,9 +54,9 @@ public RespObject readObject() throws IOException { default: throw new IOException("Code is not correct"); } - } catch (IOException ex) { - throw new IOException("Error while readObject RespReader"); - } +// } catch (IOException ex) { +// throw new IOException("Error while readObject RespReader"); +// } } /** diff --git a/src/main/java/com/itmo/java/protocol/RespWriter.java b/src/main/java/com/itmo/java/protocol/RespWriter.java index 24f72955..e905dcee 100644 --- a/src/main/java/com/itmo/java/protocol/RespWriter.java +++ b/src/main/java/com/itmo/java/protocol/RespWriter.java @@ -10,7 +10,6 @@ public class RespWriter implements AutoCloseable { private final OutputStream outputStream; public RespWriter(OutputStream os) { - outputStream = os; } @@ -18,19 +17,11 @@ public RespWriter(OutputStream os) { * Записывает в output stream объект */ public void write(RespObject object) throws IOException { - try { object.write(outputStream); - } catch (IOException ex) { - throw new IOException(ex); - } } @Override public void close() throws IOException { - try { outputStream.close(); - } catch (IOException ex) { - throw new IOException(ex); - } } } \ No newline at end of file From 7902e7c3796c2b5d8015255a0913b667affd291c Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 20:59:36 +0300 Subject: [PATCH 362/378] try2 --- .../itmo/java/basics/console/DatabaseCommandResult.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java b/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java index 45ead06d..ad74d772 100644 --- a/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java +++ b/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java @@ -35,13 +35,8 @@ static DatabaseCommandResult error(String message) { * @param exception исключение, из которого нужно сформировать результат выполнения команды * @return результат команды, при выполнении которой произошла ошибка */ - static DatabaseCommandResult error(Exception exception) { - if (exception.getMessage().isEmpty()) { - return new FailedDatabaseCommandResult(Arrays.toString(exception.getStackTrace())); - } else { - return new FailedDatabaseCommandResult(exception.getMessage()); - } - } + static DatabaseCommandResult error(Exception exception) { return new FailedDatabaseCommandResult(exception.getMessage()); } + /** * @return значение результата выполнения команды в виде {@code Optional} From dc903728eadd51a10a0ed895507d9864d25edbcb Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 20:59:44 +0300 Subject: [PATCH 363/378] try2 --- .../basics/console/impl/ExecutionEnvironmentImpl.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java index baca5383..59107a73 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java +++ b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java @@ -5,18 +5,19 @@ import com.itmo.java.basics.logic.Database; import java.nio.file.Path; +import java.nio.file.Paths; import java.util.HashMap; import java.util.Map; import java.util.Optional; public class ExecutionEnvironmentImpl implements ExecutionEnvironment { - private final DatabaseConfig dbConfig; - private final Map dataBase; + + Map dataBase; + Path workingPath; public ExecutionEnvironmentImpl(DatabaseConfig config) { - dbConfig = config; - dataBase = new HashMap<>(); + workingPath = Paths.get(config.getWorkingPath()); } @Override @@ -31,6 +32,6 @@ public void addDatabase(Database db) { @Override public Path getWorkingPath() { - return Path.of(dbConfig.getWorkingPath()); + return workingPath; } } \ No newline at end of file From a2415c8fa6c6c64f85d3ba414790c89da9d99063 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 21:03:29 +0300 Subject: [PATCH 364/378] 1 --- .../itmo/java/basics/console/DatabaseCommandResult.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java b/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java index ad74d772..45ead06d 100644 --- a/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java +++ b/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java @@ -35,8 +35,13 @@ static DatabaseCommandResult error(String message) { * @param exception исключение, из которого нужно сформировать результат выполнения команды * @return результат команды, при выполнении которой произошла ошибка */ - static DatabaseCommandResult error(Exception exception) { return new FailedDatabaseCommandResult(exception.getMessage()); } - + static DatabaseCommandResult error(Exception exception) { + if (exception.getMessage().isEmpty()) { + return new FailedDatabaseCommandResult(Arrays.toString(exception.getStackTrace())); + } else { + return new FailedDatabaseCommandResult(exception.getMessage()); + } + } /** * @return значение результата выполнения команды в виде {@code Optional} From c3da82739b4ea3486f3482420bdf74e4b7e3c049 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 21:05:56 +0300 Subject: [PATCH 365/378] 1 --- .../java/basics/console/DatabaseCommandResult.java | 8 +------- .../basics/console/impl/ExecutionEnvironmentImpl.java | 10 +++++----- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java b/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java index 45ead06d..fb491ece 100644 --- a/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java +++ b/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java @@ -4,8 +4,6 @@ import com.itmo.java.basics.console.impl.SuccessDatabaseCommandResult; import com.itmo.java.protocol.model.RespObject; -import java.util.Arrays; - public interface DatabaseCommandResult extends DatabaseApiSerializable { /** @@ -36,11 +34,7 @@ static DatabaseCommandResult error(String message) { * @return результат команды, при выполнении которой произошла ошибка */ static DatabaseCommandResult error(Exception exception) { - if (exception.getMessage().isEmpty()) { - return new FailedDatabaseCommandResult(Arrays.toString(exception.getStackTrace())); - } else { - return new FailedDatabaseCommandResult(exception.getMessage()); - } + return new FailedDatabaseCommandResult(exception.getMessage()); } /** diff --git a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java index 59107a73..29313d86 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java +++ b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java @@ -5,19 +5,19 @@ import com.itmo.java.basics.logic.Database; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.HashMap; import java.util.Map; import java.util.Optional; public class ExecutionEnvironmentImpl implements ExecutionEnvironment { + private final DatabaseConfig dbConfig; + private final Map dataBase; - Map dataBase; - Path workingPath; public ExecutionEnvironmentImpl(DatabaseConfig config) { - workingPath = Paths.get(config.getWorkingPath()); + dbConfig = config; + dataBase = new HashMap<>(); } @Override @@ -32,6 +32,6 @@ public void addDatabase(Database db) { @Override public Path getWorkingPath() { - return workingPath; + return Path.of(dbConfig.getWorkingPath()); } } \ No newline at end of file From 6d3ae1482fd9137769dcdcb07f8fc78688429814 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 21:10:42 +0300 Subject: [PATCH 366/378] try --- .../java/basics/connector/JavaSocketServerConnector.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index d3b0fde2..8a89f5ce 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -46,13 +46,10 @@ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig con */ public void start() { connectionAcceptorExecutor.submit(() -> { - Socket clientSocket = null; - try { - clientSocket = serverSocket.accept(); - } catch (IOException exception) { - exception.printStackTrace(); + while (true) { + Socket clientSocket = serverSocket.accept(); + clientIOWorkers.submit(new ClientTask(clientSocket, server)); } - clientIOWorkers.submit(new ClientTask(clientSocket, server)); }); } From ab2aba6626a5f929d55909f7a22855d1cbeba284 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 21:13:24 +0300 Subject: [PATCH 367/378] try --- .../connection/SocketKvsConnection.java | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index dd40e2c4..855baf72 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -1,6 +1,5 @@ package com.itmo.java.client.connection; - import com.itmo.java.client.exception.ConnectionException; import com.itmo.java.protocol.RespReader; import com.itmo.java.protocol.RespWriter; @@ -9,27 +8,32 @@ import java.io.IOException; import java.net.Socket; +import java.net.UnknownHostException; /** * С помощью {@link RespWriter} и {@link RespReader} читает/пишет в сокет */ public class SocketKvsConnection implements KvsConnection { - - final ConnectionConfig connectionConfig; - final Socket socket; + private final int port; + private final String host; + private final Socket clientSocket; + private final RespWriter respWriter; + private final RespReader respReader; public SocketKvsConnection(ConnectionConfig config) { - connectionConfig = config; + this.port = config.getPort(); + this.host = config.getHost(); try { - socket = new Socket(connectionConfig.getHost(), connectionConfig.getPort()); + this.clientSocket = new Socket(host, port); + this.respReader = new RespReader(clientSocket.getInputStream()); + respWriter = new RespWriter(clientSocket.getOutputStream()); } catch (IOException e) { - throw new RuntimeException("Error in const"); + throw new RuntimeException("IOException when try to connect by " + host + " " + port, e); } } /** * Отправляет с помощью сокета команду и получает результат. - * * @param commandId id команды (номер) * @param command команда * @throws ConnectionException если сокет закрыт или если произошла другая ошибка соединения @@ -37,14 +41,13 @@ public SocketKvsConnection(ConnectionConfig config) { @Override public synchronized RespObject send(int commandId, RespArray command) throws ConnectionException { try { - RespWriter respWriter = new RespWriter(socket.getOutputStream()); + RespWriter respWriter = new RespWriter(clientSocket.getOutputStream()); respWriter.write(command); - RespReader respReader = new RespReader(socket.getInputStream()); - RespObject respObject = respReader.readObject(); - return respObject; + RespReader respReader = new RespReader(clientSocket.getInputStream()); + return respReader.readObject(); } catch (IOException e) { close(); - throw new ConnectionException("IOException when send SocketKvs"); + throw new ConnectionException("IOException when send " + command.asString() + " with " + host + " and port " + port + " ___IOMessage___: " + e.getMessage(), e); } } @@ -54,9 +57,11 @@ public synchronized RespObject send(int commandId, RespArray command) throws Con @Override public void close() { try { - socket.close(); + respWriter.close(); + respReader.close(); + clientSocket.close(); } catch (IOException e) { throw new RuntimeException("IOException when try to close client socket"); } } -} \ No newline at end of file +} From 2173686368ebcb81a37303f36f9211f3787e8908 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 21:15:26 +0300 Subject: [PATCH 368/378] try --- .../itmo/java/basics/console/DatabaseCommandResult.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java b/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java index fb491ece..45ead06d 100644 --- a/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java +++ b/src/main/java/com/itmo/java/basics/console/DatabaseCommandResult.java @@ -4,6 +4,8 @@ import com.itmo.java.basics.console.impl.SuccessDatabaseCommandResult; import com.itmo.java.protocol.model.RespObject; +import java.util.Arrays; + public interface DatabaseCommandResult extends DatabaseApiSerializable { /** @@ -34,7 +36,11 @@ static DatabaseCommandResult error(String message) { * @return результат команды, при выполнении которой произошла ошибка */ static DatabaseCommandResult error(Exception exception) { - return new FailedDatabaseCommandResult(exception.getMessage()); + if (exception.getMessage().isEmpty()) { + return new FailedDatabaseCommandResult(Arrays.toString(exception.getStackTrace())); + } else { + return new FailedDatabaseCommandResult(exception.getMessage()); + } } /** From 0f3129cdcb91177ed17fcee1b73c87c32d42a076 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 21:46:51 +0300 Subject: [PATCH 369/378] try fix and make nice --- .../console/impl/CreateDatabaseCommand.java | 29 ++++++++-------- .../console/impl/CreateTableCommand.java | 34 ++++++++----------- .../basics/console/impl/DeleteKeyCommand.java | 24 ++++++------- .../impl/ExecutionEnvironmentImpl.java | 18 +++++----- .../impl/FailedDatabaseCommandResult.java | 6 ++-- .../basics/console/impl/GetKeyCommand.java | 32 ++++++++--------- .../basics/console/impl/SetKeyCommand.java | 32 ++++++++--------- .../impl/SuccessDatabaseCommandResult.java | 7 ++-- .../com/itmo/java/protocol/RespReader.java | 4 --- .../java/protocol/model/RespBulkString.java | 2 +- 10 files changed, 86 insertions(+), 102 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java index 5da16628..b8a0e350 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateDatabaseCommand.java @@ -15,26 +15,25 @@ * Команда для создания базы данных */ public class CreateDatabaseCommand implements DatabaseCommand { - private final ExecutionEnvironment environment; - private final DatabaseFactory dbfactory; - private final String dbName; + private final DatabaseFactory factoryDataBase; + private final String databaseName; /** * Создает команду. *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * - * @param env env - * @param factory функция создания базы данных (пример: DatabaseImpl::create) - * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. - * Id команды, имя команды, имя создаваемой бд + * @param env env + * @param factory функция создания базы данных (пример: DatabaseImpl::create) + * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * Id команды, имя команды, имя создаваемой бд * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public CreateDatabaseCommand(ExecutionEnvironment env, DatabaseFactory factory, List comArgs) { + public CreateDatabaseCommand(ExecutionEnvironment env, DatabaseFactory factory, List commandArgs) { environment = env; - dbfactory = factory; - dbName = comArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + factoryDataBase = factory; + databaseName = commandArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); } /** @@ -45,10 +44,10 @@ public CreateDatabaseCommand(ExecutionEnvironment env, DatabaseFactory factory, @Override public DatabaseCommandResult execute() { try { - environment.addDatabase(dbfactory.createNonExistent(dbName, environment.getWorkingPath())); - } catch (DatabaseException ex) { - return new FailedDatabaseCommandResult(ex.getMessage()); + environment.addDatabase(factoryDataBase.createNonExistent(databaseName, environment.getWorkingPath())); + } catch (DatabaseException ex){ + return DatabaseCommandResult.error("DatabaseException when try to create database " + databaseName); } - return DatabaseCommandResult.success(("Success add CreateDatabaseCommand" + dbName).getBytes(StandardCharsets.UTF_8)); + return DatabaseCommandResult.success(("Success add CreateDataBaseCommand " + databaseName).getBytes(StandardCharsets.UTF_8)); } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java index 7428945c..310f5ede 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/CreateTableCommand.java @@ -5,13 +5,10 @@ import com.itmo.java.basics.console.DatabaseCommandResult; import com.itmo.java.basics.console.ExecutionEnvironment; import com.itmo.java.basics.exceptions.DatabaseException; -import com.itmo.java.basics.logic.Database; import com.itmo.java.protocol.model.RespObject; -import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.List; -import java.util.Optional; /** * Команда для создания базы таблицы @@ -19,24 +16,23 @@ public class CreateTableCommand implements DatabaseCommand { private final ExecutionEnvironment environment; - private final String dbName; - private final String tbName; - + private final String databaseName; + private final String tableName; /** * Создает команду *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * - * @param env env - * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. - * Id команды, имя команды, имя бд, имя таблицы + * @param env env + * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * Id команды, имя команды, имя бд, имя таблицы * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public CreateTableCommand(ExecutionEnvironment env, List comArgs) { + public CreateTableCommand(ExecutionEnvironment env, List commandArgs) { environment = env; - tbName = comArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); - dbName = comArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + databaseName = commandArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + tableName = commandArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); } /** @@ -47,13 +43,13 @@ public CreateTableCommand(ExecutionEnvironment env, List comArgs) { @Override public DatabaseCommandResult execute() { try { - if (environment.getDatabase(dbName).isEmpty()) { - return DatabaseCommandResult.error("We dont found dataBase" + dbName); + if (environment.getDatabase(databaseName).isEmpty()){ + return DatabaseCommandResult.error("We dont found database " + databaseName); } - environment.getDatabase(dbName).get().createTableIfNotExists(tbName); - } catch (DatabaseException ex) { - return new FailedDatabaseCommandResult(ex.getMessage()); + environment.getDatabase(databaseName).get().createTableIfNotExists(tableName); + } catch (DatabaseException ex){ + return DatabaseCommandResult.error("DatabaseException when try to create table " + tableName); } - return DatabaseCommandResult.success(("Success add CreateTableCommand " + dbName + tbName).getBytes(StandardCharsets.UTF_8)); + return DatabaseCommandResult.success(("Table " + tableName + " was created").getBytes(StandardCharsets.UTF_8)); } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java index 96e70eae..95c061ee 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/DeleteKeyCommand.java @@ -16,8 +16,8 @@ */ public class DeleteKeyCommand implements DatabaseCommand { private final ExecutionEnvironment environment; - private final String dbName; - private final String tbName; + private final String databaseName; + private final String tableName; private final String key; /** @@ -31,10 +31,10 @@ public class DeleteKeyCommand implements DatabaseCommand { * @throws IllegalArgumentException если передано неправильное количество аргументов */ public DeleteKeyCommand(ExecutionEnvironment env, List commandArgs) { - this.environment = env; - this.dbName = commandArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - this.tbName = commandArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); - this.key = commandArgs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); + environment= env; + databaseName = commandArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + tableName = commandArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + key = commandArgs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); } /** @@ -45,18 +45,18 @@ public DeleteKeyCommand(ExecutionEnvironment env, List commandArgs) @Override public DatabaseCommandResult execute() { try { - Optional database = environment.getDatabase(dbName); + Optional database = environment.getDatabase(databaseName); if (database.isEmpty()){ - return DatabaseCommandResult.error("Not found database DeleteKeyCommand " + dbName); + return DatabaseCommandResult.error("Not found database DeleteKeyCommand " + databaseName); } - Optional previous = database.get().read(tbName, key); + Optional previous = database.get().read(tableName, key); if (previous.isEmpty()){ - return DatabaseCommandResult.error("Value with key DeleteKeyCommand " + key + " in database " + dbName + " not found"); + return DatabaseCommandResult.error("Value with key DeleteKeyCommand" + key + " in database " + databaseName + " not found"); } - database.get().delete(tbName, key); + database.get().delete(tableName, key); return DatabaseCommandResult.success(previous.get()); } catch (DatabaseException e){ - return DatabaseCommandResult.error("DatabaseException when try to delete value by key DeleteKeyCommand" + key + " in table " + tbName); + return DatabaseCommandResult.error("DatabaseException when try to delete value by key DeleteKeyCommand " + key + " in table " + tableName); } } } diff --git a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java index 29313d86..54d75e3c 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java +++ b/src/main/java/com/itmo/java/basics/console/impl/ExecutionEnvironmentImpl.java @@ -5,33 +5,31 @@ import com.itmo.java.basics.logic.Database; import java.nio.file.Path; +import java.nio.file.Paths; import java.util.HashMap; import java.util.Map; import java.util.Optional; public class ExecutionEnvironmentImpl implements ExecutionEnvironment { - - private final DatabaseConfig dbConfig; - private final Map dataBase; - + Map databases = new HashMap<>(); + Path workingPath; public ExecutionEnvironmentImpl(DatabaseConfig config) { - dbConfig = config; - dataBase = new HashMap<>(); + workingPath = Paths.get(config.getWorkingPath()); } @Override public Optional getDatabase(String name) { - return Optional.ofNullable(dataBase.get(name)); + return Optional.ofNullable(databases.get(name)); } @Override public void addDatabase(Database db) { - dataBase.put(db.getName(), db); + databases.put(db.getName(), db); } @Override public Path getWorkingPath() { - return Path.of(dbConfig.getWorkingPath()); + return workingPath; } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java b/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java index 2da3d950..3b470bb7 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java +++ b/src/main/java/com/itmo/java/basics/console/impl/FailedDatabaseCommandResult.java @@ -10,12 +10,10 @@ * Зафейленная команда */ public class FailedDatabaseCommandResult implements DatabaseCommandResult { - - private final String payLoad; public FailedDatabaseCommandResult(String pload) { - payLoad = pload; + this.payLoad = pload; } /** @@ -38,4 +36,4 @@ public boolean isSuccess() { public RespObject serialize() { return new RespError(payLoad.getBytes(StandardCharsets.UTF_8)); } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java index 62f44aa1..b2b00dd5 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/GetKeyCommand.java @@ -8,7 +8,7 @@ import com.itmo.java.basics.logic.Database; import com.itmo.java.protocol.model.RespObject; -import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Optional; @@ -16,27 +16,25 @@ * Команда для чтения данных по ключу */ public class GetKeyCommand implements DatabaseCommand { - private final ExecutionEnvironment environment; - private final String dbName; - private final String tbName; + private final String databaseName; + private final String tableName; private final String key; - /** * Создает команду. *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * - * @param env env - * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. - * Id команды, имя команды, имя бд, таблицы, ключ + * @param env env + * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * Id команды, имя команды, имя бд, таблицы, ключ * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public GetKeyCommand(ExecutionEnvironment env, List comArgs) { + public GetKeyCommand(ExecutionEnvironment env, List commandArgs) { environment = env; - this.dbName = comArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - this.tbName = comArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); - this.key = comArgs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); + databaseName = commandArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + tableName = commandArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + key = commandArgs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); } /** @@ -47,14 +45,14 @@ public GetKeyCommand(ExecutionEnvironment env, List comArgs) { @Override public DatabaseCommandResult execute() { try { - Optional dataBase = environment.getDatabase(dbName); - if (dataBase.isEmpty()) { + Optional database = environment.getDatabase(databaseName); + if (database.isEmpty()) { return DatabaseCommandResult.error("We dont have GetKeyCommand"); } - Optional value = dataBase.get().read(tbName, key); + Optional value = database.get().read(tableName, key); return DatabaseCommandResult.success(value.orElse(null)); - } catch (DatabaseException ex) { + } catch (DatabaseException e){ return DatabaseCommandResult.error("Error when try ti get value bu key"); } } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java index 3b597211..a5fd9e17 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java +++ b/src/main/java/com/itmo/java/basics/console/impl/SetKeyCommand.java @@ -8,7 +8,6 @@ import com.itmo.java.basics.logic.Database; import com.itmo.java.protocol.model.RespObject; -import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Optional; @@ -29,17 +28,18 @@ public class SetKeyCommand implements DatabaseCommand { *
* Обратите внимание, что в конструкторе нет логики проверки валидности данных. Не проверяется, можно ли исполнить команду. Только формальные признаки (например, количество переданных значений или ненуловость объектов * - * @param env env - * @param comArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. - * Id команды, имя команды, имя бд, таблицы, ключ, значение + * @param env env + * @param commandArgs аргументы для создания (порядок - {@link DatabaseCommandArgPositions}. + * Id команды, имя команды, имя бд, таблицы, ключ, значение * @throws IllegalArgumentException если передано неправильное количество аргументов */ - public SetKeyCommand(ExecutionEnvironment env, List comArgs) { + public SetKeyCommand(ExecutionEnvironment env, List commandArgs) { environment = env; - this.value = comArgs.get(DatabaseCommandArgPositions.VALUE.getPositionIndex()).asString(); - this.dbName = comArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); - this.tbName = comArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); - this.key = comArgs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); + value = commandArgs.get(DatabaseCommandArgPositions.VALUE.getPositionIndex()).asString(); + dbName = commandArgs.get(DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex()).asString(); + tbName = commandArgs.get(DatabaseCommandArgPositions.TABLE_NAME.getPositionIndex()).asString(); + key = commandArgs.get(DatabaseCommandArgPositions.KEY.getPositionIndex()).asString(); + } /** @@ -50,15 +50,15 @@ public SetKeyCommand(ExecutionEnvironment env, List comArgs) { @Override public DatabaseCommandResult execute() { try { - Optional dataBase = environment.getDatabase(dbName); - if (dataBase.isEmpty()) { - return DatabaseCommandResult.error("We dont have SetKeyCommand" + dbName); + Optional database = environment.getDatabase(dbName); + if (database.isEmpty()) { + return DatabaseCommandResult.error("We dont have SetKeyCommand" + dbName); } - Optional previous = dataBase.get().read(tbName,key); - dataBase.get().write(tbName, key, value.getBytes(StandardCharsets.UTF_8)); + Optional previous = database.get().read(tbName, key); + database.get().write(tbName, key, value.getBytes(StandardCharsets.UTF_8)); return DatabaseCommandResult.success(previous.orElse(null)); - } catch (DatabaseException ex) { + } catch (DatabaseException e){ return DatabaseCommandResult.error("Error when try to set value by key"); } } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java b/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java index 04cb0749..5ac44ad7 100644 --- a/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java +++ b/src/main/java/com/itmo/java/basics/console/impl/SuccessDatabaseCommandResult.java @@ -10,7 +10,6 @@ * Результат успешной команды */ public class SuccessDatabaseCommandResult implements DatabaseCommandResult { - private final byte[] payLoad; public SuccessDatabaseCommandResult(byte[] pload) { @@ -19,10 +18,10 @@ public SuccessDatabaseCommandResult(byte[] pload) { @Override public String getPayLoad() { - if(payLoad == null) { + if (payLoad == null) { return null; } else { - return new String(payLoad , StandardCharsets.UTF_8); + return new String(payLoad, StandardCharsets.UTF_8); } } @@ -38,4 +37,4 @@ public boolean isSuccess() { public RespObject serialize() { return new RespBulkString(payLoad); } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 1b220787..6531d0f9 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -36,7 +36,6 @@ public boolean hasArray() throws IOException { * @throws IOException при ошибке чтения */ public RespObject readObject() throws IOException { - // try { int codeInt = reader.read(); if (codeInt == -1) { throw new EOFException("InputStream is empty RespObject"); @@ -54,9 +53,6 @@ public RespObject readObject() throws IOException { default: throw new IOException("Code is not correct"); } -// } catch (IOException ex) { -// throw new IOException("Error while readObject RespReader"); -// } } /** diff --git a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java index 9a012df6..c0b33d6a 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java +++ b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java @@ -12,7 +12,7 @@ public class RespBulkString implements RespObject { * Код объекта */ public static final byte CODE = '$'; - public static final int NULL_STRING_SIZE = -1; + public static final int NULL_STRING_SIZE = -2; private final byte[] data; public static final RespBulkString NULL_STRING = new RespBulkString(null); From f863454438872bc7894ad733759678d5d90d2681 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 21:50:56 +0300 Subject: [PATCH 370/378] try fiz dirCvsCon --- .../connection/DirectReferenceKvsConnection.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java b/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java index 5c80f902..f2837885 100644 --- a/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java @@ -3,6 +3,7 @@ import com.itmo.java.basics.DatabaseServer; import com.itmo.java.client.exception.ConnectionException; import com.itmo.java.protocol.model.RespArray; +import com.itmo.java.protocol.model.RespCommandId; import com.itmo.java.protocol.model.RespObject; import java.util.concurrent.ExecutionException; @@ -12,19 +13,22 @@ * (пока еще нет реализации сокетов) */ public class DirectReferenceKvsConnection implements KvsConnection { - - private final DatabaseServer dbServer; + private final DatabaseServer databaseServer; public DirectReferenceKvsConnection(DatabaseServer databaseServer) { - dbServer = databaseServer; + this.databaseServer = databaseServer; } @Override public RespObject send(int commandId, RespArray command) throws ConnectionException { try { - return dbServer.executeNextCommand(command).get().serialize(); - } catch (ExecutionException | InterruptedException ex) { - throw new ConnectionException(ex.getMessage(), ex.getCause()); + return databaseServer.executeNextCommand(command).get().serialize(); + } catch (InterruptedException e) { + throw new ConnectionException("ConnectionException when try to get result from server because of interruption when message is '" + + command.asString() + "'", e); + } catch (ExecutionException e) { + throw new ConnectionException("ConnectionException when try to get result from server because of ExecutionException when message is '" + + command.asString() + "'", e); } } From d527063c4167f68eda4238a4b135258cf87137eb Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 21:55:36 +0300 Subject: [PATCH 371/378] make command nice --- .../command/CreateDatabaseKvsCommand.java | 15 ++++----- .../client/command/CreateTableKvsCommand.java | 21 ++++++------ .../java/client/command/DeleteKvsCommand.java | 27 ++++++++-------- .../java/client/command/GetKvsCommand.java | 26 +++++++-------- .../java/client/command/SetKvsCommand.java | 32 +++++++++---------- .../DirectReferenceKvsConnection.java | 16 ++++------ 6 files changed, 65 insertions(+), 72 deletions(-) diff --git a/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java b/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java index df83530e..18934cd9 100644 --- a/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/CreateDatabaseKvsCommand.java @@ -10,10 +10,9 @@ * Команда для создания бд */ public class CreateDatabaseKvsCommand implements KvsCommand { - private static final String COMMAND_NAME = "CREATE_DATABASE"; - private final String dbName; - private final int dbID; + private final String databaseName; + private final int commandId; /** * Создает объект @@ -21,8 +20,8 @@ public class CreateDatabaseKvsCommand implements KvsCommand { * @param databaseName имя базы данных */ public CreateDatabaseKvsCommand(String databaseName) { - dbID = idGen.incrementAndGet(); - dbName = databaseName; + this.databaseName = databaseName; + this.commandId = idGen.getAndIncrement(); } /** @@ -32,13 +31,13 @@ public CreateDatabaseKvsCommand(String databaseName) { */ @Override public RespArray serialize() { - return new RespArray(new RespCommandId(dbID), + return new RespArray(new RespCommandId(commandId), new RespBulkString(COMMAND_NAME.getBytes(StandardCharsets.UTF_8)), - new RespBulkString(dbName.getBytes(StandardCharsets.UTF_8))); + new RespBulkString(databaseName.getBytes(StandardCharsets.UTF_8))); } @Override public int getCommandId() { - return dbID; + return commandId; } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java b/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java index 06da3b1c..51068cd2 100644 --- a/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/CreateTableKvsCommand.java @@ -10,16 +10,15 @@ * Команда для создания таблицы */ public class CreateTableKvsCommand implements KvsCommand { - private static final String COMMAND_NAME = "CREATE_TABLE"; - private final String dbName; - private final int tbID; - private final String tbName; + private final String databaseName; + private final String tableName; + private final int commandId; public CreateTableKvsCommand(String databaseName, String tableName) { - dbName = databaseName; - tbName = tableName; - tbID = idGen.incrementAndGet(); + this.databaseName = databaseName; + this.tableName = tableName; + this.commandId = idGen.getAndIncrement(); } /** @@ -29,14 +28,14 @@ public CreateTableKvsCommand(String databaseName, String tableName) { */ @Override public RespArray serialize() { - return new RespArray(new RespCommandId(tbID), + return new RespArray(new RespCommandId(commandId), new RespBulkString(COMMAND_NAME.getBytes(StandardCharsets.UTF_8)), - new RespBulkString(dbName.getBytes(StandardCharsets.UTF_8)), - new RespBulkString(tbName.getBytes(StandardCharsets.UTF_8))); + new RespBulkString(databaseName.getBytes(StandardCharsets.UTF_8)), + new RespBulkString(tableName.getBytes(StandardCharsets.UTF_8))); } @Override public int getCommandId() { - return tbID; + return commandId; } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java b/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java index bc4d6fea..cbd51fe0 100644 --- a/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/DeleteKvsCommand.java @@ -7,18 +7,17 @@ import java.nio.charset.StandardCharsets; public class DeleteKvsCommand implements KvsCommand { - private static final String COMMAND_NAME = "DELETE_KEY"; - private final String dbName; - private final String tbName; - private final String Key; - private final int delID; + private final String databaseName; + private final String tableName; + private final String key; + private final int commandId; public DeleteKvsCommand(String databaseName, String tableName, String key) { - dbName = databaseName; - tbName = tableName; - Key = key; - delID = idGen.incrementAndGet(); + this.databaseName = databaseName; + this.tableName = tableName; + this.key = key; + this.commandId = idGen.getAndIncrement(); } /** @@ -28,15 +27,15 @@ public DeleteKvsCommand(String databaseName, String tableName, String key) { */ @Override public RespArray serialize() { - return new RespArray(new RespCommandId(delID), + return new RespArray(new RespCommandId(commandId), new RespBulkString(COMMAND_NAME.getBytes(StandardCharsets.UTF_8)), - new RespBulkString(dbName.getBytes(StandardCharsets.UTF_8)), - new RespBulkString(tbName.getBytes(StandardCharsets.UTF_8)), - new RespBulkString(Key.getBytes(StandardCharsets.UTF_8))); + new RespBulkString(databaseName.getBytes(StandardCharsets.UTF_8)), + new RespBulkString(tableName.getBytes(StandardCharsets.UTF_8)), + new RespBulkString(key.getBytes(StandardCharsets.UTF_8))); } @Override public int getCommandId() { - return delID; + return commandId; } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/client/command/GetKvsCommand.java b/src/main/java/com/itmo/java/client/command/GetKvsCommand.java index 5c73639a..56e70a67 100644 --- a/src/main/java/com/itmo/java/client/command/GetKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/GetKvsCommand.java @@ -9,16 +9,16 @@ public class GetKvsCommand implements KvsCommand { private static final String COMMAND_NAME = "GET_KEY"; - private final String dbName; - private final String tbName; - private final String Key; - private final int getID; + private final String databaseName; + private final String tableName; + private final String key; + private final int commandId; public GetKvsCommand(String databaseName, String tableName, String key) { - dbName = databaseName; - tbName = tableName; - Key = key; - getID = idGen.incrementAndGet(); + this.databaseName = databaseName; + this.tableName = tableName; + this.key = key; + this.commandId = idGen.getAndIncrement(); } /** @@ -28,15 +28,15 @@ public GetKvsCommand(String databaseName, String tableName, String key) { */ @Override public RespArray serialize() { - return new RespArray(new RespCommandId(getID), + return new RespArray(new RespCommandId(commandId), new RespBulkString(COMMAND_NAME.getBytes(StandardCharsets.UTF_8)), - new RespBulkString(dbName.getBytes(StandardCharsets.UTF_8)), - new RespBulkString(tbName.getBytes(StandardCharsets.UTF_8)), - new RespBulkString(Key.getBytes(StandardCharsets.UTF_8))); + new RespBulkString(databaseName.getBytes(StandardCharsets.UTF_8)), + new RespBulkString(tableName.getBytes(StandardCharsets.UTF_8)), + new RespBulkString(key.getBytes(StandardCharsets.UTF_8))); } @Override public int getCommandId() { - return getID; + return commandId; } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/client/command/SetKvsCommand.java b/src/main/java/com/itmo/java/client/command/SetKvsCommand.java index 1d5ff0fb..316c4981 100644 --- a/src/main/java/com/itmo/java/client/command/SetKvsCommand.java +++ b/src/main/java/com/itmo/java/client/command/SetKvsCommand.java @@ -9,18 +9,18 @@ public class SetKvsCommand implements KvsCommand { private static final String COMMAND_NAME = "SET_KEY"; - private final String dbName; - private final String tbName; - private final String Key; - private final int setID; - private final String Value; + private final String databaseName; + private final String tableName; + private final String key; + private final String value; + private final int commandId; public SetKvsCommand(String databaseName, String tableName, String key, String value) { - dbName = databaseName; - tbName = tableName; - Key = key; - setID = idGen.incrementAndGet(); - Value = value; + this.databaseName = databaseName; + this.tableName = tableName; + this.key = key; + this.value = value; + this.commandId = idGen.getAndIncrement(); } /** @@ -30,16 +30,16 @@ public SetKvsCommand(String databaseName, String tableName, String key, String v */ @Override public RespArray serialize() { - return new RespArray(new RespCommandId(setID), + return new RespArray(new RespCommandId(commandId), new RespBulkString(COMMAND_NAME.getBytes(StandardCharsets.UTF_8)), - new RespBulkString(dbName.getBytes(StandardCharsets.UTF_8)), - new RespBulkString(tbName.getBytes(StandardCharsets.UTF_8)), - new RespBulkString(Key.getBytes(StandardCharsets.UTF_8)), - new RespBulkString(Value.getBytes(StandardCharsets.UTF_8))); + new RespBulkString(databaseName.getBytes(StandardCharsets.UTF_8)), + new RespBulkString(tableName.getBytes(StandardCharsets.UTF_8)), + new RespBulkString(key.getBytes(StandardCharsets.UTF_8)), + new RespBulkString(value.getBytes(StandardCharsets.UTF_8))); } @Override public int getCommandId() { - return setID; + return commandId; } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java b/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java index f2837885..5c80f902 100644 --- a/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java @@ -3,7 +3,6 @@ import com.itmo.java.basics.DatabaseServer; import com.itmo.java.client.exception.ConnectionException; import com.itmo.java.protocol.model.RespArray; -import com.itmo.java.protocol.model.RespCommandId; import com.itmo.java.protocol.model.RespObject; import java.util.concurrent.ExecutionException; @@ -13,22 +12,19 @@ * (пока еще нет реализации сокетов) */ public class DirectReferenceKvsConnection implements KvsConnection { - private final DatabaseServer databaseServer; + + private final DatabaseServer dbServer; public DirectReferenceKvsConnection(DatabaseServer databaseServer) { - this.databaseServer = databaseServer; + dbServer = databaseServer; } @Override public RespObject send(int commandId, RespArray command) throws ConnectionException { try { - return databaseServer.executeNextCommand(command).get().serialize(); - } catch (InterruptedException e) { - throw new ConnectionException("ConnectionException when try to get result from server because of interruption when message is '" + - command.asString() + "'", e); - } catch (ExecutionException e) { - throw new ConnectionException("ConnectionException when try to get result from server because of ExecutionException when message is '" + - command.asString() + "'", e); + return dbServer.executeNextCommand(command).get().serialize(); + } catch (ExecutionException | InterruptedException ex) { + throw new ConnectionException(ex.getMessage(), ex.getCause()); } } From 313c29031a3ff884f5a3b6673113df9cfe4ba45a Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 21:58:31 +0300 Subject: [PATCH 372/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82=20Simple?= =?UTF-8?q?Kvs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/itmo/java/basics/DatabaseServer.java | 23 +++--- .../java/client/client/SimpleKvsClient.java | 78 ++++++------------- 2 files changed, 38 insertions(+), 63 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/DatabaseServer.java b/src/main/java/com/itmo/java/basics/DatabaseServer.java index 785068c0..8f847dc9 100644 --- a/src/main/java/com/itmo/java/basics/DatabaseServer.java +++ b/src/main/java/com/itmo/java/basics/DatabaseServer.java @@ -2,8 +2,10 @@ import com.itmo.java.basics.console.*; import com.itmo.java.basics.exceptions.DatabaseException; +import com.itmo.java.basics.initialization.InitializationContext; import com.itmo.java.basics.initialization.impl.DatabaseServerInitializer; import com.itmo.java.basics.initialization.impl.InitializationContextImpl; +import com.itmo.java.basics.logic.Database; import com.itmo.java.protocol.model.RespArray; import java.util.concurrent.CompletableFuture; @@ -12,28 +14,29 @@ public class DatabaseServer { - private final ExecutorService executorService = Executors.newSingleThreadExecutor(); - private final ExecutionEnvironment enviroment; + private ExecutorService executorService = Executors.newSingleThreadExecutor(); + private final ExecutionEnvironment environment; /** - * Con structor + * Конструктор * - * @param env env для инициализации. Далее работа происходит с заполненым объектом + * @param env env для инициализации. Далее работа происходит с заполненным объектом * @param initializer готовый чейн инициализации * @throws DatabaseException если произошла ошибка инициализации */ public static DatabaseServer initialize(ExecutionEnvironment env, DatabaseServerInitializer initializer) throws DatabaseException { - initializer.perform(new InitializationContextImpl(env, null, null, null)); + InitializationContext context = InitializationContextImpl.builder().executionEnvironment(env).build(); + initializer.perform(context); return new DatabaseServer(env); } - private DatabaseServer(ExecutionEnvironment env) { - this.enviroment = env; + private DatabaseServer(ExecutionEnvironment env){ + this.environment = env; } public CompletableFuture executeNextCommand(RespArray message) { - return CompletableFuture.supplyAsync(() -> - DatabaseCommands.valueOf(message.getObjects().get(DatabaseCommandArgPositions.COMMAND_NAME.getPositionIndex()).asString()).getCommand(enviroment, message.getObjects()).execute(), executorService); + return CompletableFuture.supplyAsync(() -> DatabaseCommands.valueOf(message.getObjects().get(DatabaseCommandArgPositions. + COMMAND_NAME.getPositionIndex()).asString()).getCommand(environment, message.getObjects()).execute(), executorService); } public CompletableFuture executeNextCommand(DatabaseCommand command) { @@ -41,6 +44,6 @@ public CompletableFuture executeNextCommand(DatabaseComma } public ExecutionEnvironment getEnv() { - return enviroment; + return environment; } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java b/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java index 9ad82ccd..5a352f34 100644 --- a/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java +++ b/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java @@ -1,18 +1,17 @@ package com.itmo.java.client.client; -import com.itmo.java.basics.console.DatabaseCommandResult; import com.itmo.java.client.command.*; import com.itmo.java.client.connection.KvsConnection; import com.itmo.java.client.exception.ConnectionException; import com.itmo.java.client.exception.DatabaseExecutionException; import com.itmo.java.protocol.model.RespObject; +import java.util.Arrays; import java.util.function.Supplier; public class SimpleKvsClient implements KvsClient { - - private final String dbName; - private final KvsConnection connectionSupplier; + private final String databaseName; + private final KvsConnection kvsConnection; /** * Конструктор @@ -21,77 +20,50 @@ public class SimpleKvsClient implements KvsClient { * @param connectionSupplier метод создания подключения к базе */ public SimpleKvsClient(String databaseName, Supplier connectionSupplier) { - dbName = databaseName; - this.connectionSupplier = connectionSupplier.get(); + this.databaseName = databaseName; + this.kvsConnection = connectionSupplier.get(); } @Override public String createDatabase() throws DatabaseExecutionException { - try { - CreateDatabaseKvsCommand dbKvsCom = new CreateDatabaseKvsCommand(dbName); - RespObject obj = connectionSupplier.send(dbKvsCom.getCommandId(), dbKvsCom.serialize()); - if (obj.isError()) { - throw new DatabaseExecutionException(obj.asString()); - } - return obj.asString(); - } catch (ConnectionException ex) { - return DatabaseCommandResult.error(ex).getPayLoad(); - } + KvsCommand command = new CreateDatabaseKvsCommand(databaseName); + return tryToSend(command); } @Override public String createTable(String tableName) throws DatabaseExecutionException { - try { - CreateTableKvsCommand tbKvsCom = new CreateTableKvsCommand(dbName, tableName); - RespObject obj = connectionSupplier.send(tbKvsCom.getCommandId(), tbKvsCom.serialize()); - if (obj.isError()) { - throw new DatabaseExecutionException(obj.asString()); - } - return obj.asString(); - } catch (ConnectionException ex) { - return DatabaseCommandResult.error(ex).getPayLoad(); - } + KvsCommand command = new CreateTableKvsCommand(databaseName, tableName); + return tryToSend(command); } @Override public String get(String tableName, String key) throws DatabaseExecutionException { - try { - GetKvsCommand getKvsCom = new GetKvsCommand(dbName, tableName, key); - RespObject obj = connectionSupplier.send(getKvsCom.getCommandId(), getKvsCom.serialize()); - if (obj.isError()) { - throw new DatabaseExecutionException(obj.asString()); - } - return obj.asString(); - } catch (ConnectionException ex) { - return DatabaseCommandResult.error(ex).getPayLoad(); - } + KvsCommand command = new GetKvsCommand(databaseName, tableName, key); + return tryToSend(command); } @Override public String set(String tableName, String key, String value) throws DatabaseExecutionException { - try { - SetKvsCommand setKvsCom = new SetKvsCommand(dbName, tableName, key, value); - RespObject obj = connectionSupplier.send(setKvsCom.getCommandId(), setKvsCom.serialize()); - if (obj.isError()) { - throw new DatabaseExecutionException(obj.asString()); - } - return obj.asString(); - } catch (ConnectionException ex) { - return DatabaseCommandResult.error(ex).getPayLoad(); - } + KvsCommand command = new SetKvsCommand(databaseName, tableName, key, value); + return tryToSend(command); } @Override public String delete(String tableName, String key) throws DatabaseExecutionException { + KvsCommand command = new DeleteKvsCommand(databaseName, tableName, key); + return tryToSend(command); + } + + private String tryToSend(KvsCommand command) throws DatabaseExecutionException { try { - DeleteKvsCommand delKvsCom = new DeleteKvsCommand(dbName, tableName, key); - RespObject obj = connectionSupplier.send(delKvsCom.getCommandId(), delKvsCom.serialize()); - if (obj.isError()) { - throw new DatabaseExecutionException(obj.asString()); + RespObject result = kvsConnection.send(command.getCommandId(), command.serialize()); + if (result.isError()) { + throw new DatabaseExecutionException(result.asString()); } - return obj.asString(); - } catch (ConnectionException ex) { - return DatabaseCommandResult.error(ex).getPayLoad(); + return result.asString(); + } catch (ConnectionException e) { + throw new DatabaseExecutionException(String.format("DatabaseExecutionException when try to send '%s' with kvsConnection" + " Message:: " + e.getMessage() + " StackTrace:: " + Arrays.toString(e.getStackTrace()), + command.serialize().asString()), e); } } } \ No newline at end of file From 6332e6e14e5e4bdd123aec9662a69d05602a411a Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 22:10:48 +0300 Subject: [PATCH 373/378] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82=20config?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../itmo/java/basics/config/ConfigLoader.java | 87 +++++++++++-------- .../connector/JavaSocketServerConnector.java | 8 +- 2 files changed, 55 insertions(+), 40 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/config/ConfigLoader.java b/src/main/java/com/itmo/java/basics/config/ConfigLoader.java index a547d5fb..7846789b 100644 --- a/src/main/java/com/itmo/java/basics/config/ConfigLoader.java +++ b/src/main/java/com/itmo/java/basics/config/ConfigLoader.java @@ -1,26 +1,30 @@ package com.itmo.java.basics.config; import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.IOException; +import java.io.InputStream; import java.util.Properties; /** * Класс, отвечающий за подгрузку данных из конфигурационного файла формата .properties */ public class ConfigLoader { - Properties configFileProp = new Properties(); - private String workingPath; - private String host; - private int port; + private static final String DEFAULT_PROPERTY_FILE = "server.properties"; + + private InputStream propertyInputStream; /** * По умолчанию читает из server.properties */ public ConfigLoader() { - try { - configFileProp.load(this.getClass().getClassLoader().getResourceAsStream("server.properties")); - } catch (IOException e) { - e.printStackTrace(); + propertyInputStream = getClass().getClassLoader().getResourceAsStream(DEFAULT_PROPERTY_FILE); + if (this.propertyInputStream == null) { + try { + this.propertyInputStream = new FileInputStream(DEFAULT_PROPERTY_FILE); + } catch (FileNotFoundException e) { + this.propertyInputStream = null; + } } } @@ -28,15 +32,13 @@ public ConfigLoader() { * @param name Имя конфикурационного файла, откуда читать */ public ConfigLoader(String name) { - try { - if (this.getClass().getClassLoader().getResourceAsStream(name) != null) { - configFileProp.load(this.getClass().getClassLoader().getResourceAsStream(name)); - } else { - FileInputStream fileInputStream = new FileInputStream(name); - configFileProp.load(fileInputStream); + this.propertyInputStream = getClass().getClassLoader().getResourceAsStream(name); + if (this.propertyInputStream == null) { + try { + this.propertyInputStream = new FileInputStream(name); + } catch (FileNotFoundException e) { + this.propertyInputStream = null; } - } catch (IOException e) { - e.printStackTrace(); } } @@ -48,23 +50,40 @@ public ConfigLoader(String name) { * Читаются: "kvs.workingPath", "kvs.host", "kvs.port" (но в конфигурационном файле допустимы и другие проперти) */ public DatabaseServerConfig readConfig() { - workingPath = configFileProp.getProperty("kvs.workingPath"); - host = configFileProp.getProperty("kvs.host"); - String stringPort = configFileProp.getProperty("kvs.port"); - if (host == null) { - host = ServerConfig.DEFAULT_HOST; - } - if (stringPort == null) { - port = ServerConfig.DEFAULT_PORT; - } else { - port = Integer.parseInt(stringPort); - } - if (workingPath == null) { - workingPath = DatabaseConfig.DEFAULT_WORKING_PATH; + Properties properties = new Properties(); + try { + if (propertyInputStream == null) { + throw new IOException("Config file not found"); + } + properties.load(propertyInputStream); + String workingPath = properties.getProperty("kvs.workingPath"); + String host = properties.getProperty("kvs.host"); + String portStr = properties.getProperty("kvs.port"); + DatabaseConfig databaseConfig; + ServerConfig serverConfig; + if (workingPath == null) { + databaseConfig = new DatabaseConfig(); + } else { + databaseConfig = new DatabaseConfig(workingPath); + } + if (host == null){ + host = ServerConfig.DEFAULT_HOST; + } + try { + int port = Integer.parseInt(portStr); + serverConfig = new ServerConfig(host, port); + } catch (NumberFormatException e) { + serverConfig = new ServerConfig(host, ServerConfig.DEFAULT_PORT); + } + return DatabaseServerConfig.builder() + .dbConfig(databaseConfig) + .serverConfig(serverConfig) + .build(); + } catch (IOException e) { + return DatabaseServerConfig.builder() + .dbConfig(new DatabaseConfig()) + .serverConfig(new ServerConfig(ServerConfig.DEFAULT_HOST, ServerConfig.DEFAULT_PORT)) + .build(); } - ServerConfig serverConfig = new ServerConfig(host, port); - DatabaseConfig databaseConfig = new DatabaseConfig(workingPath); - return new DatabaseServerConfig(serverConfig, databaseConfig); } -} - \ No newline at end of file +} \ No newline at end of file diff --git a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java index 8a89f5ce..97ad17df 100644 --- a/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java +++ b/src/main/java/com/itmo/java/basics/connector/JavaSocketServerConnector.java @@ -33,12 +33,8 @@ public class JavaSocketServerConnector implements Closeable { * Стартует сервер. По аналогии с сокетом открывает коннекшн в конструкторе. */ public JavaSocketServerConnector(DatabaseServer databaseServer, ServerConfig config) throws IOException { - try { - this.serverSocket = new ServerSocket(config.getPort()); - this.server = databaseServer; - } catch (IOException ex) { - throw new IOException(ex); - } + this.serverSocket = new ServerSocket(config.getPort()); + this.server = databaseServer; } /** From 8f29ccd6d8764a2fc43176890746bb848388d261 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 22:24:58 +0300 Subject: [PATCH 374/378] Check protocol --- .../com/itmo/java/protocol/RespReader.java | 38 +++++++++--------- .../com/itmo/java/protocol/RespWriter.java | 12 +++--- .../itmo/java/protocol/model/RespArray.java | 32 ++++++++------- .../java/protocol/model/RespBulkString.java | 40 ++++++++++--------- .../java/protocol/model/RespCommandId.java | 35 ++++++++-------- .../itmo/java/protocol/model/RespError.java | 25 ++++++------ 6 files changed, 95 insertions(+), 87 deletions(-) diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index 6531d0f9..b1e0d479 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -36,23 +36,23 @@ public boolean hasArray() throws IOException { * @throws IOException при ошибке чтения */ public RespObject readObject() throws IOException { - int codeInt = reader.read(); - if (codeInt == -1) { - throw new EOFException("InputStream is empty RespObject"); - } - byte code = (byte) codeInt; - switch (code) { - case RespArray.CODE: - return readArray(); - case RespBulkString.CODE: - return readBulkString(); - case RespCommandId.CODE: - return readCommandId(); - case RespError.CODE: - return readError(); - default: - throw new IOException("Code is not correct"); - } + int codeInt = reader.read(); + if (codeInt == -1) { + throw new EOFException("InputStream is empty when try to read RespObject"); + } + byte code = (byte) codeInt; + switch (code) { + case RespArray.CODE: + return readArray(); + case RespBulkString.CODE: + return readBulkString(); + case RespCommandId.CODE: + return readCommandId(); + case RespError.CODE: + return readError(); + default: + throw new IOException("Code character is not correct"); + } } /** @@ -137,11 +137,11 @@ private byte[] readBytesToEndOfLine() throws IOException { if (nextByte == -1) { throw new EOFException("Stream is empty when try to read all bytes before '\\r\\n'"); } - if (nextByte == LF) { + if (nextByte == LF){ reader.reset(); reader.read(); break; - } else { + }else { reader.reset(); } } diff --git a/src/main/java/com/itmo/java/protocol/RespWriter.java b/src/main/java/com/itmo/java/protocol/RespWriter.java index e905dcee..73d40e1c 100644 --- a/src/main/java/com/itmo/java/protocol/RespWriter.java +++ b/src/main/java/com/itmo/java/protocol/RespWriter.java @@ -4,24 +4,24 @@ import java.io.IOException; import java.io.OutputStream; +import java.nio.charset.StandardCharsets; -public class RespWriter implements AutoCloseable { - - private final OutputStream outputStream; +public class RespWriter implements AutoCloseable{ + private final OutputStream os; public RespWriter(OutputStream os) { - outputStream = os; + this.os = os; } /** * Записывает в output stream объект */ public void write(RespObject object) throws IOException { - object.write(outputStream); + object.write(os); } @Override public void close() throws IOException { - outputStream.close(); + os.close(); } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/protocol/model/RespArray.java b/src/main/java/com/itmo/java/protocol/model/RespArray.java index fcb17efb..6399fb00 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespArray.java +++ b/src/main/java/com/itmo/java/protocol/model/RespArray.java @@ -5,21 +5,20 @@ import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; /** * Массив RESP объектов */ public class RespArray implements RespObject { + private final List objects; /** * Код объекта */ public static final byte CODE = '*'; - private List objects; - public RespArray(RespObject... obj) { - objects = Arrays.asList(obj); + public RespArray(RespObject... objects) { + this.objects = Arrays.asList(objects); } /** @@ -39,20 +38,23 @@ public boolean isError() { */ @Override public String asString() { - return objects.stream().map(RespObject::asString).collect(Collectors.joining(" ")); + StringBuilder stringBuilder = new StringBuilder(); + for (RespObject object : objects) { + stringBuilder.append(object.asString()); + stringBuilder.append(" "); + } + stringBuilder.deleteCharAt(stringBuilder.length() - 1); + return stringBuilder.toString(); } @Override - public void write(OutputStream output) throws IOException { - try { - output.write(CODE); - output.write(Integer.toString(objects.size()).getBytes(StandardCharsets.UTF_8)); - output.write(CRLF); - for (RespObject obj : objects) { - obj.write(output); - } - } catch (IOException ex) { - throw new IOException(ex); + public void write(OutputStream os) throws IOException { + os.write(CODE); + os.write(String.valueOf(objects.size()).getBytes(StandardCharsets.UTF_8)); + os.write(CRLF); + os.flush(); + for (RespObject object : objects) { + object.write(os); } } diff --git a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java index c0b33d6a..890c0e3f 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java +++ b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java @@ -8,17 +8,19 @@ * Строка */ public class RespBulkString implements RespObject { + private final byte[] data; + /** * Код объекта */ public static final byte CODE = '$'; + public static final int NULL_STRING_SIZE = -2; - private final byte[] data; - public static final RespBulkString NULL_STRING = new RespBulkString(null); + public static final RespBulkString NULL_STRING = new RespBulkString(null); - public RespBulkString(byte[] inform) { - data = inform; + public RespBulkString(byte[] data) { + this.data = data; } /** @@ -38,24 +40,24 @@ public boolean isError() { */ @Override public String asString() { - return new String(data); + if (data == null) { + return null; + } + return new String(data, StandardCharsets.UTF_8); } @Override - public void write(OutputStream output) throws IOException { - try { - output.write(CODE); - if (data == null) { - output.write(Integer.toString(NULL_STRING_SIZE).getBytes(StandardCharsets.UTF_8)); - } else { - output.write(Integer.toString(data.length).getBytes(StandardCharsets.UTF_8)); - output.write(CRLF); - output.write(data); - } - output.write(CRLF); - } catch (IOException ex) { - throw new IOException(ex); + public void write(OutputStream os) throws IOException { + os.write(CODE); + if (data == null) { + os.write(String.valueOf(NULL_STRING_SIZE).getBytes(StandardCharsets.UTF_8)); } + else { + os.write(String.valueOf(data.length).getBytes(StandardCharsets.UTF_8)); + os.write(CRLF); + os.write(data); + } + os.write(CRLF); + os.flush(); } - } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/protocol/model/RespCommandId.java b/src/main/java/com/itmo/java/protocol/model/RespCommandId.java index 8255d758..c8f4285e 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespCommandId.java +++ b/src/main/java/com/itmo/java/protocol/model/RespCommandId.java @@ -2,20 +2,21 @@ import java.io.IOException; import java.io.OutputStream; +import java.nio.charset.StandardCharsets; /** * Id */ public class RespCommandId implements RespObject { + private final int commandId; /** * Код объекта */ public static final byte CODE = '!'; - private final int commandId; - public RespCommandId(int comId) { - commandId = comId; + public RespCommandId(int commandId) { + this.commandId = commandId; } /** @@ -30,21 +31,23 @@ public boolean isError() { @Override public String asString() { - return Integer.toString(commandId); + return String.valueOf(commandId); } @Override - public void write(OutputStream output) throws IOException { - try { - output.write(CODE); - int commandByte = commandId; - output.write((commandByte >>> 24) & 0xFF); - output.write((commandByte >>> 16) & 0xFF); - output.write((commandByte >>> 8) & 0xFF); - output.write(commandByte & 0xFF); - output.write(CRLF); - } catch (IOException ex) { - throw new IOException(ex); - } + public void write(OutputStream os) throws IOException { + os.write(CODE); + os.write(intToByteArray(commandId)); + os.write(CRLF); + os.flush(); + } + + static byte[] intToByteArray(int data) { + byte[] result = new byte[4]; + result[0] = (byte) ((data & 0xFF000000) >> 24); + result[1] = (byte) ((data & 0x00FF0000) >> 16); + result[2] = (byte) ((data & 0x0000FF00) >> 8); + result[3] = (byte) ((data & 0x000000FF)); + return result; } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/protocol/model/RespError.java b/src/main/java/com/itmo/java/protocol/model/RespError.java index 8e47a31f..68740e83 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespError.java +++ b/src/main/java/com/itmo/java/protocol/model/RespError.java @@ -2,20 +2,21 @@ import java.io.IOException; import java.io.OutputStream; +import java.nio.charset.StandardCharsets; /** * Сообщение об ошибке в RESP протоколе */ public class RespError implements RespObject { + private final byte[] message; /** * Код объекта */ public static final byte CODE = '-'; - public byte[] message; - public RespError(byte[] mes) { - message = mes; + public RespError(byte[] message) { + this.message = message; } /** @@ -30,17 +31,17 @@ public boolean isError() { @Override public String asString() { - return new String(message); + if (message == null) { + return null; + } + return new String(message, StandardCharsets.UTF_8); } @Override - public void write(OutputStream output) throws IOException { - try { - output.write(CODE); - output.write(message); - output.write(CRLF); - } catch (IOException ex) { - throw new IOException(ex); - } + public void write(OutputStream os) throws IOException { + os.write(CODE); + os.write(message); + os.write(CRLF); + os.flush(); } } \ No newline at end of file From 74466265c8aab427d2186e0639b13590ce8fe36e Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 22:28:09 +0300 Subject: [PATCH 375/378] check client --- .../connection/DirectReferenceKvsConnection.java | 16 ++++++++++------ .../client/connection/SocketKvsConnection.java | 2 +- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java b/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java index 5c80f902..f2837885 100644 --- a/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/DirectReferenceKvsConnection.java @@ -3,6 +3,7 @@ import com.itmo.java.basics.DatabaseServer; import com.itmo.java.client.exception.ConnectionException; import com.itmo.java.protocol.model.RespArray; +import com.itmo.java.protocol.model.RespCommandId; import com.itmo.java.protocol.model.RespObject; import java.util.concurrent.ExecutionException; @@ -12,19 +13,22 @@ * (пока еще нет реализации сокетов) */ public class DirectReferenceKvsConnection implements KvsConnection { - - private final DatabaseServer dbServer; + private final DatabaseServer databaseServer; public DirectReferenceKvsConnection(DatabaseServer databaseServer) { - dbServer = databaseServer; + this.databaseServer = databaseServer; } @Override public RespObject send(int commandId, RespArray command) throws ConnectionException { try { - return dbServer.executeNextCommand(command).get().serialize(); - } catch (ExecutionException | InterruptedException ex) { - throw new ConnectionException(ex.getMessage(), ex.getCause()); + return databaseServer.executeNextCommand(command).get().serialize(); + } catch (InterruptedException e) { + throw new ConnectionException("ConnectionException when try to get result from server because of interruption when message is '" + + command.asString() + "'", e); + } catch (ExecutionException e) { + throw new ConnectionException("ConnectionException when try to get result from server because of ExecutionException when message is '" + + command.asString() + "'", e); } } diff --git a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java index 855baf72..f2a9eb6b 100644 --- a/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java +++ b/src/main/java/com/itmo/java/client/connection/SocketKvsConnection.java @@ -64,4 +64,4 @@ public void close() { throw new RuntimeException("IOException when try to close client socket"); } } -} +} \ No newline at end of file From 98ea7446898ff89b620a3ef041c3061964db3117 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Thu, 10 Jun 2021 22:31:40 +0300 Subject: [PATCH 376/378] fix --- src/main/java/com/itmo/java/protocol/model/RespBulkString.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java index 890c0e3f..8efa0c10 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java +++ b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java @@ -15,7 +15,7 @@ public class RespBulkString implements RespObject { */ public static final byte CODE = '$'; - public static final int NULL_STRING_SIZE = -2; + public static final int NULL_STRING_SIZE = -1; public static final RespBulkString NULL_STRING = new RespBulkString(null); From 1663d1b331e97f6bdd12e32303c6fcf4e5de0a30 Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 11 Jun 2021 01:25:01 +0300 Subject: [PATCH 377/378] small fix --- .../com/itmo/java/basics/DatabaseServer.java | 3 +- .../itmo/java/basics/resp/CommandReader.java | 35 +++------ .../java/client/client/SimpleKvsClient.java | 78 +++++++++++++------ .../com/itmo/java/protocol/RespReader.java | 8 +- .../com/itmo/java/protocol/RespWriter.java | 11 ++- .../java/protocol/model/RespBulkString.java | 3 +- .../java/protocol/model/RespCommandId.java | 31 +++----- 7 files changed, 86 insertions(+), 83 deletions(-) diff --git a/src/main/java/com/itmo/java/basics/DatabaseServer.java b/src/main/java/com/itmo/java/basics/DatabaseServer.java index 8f847dc9..c5ea3e59 100644 --- a/src/main/java/com/itmo/java/basics/DatabaseServer.java +++ b/src/main/java/com/itmo/java/basics/DatabaseServer.java @@ -5,7 +5,6 @@ import com.itmo.java.basics.initialization.InitializationContext; import com.itmo.java.basics.initialization.impl.DatabaseServerInitializer; import com.itmo.java.basics.initialization.impl.InitializationContextImpl; -import com.itmo.java.basics.logic.Database; import com.itmo.java.protocol.model.RespArray; import java.util.concurrent.CompletableFuture; @@ -30,7 +29,7 @@ public static DatabaseServer initialize(ExecutionEnvironment env, DatabaseServer return new DatabaseServer(env); } - private DatabaseServer(ExecutionEnvironment env){ + private DatabaseServer(ExecutionEnvironment env) { this.environment = env; } diff --git a/src/main/java/com/itmo/java/basics/resp/CommandReader.java b/src/main/java/com/itmo/java/basics/resp/CommandReader.java index b5135f81..a4078fc8 100644 --- a/src/main/java/com/itmo/java/basics/resp/CommandReader.java +++ b/src/main/java/com/itmo/java/basics/resp/CommandReader.java @@ -5,12 +5,10 @@ import com.itmo.java.basics.console.DatabaseCommands; import com.itmo.java.basics.console.ExecutionEnvironment; import com.itmo.java.protocol.RespReader; -import com.itmo.java.protocol.model.RespArray; -import com.itmo.java.protocol.model.RespBulkString; -import com.itmo.java.protocol.model.RespCommandId; import com.itmo.java.protocol.model.RespObject; import java.io.IOException; +import java.util.List; public class CommandReader implements AutoCloseable { private final RespReader reader; @@ -25,7 +23,7 @@ public CommandReader(RespReader reader, ExecutionEnvironment env) { * Есть ли следующая команда в ридере? */ public boolean hasNextCommand() throws IOException { - return reader.hasArray(); + return this.reader.hasArray(); } /** @@ -34,30 +32,17 @@ public boolean hasNextCommand() throws IOException { * @throws IllegalArgumentException если нет имени команды и id */ public DatabaseCommand readCommand() throws IOException { - RespArray respArray = reader.readArray(); - if (respArray.getObjects().size() < DatabaseCommandArgPositions.DATABASE_NAME.getPositionIndex() + 1) { - throw new IllegalArgumentException("RespArray does not have enough size"); + final List commandArgs = this.reader.readArray().getObjects(); + if (commandArgs.size() < 2) { + throw new IllegalArgumentException("There is no id and command name"); } - RespObject id = respArray.getObjects().get(DatabaseCommandArgPositions.COMMAND_ID.getPositionIndex()); - if (!(id instanceof RespCommandId)) { - throw new IllegalArgumentException("Command does not have command id"); - } - if (id.asString() == null || id.asString().isEmpty()) { - throw new IllegalArgumentException("Command id does not exist"); - } - RespObject commandName = respArray.getObjects().get(DatabaseCommandArgPositions.COMMAND_NAME.getPositionIndex()); - if (!(commandName instanceof RespBulkString)) { - throw new IllegalArgumentException("Command does not have command name"); - } - if (commandName.asString() == null || commandName.asString().isEmpty()) { - throw new IllegalArgumentException("Command name does not exist"); - } - - return DatabaseCommands.valueOf(commandName.asString()).getCommand(env, respArray.getObjects()); + return DatabaseCommands.valueOf(commandArgs + .get(DatabaseCommandArgPositions.COMMAND_NAME.getPositionIndex()).asString()) + .getCommand(env, commandArgs); } @Override public void close() throws Exception { - reader.close(); + this.reader.close(); } -} \ No newline at end of file +} diff --git a/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java b/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java index 5a352f34..7a1092df 100644 --- a/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java +++ b/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java @@ -1,17 +1,18 @@ package com.itmo.java.client.client; +import com.itmo.java.basics.console.DatabaseCommandResult; import com.itmo.java.client.command.*; import com.itmo.java.client.connection.KvsConnection; import com.itmo.java.client.exception.ConnectionException; import com.itmo.java.client.exception.DatabaseExecutionException; import com.itmo.java.protocol.model.RespObject; -import java.util.Arrays; import java.util.function.Supplier; public class SimpleKvsClient implements KvsClient { - private final String databaseName; - private final KvsConnection kvsConnection; + + private final String dbName; + private final KvsConnection connectionSupplier; /** * Конструктор @@ -20,50 +21,77 @@ public class SimpleKvsClient implements KvsClient { * @param connectionSupplier метод создания подключения к базе */ public SimpleKvsClient(String databaseName, Supplier connectionSupplier) { - this.databaseName = databaseName; - this.kvsConnection = connectionSupplier.get(); + this.dbName = databaseName; + this.connectionSupplier = connectionSupplier.get(); } @Override public String createDatabase() throws DatabaseExecutionException { - KvsCommand command = new CreateDatabaseKvsCommand(databaseName); - return tryToSend(command); + try { + CreateDatabaseKvsCommand dbKvsCom = new CreateDatabaseKvsCommand(dbName); + RespObject obj = connectionSupplier.send(dbKvsCom.getCommandId(), dbKvsCom.serialize()); + if (obj.isError()) { + throw new DatabaseExecutionException(obj.asString()); + } + return obj.asString(); + } catch (ConnectionException ex) { + return DatabaseCommandResult.error(ex).getPayLoad(); + } } @Override public String createTable(String tableName) throws DatabaseExecutionException { - KvsCommand command = new CreateTableKvsCommand(databaseName, tableName); - return tryToSend(command); + try { + CreateTableKvsCommand tbKvsCom = new CreateTableKvsCommand(dbName, tableName); + RespObject obj = connectionSupplier.send(tbKvsCom.getCommandId(), tbKvsCom.serialize()); + if (obj.isError()) { + throw new DatabaseExecutionException(obj.asString()); + } + return obj.asString(); + } catch (ConnectionException ex) { + return DatabaseCommandResult.error(ex).getPayLoad(); + } } @Override public String get(String tableName, String key) throws DatabaseExecutionException { - KvsCommand command = new GetKvsCommand(databaseName, tableName, key); - return tryToSend(command); + try { + GetKvsCommand getKvsCom = new GetKvsCommand(dbName, tableName, key); + RespObject obj = connectionSupplier.send(getKvsCom.getCommandId(), getKvsCom.serialize()); + if (obj.isError()) { + throw new DatabaseExecutionException(obj.asString()); + } + return obj.asString(); + } catch (ConnectionException ex) { + return DatabaseCommandResult.error(ex).getPayLoad(); + } } @Override public String set(String tableName, String key, String value) throws DatabaseExecutionException { - KvsCommand command = new SetKvsCommand(databaseName, tableName, key, value); - return tryToSend(command); + try { + SetKvsCommand setKvsCom = new SetKvsCommand(dbName, tableName, key, value); + RespObject obj = connectionSupplier.send(setKvsCom.getCommandId(), setKvsCom.serialize()); + if (obj.isError()) { + throw new DatabaseExecutionException(obj.asString()); + } + return obj.asString(); + } catch (ConnectionException ex) { + return DatabaseCommandResult.error(ex).getPayLoad(); + } } @Override public String delete(String tableName, String key) throws DatabaseExecutionException { - KvsCommand command = new DeleteKvsCommand(databaseName, tableName, key); - return tryToSend(command); - } - - private String tryToSend(KvsCommand command) throws DatabaseExecutionException { try { - RespObject result = kvsConnection.send(command.getCommandId(), command.serialize()); - if (result.isError()) { - throw new DatabaseExecutionException(result.asString()); + DeleteKvsCommand delKvsCom = new DeleteKvsCommand(dbName, tableName, key); + RespObject obj = connectionSupplier.send(delKvsCom.getCommandId(), delKvsCom.serialize()); + if (obj.isError()) { + throw new DatabaseExecutionException(obj.asString()); } - return result.asString(); - } catch (ConnectionException e) { - throw new DatabaseExecutionException(String.format("DatabaseExecutionException when try to send '%s' with kvsConnection" + " Message:: " + e.getMessage() + " StackTrace:: " + Arrays.toString(e.getStackTrace()), - command.serialize().asString()), e); + return obj.asString(); + } catch (ConnectionException ex) { + return DatabaseCommandResult.error(ex).getPayLoad(); } } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/protocol/RespReader.java b/src/main/java/com/itmo/java/protocol/RespReader.java index b1e0d479..435c406f 100644 --- a/src/main/java/com/itmo/java/protocol/RespReader.java +++ b/src/main/java/com/itmo/java/protocol/RespReader.java @@ -129,19 +129,19 @@ private byte[] readBytesToEndOfLine() throws IOException { while (true) { int currentByte = reader.read(); if (currentByte == -1) { - throw new EOFException("Stream is empty when try to read all bytes before '\\r\\n'"); + throw new EOFException("Stream is empty when try to read "); } if (currentByte == CR) { reader.mark(READ_AHEAD_LIMIT); int nextByte = reader.read(); if (nextByte == -1) { - throw new EOFException("Stream is empty when try to read all bytes before '\\r\\n'"); + throw new EOFException("Stream is empty when try to read "); } - if (nextByte == LF){ + if (nextByte == LF) { reader.reset(); reader.read(); break; - }else { + } else { reader.reset(); } } diff --git a/src/main/java/com/itmo/java/protocol/RespWriter.java b/src/main/java/com/itmo/java/protocol/RespWriter.java index 73d40e1c..61da5bda 100644 --- a/src/main/java/com/itmo/java/protocol/RespWriter.java +++ b/src/main/java/com/itmo/java/protocol/RespWriter.java @@ -4,24 +4,23 @@ import java.io.IOException; import java.io.OutputStream; -import java.nio.charset.StandardCharsets; -public class RespWriter implements AutoCloseable{ - private final OutputStream os; +public class RespWriter implements AutoCloseable { + private final OutputStream outputStream; public RespWriter(OutputStream os) { - this.os = os; + this.outputStream = os; } /** * Записывает в output stream объект */ public void write(RespObject object) throws IOException { - object.write(os); + object.write(outputStream); } @Override public void close() throws IOException { - os.close(); + outputStream.close(); } } \ No newline at end of file diff --git a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java index 8efa0c10..da2d6ee1 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespBulkString.java +++ b/src/main/java/com/itmo/java/protocol/model/RespBulkString.java @@ -51,8 +51,7 @@ public void write(OutputStream os) throws IOException { os.write(CODE); if (data == null) { os.write(String.valueOf(NULL_STRING_SIZE).getBytes(StandardCharsets.UTF_8)); - } - else { + } else { os.write(String.valueOf(data.length).getBytes(StandardCharsets.UTF_8)); os.write(CRLF); os.write(data); diff --git a/src/main/java/com/itmo/java/protocol/model/RespCommandId.java b/src/main/java/com/itmo/java/protocol/model/RespCommandId.java index c8f4285e..50a2913a 100644 --- a/src/main/java/com/itmo/java/protocol/model/RespCommandId.java +++ b/src/main/java/com/itmo/java/protocol/model/RespCommandId.java @@ -2,21 +2,20 @@ import java.io.IOException; import java.io.OutputStream; -import java.nio.charset.StandardCharsets; /** * Id */ public class RespCommandId implements RespObject { - private final int commandId; /** * Код объекта */ public static final byte CODE = '!'; + private final int commandId; - public RespCommandId(int commandId) { - this.commandId = commandId; + public RespCommandId(int comId) { + commandId = comId; } /** @@ -31,23 +30,17 @@ public boolean isError() { @Override public String asString() { - return String.valueOf(commandId); + return Integer.toString(commandId); } @Override - public void write(OutputStream os) throws IOException { - os.write(CODE); - os.write(intToByteArray(commandId)); - os.write(CRLF); - os.flush(); - } - - static byte[] intToByteArray(int data) { - byte[] result = new byte[4]; - result[0] = (byte) ((data & 0xFF000000) >> 24); - result[1] = (byte) ((data & 0x00FF0000) >> 16); - result[2] = (byte) ((data & 0x0000FF00) >> 8); - result[3] = (byte) ((data & 0x000000FF)); - return result; + public void write(OutputStream output) throws IOException { + output.write(CODE); + int commandByte = commandId; + output.write((commandByte >>> 24) & 0xFF); + output.write((commandByte >>> 16) & 0xFF); + output.write((commandByte >>> 8) & 0xFF); + output.write(commandByte & 0xFF); + output.write(CRLF); } } \ No newline at end of file From 6708b4fdda63dfd94857df58e20cd835c64553ce Mon Sep 17 00:00:00 2001 From: Aleksandor Date: Fri, 11 Jun 2021 01:36:22 +0300 Subject: [PATCH 378/378] Update SimpleKvsClient.java --- src/main/java/com/itmo/java/client/client/SimpleKvsClient.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java b/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java index 7a1092df..72fcc2ae 100644 --- a/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java +++ b/src/main/java/com/itmo/java/client/client/SimpleKvsClient.java @@ -48,7 +48,7 @@ public String createTable(String tableName) throws DatabaseExecutionException { throw new DatabaseExecutionException(obj.asString()); } return obj.asString(); - } catch (ConnectionException ex) { + } catch (ConnectionException ex){ return DatabaseCommandResult.error(ex).getPayLoad(); } }