;Основные понятия базы данных. ;1. База данных - хранилище директорий и файлов с произвольным содержанием. ;Теоретически размер базы данных может изменяться от 104 байт (пустая база) до 2^64 байт. ;2. Индекс - номер файлового смещения в базе данных. Используется в качестве относительного указателя на ;директории, файлы и строки внутри базы данных. Исчисление индексов начинается с еденицы, а нулевой индекс ;отмечает отсутствие директории, файла или строки с именем. ;3. Директория - папка базы данных. Содержит массив номеров индексов других директорий, а также файлов ;базы данных. ;4. Файл базы данных - бинарные данные произвольного содержания. ;Основные структуры базы данных ;1. Структура хранящая файловое смещение для определенного объекта. OBJ_INDEX struc Index ULONG64 ? ;Номер индекса BaseOffset ULONG64 ? ;Файловый оффсет на определенный объект (директорию, файл) NameInd ULONG64 ? ;Индекс строки содержащей имя объекта HostInd ULONG64 ? ;Номер индекса "директории владельца", ;при удалении "директории владельца", её собственные ;дочернии директории и файлы тоже удаляются FileSize ULONG64 ? ;размер директории или файла OBJ_INDEX ends LPOBJ_INDEX TYPEDEF PTR OBJ_INDEX ;2. Структура хранящая файловое смещение на строку оканчивающуюся нулём. STR_INDEX struc Index ULONG64 ? ;Номер индекса BaseOffset ULONG64 ? ;Файловый оффсет для базы данных на строку UseCount ULONG64 ? ;Количество объектов использующих эту строку как имя STR_INDEX ends LPSTR_INDEX TYPEDEF PTR STR_INDEX ;3. Заголовок файла базы данных с индексом корневой директории. DSM_VER_BASE equ -1 BHEAD struc Signature CHAR "DSMBASE",0 ;Сигнатура файла базы RootIndex ULONG64 ? ;Индекс корневой директории IndStrCnt ULONG64 ? ;Количество индексов строк с именами директорий и файлов IndDirCnt ULONG64 ? ;Количество индексов директорий IndFileCnt ULONG64 ? ;Количество индексов файлов ErasedCnt ULONG64 ? ;Ранее удаленные индексы ;т.е. это индексы которые снова могут быть использованны MaxIndex ULONG64 ? ;Номер самого большого использованного индекса ;Начиная с 0.4 версии библиотеки dsmbase VersionID SQWORD DSM_VER_BASE ;ID версии формата базы данных IndStrRes ULONG64 ? ;Количество зарезервированных индексов строк IndDirRes ULONG64 ? ;Количество зарезервированных индексов директорий IndFileRes ULONG64 ? ;Количество зарезервированных индексов файлов ErasedRes ULONG64 ? ;Количество QWORD`ов зарезервированное для номеров удаляемых индексов BDirRes ULONG64 ? ;Количество QWORD`ов зарезервированное для новых директорий BHEAD ends PBHEAD TYPEDEF PTR BHEAD BASE_HEADER struc Signature CHAR "DSMBASE",0 RootIndex ULONG64 ? IndStrCnt ULONG64 ? IndDirCnt ULONG64 ? IndFileCnt ULONG64 ? ErasedCnt ULONG64 ? MaxIndex ULONG64 ? BASE_HEADER ends LPBASE_HEADER TYPEDEF PTR BASE_HEADER ;Сразу после заголовка распологается массив из IndStrCnt структур STR_INDEX, ;далее идет массив индексов директорий OBJ_INDEX, ;после массив индексов файлов OBJ_INDEX, ;и в конце массив 64-битных чисел ранее использованных номеров индексов ;Всё остальное будет приходиться на бинарные данные ;Обобщенная структура индекса на случай директории, файла или строки INDEX struc Index ULONG64 ? BaseOffset ULONG64 ? union UseCount ULONG64 ? struc NameInd ULONG64 ? HostInd ULONG64 ? FileSize ULONG64 ? ends ends INDEX ends LPINDEX TYPEDEF PTR INDEX ;Хэндл базы данных dsmbase struc hFile HANDLE ? ;хэндл файла hMap HANDLE ? ;хэндл мапирования lpBase LPBASE_HEADER ? ;указатель на мапированную базу данных BaseSize ULONG64 ? ;текущий размер базы данных FileSize ULONG64 ? ;текущий размер маппированного файла flProtect DWORD ? ;зарезервированно для перемапирования dwDesiredAccess DWORD ? ;зарезервированно для перемапирования dsmbase ends HDBASE TYPEDEF PTR dsmbase ;Функции выполняют следующие операции ;hBase - везде хэндл базы данных ; 1. Создание новой или открытие существующей базы данных, обёртка вокруг CreateFileA ;в rax возвращает хэндл базы данных CreateDataBase PROTO lpBaseName:LPSTR,dwDesiredAccess:DWORD,dwShareMode:DWORD,\ lpSecurityAttributes:LPSECURITY_ATTRIBUTES,dwCreationDisposition:DWORD,\ dwFlagsAndAttributes:DWORD,hTemplateFile:HANDLE ; 2. Создание именной строки ;AsciiStr - указатель на строку ;UseCount - это обычно должно равняться нулю, записывается в поле STR_INDEX.UseCount ;AsciiStrLen - длина строки AsciiStr ;в rax возвращает номер индекса именной строки AddString PROTO hBase:HDBASE,AsciiStr:LPSTR,UseCount:ULONG64 AddStringEx PROTO hBase:HDBASE,AsciiStr:LPSTR,UseCount:ULONG64,AsciiStrLen:ULONG64 ; 3. Удаление именной строки ;sIndex - номер индекса строки DeleteStringEx PROTO hBase:HDBASE,sIndex:ULONG64,UseCount:ULONG64 DeleteString PROTO hBase:HDBASE,sIndex:ULONG64 ; 4. Добавление файла ;BinData - указатель на бинарные данные ;SizeOfData - размер в байтах бинарных данных ;HostInd - индекс "директории владельца" ;FileName - указатель на имя файла ;NameInd - номер индекса именной строки ;в rax возвращает номер индекса файла или 0 если не получилось создать NewFile PROTO hBase:HDBASE,BinData:LPVOID,SizeOfData:ULONG64,HostInd:ULONG64,FileName:LPSTR AddFile PROTO hBase:HDBASE,BinData:LPVOID,SizeOfData:ULONG64,HostInd:ULONG64,NameInd:ULONG64 ; 5. Удаление файла ;fIndex - номер индекса файла, который нужно удалить ;HostIndex - номер индекса "директории владельца", если равно нулю то файл обязательно удаляется ;в противном случае этот номер должен быть равен полю OBJ_INDEX.HostInd DelFile PROTO hBase:HDBASE,fIndex:ULONG64,HostIndex:ULONG64 ; 6. Создание директории ;всё также как и для NewFile/AddFile ;BinData здесь это указатель на список номеров индексов, обычно равняется нулю ;SizeOfData должно быть кратно 8 и обычно равно нулю, т.е. в начале создается пустая директория ;если HostInd равно нулю, то номер индекса создаваемой директории заносится в поле BASE_HEADER.RootIndex ;в rax возвращает номер индекса созданной диретории или 0 если не получилось создать NewDirectory PROTO hBase:HDBASE,BinData:PULONG64,SizeOfData:ULONG64,HostInd:ULONG64,DirName:LPSTR AddDirectory PROTO hBase:HDBASE,BinData:PULONG64,SizeOfData:ULONG64,HostInd:ULONG64,NameInd:ULONG64 ; 7. Удаление директории ;drIndex - номер индекса директории, которую нужно удалить ;HostIndex - номер индекса "директории владельца", если равно нулю то директория обязательно удаляется ;в противном случае этот номер должен быть равен полю OBJ_INDEX.HostInd DelDirectory PROTO hBase:HDBASE,drIndex:ULONG64,HostIndex:ULONG64 ; 8. Получение типа индекса curr_id=0 enf NULL_TYPE, STR_TYPE, DIR_TYPE,FILE_TYPE enf OBJ_INCREASE,OBJ_DECREASE, IMM_SIZE ;lpIndex - указатель на структуру INDEX ;перед вызовом в структуре INDEX нужно указать номер индекса INDEX.Index остальное функция сама всё заполнит ;в rax возвращает тип индекса STR_TYPE для строки, DIR_TYPE для директории, ;FILE_TYPE для файла и 0 если если нету запрошенного индекса GetIndexType PROTO hBase:HDBASE,lpIndex:LPINDEX PPINDEX TYPEDEF PTR LPINDEX GetIndexTypeEx PROTO hBase:HDBASE,lpIndex:LPINDEX,ImmIndex:PPINDEX ; 9. Получение индекса строки ;lpIndex - указатель на структуру STR_INDEX ;__buffer - если поле STR_INDEX.Index не равно нулю то это указатель на буфер для приёма строки иначе это ; указатель на строку по которой будет искаться индекс ;buf_size - размер буффера для приёма строки, если поле STR_INDEX.Index равно нулю то никак не используется ;в rax возвращает размер строки GetString PROTO hBase:HDBASE,lpIndex:LPSTR_INDEX,__buffer:LPSTR,buf_size:ULONG64 ;10. Установка строки ;__Index - номер индекса строки ;__string - указатель на строку ;в eax возвращает 1 если всё прошло успешно и 0 в противном случае SetString PROTO hBase:HDBASE,__Index:ULONG64,__string:LPSTR ;11. Установка нового размера объекта, директории или файла ;__Index - индекс директории или файла ;__Type - указавает тип объекта DIR_TYPE или FILE_TYPE плюс способ изменения размера ;OBJ_INCREASE увеличение на __Size байт ;OBJ_DECREASE уменьшение на __Size байт ;IMM_SIZE непосредственно новый размер __Size байт ;NewSize - указатель на переменную для сохранения нового размера ;в rax файловый указатель на объект, если к нему прибавить dsmbase.lpBase то это будет просто указатель на ;тело объекта SetObjectSize PROTO hBase:HDBASE,__Index:ULONG64,__Type:DWORD,__Size:ULONG64,NewSize:PULONG64 ;11. Получение индекса из имени/пути объекта ;RootDir - номер индекса базовой директории, может равняться нулю, тогда строка пути должна ;будет начинаться с имени корневой директории ;lpPath - указатель на строку пути, символы / и \ разделяют имена директорий и файлов ;каких-то ограничений на использование определённых символов пока не предусмотренно, но это может измениться PathToIndex PROTO hBase:HDBASE,RootDir:ULONG64,lpPath:LPSTR PathToIndexEx PROTO hBase:HDBASE,RootDir:ULONG64,lpPath:LPSTR,PathSize:ULONG64 ;12. Получение имени/пути из индекса объекта ;__Index - номер индекса директории или файла ;lpPath - указатель на буфер для сохранения пути ;PathSize - размер буфера ;в eax 1 если все получилось, 0 если индекса не существует и -1 (0FFFFFFFFh) если буфер слишком мал IndexToPath PROTO hBase:HDBASE,__Index:ULONG64,lpPath:LPSTR,PathSize:ULONG64 ;13. Закрытие базы данных CloseDataBase PROTO hBase:HDBASE ;14. Увеличение базы данных ;Для оптимизации лучше увеличивать размер базы данных за ранее перед добавлением ;большого количества файлов и директорий, особенно если есть возможность примерной оценки их общего размера IncreaseDataBase PROTO hBase:HDBASE,NumOfBytes:ULONG64 ;15. Увеличение базы данных DecreaseDataBase PROTO hBase:HDBASE,NumOfBytes:ULONG64 ;16. Получение/установка порядка объекта в своей "директории владельце" GetOrder PROTO hBase:HDBASE,objIndex:ULONG64,objOrder:PULONG64 SetOrder PROTO hBase:HDBASE,objIndex:ULONG64,NewOrder:ULONG64 ;17. Переименование объекта. RenameObject PROTO hBase:HDBASE,objIndex:ULONG64,NewHost:ULONG64,NameInd:ULONG64 ;18. Добавление индекса в директорию AddRef PROTO hBase:HDBASE,drIndex:ULONG64,objIndex:ULONG64,objOrder:ULONG64 ;19. Удаление индекса из директории DeleteRef PROTO hBase:HDBASE,drIndex:ULONG64,objIndex:ULONG64,objOrder:ULONG64 ;20. Сортировка индексов строк для соблюдения алфавитного порядка SortStringIndices PROTO hBase:HDBASE ;16. Получение/установка порядка ссылки на объект в определённой директории GetRefOrder PROTO hBase:HDBASE,drIndex:ULONG64,objIndex:ULONG64,objOrder:PULONG64 SetRefOrder PROTO hBase:HDBASE,drIndex:ULONG64,objOrder:ULONG64,NewOrder:ULONG64 ;получение номера индекса по его порядку GetRefByOrder PROTO hBase:HDBASE,drIndex:ULONG64,objOrder:ULONG64 GetFileIndexByNameInd PROTO hBase:HDBASE,lpIndex:LPINDEX,ImmIndex:PPINDEX GetDirIndex PROTO hBase:HDBASE,lpIndex:LPINDEX,ImmIndex:PPINDEX GetDirIndexAndUp PROTO hBase:HDBASE,lpIndex:LPINDEX,ImmIndex:PPINDEX SetStringEx PROTO hBase:HDBASE,__Index:ULONG64,__string:LPSTR,AsciiStrLen:ULONG64 IncreaseStrRes PROTO hBase:HDBASE,StrRes:ULONG64 IncreaseDirRes PROTO hBase:HDBASE,DirRes:ULONG64 IncreaseFileRes PROTO hBase:HDBASE,FileRes:ULONG64 IncreaseErasedRes PROTO hBase:HDBASE,ErdRes:ULONG64 IncreaseBDirRes PROTO hBase:HDBASE,BDirRes:ULONG64 GetFilePtr PROTO hBase:HDBASE,FileName:LPSTR,Host:ULONG64,FileSize:PULONG64 ;Закрытие базы данных, с определением формата curr_id=0 enf B_COMPACT,B_LEGACY CloseDataBaseEx PROTO hdBase:HDBASE,dwFlags:DWORD