Mercurial > forge
annotate main/database/inst/pq_lo_view.m @ 12097:b9544a96bc8d octave-forge
support viewing large objects with viewers needing a temporary file
* inst/pq_lo_view.m: New function file.
* src/__pq_internal_exit__.cc: New file.
* src/Makefile.in: Include __pq_internal_exit__.cc.
* NEWS, INDEX, DESCRIPTION: Respective changes.
author | i7tiol |
---|---|
date | Tue, 08 Oct 2013 13:54:46 +0000 |
parents | |
children | 52ca082757c2 |
rev | line source |
---|---|
12097
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
1 ## Copyright (C) 2013 Olaf Till <i7tiol@t-online.de> |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
2 ## |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
3 ## This program is free software; you can redistribute it and/or modify it under |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
4 ## the terms of the GNU General Public License as published by the Free Software |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
5 ## Foundation; either version 3 of the License, or (at your option) any later |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
6 ## version. |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
7 ## |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
8 ## This program is distributed in the hope that it will be useful, but WITHOUT |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
9 ## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
10 ## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
11 ## details. |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
12 ## |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
13 ## You should have received a copy of the GNU General Public License along with |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
14 ## this program; if not, see <http://www.gnu.org/licenses/>. |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
15 |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
16 ## -*- texinfo -*- |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
17 ## @deftypefn {Function File} pq_lo_view (@var{connection}, @var{oid}, @var{viewer}) |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
18 ## |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
19 ## Exports the large object of Oid @var{oid} in the database associated |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
20 ## with @var{connection} to a temporary file and starts the program |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
21 ## @var{viewer} in the background with the name of the temporary file as |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
22 ## argument. |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
23 ## |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
24 ## The temporary file will be removed after termination of the viewer. |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
25 ## |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
26 ## @end deftypefn |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
27 |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
28 function pq_lo_view (conn, oid, viewer) |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
29 |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
30 if (nargin () != 3 || ! ischar (viewer) || rows (viewer) != 1) |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
31 print_usage (); |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
32 endif |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
33 |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
34 if (([opid, omsg] = fork ()) == 0) |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
35 ## outer child |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
36 |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
37 unwind_protect |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
38 |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
39 if (([vpid, vmsg] = fork ()) == 0) |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
40 ## child for viewer |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
41 |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
42 unwind_protect |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
43 |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
44 ## We don't rely on Octave to delete the tempfile since we |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
45 ## perform a "shortcut" exit from Octave in the child. |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
46 if (([~, tname, msg] = mkstemp ... |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
47 (fullfile (P_tmpdir (), "octave-pq_lo_view-XXXXXX"))) == -1) |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
48 error ("could not make temporary file: %s", msg); |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
49 endif |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
50 |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
51 unwind_protect |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
52 |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
53 ## throws an error for errors |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
54 pq_lo_export (conn, oid, tname); |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
55 |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
56 if (system (sprintf ("%s %s", viewer, tname)) != 0) |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
57 error ("error in execution of viewer program or viewer terminated by a signal"); |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
58 endif |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
59 |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
60 unwind_protect_cleanup |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
61 |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
62 unlink (tname); |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
63 |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
64 end_unwind_protect |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
65 |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
66 unwind_protect_cleanup |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
67 |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
68 __pq_internal_exit__ (); |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
69 |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
70 end_unwind_protect |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
71 |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
72 elseif (vpid < 0) |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
73 ## fork for viewer went wrong |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
74 error ("error in fork for viewer process: %s", vmsg); |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
75 endif |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
76 |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
77 unwind_protect_cleanup |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
78 |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
79 __pq_internal_exit__ (); |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
80 |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
81 end_unwind_protect |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
82 |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
83 elseif (opid < 0) |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
84 ## fork for outer child went wrong |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
85 error ("error in fork for outer child: %s", omsg); |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
86 endif |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
87 |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
88 ## parent |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
89 waitpid (opid); |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
90 |
b9544a96bc8d
support viewing large objects with viewers needing a temporary file
i7tiol
parents:
diff
changeset
|
91 endfunction |