NAZWA¶
btree - metoda dostępu do bazy btree
SKŁADNIA¶
#include <sys/types.h>
#include <db.h>
OPIS¶
Ważna uwaga: Ta strona podręcznika ekranowego opisuje
interfejsy dostarczane przez bibliotekę glibc aż do wersji 2.1.
Od wersji 2.2 glibc już nie zawiera tych interfejsów.
Najprawdopodobniej to czego szukasz, to API dostarczane przez
bibliotekę
libdb.
Funkcja
dbopen() stanowi interfejs biblioteczny do plików baz
danych. Jednym z obsługiwanych formatów są pliki btree.
Ogólny opis metod dostępu do baz danych znajduje się w
dbopen(3), a ta strona podręcznika opisuje jedynie informacje
specyficzne dla btree.
Struktura danych btree stanowi uporządkowaną,
zrównoważoną strukturę drzewiastą,
przechowującą powiązane pary klucz/dane.
Specyficzna dla metody dostępu btree struktura danych używana
przez
dbopen(3) jest zdefiniowana w pliku nagłówkowym
<db.h> następująco:
typedef struct {
unsigned long flags;
unsigned int cachesize;
int maxkeypage;
int minkeypage;
unsigned int psize;
int (*compare)(const DBT *key1, const DBT *key2);
size_t (*prefix)(const DBT *key1, const DBT *key2);
int lorder;
} BTREEINFO;
Struktura ta zawiera następujące elementy:
- flags
- Wartość znacznika jest określona przez
alternatywę bitową ( OR) dowolnych z
następujących wartości:
- R_DUP
- Zezwala na powtarzające się w drzewie klucze, tzn. pozwala
dodawać klucze, które już w drzewie istnieją.
Domyślnym zachowaniem, jak opisano w dbopen(3), jest
nadpisywanie istniejącego pasującego klucza podczas
wprowadzania nowego klucza lub niepomyślne zakończenie, gdy
podany jest znacznik R_NOOVERWRITE. Znacznik R_DUP jest
nadpisywany przez znacznik R_NOOVERWRITE; gdy znacznik
R_NOOVERWRITE jest podany, próba dodania do drzewa klucza,
który już istnieje, zakończy się
niepowodzeniem.
- Jeśli baza danych zawiera powtarzające się klucze,
kolejność pobierania kluczy/danych za pomocą funkcji
get jest niezdefiniowana, jednakże, wywołania funkcji
seq z ustawionym znacznikiem R_CURSOR zawsze
zwrócą logicznie "pierwszy" z dowolnej grupy
powtarzających się kluczy.
- cachesize
- Sugerowany maksymalny rozmiar (w bajtach) bufora w pamięci.
Wartość ta stanowi jedynie zalecenie, więc
metoda dostępu raczej przydzieli więcej pamięci
niż zawiedzie. Ze względu na to, że każde
poszukiwanie bada stronę korzenia drzewa, buforowanie
najczęściej używanych stron istotnie skróci
czas dostępu. Dodatkowo, fizyczne zapisy będą
opóźnione na tyle, na ile będzie to możliwe,
więc umiarkowany bufor może istotnie zmniejszyć
liczbę operacji wejścia/wyjścia. Oczywiście,
korzystanie z bufora zwiększa (ale jedynie zwiększa)
prawdopodobieństwo uszkodzenia lub utraty danych, jeśli
system ulegnie awarii podczas gdy drzewo jest modyfikowane. Jeśli
cachesize wynosi 0 (nie podano rozmiaru) używany jest bufor
domyślny.
- maxkeypage
- Maksymalna liczba kluczy, które będą przechowywane w
ramach pojedynczej strony. Aktualnie nie zaimplementowane.
- minkeypage
- Minimalna liczba kluczy przechowywanych w ramach pojedynczej strony.
Wartość ta służy do określania,
które klucze będą przechowywane w stronach
nadmiarowych, to jest jeśli klucz lub element danych jest
większy niż rozmiar strony podzielony przez
wartość minkeypage, będzie on przechowywany w stronie
nadmiarowej, zamiast w stronie właściwej. Jeśli
minkeypage wynosi 0 (nie podano minimalnej liczby kluczy),
użyta zostanie wartość 2.
- psize
- Rozmiar strony jest rozmiarem (w bajtach) stron używanych przez
węzły drzewa. Minimalny rozmiar strony wynosi 512
bajtów, a maksymalnym rozmiarem jest 64K. Jeśli psize
wynosi 0 (nie podano rozmiaru strony), rozmiar strony jest wybierany w
oparciu o rozmiar bloku używanego systemu plików.
- compare
- Compare jest funkcją porównywania kluczy. Musi ona
zwracać liczbę całkowitą mniejszą,
równą lub większą od zera, gdy klucz
będący pierwszym argumentem jest, odpowiednio, mniejszy,
równy, większy niż klucz będący drugim
argumentem. Dla danego drzewa przy każdym jego otwarciu musi
być używana ta sama funcja porównawcza. Jeśli
compare ma wartość NULL (nie podano funkcji
porównawczej), klucze będą porównywane
leksykalnie, przy czym krótsze klucze będą
uważane za mniejsze niż klucze dłuższe.
- prefix
- Prefix jest funkcją porównywania przedrostków.
Jeśli zostanie podana, musi ona zwracać liczbę
bajtów argumentu będącego drugim kluczem,
które są niezbędne dla określenia czy jest on
większy niż klucz będący pierwszym argumentem.
Gdy klucze będą równe, powinna zostać
zwrócona długość klucza. Uwaga,
przydatność tej funkcji silnie zależy od danych,
jednak dla pewnych zbiorów danych jej używanie może
prowadzić do istotnie zmniejszonych rozmiarów drzewa i
krótszych czasów poszukiwania. Jeśli prefix ma
wartość NULL (nie podano funkcji prefix) oraz nie
podano funkcji porównawczej, użyta zostanie domyślna
funkcja porównywania leksykalnego. Jeśli prefix ma
wartość NULL i podano funkcję
porównawczą, nie będzie wykonywane
porównywanie przedrostków.
- lorder
- Kolejność bajtów dla liczb całkowitych w
przechowywanych metadanych bazy. Liczba powinna reprezentować
kolejność jako liczbę całkowitą; na
przykład, porządek grubokońcy byłby
liczbą 4,321. Jeśli lorder wynosi 0 (nie podano
kolejności) użyta zostanie aktualna, systemowa
kolejność.
Jeśli plik już istnieje (i nie podano znacznika
O_TRUNC),
wartości podane dla parametrów
flags,
lorder i
psize zostaną zignorowane na rzecz wartości
używanych w czasie tworzenia drzewa.
Liniowe przeglądanie drzewa "do przodu" odbywa się od
najmniejszego klucza do największego.
Przestrzeń zwolniona przez usunięcie par klucz/dane z drzewa nie
jest nigdy odzyskiwana, jednakże, jest ona normalnie dostępna
dla ponownego użycia. Oznacza to, że struktura
przechowująca drzewo btree może jedynie rosnąć.
Jedynym rozwiązaniem jest unikanie nadmiernego usuwania lub okresowe
tworzenie świeżego drzewa na podstawie przeglądania
istniejcego drzewa.
Przeszukiwania, wstawiania i usunięcia w btree odbywają się
w czasie O lg base N, gdzie base jest czynnikiem średniego
wypełnienia. Często, wprowadzanie do drzew btree danych
uporządkowanych prowadzi do niskiego czynnika wypełnienia. Ta
implementacja została zmodyfikowana, aby uczynić
uporządkowane wprowadzanie najkorzystniejszym przypadkiem,
uzyskując w wyniku tego dużo lepszy niż normalnie czynnik
wypełnienia stron.
BŁĘDY¶
Funkcje metod dostępu
btree mogą zawieść i
ustawić
errno dla dowolnego z błędów
podanych w podręczniku funkcji bibliotecznej
dbopen(3).
USTERKI¶
Obsługuje jedynie ostrokońcy i grubokońcy porządek
bajtów.
ZOBACZ TAKŻE¶
dbopen(3),
hash(3),
mpool(3),
recno(3)
The Ubiquitous B-tree, Douglas Comer, ACM Comput. Surv. 11, 2 (czerwiec
1979), 121-138.
Prefix B-trees, Bayer and Unterauer, ACM Transactions on Database
Systems, t. 2, 1 (marzec 1977), 11-26.
The Art of Computer Programming Vol. 3: Sorting and Searching, D.E.
Knuth, 1968, str. 471-480.
O STRONIE¶
Angielska wersja tej strony pochodzi z wydania 3.71 projektu Linux
man-pages. Opis projektu, informacje dotyczące zgłaszania
błędów, oraz najnowszą wersję
oryginału można znaleźć pod adresem
http://www.kernel.org/doc/man-pages/.
TŁUMACZENIE¶
Autorami polskiego tłumaczenia niniejszej strony podręcznika man
są: Andrzej Krzysztofowicz (PTM) <ankry@mif.pg.gda.pl>, Robert
Luberda <robert@debian.org> i Michał Kułach
<michal.kulach@gmail.com>.
Polskie tłumaczenie jest częścią projektu
manpages-pl; uwagi, pomoc, zgłaszanie błędów na
stronie
http://sourceforge.net/projects/manpages-pl/. Jest zgodne z
wersją
3.71 oryginału.