~ubuntu-branches/ubuntu/trusty/postgresql-9.3/trusty-updates

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML
><HEAD
><TITLE
>Asynchronous Notification</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK
REV="MADE"
HREF="mailto:pgsql-docs@postgresql.org"><LINK
REL="HOME"
TITLE="PostgreSQL 9.3.13 Documentation"
HREF="index.html"><LINK
REL="UP"
TITLE="libpq - C Library"
HREF="libpq.html"><LINK
REL="PREVIOUS"
TITLE="The Fast-Path Interface"
HREF="libpq-fastpath.html"><LINK
REL="NEXT"
TITLE="Functions Associated with the COPY Command"
HREF="libpq-copy.html"><LINK
REL="STYLESHEET"
TYPE="text/css"
HREF="stylesheet.css"><META
HTTP-EQUIV="Content-Type"
CONTENT="text/html; charset=ISO-8859-1"><META
NAME="creation"
CONTENT="2016-05-09T21:13:26"></HEAD
><BODY
CLASS="SECT1"
><DIV
CLASS="NAVHEADER"
><TABLE
SUMMARY="Header navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="5"
ALIGN="center"
VALIGN="bottom"
><A
HREF="index.html"
>PostgreSQL 9.3.13 Documentation</A
></TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="top"
><A
TITLE="The Fast-Path Interface"
HREF="libpq-fastpath.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="top"
><A
HREF="libpq.html"
ACCESSKEY="U"
>Up</A
></TD
><TD
WIDTH="60%"
ALIGN="center"
VALIGN="bottom"
>Chapter 31. <SPAN
CLASS="APPLICATION"
>libpq</SPAN
> - C Library</TD
><TD
WIDTH="20%"
ALIGN="right"
VALIGN="top"
><A
TITLE="Functions Associated with the COPY Command"
HREF="libpq-copy.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="LIBPQ-NOTIFY"
>31.8. Asynchronous Notification</A
></H1
><P
>   <SPAN
CLASS="PRODUCTNAME"
>PostgreSQL</SPAN
> offers asynchronous notification
   via the <TT
CLASS="COMMAND"
>LISTEN</TT
> and <TT
CLASS="COMMAND"
>NOTIFY</TT
>
   commands.  A client session registers its interest in a particular
   notification channel with the <TT
CLASS="COMMAND"
>LISTEN</TT
> command (and
   can stop listening with the <TT
CLASS="COMMAND"
>UNLISTEN</TT
> command).  All
   sessions listening on a particular channel will be notified
   asynchronously when a <TT
CLASS="COMMAND"
>NOTIFY</TT
> command with that
   channel name is executed by any session. A <SPAN
CLASS="QUOTE"
>"payload"</SPAN
> string can
   be passed to communicate additional data to the listeners.
  </P
><P
>   <SPAN
CLASS="APPLICATION"
>libpq</SPAN
> applications submit
   <TT
CLASS="COMMAND"
>LISTEN</TT
>, <TT
CLASS="COMMAND"
>UNLISTEN</TT
>,
   and <TT
CLASS="COMMAND"
>NOTIFY</TT
> commands as
   ordinary SQL commands.  The arrival of <TT
CLASS="COMMAND"
>NOTIFY</TT
>
   messages can subsequently be detected by calling
   <CODE
CLASS="FUNCTION"
>PQnotifies</CODE
>.
  </P
><P
>   The function <CODE
CLASS="FUNCTION"
>PQnotifies</CODE
> returns the next notification
   from a list of unhandled notification messages received from the server.
   It returns a null pointer if there are no pending notifications.  Once a
   notification is returned from <CODE
CLASS="FUNCTION"
>PQnotifies</CODE
>, it is considered
   handled and will be removed from the list of notifications.

</P><PRE
CLASS="SYNOPSIS"
>PGnotify *PQnotifies(PGconn *conn);

typedef struct pgNotify
{
    char *relname;              /* notification channel name */
    int  be_pid;                /* process ID of notifying server process */
    char *extra;                /* notification payload string */
} PGnotify;</PRE
><P>

   After processing a <TT
CLASS="STRUCTNAME"
>PGnotify</TT
> object returned
   by <CODE
CLASS="FUNCTION"
>PQnotifies</CODE
>, be sure to free it with
   <CODE
CLASS="FUNCTION"
>PQfreemem</CODE
>.  It is sufficient to free the
   <TT
CLASS="STRUCTNAME"
>PGnotify</TT
> pointer; the
   <TT
CLASS="STRUCTFIELD"
>relname</TT
> and <TT
CLASS="STRUCTFIELD"
>extra</TT
>
   fields do not represent separate allocations.  (The names of these fields
   are historical; in particular, channel names need not have anything to
   do with relation names.)
  </P
><P
>   <A
HREF="libpq-example.html#LIBPQ-EXAMPLE-2"
>Example 31-2</A
> gives a sample program that illustrates
   the use of asynchronous notification.
  </P
><P
>   <CODE
CLASS="FUNCTION"
>PQnotifies</CODE
> does not actually read data from the
   server; it just returns messages previously absorbed by another
   <SPAN
CLASS="APPLICATION"
>libpq</SPAN
> function.  In prior releases of
   <SPAN
CLASS="APPLICATION"
>libpq</SPAN
>, the only way to ensure timely receipt
   of <TT
CLASS="COMMAND"
>NOTIFY</TT
> messages was to constantly submit commands, even
   empty ones, and then check <CODE
CLASS="FUNCTION"
>PQnotifies</CODE
> after each
   <CODE
CLASS="FUNCTION"
>PQexec</CODE
>.  While this still works, it is deprecated
   as a waste of processing power.
  </P
><P
>   A better way to check for <TT
CLASS="COMMAND"
>NOTIFY</TT
> messages when you have no
   useful commands to execute is to call
   <CODE
CLASS="FUNCTION"
>PQconsumeInput</CODE
>, then check
   <CODE
CLASS="FUNCTION"
>PQnotifies</CODE
>.  You can use
   <CODE
CLASS="FUNCTION"
>select()</CODE
> to wait for data to arrive from the
   server, thereby using no <ACRONYM
CLASS="ACRONYM"
>CPU</ACRONYM
> power unless there is
   something to do.  (See <CODE
CLASS="FUNCTION"
>PQsocket</CODE
> to obtain the file
   descriptor number to use with <CODE
CLASS="FUNCTION"
>select()</CODE
>.) Note that
   this will work OK whether you submit commands with
   <CODE
CLASS="FUNCTION"
>PQsendQuery</CODE
>/<CODE
CLASS="FUNCTION"
>PQgetResult</CODE
> or
   simply use <CODE
CLASS="FUNCTION"
>PQexec</CODE
>.  You should, however, remember
   to check <CODE
CLASS="FUNCTION"
>PQnotifies</CODE
> after each
   <CODE
CLASS="FUNCTION"
>PQgetResult</CODE
> or <CODE
CLASS="FUNCTION"
>PQexec</CODE
>, to
   see if any notifications came in during the processing of the command.
  </P
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
SUMMARY="Footer navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="libpq-fastpath.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
ACCESSKEY="H"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="libpq-copy.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>The Fast-Path Interface</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="libpq.html"
ACCESSKEY="U"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Functions Associated with the <TT
CLASS="COMMAND"
>COPY</TT
> Command</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>