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()î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()î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 vechi | Nume 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);
?>