Files
SHA256/includes/dsmbase.Inc
T

218 lines
11 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
;Основные понятия базы данных.
;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