Funkcje PostgreSQLa. LXXX. PostgreSQL zawiera rozmiar bazy danych

Standardowa biblioteka szablonów ( Standardowa biblioteka szablonów , STL) znajduje się w standardowej bibliotece języka C++. Zawiera implementacje najczęściej używanych kontenerów i algorytmów, co oszczędza programistom rutynowego ich przepisywania. Podczas opracowywania kontenerów i stosowanych do nich algorytmów (takich jak usuwanie identycznych elementów, sortowanie, wyszukiwanie itp.) często trzeba poświęcić wszechstronność lub wydajność. Twórcy STL postawili sobie jednak za zadanie uczynienie biblioteki jednocześnie wydajną i uniwersalną. Aby rozwiązać ten problem, wykorzystano takie uniwersalne środki języka C++, jak szablony i przeciążanie operatorów. W poniższej prezentacji będziemy opierać się na implementacji STL dostarczonej przez firmę Microsoft wraz z kompilatorem Visual C++ 6.0. Jednak większość powyższych będzie dotyczyć również implementacji STL przez inne kompilatory.

Głównymi pojęciami w STL są pojęcia kontenera (kontenera), algorytmu (algorytmu) i iteratora (iteratora).

Pojemnikjest magazynem obiektów (zarówno typów wbudowanych, jak i zdefiniowanych przez użytkownika). Zazwyczaj kontenery są implementowane jako szablony klas. Najprostsze typy kontenerów (tablice statyczne i dynamiczne) są wbudowane bezpośrednio w język C++. Ponadto standardowa biblioteka zawiera implementacje kontenerów, takich jak wektor, lista, kolejka, mapa, zestaw i kilka innych.

Algorytmto funkcja służąca do manipulowania obiektami zawartymi w kontenerze. Typowymi przykładami algorytmów są sortowanie i wyszukiwanie. STL implementuje około 60 algorytmów, które można zastosować do różnych kontenerów, w tym do tablic wbudowanych w język C++.

Iteratorjest abstrakcją wskaźnika, czyli obiektu, który może odnosić się do innych obiektów zawartych w kontenerze. Do głównych funkcji iteratora należy zapewnienie dostępu do obiektu, do którego się odnosi (dereferencja) oraz przechodzenie z jednego elementu kontenera do drugiego (iteracja, stąd nazwa iterator). W przypadku kontenerów wbudowanych jako iteratory używane są zwykłe wskaźniki. W przypadku bardziej złożonych kontenerów iteratory implementowane są jako klasy z zestawem przeciążonych operatorów.

Oprócz zaznaczonych elementów w STL istnieje ich liczba pojęcia pomocnicze ; Warto poznać także niektóre z nich.

Alokator(alokator) to obiekt odpowiedzialny za alokację pamięci dla elementów kontenera. Z każdym standardowym kontenerem powiązany jest alokator (jego typ przekazywany jest jako jeden z parametrów szablonu). Jeśli jakiś algorytm musi przydzielić pamięć dla elementów, musi to zrobić za pomocą alokatora. W takim przypadku możesz być pewien, że rozproszone obiekty zostaną poprawnie zniszczone.

STL zawiera standardową klasę alokatora (opisaną w pliku xmemory). Tego domyślnie używają wszystkie kontenery zaimplementowane w STL. Użytkownik może jednak zaimplementować własną klasę. Jest to bardzo rzadko konieczne, ale czasami można to zrobić ze względu na wydajność lub debugowanie.

Zastanówmy się bardziej szczegółowo nad rozważeniem wprowadzonych koncepcji.

Kontenery . Każdy kontener udostępnia ściśle zdefiniowany interfejs, poprzez który algorytmy będą z nim współdziałać. Iteratory specyficzne dla kontenera udostępniają ten interfejs. Należy podkreślić, że do interakcji między algorytmami i kontenerami nie są używane żadne dodatkowe funkcje członkowskie. Dzieje się tak, ponieważ muszą działać standardowe algorytmy, w tym wbudowane kontenery języka C++, które mają iteratory (wskaźniki), ale nic więcej. Zatem podczas tworzenia własnego kontenera wdrożenie iteratora to absolutne minimum.

Każdy kontener implementuje określony typ iteratora. Spowoduje to wybranie najbardziej funkcjonalnego typu iteratora, który można skutecznie zaimplementować dla danego kontenera. „Efektywny” oznacza, że ​​szybkość wykonywania operacji na iteratorze nie powinna zależeć od ilości elementów w kontenerze. Na przykład dla wektora zaimplementowano iterator dostępu swobodnego, a dla listy zaimplementowano iterator dwukierunkowy. Ponieważ szybkość operacji na liście jest liniowa wraz z jej długością, iterator dostępu swobodnego dla listy nie jest zaimplementowany.

Niezależnie od faktycznej organizacji kontenera (wektor, lista, drzewo) przechowywane w nim elementy można traktować jako sekwencję. Iterator pierwszego elementu w tej sekwencji jest zwracany przez funkcję Begin(), a iterator elementu następującego po ostatnim jest zwracany przez funkcję end(). Jest to bardzo ważne, ponieważ wszystkie algorytmy w STL działają dokładnie z sekwencjami określonymi przez iteratory start i end.

Oprócz zwykłych iteratorów w STL istnieją iteratory odwrotne ( iterator odwrotny ). Iterator odwrotny różni się tym, że iteruje sekwencję elementów w kontenerze w odwrotnej kolejności. Innymi słowy, operacje + i - są odwrócone. Pozwala to na zastosowanie algorytmów zarówno do bezpośrednich, jak i odwrotnych sekwencji elementów. Przykładowo za pomocą funkcji find można wyszukiwać elementy zarówno z „początku”, jak i „końca” kontenera.

W STL kontenery są podzielone na trzy główne grupy (Tabela 2): kontenery sekwencyjne, kontenery asocjacyjne i adaptery kontenerów. Dwie pierwsze grupy łączone są w kontenery pierwszej klasy.

Tabela 2

Klasa kontenera STL

Opis

Pojemniki sekwencji

wektor

Tablica dynamiczna

deque

Kolejka dwukierunkowa

lista

Dwukierunkowa lista liniowa

Kontenery skojarzone

Kontener skojarzeniowy z unikalnymi kluczami

zestaw wielokrotny

Kontener skojarzeniowy umożliwiający duplikowanie kluczy

Kontener skojarzeniowy na zestawy unikalnych elementów

multimapa

Kontener skojarzeniowy dla zestawów ze zduplikowanymi elementami

Adaptery do kontenerów

stos

Standardowy stos

kolejka

Standardowa kolejka

kolejka priorytetowa

Kolejka priorytetowa

Każda klasa kontenera zaimplementowana w STL , opisuje zestaw typów skojarzonych z kontenerem. Tę samą praktykę powinieneś stosować podczas pisania własnych kontenerów. Oto lista najważniejszych typów:

typ_wartości - typ elementu;

typ_rozmiaru - typ przechowujący liczbę elementów (zwykle rozmiar_t);

iterator - iterator dla elementów kontenera;

typ klucza - typ klucza (w kontenerze skojarzonym).

Oprócz typów możemy wyróżnić zbiór funkcji, które implementuje niemal każdy kontener w STL (tabela 3). Nie są one wymagane do interakcji z algorytmami, jednak ich implementacja poprawia wymienność kontenerów w programie. STL został zaprojektowany tak, aby kontenery zapewniały podobną funkcjonalność.

Tabela 3

Wspólne metody wszystkich kontenerów STL

Opis

domyślny konstruktor

Domyślny konstruktor. Zwykle w pojemniku znajduje się kilka projektanci

konstruktor kopiujący

Kopiuj konstruktor

burzyciel

Burzyciel

pusty

Zwraca wartość true, jeśli w kontenerze nie ma elementów, w przeciwnym razie zwraca wartość false

największy rozmiar

Zwraca maksymalną liczbę elementów kontenera

rozmiar

Zwraca liczbę elementów w kontenerze w bieżącym czasie

operator =

Przypisuje jeden kontener do drugiego

operator<

Zwraca wartość true, jeśli pierwszy kontener jest mniejszy niż drugi, w przeciwnym razie zwraca wartość false

operator<=

Zwraca wartość true, jeśli pierwszy kontener nie jest większy od drugiego, w przeciwnym razie zwraca wartość false

operatora >

Zwraca wartość true, jeśli pierwszy kontener jest większy niż drugi, w przeciwnym razie zwraca wartość false

operator >=

Zwraca wartość true, jeśli pierwszy kontener nie jest mniejszy od drugiego, w przeciwnym razie zwraca wartość false

operator ==

Zwraca wartość true, jeśli porównywane kontenery są równe, w przeciwnym razie zwraca wartość false

operator !=

Zwraca wartość true, jeśli porównywane kontenery nie są równe, w przeciwnym razie zwraca wartość false

zamieniać

Zamienia elementy dwóch kontenerów

Funkcje dostępne wyłącznie w kontenerach pierwszej klasy

zaczynać

Dwie wersje tej funkcji zwracają iterator lub const_iterator, który odnosi się do pierwszego elementu kontenera

Dwie wersje tej funkcji zwracają iterator lub const_iterator, który odnosi się do następnej pozycji po końcu kontenera

zacznij

Dwie wersje tej funkcji zwracają albo Reverse_iterator lub Reverse_const_iterator , który odnosi się do ostatniego elementu kontenera

rozdzierać

Dwie wersje tej funkcji zwracają Reverse_iterator lub Reverse_const_iterator, który odnosi się do pozycji przed pierwszym elementem kontenera

wstaw, usuń,

Umożliwia wstawianie lub usuwanie elementów w środku sekwencji

Końcowy stół 3

jasne

Usuwa wszystkie elementy z kontenera

przód tył

push_back, pop_back

Umożliwia dodanie lub usunięcie ostatniego elementu w sekwencji

push_front, pop_front

Umożliwia dodanie lub usunięcie pierwszego elementu w sekwencji

Iteratory są zazwyczaj tworzone jako przyjaciele klas, na których działają, umożliwiając bezpośredni dostęp do prywatnych danych tych klas. Z pojedynczym kontenerem może być powiązanych wiele iteratorów, z których każdy przechowuje własną „informację o położeniu” (Tabela 4).

Tabela 4

Typ iteratora

Dostęp

Dereferencje

Iteracja

Porównanie

Iterator wyjściowy

(iterator wyjściowy)

Tylko nagrywanie

Iterator wejściowy

(iterator wejścia)

Tylko czytanie

*, ->

==, !=

Iterator do przodu

(iterator do przodu)

Czytaj i pisz

*, ->

==, !=

Iterator dwukierunkowy(iterator dwukierunkowy)

Czytaj i pisz

*, ->

++, --

==, !=

Iterator dostępu swobodnego

(losowy - iterator dostępu)

Czytaj i pisz

*, ->,

++, --, +, -, +=, -=

==, !=, <, <=, >, >=

pg_aktualizacja (połączenie $zasobu , ciąg $nazwa_tabeli , tablica $dane , tablica $warunek [, int $opcje = PGSQL_DML_EXEC ])

pg_update() zastępuje rekordy w tabeli spełniające warunki stan dane dane. Jeśli zostanie podany argument opcje, dane zostaną przekształcone przez funkcję pg_convert(), do którego zostaną przekazane parametry z tego argumentu.

Lista parametrów

Zasób połączenia z bazą danych PostgreSQL.

Nazwa tabeli

Nazwa tabeli, w której aktualizowane są rekordy.

Szyk( szyk), których klucze odpowiadają nazwom kolumn tabeli nazwa_tabeli, a wartości zastąpią dane w tych kolumnach.

Stan

Szyk( szyk), których klucze odpowiadają nazwom kolumn tabeli nazwa_tabeli . Zaktualizowane zostaną tylko te wiersze, których wartości pól odpowiadają wartościom tablicy.

Opcje

Jedna ze stałych PGSQL_CONV_OPTS, PGSQL_DML_NO_CONV, PGSQL_DML_ESCAPE, PGSQL_DML_EXEC, PGSQL_DML_ASYNC Lub PGSQL_DML_STRING lub ich kombinację. Jeśli opcje zawierają PGSQL_DML_STRING, funkcja zwróci ciąg. Jeśli jest zainstalowany PGSQL_DML_NO_CONV Lub PGSQL_DML_ESCAPE, a następnie funkcja pg_convert() nie wywoływane wewnętrznie.

Zwróć wartości

Zwroty PRAWDA po pomyślnym zakończeniu lub FAŁSZ w przypadku błędu. Funkcja zwróci ciąg znaków ( strunowy), jeśli jest stała PGSQL_DML_STRING zawarte w opcjach.

Przykłady

Przykład nr 1 Przykład użycia pg_update()

$db = pg_connect("nazwa bazy danych=foo" );
$data = tablica("pole1" => "AA" , "pole2" => "BB" );

// Jest to bezpieczne, ponieważ $_POST jest automatycznie konwertowany
$res = pg_update ($db, "post_log", $_POST, $data);
jeśli ($res) (
Echo „Dane zaktualizowane:$res\n";
) w przeciwnym razie (
Echo „Musiały zostać przesłane nieprawidłowe dane\n”;
}
?>

pg_aktualizacja (połączenie $zasobu , ciąg $nazwa_tabeli , tablica $dane , tablica $warunek [, int $opcje = PGSQL_DML_EXEC ])

pg_update() zastępuje rekordy w tabeli spełniające warunki stan dane dane. Jeśli zostanie podany argument opcje, dane zostaną przekształcone przez funkcję pg_convert(), do którego zostaną przekazane parametry z tego argumentu.

Lista parametrów

Zasób połączenia z bazą danych PostgreSQL.

Nazwa tabeli

Nazwa tabeli, w której aktualizowane są rekordy.

Szyk( szyk), których klucze odpowiadają nazwom kolumn tabeli nazwa_tabeli, a wartości zastąpią dane w tych kolumnach.

Stan

Szyk( szyk), których klucze odpowiadają nazwom kolumn tabeli nazwa_tabeli . Zaktualizowane zostaną tylko te wiersze, których wartości pól odpowiadają wartościom tablicy.

Opcje

Jedna ze stałych PGSQL_CONV_OPTS, PGSQL_DML_NO_CONV, PGSQL_DML_ESCAPE, PGSQL_DML_EXEC, PGSQL_DML_ASYNC Lub PGSQL_DML_STRING lub ich kombinację. Jeśli opcje zawierają PGSQL_DML_STRING, funkcja zwróci ciąg. Jeśli jest zainstalowany PGSQL_DML_NO_CONV Lub PGSQL_DML_ESCAPE, a następnie funkcja pg_convert() nie wywoływane wewnętrznie.

Zwróć wartości

Zwroty PRAWDA po pomyślnym zakończeniu lub FAŁSZ w przypadku błędu. Funkcja zwróci ciąg znaków ( strunowy), jeśli jest stała PGSQL_DML_STRING zawarte w opcjach.

Przykłady

Przykład nr 1 Przykład użycia pg_update()

$db = pg_connect("nazwa bazy danych=foo" );
$data = tablica("pole1" => "AA" , "pole2" => "BB" );

// Jest to bezpieczne, ponieważ $_POST jest automatycznie konwertowany
$res = pg_update ($db, "post_log", $_POST, $data);
jeśli ($res) (
Echo „Dane zaktualizowane:$res\n";
) w przeciwnym razie (
Echo „Musiały zostać przesłane nieprawidłowe dane\n”;
}
?>

Postgres, pierwotnie opracowany przez Wydział Informatyki Uniwersytetu Kalifornijskiego w Berkeley, był pionierem wielu koncepcji obiektowych dostępnych obecnie w niektórych komercyjnych bazach danych. Zapewnia obsługę języka SQL92/SQL99, integralność transakcji i rozszerzalność typów. PostgreSQL jest otwartym potomkiem oryginalnego kodu Berkeley.

PostgreSQL jest produktem dostępnym bezpłatnie. Aby korzystać z obsługi PostgreSQL, potrzebujesz PostgreSQL 6.5 lub nowszego. PostgreSQL 7.0 lub nowszy - dla wszystkich funkcji modułu PostgreSQL. PostgreSQL obsługuje wiele kodowań znaków, w tym kodowanie znaków wielobajtowych. Aktualną wersję i informacje o PostgreSQL można znaleźć na stronie http://www.postgresql.org/.

Aby włączyć obsługę PostgreSQL, podczas kompilacji PHP wymagana jest opcja --with-pgsql[=DIR]. Jeśli moduł obiektów współdzielonych jest dostępny, moduł PostgreSQL można załadować za pomocą dyrektywy rozszerzenia w pliku php.ini lub funkcji dl(). Obsługiwane dyrektywy ini są opisane w pliku php.ini-dist dostarczonym z kodem źródłowym dystrybucji.

Tabela 1. Zmiana nazwy funkcji
Stara nazwaNowe imie
pg_exec() pg_query()
pg_getlastoid() pg_last_oid()
pg_cmdtuples() pg_affected_rows()
pg_numrows() pg_num_rows()
pg_numpola() pg_num_fields()
nazwa_pola pg() nazwa_pola pg()
pg_fieldsize() pg_field_size()
pg_fieldnum() pg_field_num()
pg_fieldprtle() pg_field_prtle()
pg_fieldisnull() pg_field_is_null()
pg_freeresult() pg_free_result()
pg_result() pg_fetch_result()
pg_loreadall() pg_lo_read_all()
pg_locreate() pg_lo_create()
pg_lounlink() pg_lo_unlink()
pg_loopen() pg_lo_open()
pg_loclose() pg_lo_close()
pg_loread() pg_lo_read()
pg_lowrite() pg_lo_write()
pg_loimport() pg_lo_import()
pg_loexport() pg_lo_export()

Nie wszystkie funkcje są obsługiwane we wszystkich kompilacjach. Zależy to od wersji biblioteki libpq (interfejs klienta PostgreSQL C) i sposobu kompilacji biblioteki libpq. Jeśli brakuje jakiejś funkcji, libpq nie obsługuje możliwości wymaganych przez tę funkcję.

Ważne jest również, aby używać biblioteki libpq nowszej niż serwer PostgreSQL, z którym się łączysz. Jeśli używasz biblioteki libpq starszej niż oczekuje serwer PostgreSQL, będziesz mieć problemy.

Od wersji 6.3 (03.02.1998) PostgreSQL domyślnie używa gniazda domeny unix. Port TCP NIE jest domyślnie otwarty. Tabela opisuje te nowe opcje połączeń. To gniazdo można znaleźć w /tmp/.s.PGSQL.5432. Tę opcję można włączyć za pomocą flagi „-i”. naczelnik poczty, a jego wartość będzie następująca: „nasłuchuj gniazd TCP/IP oraz gniazd domeny Unix”.

Tabela 2. Postmaster i PHP

Połączenie z serwerem PostgreSQL można nawiązać za pomocą następujących par wartości w wierszu poleceń: $conn = pg_connect("Host=port mojego hosta=mojport tty=mojeTTY opcje=mojeopcje nazwa_bazy danych=użytkownik mojej bazy danych=hasło mojegoużytkownika=mojehasło ");

Poprzednia składnia: $conn = pg_connect("host", "port", "opcje", "tty", "nazwa bazy danych") nie jest już zalecane.

Zmienne środowiskowe wpływają na zachowanie serwera/klienta PostgreSQL. Na przykład moduł PostgreSQL będzie szukać zmiennej środowiskowej PGHOST, jeśli nazwa hosta nie znajduje się w ciągu połączenia. Obsługiwane zmienne środowiskowe różnią się w zależności od wersji. Aby uzyskać szczegółowe informacje, zobacz Podręcznik programisty PostgreSQL (libpq - Zmienne środowiskowe).

Upewnij się, że ustawiłeś zmienne środowiskowe dla odpowiedniego użytkownika. Użyj $_ENV lub getenv() aby sprawdzić, które zmienne środowiskowe są dostępne dla bieżącego procesu.

Począwszy od PostgreSQL 7.1.0, możesz przechowywać 1 GB w polu tekstowym. Starsze wersje mogą mieć ograniczenia rozmiaru bloku (domyślnie było to 8 KB, maksymalnie 32 KB, ustalane w czasie kompilacji).

Aby użyć interfejsu dużego obiektu (lo), musisz zawrzeć funkcje lo w bloku transakcji. Blok transakcji zaczyna się od instrukcji SQL ZACZYNAĆ, a jeśli transakcja przebiegła prawidłowo, kończy się POPEŁNIAĆ Lub KONIEC. Jeśli transakcja się nie powiedzie, należy ją zamknąć za pomocą WYCOFANIE Lub ANULOWAĆ.

Nie należy zamykać połączenia z serwerem PostgreSQL przed zamknięciem dużego obiektu.

Treść pg_affeded_rows – zwraca liczbę zaangażowanych wpisów (steam/tuples) pg_cancel_query – anuluje żądanie asynchroniczne pg_client_encoding – odbiera kod klienta pg_close – zamyka połączenie postgreSQL PG_ConNNECT – otwiera połączenie posteg Rescl PG_ConNECTION_BUSY – odbiera informację, czy połączenie jest zamknięte czy nie pg_connection_Reset – przywraca połączenie (reconnect) pg_connection_status - pobiera status połączenia pg_convert - konwertuje wartość tablicy asocjacyjnej na wartość odpowiednią dla instrukcji SQL pg_copy_from - wstawia rekordy do tabeli z tablicy pg_copy_to - kopiuje tabelę do tablicy pg_dbname - pobiera nazwę bazy danych pg_delete - usuwa rekordy pg_end_copy - synchronizuje się z backendem PostgreSQL pg_escape_bytea - mnemonizuje plik binarny /escape dla typu bajtowego pg_escape_string - mnemonizuje string dla typu tekst/znak pg_fetch_array - pobiera wiersz jako tablicę pg_fetch_object - pobiera wiersz jako obiekt pg_fetch_result - zwraca wartości z wynikowego zasobu pg_fetch_row - pobiera wiersz w postaci przeliczalnej tablicy pg_field_is_null - sprawdza, czy pole jest ZERO pg_field_name - zwraca nazwę pola pg_field_num - zwraca numer nazwanego pola pg_field_prtlen - zwraca rozmiar do wydrukowania pg_field_size - zwraca rozmiar wewnętrznej pamięci nazwanego pola pg_field_type - zwraca nazwę typu dla odpowiedniego numeru pola

(PHP 4 >= 4.3.0, PHP 5, PHP 7)

pg_convert — Konwertuje wartości tablicy asocjacyjnej na wartości dopuszczalne do wykorzystania w zapytaniach SQL

Opis

pg_convert (połączenie $zasobu , ciąg $nazwa_tabeli , tablica $assoc_array [, int $opcje = 0]): tablica

pg_convert() sprawdza i konwertuje wartości z assoc_array na te akceptowalne dla serwera SQL. Tabela nazwa_tabeli musi istnieć, a liczba znajdujących się w niej kolumn nie może być mniejsza niż wartości w tablicy assoc_array. Nazwy kolumn w tabeli nazwa_tabeli muszą odpowiadać kluczom tablicy assoc_array, a typy danych wartości tablicy muszą również odpowiadać typom danych odpowiednich kolumn. Jeśli konwersja zakończy się pomyślnie, funkcja zwróci tablicę przekonwertowanych wartości, w przeciwnym razie zwraca FAŁSZ.

Komentarz:

Od wersji PHP 5.6.0 dozwolone są wartości logiczne. Są one konwertowane na typ logiczny PostgreSQL. Obsługiwane są także ciągi znaków reprezentujące wartość logiczną. ZERO jest konwertowany na PostgreSQL NULL.

Przed wersją PHP 5.6.0, jeśli tabela nazwa_tabeli zawiera pola logiczne, nie używaj stałej PRAWDA jako wartość tablicy nazwa_tabeli dla tych pól. Zostanie on przekonwertowany na ciąg „TRUE”, który jest niepoprawną wartością dla pól logicznych w PostgreSQL. Użyj wartości „t”, „true”, „1”, „y”, „yes”.

Lista parametrów

Zasób połączenia z bazą danych PostgreSQL.

Nazwa tabeli

Nazwa tabeli bazy danych.

Assoc_array

Dane do konwersji.

Opcje

Jedna ze stałych PGSQL_CONV_IGNORE_DEFAULT, PGSQL_CONV_FORCE_NULL Lub PGSQL_CONV_IGNORE_NOT_NULL lub ich kombinację.

Zwróć wartości

Szyk( szyk), zawierający przekonwertowane dane, lub FAŁSZ w przypadku błędu.

Przykłady

Przykład nr 1 Przykład użycia pg_convert()

$dbconn = pg_connect („nazwa bazy danych=foo” );

$tmp = tablica(
"autor" => "Joe Thackery" ,
"rok" => 2005,
"title" => "Moje życie, Joe Thackery"
);

$vals = pg_convert ($dbconn, "autorzy", $tmp);
?>