Age Owner TLA Line data Source code
1 : /**********************************************************************
2 : * PostgreSQL::InServer::SPI
3 : *
4 : * SPI interface for plperl.
5 : *
6 : * src/pl/plperl/SPI.xs
7 : *
8 : **********************************************************************/
9 :
10 : /* this must be first: */
11 : #include "postgres.h"
12 :
13 : /* perl stuff */
14 : #define PG_NEED_PERL_XSUB_H
15 : #include "plperl.h"
16 :
17 :
18 : MODULE = PostgreSQL::InServer::SPI PREFIX = spi_
19 :
20 : PROTOTYPES: ENABLE
21 : VERSIONCHECK: DISABLE
22 :
23 : SV*
24 : spi_spi_exec_query(sv, ...)
25 : SV* sv;
26 : PREINIT:
6856 mail 27 ECB : HV *ret_hash;
6714 tgl 28 GIC 56 : int limit = 0;
29 : char *query;
6856 mail 30 ECB : CODE:
6714 tgl 31 GBC 56 : if (items > 2)
6244 andrew 32 UIC 0 : croak("Usage: spi_exec_query(query, limit) "
6244 andrew 33 ECB : "or spi_exec_query(query)");
6714 tgl 34 GBC 56 : if (items == 2)
6714 tgl 35 LBC 0 : limit = SvIV(ST(1));
4445 andrew 36 CBC 56 : query = sv2cstr(sv);
6714 tgl 37 56 : ret_hash = plperl_spi_exec(query, limit);
4445 andrew 38 50 : pfree(query);
6714 tgl 39 GIC 50 : RETVAL = newRV_noinc((SV*) ret_hash);
40 : OUTPUT:
41 : RETVAL
42 :
43 : void
44 : spi_return_next(rv)
45 : SV *rv;
6518 bruce 46 ECB : CODE:
2081 tgl 47 GIC 87 : plperl_return_next(rv);
48 :
49 : SV *
50 : spi_spi_query(sv)
51 : SV *sv;
6482 bruce 52 ECB : CODE:
4445 andrew 53 CBC 9 : char* query = sv2cstr(sv);
6482 bruce 54 9 : RETVAL = plperl_spi_query(query);
4445 andrew 55 GIC 9 : pfree(query);
56 : OUTPUT:
57 : RETVAL
58 :
59 : SV *
60 : spi_spi_fetchrow(sv)
61 : SV* sv;
6482 bruce 62 ECB : CODE:
4445 andrew 63 CBC 36 : char* cursor = sv2cstr(sv);
6482 bruce 64 36 : RETVAL = plperl_spi_fetchrow(cursor);
4445 andrew 65 GIC 36 : pfree(cursor);
66 : OUTPUT:
67 : RETVAL
68 :
69 : SV*
70 : spi_spi_prepare(sv, ...)
71 : SV* sv;
72 : CODE:
73 : int i;
6244 andrew 74 ECB : SV** argv;
4445 andrew 75 CBC 8 : char* query = sv2cstr(sv);
4520 peter_e 76 GBC 8 : if (items < 1)
6244 andrew 77 LBC 0 : Perl_croak(aTHX_ "Usage: spi_prepare(query, ...)");
6244 andrew 78 CBC 8 : argv = ( SV**) palloc(( items - 1) * sizeof(SV*));
4520 peter_e 79 16 : for ( i = 1; i < items; i++)
6244 andrew 80 8 : argv[i - 1] = ST(i);
81 8 : RETVAL = plperl_spi_prepare(query, items - 1, argv);
82 7 : pfree( argv);
4445 andrew 83 GIC 7 : pfree(query);
84 : OUTPUT:
85 : RETVAL
86 :
87 : SV*
88 : spi_spi_exec_prepared(sv, ...)
89 : SV* sv;
90 : PREINIT:
91 : HV *ret_hash;
6244 andrew 92 ECB : CODE:
6244 andrew 93 CBC 6 : HV *attr = NULL;
6244 andrew 94 GIC 6 : int i, offset = 1, argc;
6244 andrew 95 ECB : SV ** argv;
4445 andrew 96 CBC 6 : char *query = sv2cstr(sv);
4520 peter_e 97 GBC 6 : if ( items < 1)
4520 peter_e 98 UIC 0 : Perl_croak(aTHX_ "Usage: spi_exec_prepared(query, [\\%%attr,] "
6244 andrew 99 ECB : "[\\@bind_values])");
6244 andrew 100 GIC 6 : if ( items > 1 && SvROK( ST( 1)) && SvTYPE( SvRV( ST( 1))) == SVt_PVHV)
4520 peter_e 101 ECB : {
6244 andrew 102 CBC 2 : attr = ( HV*) SvRV(ST(1));
6244 andrew 103 GIC 2 : offset++;
6244 andrew 104 ECB : }
6244 andrew 105 CBC 6 : argc = items - offset;
106 6 : argv = ( SV**) palloc( argc * sizeof(SV*));
4520 peter_e 107 10 : for ( i = 0; offset < items; offset++, i++)
6244 andrew 108 4 : argv[i] = ST(offset);
109 6 : ret_hash = plperl_spi_exec_prepared(query, attr, argc, argv);
110 6 : RETVAL = newRV_noinc((SV*)ret_hash);
111 6 : pfree( argv);
4445 andrew 112 GIC 6 : pfree(query);
113 : OUTPUT:
114 : RETVAL
115 :
116 : SV*
117 : spi_spi_query_prepared(sv, ...)
118 : SV * sv;
119 : CODE:
120 : int i;
6244 andrew 121 ECB : SV ** argv;
4445 andrew 122 CBC 2 : char *query = sv2cstr(sv);
4520 peter_e 123 GBC 2 : if ( items < 1)
6244 andrew 124 UIC 0 : Perl_croak(aTHX_ "Usage: spi_query_prepared(query, "
6244 andrew 125 ECB : "[\\@bind_values])");
6244 andrew 126 CBC 2 : argv = ( SV**) palloc(( items - 1) * sizeof(SV*));
4520 peter_e 127 5 : for ( i = 1; i < items; i++)
6244 andrew 128 3 : argv[i - 1] = ST(i);
129 2 : RETVAL = plperl_spi_query_prepared(query, items - 1, argv);
130 2 : pfree( argv);
4445 andrew 131 GIC 2 : pfree(query);
132 : OUTPUT:
133 : RETVAL
134 :
135 : void
136 : spi_spi_freeplan(sv)
137 : SV *sv;
6244 andrew 138 ECB : CODE:
4445 andrew 139 CBC 5 : char *query = sv2cstr(sv);
6244 140 5 : plperl_spi_freeplan(query);
4445 andrew 141 GIC 5 : pfree(query);
142 :
143 : void
144 : spi_spi_cursor_close(sv)
145 : SV *sv;
6244 andrew 146 ECB : CODE:
4445 andrew 147 CBC 1 : char *cursor = sv2cstr(sv);
6244 148 1 : plperl_spi_cursor_close(cursor);
4445 andrew 149 GIC 1 : pfree(cursor);
150 :
151 : void
152 : spi_spi_commit()
1903 peter_e 153 ECB : CODE:
1903 peter_e 154 GIC 25 : plperl_spi_commit();
155 :
156 : void
157 : spi_spi_rollback()
1903 peter_e 158 ECB : CODE:
1903 peter_e 159 GIC 17 : plperl_spi_rollback();
160 :
6713 tgl 161 ECB : BOOT:
6713 tgl 162 GIC 21 : items = 0; /* avoid 'unused variable' warning */
|