Funcții PostgreSQL. LXXX. PostgreSQL Caracteristici Dimensiunea bazei de date

Bibliotecă de șabloane standard ( Biblioteca de șabloane standard , STL) este inclusă în biblioteca standard a limbajului C++. Include implementări ale celor mai des utilizați containere și algoritmi, ceea ce îi salvează pe programatori de rutina de a le rescrie din nou și din nou. Atunci când se dezvoltă containere și algoritmii aplicați acestora (cum ar fi eliminarea elementelor identice, sortarea, căutarea etc.), deseori trebuie sacrificate fie versatilitatea, fie performanța. Cu toate acestea, dezvoltatorii STL și-au propus sarcina de a face biblioteca atât eficientă, cât și universală. Pentru a rezolva această problemă, au fost folosite astfel de mijloace universale ale limbajului C++ precum șabloanele și supraîncărcarea operatorilor. În prezentarea următoare ne vom baza pe implementarea STL furnizată de Microsoft împreună cu compilatorul Visual C++ 6.0. Cu toate acestea, cele mai multe dintre cele de mai sus vor fi valabile și pentru implementările STL de către alți compilatori.

Principalele concepte din STL sunt conceptele de container (container), algoritm (algoritm) și iterator (iterator).

Containereste un depozit de obiecte (atât tipurile încorporate, cât și cele definite de utilizator). De obicei, containerele sunt implementate ca șabloane de clasă. Cele mai simple tipuri de containere (matrice statice și dinamice) sunt construite direct în limbajul C++. În plus, biblioteca standard include implementări de containere, cum ar fi vector, listă, coadă, hartă, set și altele.

Algoritmeste o funcție de manipulare a obiectelor conținute într-un container. Exemple tipice de algoritmi sunt sortarea și căutarea. STL implementează aproximativ 60 de algoritmi care pot fi aplicați la diferite containere, inclusiv matrice încorporate în limbajul C++.

Iteratoreste o abstractizare a unui pointer, adică un obiect care se poate referi la alte obiecte conținute în container. Principalele funcții ale unui iterator sunt de a oferi acces la obiectul la care se referă (dereferențiere) și de a trece de la un element container la altul (iterație, de unde și numele de iterator). Pentru containerele încorporate, pointerii obișnuiți sunt utilizați ca iteratori. În cazul containerelor mai complexe, iteratoarele sunt implementate ca clase cu un set de operatori supraîncărcați.

Pe lângă elementele marcate în STL există un număr concepte auxiliare ; De asemenea, ar trebui să le cunoașteți pe unele dintre ele.

Alocator(alocator) este un obiect responsabil cu alocarea memoriei pentru elementele containerului. Fiecărui container standard este asociat un alocator (tipul acestuia este trecut ca unul dintre parametrii șablonului). Dacă un algoritm trebuie să aloce memorie pentru elemente, trebuie să facă acest lucru printr-un alocător. În acest caz, puteți fi sigur că obiectele distribuite vor fi distruse corect.

STL include o clasă standard de alocare (descrisă în fișierul xmemory). Acesta este ceea ce folosesc implicit toate containerele implementate în STL. Cu toate acestea, utilizatorul își poate implementa propria clasă. Acest lucru este foarte rar necesar, dar uneori poate fi făcut în scopuri de eficiență sau de depanare.

Să ne oprim mai în detaliu asupra luării în considerare a conceptelor introduse.

Containere . Fiecare container oferă o interfață strict definită prin care algoritmii vor interacționa cu el. Iteratoarele specifice containerului oferă această interfață. Este important de subliniat că nu sunt utilizate funcții membre suplimentare pentru a interacționa între algoritmi și containere. Acest lucru se face deoarece algoritmii standard trebuie să funcționeze, inclusiv containerele încorporate ale limbajului C++, care au iteratoare (pointeri), dar nimic altceva. Astfel, atunci când vă creați propriul container, implementarea unui iterator este strictul minim.

Fiecare container implementează un tip specific de iterator. Aceasta selectează cel mai funcțional tip de iterator care poate fi implementat eficient pentru un anumit container. „Eficient” înseamnă că viteza de efectuare a operațiunilor pe iterator nu ar trebui să depindă de numărul de elemente din container. De exemplu, un iterator cu acces aleatoriu este implementat pentru un vector, iar un iterator bidirecțional este implementat pentru o listă. Deoarece viteza unei operațiuni de listă este liniară cu lungimea acesteia, nu este implementat un iterator cu acces aleatoriu pentru o listă.

Indiferent de organizarea efectivă a containerului (vector, listă, arbore), elementele stocate în acesta pot fi considerate ca o secvență. Iteratorul primului element din această secvență este returnat de funcția begin(), iar iteratorul elementului care urmează ultimul este returnat de funcția end(). Acest lucru este foarte important, deoarece toți algoritmii din STL funcționează exact cu secvențe specificate de iteratorii de început și de sfârșit.

Pe lângă iteratoarele obișnuite din STL, există iteratoare inverse ( iterator invers ). Un iterator invers este diferit prin aceea că iterează prin secvența de elemente dintr-un container în ordine inversă. Cu alte cuvinte, operațiile + și - sunt inversate. Acest lucru permite algoritmilor să fie aplicați atât secvențelor directe cât și inverse de elemente. De exemplu, folosind funcția de căutare, puteți căuta elemente atât de la „începutul” cât și de la „sfârșitul” unui container.

În STL, containerele sunt împărțite în trei grupuri principale (Tabelul 2): ​​containere de secvență, containere asociative și adaptoare de containere. Primele două grupuri sunt combinate în containere de primă clasă.

masa 2

Clasa containerelor STL

Descriere

Containere de secvențe

vector

Matrice dinamică

deque

Coadă bidirecțională

listă

Lista liniară bidirecțională

Containere asociative

Container asociativ cu chei unice

multiset

Container asociativ care permite chei duplicate

Container asociativ pentru seturi de elemente unice

multihartă

Container asociativ pentru seturi cu elemente duplicate

Adaptoare pentru containere

grămadă

Stivă standard

coadă

Coada standard

priority_queue

Coada de prioritate

Fiecare clasă de container implementată în STL , descrie setul de tipuri asociate containerului. Ar trebui să urmați aceeași practică atunci când vă scrieți propriile containere. Iată o listă cu cele mai importante tipuri:

value_type - tipul elementului;

tipul marimii - un tip pentru stocarea numărului de elemente (de obicei dimensiunea_t);

iterator - iterator pentru elemente container;

tip_cheie - tip cheie (într-un container asociativ).

Pe lângă tipuri, putem distinge un set de funcții pe care aproape fiecare container din STL le implementează (Tabelul 3). Ele nu sunt necesare pentru interacțiunea cu algoritmi, dar implementarea lor îmbunătățește interschimbabilitatea containerelor din program. STL este proiectat astfel încât containerele să ofere funcționalități similare.

Tabelul 3

Metode comune pentru toate containerele STL

Descriere

constructor implicit

Constructor implicit. De obicei, un container are mai multe designeri

constructor de copiere

Constructor de copiere

distrugător

Destructor

gol

Returnează true dacă nu există elemente în container, false în caz contrar

dimensiune_max

Returnează numărul maxim de elemente pentru un container

mărimea

Returnează numărul de elemente din container la momentul curent

operator =

Atribuie un container altuia

operator<

Returnează true dacă primul container este mai mic decât al doilea, false în caz contrar

operator<=

Returnează true dacă primul container nu este mai mare decât al doilea, false în caz contrar

operator >

Returnează true dacă primul container este mai mare decât al doilea, false în caz contrar

operator >=

Returnează true dacă primul container nu este mai mic decât al doilea, false în caz contrar

operator ==

Returnează true dacă containerele comparate sunt egale, false în caz contrar

operator !=

Returnează true dacă containerele comparate nu sunt egale, false în caz contrar

schimb

Schimbă elementele a două containere

Caracteristici disponibile numai în containere de primă clasă

ÎNCEPE

Două versiuni ale acestei funcții returnează fie un iterator, fie un const_iterator, care se referă la primul element al containerului

Două versiuni ale acestei funcții returnează fie un iterator, fie un const_iterator, care se referă la următoarea poziție după sfârșitul containerului

a începe

Două versiuni ale acestei funcții revin fie reverse_iterator sau reverse_const_iterator , care se referă la ultimul element al containerului

rupe

Două versiuni ale acestei funcții returnează fie un reverse_iterator, fie un reverse_const_iterator, care se referă la poziția dinaintea primului element al containerului

inserarea, ștergerea,

Vă permite să introduceți sau să eliminați elemente în mijlocul unei secvențe

Masa finala 3

clar

Îndepărtează toate elementele dintr-un container

față spate

push_back, pop_back

Vă permite să adăugați sau să eliminați ultimul element dintr-o secvență

push_front, pop_front

Vă permite să adăugați sau să eliminați primul element dintr-o secvență

Iteratorii sunt de obicei creați ca prieteni ai claselor în care operează, permițând accesul direct la datele private ale acelor clase. Un singur container poate avea mai mulți iteratori asociați, fiecare dintre acestea menținând propriile „informații de poziție” (Tabelul 4).

Tabelul 4

Tip iterator

Acces

Dereferențiere

Repetare

Comparaţie

Iterator de ieșire

(iterator de ieșire)

Doar înregistrare

Iterator de intrare

(iterator de intrare)

Doar lectură

*, ->

==, !=

Iterator înainte

(iterator înainte)

Citeste si scrie

*, ->

==, !=

Iterator bidirecțional(iterator bidirecțional)

Citeste si scrie

*, ->

++, --

==, !=

Iterator cu acces aleatoriu

(aleatoriu - acces iterator)

Citeste si scrie

*, ->,

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

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

pg_update (resursa $conexiune , șir $table_name , matrice $date , matrice $condiție [, int $opțiuni = PGSQL_DML_EXEC ])

pg_update()înlocuiește înregistrările din tabel care îndeplinesc condițiile condiție date date. Dacă se dă un argument Opțiuni, datele vor fi transformate de funcție pg_convert(), la care se vor trece parametrii din acest argument.

Lista parametrilor

Resursa de conexiune la baza de date PostgreSQL.

Nume_tabel

Numele tabelului în care sunt actualizate înregistrările.

matrice( matrice), ale căror chei corespund numelor coloanelor din tabelul table_name, iar valorile vor înlocui datele din aceste coloane.

Condiție

matrice( matrice), ale căror chei corespund numelor coloanelor tabelului table_name . Vor fi actualizate doar acele rânduri ale căror valori de câmp se potrivesc cu valorile matricei.

Opțiuni

Una dintre constante PGSQL_CONV_OPTS, PGSQL_DML_NO_CONV, PGSQL_DML_ESCAPE, PGSQL_DML_EXEC, PGSQL_DML_ASYNC sau PGSQL_DML_STRING, sau o combinație a acestora. Dacă opțiunile conține PGSQL_DML_STRING, funcția va returna un șir. Dacă este instalat PGSQL_DML_NO_CONV sau PGSQL_DML_ESCAPE, apoi funcția pg_convert() nu apelat intern.

Valori returnate

Se intoarce ADEVĂRAT la finalizarea cu succes sau FALSîn cazul unei erori. Funcția va returna șirul ( şir), dacă este constantă PGSQL_DML_STRING cuprinse în opțiuni.

Exemple

Exemplul #1 Exemplu de utilizare pg_update()

$db = pg_connect("dbname=foo" );
$date = array("field1" => "AA" , "field2" => "BB" );

// Acest lucru este sigur deoarece $_POST este convertit automat
$res = pg_update ($db, "post_log", $_POST, $date);
dacă ($res) (
ecou „Date actualizate:$res\n" ;
) altfel (
ecou „Datele nevalide trebuie să fi fost trimise\n”;
}
?>

pg_update (resursa $conexiune , șir $table_name , matrice $date , matrice $condiție [, int $opțiuni = PGSQL_DML_EXEC ])

pg_update()înlocuiește înregistrările din tabel care îndeplinesc condițiile condiție date date. Dacă se dă un argument Opțiuni, datele vor fi transformate de funcție pg_convert(), la care se vor trece parametrii din acest argument.

Lista parametrilor

Resursa de conexiune la baza de date PostgreSQL.

Nume_tabel

Numele tabelului în care sunt actualizate înregistrările.

matrice( matrice), ale căror chei corespund numelor coloanelor din tabelul table_name, iar valorile vor înlocui datele din aceste coloane.

Condiție

matrice( matrice), ale căror chei corespund numelor coloanelor tabelului table_name . Vor fi actualizate doar acele rânduri ale căror valori de câmp se potrivesc cu valorile matricei.

Opțiuni

Una dintre constante PGSQL_CONV_OPTS, PGSQL_DML_NO_CONV, PGSQL_DML_ESCAPE, PGSQL_DML_EXEC, PGSQL_DML_ASYNC sau PGSQL_DML_STRING, sau o combinație a acestora. Dacă opțiunile conține PGSQL_DML_STRING, funcția va returna un șir. Dacă este instalat PGSQL_DML_NO_CONV sau PGSQL_DML_ESCAPE, apoi funcția pg_convert() nu apelat intern.

Valori returnate

Se intoarce ADEVĂRAT la finalizarea cu succes sau FALSîn cazul unei erori. Funcția va returna șirul ( şir), dacă este constantă PGSQL_DML_STRING cuprinse în opțiuni.

Exemple

Exemplul #1 Exemplu de utilizare pg_update()

$db = pg_connect("dbname=foo" );
$date = array("field1" => "AA" , "field2" => "BB" );

// Acest lucru este sigur deoarece $_POST este convertit automat
$res = pg_update ($db, "post_log", $_POST, $date);
dacă ($res) (
ecou „Date actualizate:$res\n" ;
) altfel (
ecou „Datele nevalide trebuie să fi fost trimise\n”;
}
?>

Postgres, dezvoltat inițial de Departamentul de Informatică UC Berkeley, a fost pionier în multe dintre conceptele orientate pe obiecte disponibile acum în unele baze de date comerciale. Acesta oferă suport pentru limbajul SQL92/SQL99, integritatea tranzacției și extensibilitatea tipului. PostgreSQL este un descendent open source al codului original Berkeley.

PostgreSQL este un produs disponibil gratuit. Pentru a utiliza suportul PostgreSQL, aveți nevoie de PostgreSQL 6.5 sau o versiune ulterioară. PostgreSQL 7.0 sau o versiune ulterioară - pentru toate caracteristicile modulului PostgreSQL. PostgreSQL acceptă multe codificări de caractere, inclusiv codificări de caractere pe mai mulți octeți. Versiunea actuală și informații despre PostgreSQL pot fi găsite la http://www.postgresql.org/.

Pentru a activa suportul PostgreSQL, este necesară opțiunea --with-pgsql[=DIR] la compilarea PHP. Dacă modulul de obiecte partajate este disponibil, modulul PostgreSQL poate fi încărcat folosind directiva de extensie din fișierul php.ini sau funcția dl(). Directivele ini acceptate sunt descrise în fișierul php.ini-dist furnizat cu codul sursă de distribuție.

Tabelul 1. Numele funcției se modifică
Nume vechiNume nou
pg_exec() pg_query()
pg_getlastoid() pg_last_oid()
pg_cmdtuples() pg_afected_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()

Nu toate funcțiile sunt acceptate în toate versiunile. Acest lucru depinde de versiunea libpq-ului dumneavoastră (interfața PostgreSQL C Client) și de modul în care este compilat libpq. Dacă lipsește o funcție, libpq nu acceptă capabilitățile cerute de acea funcție.

De asemenea, este important să utilizați un libpq mai nou decât serverul PostgreSQL la care vă conectați. Dacă utilizați un libpq mai vechi decât se așteaptă PostgreSQL Server, veți avea probleme.

Începând cu versiunea 6.3 (02/03/1998), PostgreSQL utilizează implicit un socket de domeniu Unix. Portul TCP NU este deschis implicit. Tabelul descrie aceste noi opțiuni de conectare. Acest socket poate fi găsit în /tmp/.s.PGSQL.5432. Această opțiune poate fi activată cu indicatorul „-i” pentru director de poştă, iar valoarea sa va fi: „ascultă socketurile TCP/IP precum și socketurile de domeniu Unix”.

Tabelul 2. Postmaster și PHP

O conexiune la serverul PostgreSQL poate fi stabilită cu următoarele perechi de valori pe linia de comandă: $conn = pg_connect("gazdă=myHost port=myPort tty=myTTY options=myOptions dbname=myDB user=myUser parola=myPassword ");

Sintaxa anterioară: $conn = pg_connect ("gazdă", "port", "opțiuni", "tty", "nume db") nu mai este recomandat.

Variabilele de mediu afectează comportamentul serverului/clientului PostgreSQL. De exemplu, modulul PostgreSQL va căuta variabila de mediu PGHOST dacă numele gazdă nu este în șirul de conexiune. Variabilele de mediu acceptate diferă între versiuni. Consultați Manualul programatorului PostgreSQL (libpq - Variabile de mediu) pentru detalii.

Asigurați-vă că setați variabilele de mediu pentru utilizatorul corespunzător. Folosiți $_ENV sau getenv() pentru a verifica ce variabile de mediu sunt disponibile pentru procesul curent.

Începând cu PostgreSQL 7.1.0, puteți stoca 1 GB într-un câmp de text. Versiunile mai vechi pot avea restricții privind dimensiunea blocurilor (prestabilit a fost 8KB, maximul a fost 32KB, determinat în momentul compilării).

Pentru a utiliza interfața obiect mare (lo), trebuie să includeți funcții lo în interiorul blocului de tranzacție. Un bloc de tranzacție începe cu o instrucțiune SQL ÎNCEPE, iar dacă tranzacția a fost corectă, se încheie COMMIT sau Sfârşit. Dacă o tranzacție eșuează, trebuie să fie închisă cu ROLLBACK sau ABORTARE.

Nu ar trebui să închideți conexiunea la serverul PostgreSQL înainte de a închide obiectul mare.

Conţinut pg_affeded_rows - returnează numărul de intrări implicate (steam/tuples) pg_cancel_query - anulează cererea asincronă pg_client_encoding - primește codificarea clientului pg_close - închide conexiunea postgreSQL PG_ConNNECT - deschide conexiunea posteg Rescl PG_ConNECTION_BUSY_ - primește conexiunea Resetează sau nu, restabilește pg_ConNECTION_BUSY_ connection (reconectare) pg_connection_status - obține starea conexiunii pg_convert - convertește valoarea unui tablou asociativ într-o valoare potrivită pentru instrucțiunea SQL pg_copy_from - inserează înregistrări într-un tabel dintr-o matrice pg_copy_to - copiează un tabel într-o matrice pg_dbname - primește numele bazei de date PG_Delete - Șterge înregistrările PG_END_COPY - Sincronizează cu Backend PostgreSQL PG_ESCAPE_BYTEA - MNEMNIFES /ESCAPE BARINE PENTRU TIP BYTEA PG_ESCAPE_STRING - MNEMONIFES STRING PENTRU TIP TEXT /CHAR PG_FETCH_ARRAY - Recuperați un rând ca un tablou PG din resursa rezultată pg_fetch_row - preia un rând ca o matrice enumerabilă pg_field_is_null - verifică dacă un câmp este NUL pg_field_name - returnează numele câmpului pg_field_num - returnează numărul câmpului numit pg_field_prtlen - returnează dimensiunea imprimabilă pg_field_size - returnează dimensiunea de stocare internă a câmpului numit pg_field_type - returnează numele tipului pentru numărul de câmp corespunzător

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

pg_convert — Convertește valorile unui tablou asociativ în valori acceptabile pentru utilizare în interogări SQL

Descriere

pg_convert (resursa $conexiune , șir $table_name , matrice $assoc_array [, int $opțiuni = 0]): matrice

pg_convert() verifică și convertește valorile din assoc_array în cele acceptabile pentru serverul SQL. Tabelul table_name trebuie să existe, iar numărul de coloane din acesta nu trebuie să fie mai mic decât valorile din matricea assoc_array. Numele coloanelor din tabelul table_name trebuie să se potrivească cu cheile matricei assoc_array, iar tipurile de date ale valorilor matricei trebuie, de asemenea, să se potrivească cu tipurile de date ale coloanelor corespunzătoare. Dacă conversia are succes, funcția returnează o matrice de valori convertite, în caz contrar, revine FALS.

cometariu:

Începând cu PHP 5.6.0, valorile booleene sunt permise. Ele sunt convertite la tipul boolean PostgreSQL. Reprezentările cu șiruri de caractere ale unei valori booleene sunt, de asemenea, acceptate. NUL este convertit în PostgreSQL NULL.

Înainte de PHP 5.6.0, dacă tabelul table_name conține câmpuri booleene, nu utilizați o constantă ADEVĂRAT ca valoare a tabloului table_name pentru aceste câmpuri. Acesta va fi convertit în șirul „TRUE”, care este o valoare nevalidă pentru câmpurile booleene din PostgreSQL. Utilizați valorile „t”, „adevărat”, „1”, „y”, „da”.

Lista parametrilor

Resursa de conexiune la baza de date PostgreSQL.

Nume_tabel

Numele tabelului bazei de date.

Assoc_array

Date de convertit.

Opțiuni

Una dintre constante PGSQL_CONV_IGNORE_DEFAULT, PGSQL_CONV_FORCE_NULL sau PGSQL_CONV_IGNORE_NOT_NULL, sau o combinație a acestora.

Valori returnate

matrice( matrice), care conține datele convertite sau FALSîn caz de eroare.

Exemple

Exemplul #1 Exemplu de utilizare pg_convert()

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

$tmp = matrice(
"author" => "Joe Thackery" ,
"an" => 2005,
"title" => "Viața mea, de Joe Thackery"
);

$vals = pg_convert ($dbconn, „autori”, $tmp);
?>