Функції PostgreSQL. LXXX. Функції PostgreSQL Розмір бази даних

Стандартна бібліотека шаблонів ( Standard Template Library , STL) входить до стандартної бібліотеки мови C++. У неї включені реалізації контейнерів і алгоритмів, що найчастіше використовуються, що позбавляє програмістів від рутинного переписування їх знову і знову. При розробці контейнерів і алгоритмів, що застосовуються до них (таких як видалення однакових елементів, сортування, пошук і т. д.) часто доводиться приносити в жертву або універсальність, або швидкодія. Однак розробники STL поставили перед собою завдання: зробити бібліотеку одночасно ефективною та універсальною. Для її вирішення були використані такі універсальні засоби мови C++, як шаблони та навантаження операторів. У наступному викладі спиратимемося на реалізацію STL, що постачається фірмою Microsoft разом із компілятором Visual C++ 6.0. Проте більшість сказаного буде справедлива й у реалізацій STL іншими компіляторами.

Основними поняттями в STL є поняття контейнера (container), алгоритму (algorithm) та ітератора (iterator).

Контейнер- це сховище об'єктів (як вбудованих, і певних користувачем типів). Як правило, контейнери реалізуються як шаблонів класів. Найпростіші види контейнерів (статичні та динамічні масиви) вбудовані безпосередньо в мову C++. Крім того, стандартна бібліотека включає реалізації таких контейнерів, як вектор (vector), список (list), черга (deque), асоціативний масив (map), безліч (set) і деяких інших.

Алгоритм- це функція для маніпулювання об'єктами, що містяться у контейнері. Типові приклади алгоритмів - сортування та пошук. У STL реалізовано близько 60 алгоритмів, які можна застосовувати до різних контейнерів, зокрема масивів, вбудованим у мову C++.

Ітератор- це абстракція покажчика, тобто об'єкт, який може посилатися інші об'єкти, які у контейнері. Основні функції ітератора - забезпечення доступу до об'єкта, на який він посилається (розйменування), та перехід від одного елемента контейнера до іншого (ітерація, звідси назва ітератора). Для вбудованих контейнерів як ітератори використовуються звичайні покажчики. Що стосується більш складними контейнерами ітератори реалізуються як класів з набором перевантажених операторів.

Крім зазначених елементів у STL є ряд допоміжних понять ; з деякими їх слід також познайомитися.

Аллокатор(allocator) - це об'єкт, відповідальний розподіл пам'яті елементів контейнера. З кожним стандартним контейнером зв'язується аллокатор (його тип передається як один із параметрів шаблону). Якщо якомусь алгоритму потрібно розподіляти пам'ять елементів, він повинен робити це через аллокатор. У цьому випадку можна бути впевненим, що розподілені об'єкти будуть знищені правильно.

До складу STL входить стандартний клас allocator (описаний у файлі xmemory). Саме його за замовчуванням використовують усі контейнери, реалізовані у STL. Однак, користувач може реалізувати власний клас. Необхідність у цьому виникає дуже рідко, але іноді це можна зробити з міркувань ефективності або в цілях налагодження.

Зупинимося докладніше на розгляді введених понять.

Контейнери . Кожен контейнер надає чітко визначений інтерфейс, через який з ним взаємодіятимуть алгоритми. Цей інтерфейс забезпечують відповідні контейнери ітератори. Важливо підкреслити, що додаткові функції-члени для взаємодії алгоритмів і контейнерів не використовуються. Це зроблено тому, що стандартні алгоритми повинні працювати, у тому числі з вбудованими контейнерами мови C++, які мають ітератори (покажчики), але немає нічого, крім них. Отже, під час створення власного контейнера реалізація ітератора - необхідний мінімум.

Кожен контейнер реалізує певний тип ітераторів. При цьому вибирається найбільш функціональний тип ітератора, який може бути ефективно реалізований для контейнера. "Ефективно" означає, що швидкість виконання операцій над ітератором не повинна залежати від кількості елементів контейнера. Наприклад, для вектора реалізується ітератор з довільним доступом, а списку - двонаправлений. Оскільки швидкість виконання операції для списку лінійно залежить від його довжини, ітератор із довільним доступом для списку не реалізується.

Незалежно від фактичної організації контейнера (вектор, список, дерево) елементи, що зберігаються в ньому, можна розглядати як послідовність. Ітератор першого елемента у цій послідовності повертає функція begin(), а ітератор елемента, наступного за останнім, – функція end(). Це дуже важливо, тому що всі алгоритми STL працюють саме з послідовностями, заданими ітераторами початку і кінця.

Крім звичайних ітераторів у STL існують зворотні ітератори ( reverse iterator ). Зворотний ітератор відрізняється тим, що переглядає послідовність елементів у контейнері у зворотному порядку. Іншими словами, операції + і – у нього змінюються місцями. Це дозволяє застосовувати алгоритми як до прямої, так і зворотної послідовності елементів. Наприклад, за допомогою функції find можна шукати елементи як з початку, так і з кінця контейнера.

У STL контейнери поділяються на три основні групи (табл. 2): контейнери послідовностей, асоціативні контейнери та адаптери контейнерів. Перші дві групи об'єднуються у контейнери першого класу.

Таблиця 2

Контейнерний клас STL

Опис

Контейнери послідовностей

vector

Динамічний масив

deque

Двоспрямована черга

list

Двонаправлений лінійний список

Асоціативні контейнери

Асоціативний контейнер із унікальними ключами

multiset

Асоціативний контейнер, що допускає дублювання ключів

Асоціативний контейнер для наборів унікальних елементів

multimap

Асоціативний контейнер для наборів із дублюванням елементів

Адаптери контейнерів

stack

Стандартний стек

queue

Стандартна черга

priority _ queue

Черга з пріоритетами

Кожен клас контейнера, реалізований у STL описує набір типів, пов'язаних з контейнером. При написанні власних контейнерів слід дотримуватись цієї ж практики. Ось список найважливіших типів:

value _ type - тип елемента;

size _type - тип зберігання елементів (зазвичай size _ t);

iterator - ітератор для елементів контейнера;

key _ type - Тип ключа (в асоціативному контейнері).

Крім типів можна виділити набір функцій, що їх реалізує майже кожен контейнер в STL (табл. 3). Вони не потрібні для взаємодії з алгоритмами, але їх реалізація покращує взаємозамінність контейнерів у програмі. STL розроблена для того, щоб контейнери забезпечували аналогічні функціональні можливості.

Таблиця 3

Загальні методи всіх STL-контейнерів

Опис

default constructor

Конструктор за замовчуванням. Зазвичай контейнер має декількаконструкторів

copy constructor

Копіюючий конструктор

destructor

Деструктор

empty

Повертає true, якщо в контейнері немає елементів, інакше false

max _ size

Повертає максимальну кількість елементів контейнера

size

Повертає кількість елементів у контейнері в даний час

operator =

Привласнює один контейнер іншому

operator<

Повертає true, якщо перший контейнер менший за другий, інакше false

operator<=

Повертає true, якщо перший контейнер не більший за другий, інакше false

operator >

Повертає true, якщо перший контейнер більший за другий, інакше false

operator >=

Повертає true, якщо перший контейнер не менший за другий, інакше false

operator ==

Повертає true, якщо контейнери, що порівнюються, рівні, інакше false

operator !=

Повертає true, якщо контейнери, що порівнюються, не рівні, інакше false

swap

Змінює місцями елементи двох контейнерів

Функції, які є лише у контейнерах першого класу

begin

Дві версії цієї функції повертають або iterator або const_iterator, який посилається на перший елемент контейнера

Дві версії цієї функції повертають або iterator або const_iterator, який посилається на наступну позицію після кінця контейнера

rbegin

Дві версії цієї функції повертають або reverse _ iterator , або reverse _ const _ iterator , який посилається на останній елемент контейнера

rend

Дві версії цієї функції повертають або reverse_iterator, або reverse_const_iterator, який посилається на позицію перед першим елементом контейнера

insert, erase,

Дозволяють вставити або видалити елемент(и) у середині послідовності

Закінчення табл. 3

clear

Видаляє з контейнера всі елементи

front , back

push_back, pop_back

Дозволяють додати або видалити останній елемент у послідовності

push_front, pop_front

Дозволяють додати або видалити перший елемент у послідовності

Ітератори зазвичай створюються як друзі класів, з якими вони працюють, що дозволяє виконати прямий доступ до приватних даних цих класів. З одним контейнером може бути пов'язано кілька ітераторів, кожен із яких підтримує свою власну «позиційну інформацію» (табл. 4).

Таблиця 4

Тип ітератора

Доступ

Розіменування

Ітерація

Порівняння

Ітератор виведення

(output iterator)

Тільки запис

Ітератор введення

(input iterator)

Тільки читання

*, ->

==, !=

Прямий ітератор

(Forward iterator)

Читання та запис

*, ->

==, !=

Двонаправлений ітератор(bidirectional iterator)

Читання та запис

*, ->

++, --

==, !=

Ітератор із довільним доступом

(random-access iterator)

Читання та запис

*, ->,

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

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

pg_update (resource $connection , string $table_name , array $data , array $condition [, int $options = PGSQL_DML_EXEC ])

pg_update()замінює записи у таблиці, що задовольняють умовам conditionданими data. Якщо заданий аргумент optionsдані будуть перетворені функцією pg_convert(), Які будуть передані параметри з цього аргументу.

Список параметрів

Ресурс з'єднання з базою даних PostgreSQL.

Table_name

Ім'я таблиці, де оновлюються записи.

Масив ( array), ключі якого відповідають імен колонок таблиці table_name , а значення замінять дані в цих колонках.

Condition

Масив ( array), ключі якого відповідають імен колонок таблиці table_name . Буде оновлено лише рядки, значення полів яких збігатимуться зі значеннями масиву.

Options

Одна з констант PGSQL_CONV_OPTS, PGSQL_DML_NO_CONV, PGSQL_DML_ESCAPE, PGSQL_DML_EXEC, PGSQL_DML_ASYNCабо PGSQL_DML_STRINGабо їх комбінація. Якщо options містить PGSQL_DML_STRING, функція поверне рядок. Якщо встановлено PGSQL_DML_NO_CONVабо PGSQL_DML_ESCAPE, то функція pg_convert()внутрішньо не викликається.

Значення, що повертаються

Повертає TRUEу разі успішного завершення або FALSEу разі виникнення помилки. Функція поверне рядок ( string), якщо константа PGSQL_DML_STRINGміститься в options.

Приклади

Приклад #1 Приклад використання pg_update()

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

// Це безпечно з того часу, як $_POST перетворюється автоматично
$res = pg_update ($db, "post_log", $_POST, $ data);
if ($res) (
echo "Дані оновлені:$res \n" ;
) else (
echo "Повинні бути передані неправильні дані\n";
}
?>

pg_update (resource $connection , string $table_name , array $data , array $condition [, int $options = PGSQL_DML_EXEC ])

pg_update()замінює записи у таблиці, що задовольняють умовам conditionданими data. Якщо заданий аргумент optionsдані будуть перетворені функцією pg_convert(), Які будуть передані параметри з цього аргументу.

Список параметрів

Ресурс з'єднання з базою даних PostgreSQL.

Table_name

Ім'я таблиці, де оновлюються записи.

Масив ( array), ключі якого відповідають імен колонок таблиці table_name , а значення замінять дані в цих колонках.

Condition

Масив ( array), ключі якого відповідають імен колонок таблиці table_name . Буде оновлено лише рядки, значення полів яких збігатимуться зі значеннями масиву.

Options

Одна з констант PGSQL_CONV_OPTS, PGSQL_DML_NO_CONV, PGSQL_DML_ESCAPE, PGSQL_DML_EXEC, PGSQL_DML_ASYNCабо PGSQL_DML_STRINGабо їх комбінація. Якщо options містить PGSQL_DML_STRING, функція поверне рядок. Якщо встановлено PGSQL_DML_NO_CONVабо PGSQL_DML_ESCAPE, то функція pg_convert()внутрішньо не викликається.

Значення, що повертаються

Повертає TRUEу разі успішного завершення або FALSEу разі виникнення помилки. Функція поверне рядок ( string), якщо константа PGSQL_DML_STRINGміститься в options.

Приклади

Приклад #1 Приклад використання pg_update()

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

// Це безпечно з того часу, як $_POST перетворюється автоматично
$res = pg_update ($db, "post_log", $_POST, $ data);
if ($res) (
echo "Дані оновлені:$res \n" ;
) else (
echo "Повинні бути передані неправильні дані\n";
}
?>

Postgres, розроблений в оригіналі департаментом UC Berkeley Computer Science Department, був піонером багатьох об'єктно-орієнтованих концепцій, які тепер стали доступними в деяких комерційних БД. Він надає підтримку мови SQL92/SQL99, цілісності транзакцій та розширюваності типів. PostgreSQL це відкритий ресурс, нащадок оригінального Berkeley-коду.

PostgreSQL – це продукт, доступний безкоштовно. Для використання підтримки PostgreSQL вам потрібний PostgreSQL 6.5 або новіший. PostgreSQL 7.0 або новіше - для всіх можливостей модуля PostgreSQL. PostgreSQL підтримує багато кодувань символів, включаючи кодування багатобайтних символів. Поточна версія та інформація про PostgreSQL знаходяться на http://www.postgresql.org/.

Щоб увімкнути підтримку PostgreSQL, потрібна опція --with-pgsql[=DIR] під час компіляції PHP. Якщо модуль спільно використовуваних/shared об'єктів доступний, PostgreSQL-модуль може бути завантажений з використанням директиви extension у файлі php.ini або функції dl(). Підтримувані ini-директиви описані у файлі php.ini-dist, що поставляється разом із вихідним кодом дистрибутива.

Таблиця 1.Зміни імен функцій
Старе ім'яНове ім'я
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()

Не всі функції підтримуються у всіх побудовах/будівлях. Це залежить від версії вашої libpq (The PostgreSQL C Client interface) та від того, як libpq скомпільована. Якщо є відсутня функція, libpq не підтримує можливості, потрібні для цієї функції.

Важливо також, щоб ви використовували більш нову libpq, ніж PostgreSQL Server, з яким з'єднуєтеся. Якщо ви використовуєте libpq старіший, ніж очікує PostgreSQL Server, у вас будуть проблеми.

Починаючи з версії 6.3 (03/02/1998), PostgreSQL використовує стандартний сокет домену unix. TCP-порт НЕ відкривається за замовчуванням. У таблиці описані нові можливості з'єднань. Цей сокет можна знайти в in /tmp/.s.PGSQL.5432. Ця опція може бути включена прапором "-i" для postmaster, та його значенням буде: "прослуховувати TCP/IP-сокети, а також сокети Unix-домену".

Таблиця 2. Postmaster та PHP

З'єднання з PostgreSQL-сервером може бути встановлене наступними парами значень у командному рядку: $conn = pg_connect("host=myHost port=myPort tty=myTTY options=myOptions dbname=myDB user=myUser password=myPassword ");

Попередній синтаксис: $conn = pg_connect ("host", "port", "options", "tty", "dbname")тепер не рекомендується.

Змінні оточення впливають на поведінку PostgreSQL server/client. Наприклад, модуль PostgreSQL шукатиме змінну оточення PGHOST, якщо hostname відсутня в рядку з'єднання. Змінні оточення, що підтримуються, відрізняються в різних версіях. Докладніше про PostgreSQL Programmer's Manual (libpq - Environment Variables).

Переконайтеся, що ви встановили змінні оточення відповідного користувача. Використовуйте $_ENV або getenv()для перевірки того, які змінні оточення доступні для поточного процесу.

Починаючи роботу з PostgreSQL 7.1.0, можна зберігати 1GB у полі типу text. У старіших версіях можуть бути обмеження на розмір блоків (за замовчуванням було 8KB, максимум був 32KB, які визначаються на етапі компіляції).

Для використання інтерфейсу великих об'єктів/large object (lo) необхідно включати lo-функції всередині транзакційного блоку. Блок транзакції починається з SQL-оператора BEGIN, і, якщо транзакція була вірною, закінчується COMMITабо END. Якщо транзакція зазнає невдачі, вона має бути закрита за допомогою ROLLBACKабо ABORT.

Ви не повинні закривати з'єднання з PostgreSQL-сервером до закриття великого об'єкта.

Зміст pg_affected_rows - повертає кількість задіяних записів (пар/tuples) pg_cancel_query - скасовує async-запит pg_client_encoding - отримує клієнтське кодування pg_close - закриває PostgreSQL-з'єднання pg_connect - відкриває PostgreSQL-з'єднання pg_connection_bus з'єднання (reconnect) pg_connection_status - получает статус соединения pg_convert - конвертирует значение ассоциативного массива в значение, подходящее для оператора SQL pg_copy_from - вставляет записи в таблицу из массива pg_copy_to - копирует таблицу в массив pg_dbname - получает имя базы данных pg_delete - удаляет записи pg_end_copy - синхронизирует с PostgreSQL backend pg_escape_bytea - мнемонизирует /еscape binary для типу bytea pg_escape_string - мнемонізує string для типу text/char pg_fetch_array - витягує ряд як масив pg_fetch_object - витягує ряд як об'єкт pg_fetch_result - повертає значення з результуючого ресурсу pg_fetch_row - NULL pg_field_name – повертає ім'я поля pg_field_num – повертає номер іменованого поля pg_field_prtlen – повертає друкований розмір pg_field_size – повертає внутрішній розмір зберігання іменованого поля pg_field_type – повертає ім'я типу для відповідного номера поля

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

pg_convert - Перетворює значення асоціативного масиву на прийнятні для використання в SQL-запитах

Опис

pg_convert (resource $connection , string $table_name , array $assoc_array [, int $options = 0]) : array

pg_convert()перевіряє і перетворює значення assoc_array в прийнятні для SQL-сервера. Необхідно, щоб існувала таблиця table_name , а кількість колонок у ній має бути не меншою, ніж значень у масиві assoc_array . Імена колонок таблиці table_name повинні збігатися з ключами масиву assoc_array , типи даних значень масиву також повинні збігатися з типами даних відповідних колонок. У разі успішної конвертації функція повертає масив перетворених значень, інакше повертає FALSE.

Зауваження:

З версії PHP 5.6.0, допускаються булеві значення. Вони перетворюються на булев тип PostgreSQL. Строкові уявлення булевого значення також підтримуються. NULLперетворюється на PostgreSQL NULL.

До версії PHP 5.6.0, якщо таблиця table_name містить поля булева типу, не використовуйте константу TRUEяк значення масиву table_name для цих полів. Вона буде перетворена на рядок "TRUE", який є неприпустимим значенням для булевих полів у PostgreSQL. Використовуйте значення "t", "true", "1", "y", "yes".

Список параметрів

Ресурс з'єднання з базою даних PostgreSQL.

Table_name

Ім'я таблиці бази даних.

Assoc_array

Дані перетворення.

Options

Одна з констант PGSQL_CONV_IGNORE_DEFAULT, PGSQL_CONV_FORCE_NULLабо PGSQL_CONV_IGNORE_NOT_NULLабо їх комбінація.

Значення, що повертаються

Масив ( array), що містить перетворені дані, або FALSEу разі помилки.

Приклади

Приклад #1 Приклад використання pg_convert()

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

$tmp = array(
"author" => "Joe Thackery" ,
"year" => 2005 ,
"title" => "My Life, by Joe Thackery"
);

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