Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions src/main/java/ru/andrey/kvstorage/resp/RespReader.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,22 @@ public class RespReader {

private final InputStream is;

/**
* Возвращает {@code true} - если в InputStream есть RespArray, {@code false} - в ином случае.
*
* @return {@code true} - если в InputStream есть RespArray, {@code false} - в ином случае
* @throws IOException если произошла ошибка ввода-вывода
*/
public boolean hasArray() throws IOException {
return is.read() == RespArray.CODE;
}

/**
* Считывает и возвращает считанный {@code RespObject}.
*
* @return считанный {@code RespObject}
* @throws IOException если произошла ошибка ввода-вывода или данные не соответствуют формату RESP
*/
public RespObject readObject() throws IOException {
final int code = is.read();
if (code == -1) {
Expand All @@ -46,14 +58,32 @@ public RespObject readObject() throws IOException {
}
}

/**
* Принудительно пытается считать {@code RespSimpleString} при условии, что первый байт уже был считан.
*
* @return считанная {@code RespSimpleString}
* @throws IOException если произошла ошибка ввода-вывода или данные не соответствуют формату RESP
*/
public RespSimpleString readSimpleString() throws IOException {
return new RespSimpleString(readString());
}

/**
* Принудительно пытается считать {@code RespError} при условии, что первый байт уже был считан.
*
* @return считанный {@code RespError}
* @throws IOException если произошла ошибка ввода-вывода или данные не соответствуют формату RESP
*/
public RespError readError() throws IOException {
return new RespError(readString());
}

/**
* Принудительно пытается считать {@code RespBulkString} при условии, что первый байт уже был считан.
*
* @return считанная {@code RespBulkString}
* @throws IOException если произошла ошибка ввода-вывода или данные не соответствуют формату RESP
*/
public RespBulkString readBulkString() throws IOException {
final int size = readInt();

Expand Down Expand Up @@ -87,6 +117,12 @@ public RespBulkString readBulkString() throws IOException {
return new RespBulkString(data);
}

/**
* Принудительно пытается считать {@code RespArray} при условии, что первый байт уже был считан.
*
* @return считанный {@code RespArray}
* @throws IOException если произошла ошибка ввода-вывода или данные не соответствуют формату RESP
*/
public RespArray readArray() throws IOException {
final int size = readInt();

Expand Down
7 changes: 7 additions & 0 deletions src/main/java/ru/andrey/kvstorage/resp/RespUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,13 @@

public class RespUtil {

/**
* Записывает число в {@code os} в символьно-цифровом представлении.
*
* @param os входной поток, куда нужно записать число
* @param number число, которое нужно записать
* @throws IOException если произошла ошибка ввода-вывода
*/
public static void writeInt(OutputStream os, int number) throws IOException {
os.write(Integer.toString(number).getBytes(StandardCharsets.US_ASCII));
}
Expand Down
6 changes: 6 additions & 0 deletions src/main/java/ru/andrey/kvstorage/resp/RespWriter.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,12 @@ public class RespWriter {

private final OutputStream os;

/**
* Записывает {@code object} в выходной поток.
*
* @param object объект, который нужно записать
* @throws IOException если произошла ошибка ввода-вывода
*/
public void write(RespObject object) throws IOException {
object.write(os);
os.flush();
Expand Down
21 changes: 21 additions & 0 deletions src/main/java/ru/andrey/kvstorage/resp/object/RespObject.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,33 @@ public interface RespObject {
byte[] CRLF = "\r\n".getBytes(StandardCharsets.US_ASCII);
byte[] MINUS_ONE = "-1".getBytes(StandardCharsets.US_ASCII);

/**
* Возвращает {@code true} - если данный объект является ошибкой, {@code false} - в ином случае.
*
* @return {@code true} - если данный объект является ошибкой, {@code false} - в ином случае
*/
boolean isError();

/**
* Возвращает строковое представление данного объекта.
*
* @return строковое представление данного объекта
*/
String asString();

/**
* Сериализует данный объект в байты и записывает его в OutputStream.
*
* @param os - выходной поток, куда будут записываться данные
* @throws IOException если произошла ошибка ввода-вывода
*/
void write(OutputStream os) throws IOException;

/**
* Возвращает байтовое представление данного объекта.
*
* @return байтовое представление данного объекта
*/
default byte[] getBytes() {
final ByteArrayOutputStream os = new ByteArrayOutputStream();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,11 @@
import ru.andrey.kvstorage.resp.object.RespObject;

public interface DatabaseApiSerializable {

/**
* Возвращает представление данного объекта в RESP протоколе.
*
* @return представление данного объекта в RESP протоколе
*/
RespObject serialize();
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,12 @@
import ru.andrey.kvstorage.server.exception.DatabaseException;

public interface DatabaseCommand {

/**
* Запуск данной команды.
*
* @return результат выполнение команды
* @throws DatabaseException если произошла ошибка СУБД
*/
DatabaseCommandResult execute() throws DatabaseException;
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,34 @@

public interface DatabaseCommandResult extends DatabaseApiSerializable {

/**
* Формирует успешный результат выполнения команды из значения результата.
*
* @param result значение результата
* @return успешный результат выполнения команды, который был сформирован
*/
static DatabaseCommandResult success(String result) {
Objects.requireNonNull(result);
return new DatabaseCommandResultImpl(result, null, DatabaseCommandStatus.SUCCESS);
}

/**
* Формирует результат команды, при выполнении которой произошла ошибка.
*
* @param message сообщение об ошибке
* @return результат команды, при выполнении которой произошла ошибка
*/
static DatabaseCommandResult error(String message) {
Objects.requireNonNull(message);
return new DatabaseCommandResultImpl(null, message, DatabaseCommandStatus.FAILED);
}

/**
* Формирует результат команды, при выполнении которой произошла ошибка, из исключения.
*
* @param exception исключение, из которого нужно сформировать результат выполнения команды
* @return результат команды, при выполнении которой произошла ошибка
*/
static DatabaseCommandResult error(Exception exception) {
Objects.requireNonNull(exception);
String message = exception.getMessage() != null
Expand All @@ -29,14 +47,37 @@ static DatabaseCommandResult error(Exception exception) {
return DatabaseCommandResult.error(message);
}

/**
* Возвращает значение результата выполнения команды в виде {@code Optional<String>}.
*
* @return значение результата выполнения команды в виде {@code Optional<String>}
*/
Optional<String> getResult();

/**
* Возвращает статус выполнения команды.
*
* @return статус выполнения команды
*/
DatabaseCommandStatus getStatus();

/**
* Возвращает {@code true} - если команда выполнилась успешно (status == DatabaseCommandStatus.SUCCESS), {@code false} - в ином случае.
*
* @return {@code true} - если команда выполнилась успешно (status == DatabaseCommandStatus.SUCCESS), {@code false} - в ином случае
*/
boolean isSuccess();

/**
* Возвращает сообщение об ошибке, которая произошла при выполнении команды.
*
* @return сообщение об ошибке, которая произошла при выполнении команды
*/
String getErrorMessage();

/**
* Перечисление, описывающее возможные варианты статуса выполнения команды.
*/
enum DatabaseCommandStatus {
SUCCESS, FAILED
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,12 @@ public DatabaseCommand getCommand(ExecutionEnvironment env, String... args) {
}
};


/**
* Формирование команды СУБД из входных аргументов.
*
* @param env текущее окружение
* @param args аргументы
* @return сформированная команда СУБД
*/
public abstract DatabaseCommand getCommand(ExecutionEnvironment env, String... args);
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,26 @@
import java.util.Optional;

public interface ExecutionEnvironment {

/**
* Возвращает путь до папки, где находятся базы данных.
*
* @return путь до папки, где находятся базы данных
*/
Path getWorkingPath();

/**
* Возвращает {@code Optional<Database>}.
*
* @param name имя базы данных
* @return {@code Optional<Database>}
*/
Optional<Database> getDatabase(String name);

/**
* Добавляет базу данных в текущее окружение.
*
* @param db база данных, которую нужно добавить
*/
void addDatabase(Database db);
}
13 changes: 13 additions & 0 deletions src/main/java/ru/andrey/kvstorage/server/index/DatabaseIndex.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,20 @@
import java.util.Optional;

public interface DatabaseIndex<K, V> {

/**
* Оповещает индекс об обновлении значения по определенному ключу.
*
* @param key ключ, который обновился
* @param value новое значение
*/
void onIndexedEntityUpdated(K key, V value);

/**
* Ищет значение в индексе по указанному ключу.
*
* @param key ключ, по которому нужно провести поиск значение
* @return {@code Optional<V>}
*/
Optional<V> searchForKey(K key);
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
package ru.andrey.kvstorage.server.index;

public interface SegmentIndexInfo {

/**
* Возвращает смещение определенной записи в файле сегмента.
*
* @return смещение определенной записи в файле сегмента
*/
long getOffset();
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,33 @@
import java.util.Map;

public interface DatabaseInitializationContext {

/**
* Возвращает имя инициализируемой базы данных.
*
* @return имя инициализируемой базы данных
*/
String getDbName();

/**
* Возвращает путь до директории инициализируемой базы данных.
*
* @return путь до директории инициализируемой базы данных
*/
Path getDatabasePath();

/**
* Возвращает ассоциативный массив таблиц, который накопился на данном этапе инициализации.
*
* @return массив таблиц, который накопился на данном этапе инициализации
*/
Map<String, Table> getTables();

/**
* Добавляет таблицу в ассоциативный массив накопленных таблиц.
*
* @param table таблица, которую нужно добавить
*/
void addTable(Table table);
}

Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,32 @@
import ru.andrey.kvstorage.server.console.ExecutionEnvironment;

public interface InitializationContext {

/**
* Возвращает текущее окружение.
*
* @return текущее окружение
*/
ExecutionEnvironment executionEnvironment();

/**
* Возвращает контекст инициализации для базы данных.
*
* @return контекст инициализации для базы данных
*/
DatabaseInitializationContext currentDbContext();

/**
* Возвращает контекст инициализации для таблицы.
*
* @return контекст инициализации для таблицы
*/
TableInitializationContext currentTableContext();

/**
* Возвращает контекст инициализации для сегмента.
*
* @return контекст инициализации для сегмента
*/
SegmentInitializationContext currentSegmentContext();
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,12 @@
import ru.andrey.kvstorage.server.exception.DatabaseException;

public interface Initializer {

/**
* Выполняет инициализацию какой-либо сущности с переданным контекстом.
*
* @param context контекст, с которым нужно провести инициализацию
* @throws DatabaseException если произошла ошибка инициализации сущности
*/
void perform(InitializationContext context) throws DatabaseException;
}
Loading