<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="http://wiki2.linuxformat.ru/skins/common/feed.css?97"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title>LXF89:PostgreSQL - История изменений</title>
		<link>http://wiki2.linuxformat.ru/index.php?title=LXF89:PostgreSQL&amp;action=history</link>
		<description>История изменений этой страницы в вики</description>
		<language>ru</language>
		<generator>MediaWiki 1.11.1</generator>
		<lastBuildDate>Wed, 13 May 2026 20:55:45 GMT</lastBuildDate>
		<item>
			<title>Lockal: восстановление кавычек в коде  AWB</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF89:PostgreSQL&amp;diff=4502&amp;oldid=prev</link>
			<description>&lt;p&gt;восстановление кавычек в коде  &lt;a href=&quot;/index.php?title=Linuxformat:AutoWikiBrowser&amp;amp;action=edit&quot; class=&quot;new&quot; title=&quot;Linuxformat:AutoWikiBrowser&quot;&gt;AWB&lt;/a&gt;&lt;/p&gt;

			&lt;table style=&quot;background-color: white; color:black;&quot;&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;tr&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 14:07, 27 апреля 2008&lt;/td&gt;
			&lt;/tr&gt;
		&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 28:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 28:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;#include &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“libpq&lt;/del&gt;-fe.&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;h”&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;#include &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;libpq&lt;/ins&gt;-fe.&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;h&amp;quot;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;/source&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;/source&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 35:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 35:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;gt; #сборка программы&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;gt; #сборка программы&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;gt; gcc -o &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“бинарник” “исходник”&lt;/del&gt;.c -I&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;`&lt;/del&gt;pg_config --includedir&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;` &lt;/del&gt;\&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;gt; gcc -o &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;бинарник&amp;quot; &amp;quot;исходник&amp;quot;&lt;/ins&gt;.c -I&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'&lt;/ins&gt;pg_config --includedir&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;' &lt;/ins&gt;\&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;-lpq &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;`&lt;/del&gt;/usr/bin/libpq3-config&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;`&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;-lpq &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'&lt;/ins&gt;/usr/bin/libpq3-config&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;gt; cat /usr/bin/libpq3-config&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;gt; cat /usr/bin/libpq3-config&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;#!/bin/bash&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;#!/bin/bash&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 62:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 62:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;const char *conninfo= &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“dbname &lt;/del&gt;= test host=&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;localhost”&lt;/del&gt;;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;const char *conninfo= &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;dbname &lt;/ins&gt;= test host=&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;localhost&amp;quot;&lt;/ins&gt;;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;PGconn *conn=PQconnectdb(conninfo);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;PGconn *conn=PQconnectdb(conninfo);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;if (PQstatus(conn) != CONNECTION_OK) {&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;if (PQstatus(conn) != CONNECTION_OK) {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;fprintf(stderr, &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“Не &lt;/del&gt;удалось соединиться с базой данных: %&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;s”&lt;/del&gt;,&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;fprintf(stderr, &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;Не &lt;/ins&gt;удалось соединиться с базой данных: %&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;s&amp;quot;&lt;/ins&gt;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;PQerrorMessage(conn));&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;PQerrorMessage(conn));&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;/*завершаем работу*/ …}&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;/*завершаем работу*/ …}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;/source&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;/source&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Параметры передаются в форме '''«ключевое слово»=«значение»'''. Пары разделяются обычным пробелом. Пробелы вокруг знака равенства можно опустить. Если необходимо передать значение с пробелами, то его необходимо заключить в одинарные кавычки '''&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;‘«составное» «значение»’&lt;/del&gt;'''. Для передачи одинарной кавычки ее необходимо экранировать с помощью обратной косой черты '''\&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;’&lt;/del&gt;'''. При отсутствии какого-либо параметра в строке '''conninfo''' его значение берется из соответствующей переменной окружения, если таковая определена. Если нет, то при открытии соединения используется значение по умолчанию.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Параметры передаются в форме '''«ключевое слово»=«значение»'''. Пары разделяются обычным пробелом. Пробелы вокруг знака равенства можно опустить. Если необходимо передать значение с пробелами, то его необходимо заключить в одинарные кавычки '''&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'«составное» «значение»'&lt;/ins&gt;'''. Для передачи одинарной кавычки ее необходимо экранировать с помощью обратной косой черты '''\&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'&lt;/ins&gt;'''. При отсутствии какого-либо параметра в строке '''conninfo''' его значение берется из соответствующей переменной окружения, если таковая определена. Если нет, то при открытии соединения используется значение по умолчанию.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Функции открытия соединения распознают следующие параметры и переменные окружения (кое-какие особенности опущены):&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Функции открытия соединения распознают следующие параметры и переменные окружения (кое-какие особенности опущены):&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 132:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 132:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Рабочей частью пакета является исполняемый файл '''bondfrontend''', который осуществляет связь с базой данных и может «прикинуться» любой формой. Описание формы хранится в обычном XML-файле. Используемый диалект XML подробно описан в документации.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Рабочей частью пакета является исполняемый файл '''bondfrontend''', который осуществляет связь с базой данных и может «прикинуться» любой формой. Описание формы хранится в обычном XML-файле. Используемый диалект XML подробно описан в документации.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;[[Изображение:&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;Img_89_87_1&lt;/del&gt;.jpg|thumb|center|300px|Формочки, XML (правда на заднем фоне и без подсветки) и связь с базой данных — это ''bond''.]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;[[Изображение:&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;Img 89 87 1&lt;/ins&gt;.jpg|thumb|center|300px|Формочки, XML (правда на заднем фоне и без подсветки) и связь с базой данных — это ''bond''.]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;История пакета насчитывает уже пять лет. Программа доступна по дуальной лицензии: GPL – для использования со свободным ПО и коммерческой – для использования в проприетарном. Существует версия и для Windows.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;История пакета насчитывает уже пять лет. Программа доступна по дуальной лицензии: GPL – для использования со свободным ПО и коммерческой – для использования в проприетарном. Существует версия и для Windows.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 197:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 197:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;===== Асинхронные сигналы =====&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;===== Асинхронные сигналы =====&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Стандартный ''SQL'' не предполагает взаимодействия разных пользователей, кроме как через изменение данных в таблицах. ''PostgreSQL'' позволяет посылать асинхронные сигналы с помощью команд '''LISTEN''' и '''NOTIFY'''. '''LISTEN &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“имя сигнала”&lt;/del&gt;''' передается серверу как обычная ''SQL''- команда. Если статус запроса становится равным '''PGRES_COMMAND_OK''', то это означает, что ранее был выполнен запрос '''NOTIFY &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“имя сигнала”&lt;/del&gt;'''. Если же инициализация сигнала ('''NOTIFY''') ожидается позже регистрации ('''LISTEN'''), то функция '''PQnotifies''' позволяет вновь проверить наличие сигнала после любого запроса.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Стандартный ''SQL'' не предполагает взаимодействия разных пользователей, кроме как через изменение данных в таблицах. ''PostgreSQL'' позволяет посылать асинхронные сигналы с помощью команд '''LISTEN''' и '''NOTIFY'''. '''LISTEN &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;имя сигнала&amp;quot;&lt;/ins&gt;''' передается серверу как обычная ''SQL''- команда. Если статус запроса становится равным '''PGRES_COMMAND_OK''', то это означает, что ранее был выполнен запрос '''NOTIFY &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;имя сигнала&amp;quot;&lt;/ins&gt;'''. Если же инициализация сигнала ('''NOTIFY''') ожидается позже регистрации ('''LISTEN'''), то функция '''PQnotifies''' позволяет вновь проверить наличие сигнала после любого запроса.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;===== Сборка «мусора» =====&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;===== Сборка «мусора» =====&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 232:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 232:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;EXEC SQL whenever sqlerror do ExitForError();&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;EXEC SQL whenever sqlerror do ExitForError();&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;void ExitForError() {&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;void ExitForError() {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;    fprintf(stderr,&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;”Все&lt;/del&gt;, конец - это фатально.\&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;n”&lt;/del&gt;);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;    fprintf(stderr,&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;Все&lt;/ins&gt;, конец - это фатально.\&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;n&amp;quot;&lt;/ins&gt;);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;    sqlprint();&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;    sqlprint();&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;    exit(1);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;    exit(1);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 242:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 242:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;    // инструкциях ECPG&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;    // инструкциях ECPG&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;    EXEC SQL BEGIN DECLARE SECTION;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;    EXEC SQL BEGIN DECLARE SECTION;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;    const char *dbname = &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“test”&lt;/del&gt;;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;    const char *dbname = &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;test&amp;quot;&lt;/ins&gt;;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;    const char *user = &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“baldin”&lt;/del&gt;;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;    const char *user = &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;baldin&amp;quot;&lt;/ins&gt;;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;    VARCHAR FIO[128];&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;    VARCHAR FIO[128];&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;    VARCHAR NUMBER[128];&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;    VARCHAR NUMBER[128];&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 258:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 258:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;    EXEC SQL FETCH NEXT FROM mycursor INTO :FIO,:NUMBER;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;    EXEC SQL FETCH NEXT FROM mycursor INTO :FIO,:NUMBER;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;    while (sqlca.sqlcode == 0) { // не 0, если данные больше нет&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;    while (sqlca.sqlcode == 0) { // не 0, если данные больше нет&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;        printf(&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“ФИО&lt;/del&gt;: %s номер: %s\&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;n”&lt;/del&gt;,FIO.arr,NUMBER.arr);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;        printf(&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;ФИО&lt;/ins&gt;: %s номер: %s\&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;n&amp;quot;&lt;/ins&gt;,FIO.arr,NUMBER.arr);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;        EXEC SQL FETCH NEXT FROM mycursor INTO :FIO, :NUMBER;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;        EXEC SQL FETCH NEXT FROM mycursor INTO :FIO, :NUMBER;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;    }&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;    }&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 287:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 287:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;| valign=&amp;quot;top&amp;quot; |&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;| valign=&amp;quot;top&amp;quot; |&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Врезка|Заголовок=PostgreSQL в лицах: Сергей Копосов|Содержание=&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Врезка|Заголовок=PostgreSQL в лицах: Сергей Копосов|Содержание=&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;[[Изображение:&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;Img_89_89_1&lt;/del&gt;.jpg|thumb|left|100px]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;[[Изображение:&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;Img 89 89 1&lt;/ins&gt;.jpg|thumb|left|100px]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;'''Визитка LXF:'''&amp;lt;br&amp;gt;Дипломированный физик. Профессиональный астроном. Участник программы Google Summer of Code 2006. Домашняя страница: http://lnfm1.sai.msu.ru/~math/.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;'''Визитка LXF:'''&amp;lt;br&amp;gt;Дипломированный физик. Профессиональный астроном. Участник программы Google Summer of Code 2006. Домашняя страница: http://lnfm1.sai.msu.ru/~math/.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Sun, 27 Apr 2008 14:07:52 GMT</pubDate>			<dc:creator>Lockal</dc:creator>			<comments>http://wiki2.linuxformat.ru/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:LXF89:PostgreSQL</comments>		</item>
		<item>
			<title>Yaleks: шаблон</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF89:PostgreSQL&amp;diff=2812&amp;oldid=prev</link>
			<description>&lt;p&gt;шаблон&lt;/p&gt;

			&lt;table style=&quot;background-color: white; color:black;&quot;&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;tr&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 07:51, 20 марта 2008&lt;/td&gt;
			&lt;/tr&gt;
		&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Цикл/PostgreSQL}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;'''История PostgreSQL''' Изучаем самый мощный из открытых серверов баз данных&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;'''История PostgreSQL''' Изучаем самый мощный из открытых серверов баз данных&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Thu, 20 Mar 2008 07:51:05 GMT</pubDate>			<dc:creator>Yaleks</dc:creator>			<comments>http://wiki2.linuxformat.ru/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:LXF89:PostgreSQL</comments>		</item>
		<item>
			<title>Interlace в 14:07, 18 марта 2008</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF89:PostgreSQL&amp;diff=2676&amp;oldid=prev</link>
			<description>&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;http://wiki2.linuxformat.ru/index.php?title=LXF89:PostgreSQL&amp;amp;diff=2676&amp;amp;oldid=1456&quot;&gt;(Различия между версиями)&lt;/a&gt;</description>
			<pubDate>Tue, 18 Mar 2008 14:07:21 GMT</pubDate>			<dc:creator>Interlace</dc:creator>			<comments>http://wiki2.linuxformat.ru/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:LXF89:PostgreSQL</comments>		</item>
		<item>
			<title>PonElA: /* Открытие и закрытие соединения */</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF89:PostgreSQL&amp;diff=1456&amp;oldid=prev</link>
			<description>&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Открытие и закрытие соединения&lt;/span&gt;&lt;/p&gt;

			&lt;table style=&quot;background-color: white; color:black;&quot;&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;tr&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 12:40, 12 марта 2008&lt;/td&gt;
			&lt;/tr&gt;
		&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 73:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 73:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Для того чтобы разорвать соединение используется функция:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Для того чтобы разорвать соединение используется функция:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; void P Q f i n i s h ( PGconn ∗ conn ) ;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; void P Q f i n i s h ( PGconn ∗ conn ) ;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;{{&lt;/del&gt;ВНИМАНИЕ&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;| &lt;/del&gt;Всегда следует закрывать соединения, когда в них отпадает нужда.&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;}}&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;ВНИМАНИЕ&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;! &lt;/ins&gt;Всегда следует закрывать соединения, когда в них отпадает нужда.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Число соединений которые поддерживает POSTMASTER ограничено очень легко парализовать работу базы данных только открывая новые соединения.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Число соединений которые поддерживает POSTMASTER ограничено очень легко парализовать работу базы данных только открывая новые соединения.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Wed, 12 Mar 2008 12:40:12 GMT</pubDate>			<dc:creator>PonElA</dc:creator>			<comments>http://wiki2.linuxformat.ru/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:LXF89:PostgreSQL</comments>		</item>
		<item>
			<title>PonElA: Новая: '''PostgreSQL. ЧАСТЬ 4: Интерфейсы'''  :В институте им очень дорожили, так как :попутно он использовался для нек...</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF89:PostgreSQL&amp;diff=1455&amp;oldid=prev</link>
			<description>&lt;p&gt;Новая: '''PostgreSQL. ЧАСТЬ 4: Интерфейсы'''  :В институте им очень дорожили, так как :попутно он использовался для нек...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая статья&lt;/b&gt;&lt;/p&gt;&lt;div&gt;'''PostgreSQL. ЧАСТЬ 4: Интерфейсы'''&lt;br /&gt;
&lt;br /&gt;
:В институте им очень дорожили, так как&lt;br /&gt;
:попутно он использовался для некоторых&lt;br /&gt;
:уникальных экспериментов и как переводчик&lt;br /&gt;
:при общении со Змеем Горынычем.&lt;br /&gt;
::АБС о Кощее Бессмертном&lt;br /&gt;
&lt;br /&gt;
==libpq==&lt;br /&gt;
Чтобы общаться с базой данных много функций не надо: одна функция для открытия соединения, одна для посылки запроса, одна для получения ответа и одна для закрытия соединения. В реальности всё немного сложнее, но суть остаётся.&lt;br /&gt;
&lt;br /&gt;
К вопросу о переносимости Библиотека libpq написана на чистом C, поэтому практически везде, где есть gcc, можно организовать связь с PostgreSQL. Мне както пришлось это делать для VAX/VMS всё решилось методом тыка, даже думать почти не потребовалось. Все данные текст, поэтому вопрос бинарной совместимости платформ попросту отсутствует.&lt;br /&gt;
&lt;br /&gt;
С чего начать Для того чтобы воспользоваться вызовами libpq, необходимо для начала установить её. В Debian (Etch) для этого надо установить пакет postgresql-dev:&lt;br /&gt;
 &amp;gt; sudo apt−g e t i n s t a l l p o s t g r e s q l −dev&lt;br /&gt;
Для доступа к функциям libpq необходимо включить в исходник include-файл:&lt;br /&gt;
 #include &amp;quot;libpq−f e . h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Скрипт pg_conﬁg (man pg_conﬁg) позволяет получить информацию куда помещаются include-файлы, библиотеки и тому подобное:&lt;br /&gt;
 &amp;gt; #сборка программы&lt;br /&gt;
 &amp;gt; g cc −o &amp;quot;бинарник&amp;quot; &amp;quot;исходник&amp;quot; . c −I ‘ pg _ co nf i g −−i n c l u d e d i r ‘ \&lt;br /&gt;
 −l p q ‘ pg _ co nf i g −−l i b s ‘&lt;br /&gt;
&lt;br /&gt;
===Открытие и закрытие соединения===&lt;br /&gt;
&lt;br /&gt;
Даже открывать соединение с PostgreSQL можно двумя способами:&lt;br /&gt;
 // открыть соединение&lt;br /&gt;
 PGconn ∗ PQconnectdb ( const char ∗ c o n n i n f o ) ;&lt;br /&gt;
 // то же , но не блокируя программу&lt;br /&gt;
 PGconn ∗ PQconnectStart ( const char ∗ c o n n i n f o ) ;&lt;br /&gt;
 // проверка ст а т уса соединения ( после PQconnectStart )&lt;br /&gt;
 P o s t g r e s P o l l i n g S t a t u s T y p e PQconnectPoll ( PGconn ∗ conn ) ;&lt;br /&gt;
PQconnectdb обычная функция, где на вход подаём текстовую строку conninfo с параметрами для соединения с сервером, а на выходе получаем структуру типа PGconn с информацией о сделанном соединении и на сколько операция по соединению прошла удачно. В дальнейшем при передача данных эта переменная будет использоваться в качестве параметра.&lt;br /&gt;
&lt;br /&gt;
Передача информации о серевере в качестве строки (conninfo) позволяет в случае появления дополнительных параметров не менять внешний интерфейс вызова и легко добавлять дополнительные опции. Пример открытия соединения:&lt;br /&gt;
 const char ∗ c o n n i n f o= &amp;quot;dbname = t est host=lo c alho st &amp;quot; ;&lt;br /&gt;
 PGconn ∗ conn=PQconnectdb ( c o n n i n f o ) ;&lt;br /&gt;
 i f ( PQstatus ( conn ) != CONNECTION_OK) {&lt;br /&gt;
   f p r i n t f ( s t d e r r , &amp;quot;Не удалось соединиться с базой данных: %s&amp;quot; ,&lt;br /&gt;
                                 PQerrorMessage ( conn ) ) ;&lt;br /&gt;
   /∗ завершаем работу ∗/ . . . }&lt;br /&gt;
Параметры передаются в форме ключевое слово = значение. Пары разделяются обычным пробелом. Пробелы вокруг знака равенства можно опустить. Если необходимо передать значение с пробелами, то его необходимо заключить в одинарные кавычки ’ составное значение ’. Для передачи одинарной кавычки её необходимо экранировать с помощью обратной косой черты \’. При отсутствии какого-либо параметра в строке conninfo его значение берётся из соответствующей переменной окружения, если такая определена. Если нет, то при открытии соединения используется значение по умолчанию.&lt;br /&gt;
&lt;br /&gt;
Функции открытия соединения распознают следующие параметры и переменные окружения (кое-какие особенности опущены):&lt;br /&gt;
* '''host TCP/IP''' имя узла на котором находится сервер PostgreSQL. Соответствует переменной окружения PGHOST. Значение по умолчанию localhost.&lt;br /&gt;
* '''hostaddr''' Числовой адрес узла на котором находится PostgreSQL (альтернатива host). Соответствует переменной окружения PGHOSTADDR. Значение по умолчанию эквивалентно localhost.&lt;br /&gt;
* '''port''' Номер порта, который слушает POSTMASTER. Соответствует переменной окружения PGPORT. Значение по умолчанию обычно 5432.&lt;br /&gt;
* '''dbname''' Имя базы данных. Соответствует переменной окружения PGDATABASE. Значение по умолчанию совпадает с системной учётной записью пользователя.&lt;br /&gt;
* '''user''' Имя пользователя базы данных. Соответствует переменной окружения PGUSER. Значение по умолчанию совпадает с системной учётной записью пользователя.&lt;br /&gt;
* '''password''' Поле пароля, если для аутентификации требуется пароль. Соответствует переменной окружения PGPASSWORD. Если аутентификация требуется, а поле неопределенно, то для доступа используется информация в файле ~/.pgpass. Переменная окружения PGPASSFILE может указать другой файл для проведения аутентификации.&lt;br /&gt;
* '''connect_timeout''' Устанавливает максимальное время ожидания соединения в секундах. С сервером и сетью всякое может случиться. Соответствует переменной окружения PGCONNECT_TIMEOUT. Значение по умолчанию равно 0, что означает что время ожидания равно бесконечности. Не рекомендуется устанавливать значение на ожидание меньше 2 секунд.&lt;br /&gt;
* '''options''' Опции, посылаемые непосредственно серверу, коли такое потребуется. Соответствует переменной окружения PGOPTIONS.&lt;br /&gt;
* '''sslmode''' Определяет порядок действий при SSL-соединении. Принимает четыре возможных значения:&lt;br /&gt;
** '''disable'''     без шифрации,&lt;br /&gt;
** '''allow'''    сначала попробовать соединиться без шифрации, а в случае неудачи постараться установить защищённое соединение,&lt;br /&gt;
** '''prefer'''    сначала попробовать установить защищённое соединения, а в случае неудачи повторить соединение без шифрации,&lt;br /&gt;
** '''require'''     выполнять только защищённое соединение. &lt;br /&gt;
&lt;br /&gt;
Соответствует переменной окружения PGSSLMODE. Значение по умолчанию prefer.&lt;br /&gt;
* '''krbsrvname''' Имя Kerberos-сервиса. используется для аутентификации с помощью Kerberos-5&amp;lt;ref&amp;gt;&lt;br /&gt;
Kerberos промышленный стандарт для аутентификации и взаимодействия в условиях незащищённого окружения. Алгоритмы Kerberos основаны на шифровании с использованием симметричного криптографического ключа и требует наличие доверенного агента.&lt;br /&gt;
&amp;lt;/ref&amp;gt;. Это совершенно отдельная тема для беседы. Соответствует переменной окружения PGKRBSRVNAME.&lt;br /&gt;
&lt;br /&gt;
 PGDATESTYLE      Переменная окружения, позволяющая установить представление времени и даты по умолчанию. Соответствует SQL-команде SET datestyle TO. . .&lt;br /&gt;
 PGTZ             Переменная окружения, позволяющая установить текущий часовой пояс. Соответствует SQL-команде SET timezone TO. . .&lt;br /&gt;
 PGCLIENTENCODING Переменная окружения, позволяющая установить кодировку клиента. Соответствует SQL-команде SET client_encoding TO. . .&lt;br /&gt;
&lt;br /&gt;
Существует целый класс функций, которые позволяют получить информацию о соединении. Для подробностей следует обратиться к документации. Для начала полезно знать о двух из них:&lt;br /&gt;
 ConnStatusType PQstatus ( const PGconn ∗ conn ) ;&lt;br /&gt;
 char ∗ PQerrorMessage ( const PGconn ∗ conn ) ;&lt;br /&gt;
PQstatus возвращает информацию о том, как прошло соединение. Интересны состояния CONNECTION_OK всё хорошо и CONNECTION_BAD ничего не вышло. Функция PQerrorMessage позволяет получить текстовую строку с описанием последней возникшей проблемы.&lt;br /&gt;
&lt;br /&gt;
Для того чтобы разорвать соединение используется функция:&lt;br /&gt;
 void P Q f i n i s h ( PGconn ∗ conn ) ;&lt;br /&gt;
{{ВНИМАНИЕ| Всегда следует закрывать соединения, когда в них отпадает нужда.}}&lt;br /&gt;
Число соединений которые поддерживает POSTMASTER ограничено очень легко парализовать работу базы данных только открывая новые соединения.&lt;br /&gt;
&lt;br /&gt;
===SQL запросы===&lt;br /&gt;
Что ж, до сервера уже дозвонились , теперь пора с ним поговорить. &lt;br /&gt;
&lt;br /&gt;
'''Посылка запросов''' Простейший способ выполнить SQL-запрос, это воспользоваться функцией PQexec:&lt;br /&gt;
 PG r esul t ∗PQexec ( PGconn ∗ conn , const char ∗command ) ;&lt;br /&gt;
В качестве параметров передаётся структура соединения conn и строка с SQL-командой command. Возвращается указатель на структуру типа PGresult, где сохраняется информация полученная от СУБД в ответ на запрос. При желании можно в одном запросе отсылать сразу несколько SQL-команд, разделённых точкой с запятой ; , но в этом случае информация сохранённая в структуре PGresult будет относиться только к последнему запросу.&lt;br /&gt;
&lt;br /&gt;
По умолчанию каждый PQexec считается за отдельную транзакцию, если явно не начать транзакцию с помощью команды BEGIN, которая будет продолжаться либо до COMMIT, либо до ROLLBACK.&lt;br /&gt;
&lt;br /&gt;
Есть более сложный вызов PQexecParams, который позволяет передавать вызов и параметры к этому вызову раздельно. Таким образом исчезает необходимость самостоятельно формировать строку SQL-команды и заботиться об экранировании данных, что важно в случае сохранения бинарных последовательностей. В качестве платы из соображения безопасности PQexecParams может послать не более одной команды за раз.&lt;br /&gt;
&lt;br /&gt;
В некоторых случаях для увеличения скорости выполнения часто встречающихся запросов полезно обратить внимание на парочку PQprepare и PQexecPrepared. Эти команды эквивалентны своим SQL-аналогам PREPARE и EXECUTE. Идея оптимизации состоит в том, что прежде чем выполнить запрос, PostgreSQL сначала анализирует его, затем планирует порядок действий и только потом, собственно, выполняет запрос. Первые два этапа для похожих запросов с разными условиями отбора можно выполнить заранее с помощью команды PREPARE. Затем, с помощью команды EXECUTE, можно выполнять подобные уже подготовленные (prepared)&lt;br /&gt;
запросы.&lt;br /&gt;
&lt;br /&gt;
Все упомянутые выше команды работают с сервером БД синхронным образом, то есть посылают запрос и ждут ответа. Клиентское приложение на это время засыпает (suspended). В libpq предусмотрен целый класс функций предназначенный для асинхронных операций, не блокирующих клиентское приложение. Их применение усложняет код и логику программы, хотя всё в пределах допустимого. С моей точки зрения лучше организовать всё так, чтобы время использованное на ожидание результатов запроса фатально не влияло на внешние процессы и обеспечить бесперебойную работу сети и сервера базы данных. &lt;br /&gt;
&lt;br /&gt;
'''Информация о состоянии запроса''' После выполнения запроса всегда интересно узнать каково его состояние:&lt;br /&gt;
 ExecStatusType P Q r e s u l t S t a t u s ( const PG r esul t ∗ r e s ) ;&lt;br /&gt;
На вход подаётся структура PGresult, создаваемая в результате работы PQexec подобных функций, а на выходе получаем информацию о состоянии в виде числа, значение которого можно сравнить со следующими константами:&lt;br /&gt;
 PGRES_COMMAND_OK     всё прошло хорошо (для запросов, которые не возвращают данные, например, INSERT),&lt;br /&gt;
 PGRES_TUPLES_OK      всё прошло хорошо, плюс получены данные в ответ на запрос (для запросов типа SELECT или SHOW),&lt;br /&gt;
 PGRES_EMPTY_QUERY    строка запроса была почему-то пустой,&lt;br /&gt;
 PGRES_COPY_OUT       идёт передача данных от сервера,&lt;br /&gt;
 PGRES_COPY_IN        идёт передача данных на сервер,&lt;br /&gt;
 PGRES_BAD_RESPONSE   ошибка, ответ сервера не разборчив,&lt;br /&gt;
 PGRES_NONFATAL_ERROR ошибка, не смертельно: предупреждение (notice) или информация к сведению (warning),&lt;br /&gt;
 PGRES_FATAL_ERROR    при выполнении запроса произошла серьёзная ошибка.&lt;br /&gt;
&lt;br /&gt;
Для получения более подробной информации об ошибке следует воспользоваться функцией&lt;br /&gt;
 char ∗ PQ r esul t Er r o r Messa g e ( const PG r esul t ∗ r e s ) ;&lt;br /&gt;
При вызове этой функции в качестве результата будет сформирована строка с информацией об ошибке или пустая строка если всё прошло хорошо. &lt;br /&gt;
&lt;br /&gt;
'''Получение данных''' При получении данных предполагается, что статус запроса соответствует PGRES_TUPLES_OK. Теперь, если примерно известно что хочется получить в результате запроса, то для получения данных достаточно четырёх функций:&lt;br /&gt;
 int PQntuples ( const PG r esul t ∗ r e s ) ;&lt;br /&gt;
 int P Q n f i e l d s ( const PG r esul t ∗ r e s ) ;&lt;br /&gt;
 char ∗ PQgetvalue ( const PG r esul t ∗ r e s ,&lt;br /&gt;
                             int row_number , int column_number ) ;&lt;br /&gt;
 int P Q g e t i s n u l l ( const PG r esul t ∗ r e s ,&lt;br /&gt;
                             int row_number , int column_number ) ;&lt;br /&gt;
Первые две функции являются информационными и позволяют узнать сколько в результате запроса получено строк (PQntuples) и сколько колонок в каждой такой строке (PQnﬁelds). Возьмите на заметку, что 0 строк это тоже хороший результат.&lt;br /&gt;
&lt;br /&gt;
Функция PQgetvalue позволяет получить доступ к полученным данным. В качестве параметров кроме структуры соединения (res) передаётся номер строки (column_number) и номер колонки (column_number). Все данные возвращаются так же в виде текстовой строки, как и посылаются, то есть, эти данные необходимо перевести в привычный формат. Например, в случае целых чисел можно восполь-&lt;br /&gt;
зоваться функцией atoi.&lt;br /&gt;
&lt;br /&gt;
Следует помнить, что данные SQL могут иметь неопределённое значение (NULL). Если подобная возможность существует, то перед получением значения проверить, а определено ли оно. PQgetisnull позволяет разобраться с этой проблемой. По передаваемым параметрам эта функция эквивалентна PQgetvalue, а в качестве результата возвращает 1, если значение не определено и 0, если опеределено.&lt;br /&gt;
&lt;br /&gt;
Кроме упомянутых существует целый ряд функций, позволяющих получить информацию о полученных данных, как то: имя колонки (PQfname), размер передаваемых данных в байтах (PQgetlength) и тому подобное. Для экранирования специальных символов при операции с бинарными или текстовыми данными есть набор сервисных функций PQescape∗.&lt;br /&gt;
&lt;br /&gt;
'''COPY''' SQL команда COPY является расширением специфичным для PostgreSQL.&lt;br /&gt;
&lt;br /&gt;
Основное преимущество SQL  всё есть понятный текст, в некоторых случаях, когда надо передавать большие объёмы данных, оборачивается недостатком.&lt;br /&gt;
Функции PQputCopyData и PQgetCopyData позволяют под час значительно ускорить передачу данных между сервером и клиентом.&lt;br /&gt;
&lt;br /&gt;
'''Асинхронные сигналы''' Стандартный SQL не предполагает взаимодействия разных пользователей, кроме как через изменение данных в таблицах. PostgreSQL позволяет посылать асинхронные сигналы с помощью команд LISTEN и NOTIFY. LISTEN &amp;quot;имя сигнала&amp;quot; передаётся серверу как обычная SQL-команда. Если статус запроса становится равным PGRES_COMMAND_OK, то это означает, что ранее был выполнен запрос NOTIFY &amp;quot;имя сигнала&amp;quot;. Если же инициализация сигнала (NOTIFY) ожидается позже регистрации (LISTEN), то функция PQnotiﬁes позволяет после любого запроса проверить наличие сигнала вновь.&lt;br /&gt;
&lt;br /&gt;
'''Сборка мусора''' Мусор убирать придётся руками. Каждая функция типа PQexec создаёт объект типа PGresult. После того как вся необходимая информация о результатах запроса получена, следует освободить память, занимаемую этим объектом с помощью команды:&lt;br /&gt;
 void PQclear ( PG r esul t ∗ r e s ) ;&lt;br /&gt;
Если утечки памяти Вас не волнуют, то можно этого и не делать. В этом случае следует побеспокоиться о том: Почему Вас не беспокоят утечки памяти?&lt;br /&gt;
&lt;br /&gt;
===Большие объекты===&lt;br /&gt;
Ещё один способ сохранять неструктурированные данные в PostgreSQL это пихать их как большие объекты (Large Objects). PostgreSQL предоставляет интерфейс схожим с файловым интерфейсом Unix: open (lo_open), read (lo_read), write (lo_write), lseek (lo_lseek) и так далее. Все lo_∗ команды работают со значениями полученными из колонки с типом oid. oid это специальный тип данных, который является ссылкой на объект произвольного типа. То есть последовательность работы с большим объектом следующая: создаётся большой объект (lo_create). Далее возвращаемый lo_create указатель Oid используется для записи данных в большой объект (lo_import/lo_write), а затем этот указатель вставляется в таблицу с помощью стандартных SQL операторов. Чтение происходит в обратном порядке (lo_export/lo_read). Все операции с большими объектами должны происходить внутри транзакции.&lt;br /&gt;
&lt;br /&gt;
'''P.S.''' Необходимость интерфейса больших объектов на текущий момент не так уж и очевидна. Стандартными средствами в PostgreSQL можно сохранять бинарные данные размером вплоть до 1 Гб, что вполне может соперничать с максимальным размером для большого объекта в 2 Гб.&lt;br /&gt;
&lt;br /&gt;
==ECPG==&lt;br /&gt;
Чтобы не отставать от коммерческих баз данных PostgreSQL имеет свой собственный вариант встроенного SQL . Эта технология позволяет смешивать обычный язык C с SQL-структурами, примерно следующим образом:&lt;br /&gt;
&lt;br /&gt;
 // файл test.pgc&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
 // структура для обработки ошибок&lt;br /&gt;
 EXEC SQL i n c l u d e s q l c a ;&lt;br /&gt;
 // реакция в случае ошибки/ предупреждения&lt;br /&gt;
 EXEC SQL whenever s q l w a r n i n g s q l p r i n t ;&lt;br /&gt;
 EXEC SQL whenever s q l e r r o r do E x i t F o r E r r o r ( ) ;&lt;br /&gt;
 void E x i t F o r E r r o r ( ) {&lt;br /&gt;
  f p r i n t f ( s t d e r r , &amp;quot;Всё , конец − это фатально .\n&amp;quot; ) ;&lt;br /&gt;
  sqlprint ();&lt;br /&gt;
  exit (1);&lt;br /&gt;
 }&lt;br /&gt;
 int main ( int argc , char ∗∗ argv )&lt;br /&gt;
 {&lt;br /&gt;
 // определение переменных , чтобы их можно было использовать&lt;br /&gt;
 // инструкциях ECPG&lt;br /&gt;
  EXEC SQL BEGIN DECLARE SECTION;&lt;br /&gt;
    const char ∗dbname = &amp;quot; t est &amp;quot; ;&lt;br /&gt;
    const char ∗ u s e r = &amp;quot;baldin&amp;quot; ;&lt;br /&gt;
   VARCHAR FIO [ 1 2 8 ] ;&lt;br /&gt;
   VARCHAR NUMBER[ 1 2 8 ] ;&lt;br /&gt;
  EXEC SQL END DECLARE SECTION ;&lt;br /&gt;
 // соединение с базой данных&lt;br /&gt;
 // внешние переменные предваряются двоеточием&lt;br /&gt;
  EXEC SQL CONNECT TO : dbname USER : u s e r ;&lt;br /&gt;
 // определение курсора через SELECT&lt;br /&gt;
  EXEC SQL DECLARE mycursor CURSOR FOR&lt;br /&gt;
     SELECT f i o , number FROM f i o d a t a , phonedata&lt;br /&gt;
                                       WHERE f i o d a t a . i d=phonedata . i d ;&lt;br /&gt;
  EXEC SQL open mycursor ;&lt;br /&gt;
 // чтение данных из курсора&lt;br /&gt;
  EXEC SQL FETCH NEXT FROM mycursor INTO : FIO , :NUMBER;&lt;br /&gt;
  while ( s q l c a . s q l c o d e == 0 ) { // не 0 , если данные больше нет&lt;br /&gt;
      p r i n t f ( &amp;quot; И %s номер : %s\n&amp;quot; , FIO . a r r ,NUMBER. a r r ) ;&lt;br /&gt;
                     Ф О:&lt;br /&gt;
     EXEC SQL FETCH NEXT FROM mycursor INTO : FIO , :NUMBER;&lt;br /&gt;
  }&lt;br /&gt;
 // разъединение с базой данных&lt;br /&gt;
 EXEC SQL DISCONNECT;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Все SQL-команды начинаются с метки EXEC SQL. Эта метка позволяет затем препроцессору ecpg обработать и произвести C-исходник. Внутри SQL-команд можно использовать C-переменные. Для этого переменным в начале добавляется двоеточие : .&lt;br /&gt;
&lt;br /&gt;
Для компиляции выше процитированного исходника (файл test1.pgc) необходимо выполнить следующие действия:&lt;br /&gt;
 &amp;gt; # установить ecpg&lt;br /&gt;
 &amp;gt; sudo apt−g e t i n s t a l l l i b e c p g −dev&lt;br /&gt;
 &amp;gt; # запустить препроцессор&lt;br /&gt;
 &amp;gt; ecpg t e s t 1 . pgc&lt;br /&gt;
 &amp;gt; # скомпилировать получившийся исходник&lt;br /&gt;
 &amp;gt; g cc −o t e s t 1 t e s t 1 . c −I ‘ pg _ co nf i g −−i n c l u d e d i r ‘ −l e c p g&lt;br /&gt;
 &amp;gt; # проверка работоспособности программы&lt;br /&gt;
 &amp;gt; ./ test1&lt;br /&gt;
 ФИО: Иванов И.П. номер : 555−32−23&lt;br /&gt;
 ФИО: Балдин Е .М. номер : 555−41−37&lt;br /&gt;
 ФИО: Балдин Е .М. номер : (+7)5559323919&lt;br /&gt;
&lt;br /&gt;
Удобно это или нет решайте сами.&lt;br /&gt;
&lt;br /&gt;
==Всё остальное==&lt;br /&gt;
Статья называется Интерфейсы , а большая часть посвящена только одному из них. Дело в том, что этот один является родным и наиболее полным, а всё остальное лишь подмножество. В простейшем случае все интерфейсы одинаковы: открыл соединение, послал запрос, обработал результаты запроса, закрыл соединение. Так же заметна энергосберегающая тенденция везде делать ровно один интерфейс на все типы СУБД.&lt;br /&gt;
&lt;br /&gt;
* '''bash''' Да, да к bash тоже есть свой интерфейс, правда для этого надо патчить его исходники. Возни, конечно, не мало зато прямо в shell-скриптах можно обращать к базе данных.  [http://www.psn.co.jp/PostgreSQL/pgbash/index-e.html Страничка проекта].&lt;br /&gt;
&lt;br /&gt;
* '''Java''' Совершенно ожидаемо, что Java общается с PostgreSQL стандартным образом, а именно через JDBC. Поэтому если знаком с Java, то достаточно добыть драйвер JDBC для PostgreSQL, например [http://jdbc.postgresql.org/ отсюда] или в Debian (Sarge) набрать&lt;br /&gt;
 &amp;gt; sudo apt−g e t i n s t a l l l i b p g j a v a&lt;br /&gt;
и, прочитав README к пакету, приступить к работе.&lt;br /&gt;
&lt;br /&gt;
* '''lisp''' Точнее Common Lisp. Скорее всего эти драйвера подойдут и для других диалектов:&lt;br /&gt;
 &amp;gt; sudo apt−g e t i n s t a l l c l −pg&lt;br /&gt;
 #или&lt;br /&gt;
 &amp;gt; sudo apt−g e t i n s t a l l c l −s q l −p o s t g r e s q l&lt;br /&gt;
Второй вариант является драйвером для единого интерфейса доступа к SQL-базам данных из Common Lisp [http://clsql.b9.com/ CLSQL].&lt;br /&gt;
&lt;br /&gt;
* '''perl''' Интерфейс для связи с PostgreSQL DBD-Pg используется в perl через DBI&amp;lt;ref&amp;gt;DBI унифицированный интерфейс для доступа к данным. Подробнее об этом пакете можно посмотреть на CTAN: http://search.cpan.org/~timb/DBI-1.52/DBI.pm&amp;lt;/ref&amp;gt;. Все подробности на [http://search.cpan.org/~dbdpg/DBD-Pg/Pg.pm CTAN].&lt;br /&gt;
 &amp;gt; l i bdbd −pg−p e r l&lt;br /&gt;
DBD-Pg охватывает фактически все имеющиеся на сегодня возможности PostgreSQL от больших объектов (large objects), до точек сохранения (savepoints).&lt;br /&gt;
&lt;br /&gt;
* '''PHP''' О том как использовать PostgreSQL в PHP-проектах можно прочитать [http://www.php.net/manual/en/ref.pgsql.php здесь]. Установить драйвер можно, например, так:&lt;br /&gt;
 &amp;gt; sudo apt−g e t i n s t a l l php5−p g s q l&lt;br /&gt;
Говорят, почти единственной причиной, по которой PHP-разработчики предпочитают MySQL является то, что раньше не было родной версии PostgreSQL под альтернативную операционную систему. С версии 8.0 PostgreSQL конкретно этот довод против уже не работает.&lt;br /&gt;
&lt;br /&gt;
* '''Python''' Модуль для Python существует уже больше десяти лет. Подробности выясняются [http://www.druid.net/pygresql/ здесь]. Установка модуля:&lt;br /&gt;
 &amp;gt; sudo apt−g e t i n s t a l l python−p y g r e s q l&lt;br /&gt;
Более молодая и по утверждениям пользователей более стабильная библиотека для связи с PostgreSQL psycopg2 (http://initd.org/projects/psycopg2) так же устанавливается из коробки:&lt;br /&gt;
 &amp;gt; sudo apt−g e t i n s t a l l python−psycopg2&lt;br /&gt;
&lt;br /&gt;
* '''Ruby''' Что-то есть [http://ruby.scripting.ca/postgres/ здесь]. Установка, как обычно:&lt;br /&gt;
 &amp;gt; sudo apt−g e t i n s t a l l l i bdbd −pg−ruby&lt;br /&gt;
&lt;br /&gt;
* '''ODBC''' Разработка драйвера идёт на pgFoundry, аскетичная страничка проекта [http://pgfoundry.org/projects/psqlodbc/ здесь]. Установка:&lt;br /&gt;
 &amp;gt; sudo apt−g e t i n s t a l l odbc−p o s t g r e s q l&lt;br /&gt;
&lt;br /&gt;
==Послесловие==&lt;br /&gt;
Очевидно, что есть много чего ещё. При желании можно самому написать, благо родной C-интерфейс уже знаком, а логика достаточно прозрачна: открыл соединение, обменялся [SQL]-запросами и обязательно закрыл соединение. С другой стороны не стоит изобретать велосипеда и лучше для начала посмотреть, что было уже сделано, например, [http://techdocs.postgresql.org/oresources.php здесь].&lt;br /&gt;
===Врезка про bond===&lt;br /&gt;
Лень писать всё самому? Но не лень изучать XML? Тогда BOND это программа для Вас. [http://www.treshna.com/bond/ Сайт проекта].&lt;br /&gt;
&lt;br /&gt;
Рабочей частью пакета является исполняемый файл bondfrontend, который осуществляет связь с базой данных и может прикинуться любой формой. Описание формы хранится в обычном xml-файле. Используемый диалект xml подробно описан в документации.&lt;br /&gt;
&lt;br /&gt;
Рис. 4.1. Формочки, XML (правда на заднем фоне и без подсветки) и связь с базой данных это bond&lt;br /&gt;
&lt;br /&gt;
История пакета насчитывает уже пять лет. Программа доступна под GPL, то есть исходники производных продуктов надо открывать, а если хочется пожадничать, то есть версия и для такого случая, но за деньги. Доступна версия и под win32.&lt;br /&gt;
&lt;br /&gt;
Внимательно читаем README и устанавливаем всё что там перечисляется. Сборка осуществляется с помощью scons, который позиционируется как замена make с функциональность automake/autoconf и синтаксисом от Python. Установка по умолчанию производится /usr/local/. Для установки (scons install ) необходимы привилегии системного администратора. Далее читаем документацию и изучаем директорию examples.&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</description>
			<pubDate>Wed, 12 Mar 2008 12:39:02 GMT</pubDate>			<dc:creator>PonElA</dc:creator>			<comments>http://wiki2.linuxformat.ru/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:LXF89:PostgreSQL</comments>		</item>
	</channel>
</rss>