PostgreSQL funkce. LXXX. Funkce PostgreSQL Velikost databáze

Standardní knihovna šablon ( Standardní knihovna šablon , STL) je součástí standardní knihovny jazyka C++. Zahrnuje implementace nejběžněji používaných kontejnerů a algoritmů, což programátorům ušetří rutinu jejich opakovaného přepisování. Při vývoji kontejnerů a algoritmů, které se na ně vztahují (jako je odstraňování identických prvků, třídění, vyhledávání atd.), je často nutné obětovat všestrannost nebo výkon. Vývojáři STL si však dali za úkol udělat knihovnu jak efektivní, tak univerzální. K vyřešení tohoto problému byly použity takové univerzální prostředky jazyka C++, jako jsou šablony a přetěžování operátorů. V následující prezentaci se budeme spoléhat na implementaci STL dodanou společností Microsoft spolu s kompilátorem Visual C++ 6.0. Většina z výše uvedeného však bude platit i pro implementace STL jinými kompilátory.

Hlavními pojmy v STL jsou pojmy kontejner (kontejner), algoritmus (algoritmus) a iterátor (iterátor).

Kontejnerje úložiště objektů (vestavěných i uživatelsky definovaných typů). Obvykle jsou kontejnery implementovány jako šablony tříd. Nejjednodušší typy kontejnerů (statická a dynamická pole) jsou zabudovány přímo do jazyka C++. Standardní knihovna navíc obsahuje implementace kontejnerů, jako je vektor, seznam, fronta, mapa, sada a některé další.

Algoritmusje funkce pro manipulaci s objekty obsaženými v kontejneru. Typickými příklady algoritmů jsou třídění a vyhledávání. STL implementuje asi 60 algoritmů, které lze aplikovat na různé kontejnery, včetně polí zabudovaných do jazyka C++.

Iterátorje abstrakce ukazatele, tedy objektu, který může odkazovat na jiné objekty obsažené v kontejneru. Hlavními funkcemi iterátoru je poskytnout přístup k objektu, na který odkazuje (dereferencování), a přesunout se z jednoho prvku kontejneru do druhého (iterace, odtud název iterátor). U vestavěných kontejnerů se jako iterátory používají běžné ukazatele. V případě složitějších kontejnerů jsou iterátory implementovány jako třídy se sadou přetížených operátorů.

Kromě označených prvků v STL existuje řada pomocné pojmy ; Některé z nich byste také měli poznat.

Alokátor(allocator) je objekt zodpovědný za alokaci paměti pro prvky kontejneru. Ke každému standardnímu kontejneru je přidružen alokátor (jeho typ je předán jako jeden z parametrů šablony). Pokud nějaký algoritmus potřebuje alokovat paměť pro prvky, musí to udělat prostřednictvím alokátoru. V tomto případě si můžete být jisti, že distribuované objekty budou správně zničeny.

STL obsahuje standardní třídu alokátoru (popsanou v souboru xmemory). To je to, co všechny kontejnery implementované v STL standardně používají. Uživatel však může implementovat svou vlastní třídu. To je velmi zřídka nutné, ale někdy to lze provést pro účely účinnosti nebo ladění.

Zastavme se podrobněji u zvážení představených pojmů.

Kontejnery . Každý kontejner poskytuje přesně definované rozhraní, jehož prostřednictvím s ním budou algoritmy interagovat. Toto rozhraní poskytují iterátory specifické pro kontejner. Je důležité zdůraznit, že k interakci mezi algoritmy a kontejnery se nepoužívají žádné další členské funkce. To se děje proto, že musí fungovat standardní algoritmy, včetně vestavěných kontejnerů jazyka C++, které mají iterátory (ukazatele), ale nic jiného. Při vytváření vlastního kontejneru je tedy implementace iterátoru naprosté minimum.

Každý kontejner implementuje specifický typ iterátoru. Tím se vybere nejfunkčnější typ iterátoru, který lze pro daný kontejner efektivně implementovat. "Efektivní" znamená, že rychlost provádění operací na iterátoru by neměla záviset na počtu prvků v kontejneru. Například pro vektor je implementován iterátor náhodného přístupu a pro seznam je implementován obousměrný iterátor. Protože rychlost operace seznamu je lineární s jeho délkou, není implementován iterátor náhodného přístupu pro seznam.

Bez ohledu na skutečnou organizaci kontejneru (vektor, seznam, strom) lze prvky v něm uložené považovat za sekvenci. Iterátor prvního prvku v této sekvenci je vrácen funkcí begin() a iterátor prvku následujícího za posledním je vrácen funkcí end(). To je velmi důležité, protože všechny algoritmy v STL pracují přesně se sekvencemi určenými počátečními a koncovými iterátory.

Kromě běžných iterátorů v STL existují reverzní iterátory ( zpětný iterátor ). Zpětný iterátor se liší v tom, že iteruje posloupností prvků v kontejneru v obráceném pořadí. Jinými slovy, operace + a - jsou obrácené. To umožňuje, aby byly algoritmy aplikovány na přímé i reverzní sekvence prvků. Například pomocí funkce find můžete vyhledávat prvky ze „začátku“ i „konce“ kontejneru.

V STL jsou kontejnery rozděleny do tří hlavních skupin (Tabulka 2): sekvenční kontejnery, asociativní kontejnery a adaptéry kontejnerů. První dvě skupiny jsou spojeny do kontejnerů první třídy.

tabulka 2

Kontejnerová třída STL

Popis

Sekvenční kontejnery

vektor

Dynamické pole

deque

Obousměrná fronta

seznam

Obousměrný lineární seznam

Asociativní kontejnery

Asociativní kontejner s jedinečnými klíči

multiset

Asociativní kontejner umožňující duplicitní klíče

Asociativní kontejner pro sady jedinečných prvků

multimapa

Asociativní kontejner pro sady s duplicitními prvky

Kontejnerové adaptéry

zásobník

Standardní zásobník

fronta

Standardní fronta

priorita_fronta

Prioritní fronta

Každá třída kontejneru implementovaná v STL , popisuje sadu typů spojených s kontejnerem. Stejný postup byste měli dodržovat při psaní vlastních kontejnerů. Zde je seznam nejdůležitějších typů:

value_type - typ prvku;

size_type - typ pro uložení počtu prvků (obvykle size_t);

iterátor - iterátor pro prvky kontejneru;

key_type - typ klíče (v asociativním kontejneru).

Kromě typů můžeme rozlišit sadu funkcí, které implementuje téměř každý kontejner v STL (tabulka 3). Nejsou vyžadovány pro interakci s algoritmy, ale jejich implementace zlepšuje zaměnitelnost kontejnerů v programu. STL je navrženo tak, aby kontejnery poskytovaly podobnou funkcionalitu.

Tabulka 3

Společné metody všech STL kontejnerů

Popis

výchozí konstruktor

Výchozí konstruktor. Typicky má kontejner několik návrháři

kopírovací konstruktor

Kopírovat konstruktor

destruktor

Destruktor

prázdný

Pokud v kontejneru nejsou žádné prvky, vrátí hodnotu true, v opačném případě vrátí hodnotu false

max_size

Vrátí maximální počet prvků pro kontejner

velikost

Vrátí počet prvků v kontejneru v aktuálním čase

operátor =

Přiřadí jeden kontejner druhému

operátor<

Vrátí hodnotu true, pokud je první kontejner menší než druhý, v opačném případě hodnotu false

operátor<=

Vrátí hodnotu true, pokud první kontejner není větší než druhý, jinak hodnotu false

operátor >

Vrátí hodnotu true, pokud je první kontejner větší než druhý, v opačném případě vrací hodnotu false

operátor >=

Vrátí hodnotu true, pokud první kontejner není menší než druhý, jinak hodnotu false

operátor ==

Vrátí hodnotu true, pokud jsou porovnávané kontejnery stejné, v opačném případě vrací hodnotu false

operátor !=

Vrací hodnotu true, pokud si porovnávané kontejnery nejsou stejné, v opačném případě vrací hodnotu false

vyměnit

Vymění prvky dvou kontejnerů

Funkce dostupné pouze v kontejnerech první třídy

začít

Dvě verze této funkce vracejí buď iterátor, nebo const_iterator, který odkazuje na první prvek kontejneru

Dvě verze této funkce vracejí buď iterátor, nebo const_iterator, který odkazuje na další pozici za koncem kontejneru.

začít

Dvě verze této funkce vrátí buď reverse_iterator nebo reverse_const_iterator , který odkazuje na poslední prvek kontejneru

roztrhnout

Dvě verze této funkce vracejí buď reverse_iterator, nebo reverse_const_iterator, který odkazuje na pozici před prvním prvkem kontejneru.

vložit, vymazat,

Umožňuje vložit nebo odebrat prvek (prvky) uprostřed sekvence

Stolek 3

Průhledná

Odebere všechny prvky z kontejneru

přední, zadní

push_back, pop_back

Umožňuje přidat nebo odebrat poslední prvek v sekvenci

push_front, pop_front

Umožňuje přidat nebo odebrat první prvek v sekvenci

Iterátoři jsou obvykle vytvářeni jako přátelé tříd, na kterých působí, což umožňuje přímý přístup k soukromým datům těchto tříd. K jednomu kontejneru může být přidruženo více iterátorů, z nichž každý uchovává své vlastní „informace o poloze“ (tabulka 4).

Tabulka 4

Typ iterátoru

Přístup

Dereferencování

Opakování

Srovnání

Iterátor výstupu

(výstupní iterátor)

Pouze nahrávání

Iterátor vstupu

(vstupní iterátor)

Pouze čtení

*, ->

==, !=

Dopředný iterátor

(dopředný iterátor)

Číst a psát

*, ->

==, !=

Obousměrný iterátor(obousměrný iterátor)

Číst a psát

*, ->

++, --

==, !=

Iterátor náhodného přístupu

( iterátor náhodného přístupu)

Číst a psát

*, ->,

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

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

pg_update (zdroj $připojení , řetězec $název_tabulky , pole $data , pole $podmínka [, int $options = PGSQL_DML_EXEC ])

pg_update() nahradí záznamy v tabulce, které splňují podmínky stav data data. Pokud je uveden argument možnosti, budou data transformována funkcí pg_convert(), kterému budou předány parametry z tohoto argumentu.

Seznam parametrů

Zdroj připojení k databázi PostgreSQL.

Název_tabulky

Název tabulky, ve které se aktualizují záznamy.

Pole( pole), jehož klíče odpovídají názvům sloupců tabulky název_tabulky a hodnoty nahradí data v těchto sloupcích.

Stav

Pole( pole), jehož klíče odpovídají názvům sloupců tabulky název_tabulky . Aktualizovány budou pouze ty řádky, jejichž hodnoty polí odpovídají hodnotám pole.

Možnosti

Jedna z konstant PGSQL_CONV_OPTS, PGSQL_DML_NO_CONV, PGSQL_DML_ESCAPE, PGSQL_DML_EXEC, PGSQL_DML_ASYNC nebo PGSQL_DML_STRING, nebo jejich kombinace. Pokud možnosti obsahují PGSQL_DML_STRING, funkce vrátí řetězec. Pokud je nainstalován PGSQL_DML_NO_CONV nebo PGSQL_DML_ESCAPE, pak funkci pg_convert() není voláno interně.

Návratové hodnoty

Návraty SKUTEČNÝ po úspěšném absolvování popř NEPRAVDIVÉ v případě chyby. Funkce vrátí řetězec ( tětiva), pokud je konstantní PGSQL_DML_STRING obsažené v opcích.

Příklady

Příklad č. 1 Příklad použití pg_update()

$db = pg_connect("dbname=foo" );
$data = array("pole1" => "AA" , "pole2" => "BB" );

// Toto je bezpečné, protože $_POST je automaticky převedeno
$res = pg_update ($db, "post_log", $_POST, $data);
if ($res) (
echo "Data aktualizována:$res\n" ;
) jinak (
echo "Musela být odeslána neplatná data\n";
}
?>

pg_update (zdroj $připojení , řetězec $název_tabulky , pole $data , pole $podmínka [, int $options = PGSQL_DML_EXEC ])

pg_update() nahradí záznamy v tabulce, které splňují podmínky stav data data. Pokud je uveden argument možnosti, budou data transformována funkcí pg_convert(), kterému budou předány parametry z tohoto argumentu.

Seznam parametrů

Zdroj připojení k databázi PostgreSQL.

Název_tabulky

Název tabulky, ve které se aktualizují záznamy.

Pole( pole), jehož klíče odpovídají názvům sloupců tabulky název_tabulky a hodnoty nahradí data v těchto sloupcích.

Stav

Pole( pole), jehož klíče odpovídají názvům sloupců tabulky název_tabulky . Aktualizovány budou pouze ty řádky, jejichž hodnoty polí odpovídají hodnotám pole.

Možnosti

Jedna z konstant PGSQL_CONV_OPTS, PGSQL_DML_NO_CONV, PGSQL_DML_ESCAPE, PGSQL_DML_EXEC, PGSQL_DML_ASYNC nebo PGSQL_DML_STRING, nebo jejich kombinace. Pokud možnosti obsahují PGSQL_DML_STRING, funkce vrátí řetězec. Pokud je nainstalován PGSQL_DML_NO_CONV nebo PGSQL_DML_ESCAPE, pak funkci pg_convert() není voláno interně.

Návratové hodnoty

Návraty SKUTEČNÝ po úspěšném absolvování popř NEPRAVDIVÉ v případě chyby. Funkce vrátí řetězec ( tětiva), pokud je konstantní PGSQL_DML_STRING obsažené v opcích.

Příklady

Příklad č. 1 Příklad použití pg_update()

$db = pg_connect("dbname=foo" );
$data = array("pole1" => "AA" , "pole2" => "BB" );

// Toto je bezpečné, protože $_POST je automaticky převedeno
$res = pg_update ($db, "post_log", $_POST, $data);
if ($res) (
echo "Data aktualizována:$res\n" ;
) jinak (
echo "Musela být odeslána neplatná data\n";
}
?>

Postgres, původně vyvinutý oddělením informatiky UC Berkeley, byl průkopníkem mnoha objektově orientovaných konceptů, které jsou nyní dostupné v některých komerčních databázích. Poskytuje podporu pro jazyk SQL92/SQL99, integritu transakcí a rozšiřitelnost typů. PostgreSQL je open source potomek původního kódu Berkeley.

PostgreSQL je produkt dostupný zdarma. Chcete-li používat podporu PostgreSQL, potřebujete PostgreSQL 6.5 nebo novější. PostgreSQL 7.0 nebo novější – pro všechny funkce modulu PostgreSQL. PostgreSQL podporuje mnoho kódování znaků, včetně vícebajtových kódování znaků. Aktuální verzi a informace o PostgreSQL naleznete na http://www.postgresql.org/.

Chcete-li povolit podporu PostgreSQL, je při kompilaci PHP vyžadována volba --with-pgsql[=DIR]. Pokud je dostupný modul sdílených objektů, lze modul PostgreSQL načíst pomocí direktivy extension v souboru php.ini nebo funkce dl(). Podporované direktivy ini jsou popsány v souboru php.ini-dist dodávaném se zdrojovým kódem distribuce.

Stůl 1. Změny názvu funkce
Staré jménoNové jméno
pg_exec() pg_query()
pg_getlastoid() pg_last_oid()
pg_cmdtuples() pg_affected_rows()
pg_numrows() pg_num_rows()
pg_numfields() pg_num_fields()
pg_fieldname() pg_field_name()
pg_fieldsize() pg_field_size()
pg_fieldnum() pg_field_num()
pg_fieldprtlen() pg_field_prtlen()
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()

Ne všechny funkce jsou podporovány ve všech sestaveních. To závisí na verzi vašeho libpq (rozhraní klienta PostgreSQL C) a na tom, jak je libpq zkompilován. Pokud funkce chybí, libpq nepodporuje schopnosti požadované touto funkcí.

Je také důležité, abyste používali knihovnu libpq, která je novější než PostgreSQL Server, ke kterému se připojujete. Pokud používáte libpq, který je starší, než PostgreSQL Server očekává, budete mít problémy.

Od verze 6.3 (02/03/1998) PostgreSQL standardně používá unixovou doménu. TCP port NENÍ standardně otevřen. Tabulka popisuje tyto nové možnosti připojení. Tento socket lze nalézt v /tmp/.s.PGSQL.5432. Tuto volbu lze povolit pomocí příznaku "-i". poštmistr a jeho hodnota bude: "poslouchejte sokety TCP/IP i sokety unixové domény."

Tabulka 2. Postmaster a PHP

Spojení se serverem PostgreSQL lze navázat pomocí následujících párů hodnot na příkazovém řádku: $conn = pg_connect("host=myHost port=myPort tty=mojeTTY options=myOptions dbname=myDB user=myuser password=myPassword ");

Předchozí syntaxe: $conn = pg_connect("hostitel", "port", "možnosti", "tty", "název databáze") se již nedoporučuje.

Proměnné prostředí ovlivňují chování PostgreSQL serveru/klienta. Například modul PostgreSQL bude hledat proměnnou prostředí PGHOST, pokud název hostitele není v připojovacím řetězci. Podporované proměnné prostředí se mezi verzemi liší. Podrobnosti viz PostgreSQL Programmer's Manual (libpq - Environment Variables).

Ujistěte se, že jste nastavili proměnné prostředí pro příslušného uživatele. Použijte $_ENV nebo getenv() zkontrolovat, které proměnné prostředí jsou dostupné aktuálnímu procesu.

Počínaje PostgreSQL 7.1.0 můžete uložit 1 GB do textového pole. Starší verze mohou mít omezení velikosti bloku (výchozí hodnota byla 8 KB, maximum bylo 32 KB, stanovené v době kompilace).

Chcete-li použít rozhraní velkého objektu (lo), musíte do transakčního bloku zahrnout funkce lo. Transakční blok začíná příkazem SQL ZAČÍT a pokud byla transakce správná, skončí SPÁCHAT nebo KONEC. Pokud se transakce nezdaří, musí být uzavřena s NÁVRAT nebo PŘERUŠIT.

Před uzavřením velkého objektu byste neměli zavírat připojení k serveru PostgreSQL.

Obsah pg_affeded_rows - vrátí počet zapojených položek (steam/ntice) pg_cancel_query - zruší asynchronní požadavek pg_client_encoding - přijme zákaznické kódování pg_close - zavře postgreSQL připojení PG_ConNNECT - otevře posteg připojení Rescl PG_ConNECTION_BUSY -sgconnect, zda je připojení uzavřeno nebo ne - přijme pg_connect connection (reconnect) pg_connection_status - získá stav připojení pg_convert - převede hodnotu asociativního pole na hodnotu vhodnou pro SQL příkaz pg_copy_from - vloží záznamy do tabulky z pole pg_copy_to - zkopíruje tabulku do pole pg_dbname - získá název databáze pg_delete - smaže záznamy pg_end_copy - synchronizuje se s PostgreSQL backendem pg_escape_bytea - mnemonizuje /escape binární pro typ bytea pg_escape_string - mnemonizuje řetězec pro typ text/char pg_fetch_array - načte řádek jako pole pg_fetch_object návratový objekt pfetch - hodnoty pfetchg pole pfet z výsledného zdroje pg_fetch_row - načte řádek jako vyčíslitelné pole pg_field_is_null - zkontroluje, zda je pole NULA pg_field_name - vrátí název pole pg_field_num - vrátí číslo pojmenovaného pole pg_field_prtlen - vrátí tisknutelnou velikost pg_field_size - vrátí velikost vnitřního úložiště pojmenovaného pole pg_field_type - vrátí název typu pro odpovídající číslo pole

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

pg_convert — Převede hodnoty asociativního pole na přijatelné hodnoty pro použití v dotazech SQL

Popis

pg_convert (zdroj $připojení , řetězec $název_tabulky , pole $assoc_array [, int $options = 0]): pole

pg_convert() kontroluje a převádí hodnoty z assoc_array na hodnoty přijatelné pro SQL server. Tabulka název_tabulky musí existovat a počet sloupců v ní nesmí být menší než hodnoty v poli assoc_array. Názvy sloupců v tabulce table_name se musí shodovat s klíči pole assoc_array a datové typy hodnot pole se také musí shodovat s datovými typy odpovídajících sloupců. Pokud je převod úspěšný, funkce vrátí pole převedených hodnot, jinak vrátí NEPRAVDIVÉ.

Komentář:

Od PHP 5.6.0 jsou povoleny booleovské hodnoty. Jsou převedeny na booleovský typ PostgreSQL. Podporovány jsou také řetězcové reprezentace booleovské hodnoty. NULA je převeden na PostgreSQL NULL.

Pokud před PHP 5.6.0 tabulka název_tabulky obsahuje logická pole, nepoužívejte konstantu SKUTEČNÝ jako hodnotu pole název_tabulky pro tato pole. Bude převeden na řetězec "TRUE", což je neplatná hodnota pro booleovská pole v PostgreSQL. Použijte hodnoty „t“, „true“, „1“, „y“, „yes“.

Seznam parametrů

Zdroj připojení k databázi PostgreSQL.

Název_tabulky

Název tabulky databáze.

Assoc_array

Data k převodu.

Možnosti

Jedna z konstant PGSQL_CONV_IGNORE_DEFAULT, PGSQL_CONV_FORCE_NULL nebo PGSQL_CONV_IGNORE_NOT_NULL, nebo jejich kombinace.

Návratové hodnoty

Pole( pole), obsahující převedená data, popř NEPRAVDIVÉ v případě chyby.

Příklady

Příklad č. 1 Příklad použití pg_convert()

$dbconn = pg_connect ( "dbname=foo");

$tmp = pole(
"autor" => "Joe Thackery" ,
"rok" => 2005,
"title" => "Můj život, od Joe Thackery"
);

$vals = pg_convert ($dbconn, "autoři", $tmp);
?>