Skip to content

Latest commit

 

History

History
105 lines (84 loc) · 4.13 KB

03-MultiFileHashMap.md

File metadata and controls

105 lines (84 loc) · 4.13 KB

MultiFileHashMap

Поддержка в БД нескольких таблиц и распределение данных таблицы.

Корневая директория для данных получается из property System.getProperty("fizteh.db.dir"). В корневой директории располагаются поддиректории, чьи имена соответствуют именам таблиц. Директория таблицы может содержать до 16 директорий: 0.dir, 1.dir, 2.dir, ..., 15.dir. Внутри каждой директории может быть до 16 файлов с именами: 0.dat, 1.dat, 2.dat, ..., 15.dat. Данные распределяются по файлам строго оговоренным ниже образом. Файлы и директории должны быть непустыми. Если файл или директория опустели, они удаляются.

Кроме того, приложение должно поддерживать дополнительные команды для работы с таблицами.

create

create <tablename>

Создать новую таблицу. Создается соответствующая директория. Если успешно:

created

Если такая таблица уже существует:

tablename exists

drop

drop tablename

Удалить таблицу. Директория таблицы удаляется с диска. Если успешно:

dropped

Если такой таблицы не существует:

tablename not exists

use

use tablename

Использовать указанную таблицу для последующих операций работы с данными.

Если таблицы не существует:

tablename not exists

Если переключение прошло успешно:

using tablename

Если пользователь пытается провести операции с данными, когда база еще не выбрана:

no table

show tables

show tables

Выводит список таблиц с количеством записей (через пробел).

table_name row_count
table1 10
table2 123
table3 45
…

Вариант 1

Пара ключ-значение записывается в соответствующий файл по следующему правилу:

hashcode = key.hashCode()
ndirectory = hashcode % 16
nfile = hashcode / 16 % 16

Вариант 2

Пара ключ-значение записывается в соответствующий файл по следующему правилу:

byte = key.bytes[0]
ndirectory = byte % 16
nfile = byte / 16 % 16

Подводные камни

  • При запуске приложения нужно убедиться, что директория, в которой предлагается работать, существует.
  • Также следует проверить, что корневая директория и поддиректории действительно директории, а не файлы.
  • При чтении из файлов нужно проверять их валидность, избегать слишком больших и маленьких значений буферов.
  • При чтении из файла можно проверять, что читаемые ключи действительно должны принадлежать именно к этому файлу.
  • Бинарный формат и соотношение ключ-файл должны быть строго соблюдены.
  • Протокол интерактивной работы должен быть строго соблюден.
  • Приложение должно поддерживать русские буковки.
  • Неразумно на каждый запрос писать в файл и читать из файла.