File: Sybase.xs

package info (click to toggle)
libdbd-sybase-perl 1.24-3
  • links: PTS
  • area: main
  • in suites: forky, sid, trixie
  • size: 712 kB
  • sloc: ansic: 5,629; perl: 2,216; makefile: 4
file content (221 lines) | stat: -rw-r--r-- 5,014 bytes parent folder | download
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
/* -*-C-*- */

/* $Id: Sybase.xs,v 1.19 2011/04/25 08:59:17 mpeppler Exp $
   Copyright (c) 1997-2011 Michael Peppler

   Uses from Driver.xst
   Copyright (c) 1994,1995,1996,1997  Tim Bunce

   You may distribute under the terms of either the GNU General Public
   License or the Artistic License, as specified in the Perl README file.

*/

#include "Sybase.h"

DBISTATE_DECLARE;

MODULE = DBD::Sybase    PACKAGE = DBD::Sybase

I32
constant()
    ALIAS:
    CS_ROW_RESULT           = CS_ROW_RESULT
    CS_CURSOR_RESULT        = CS_CURSOR_RESULT
    CS_PARAM_RESULT         = CS_PARAM_RESULT
    CS_STATUS_RESULT        = CS_STATUS_RESULT
    CS_MSG_RESULT           = CS_MSG_RESULT
    CS_COMPUTE_RESULT       = CS_COMPUTE_RESULT
    CODE:
    if (!ix) {
      char *what = GvNAME(CvGV(cv));
      croak("Unknown DBD::Sybase constant '%s'", what);
    } else {
      RETVAL = ix;
    }
    OUTPUT:
    RETVAL


void
timeout(value)
    int		value
    CODE:
    ST(0) = sv_2mortal(newSViv(syb_set_timeout(value)));

void
thread_enabled()
    CODE:
    ST(0) = sv_2mortal(newSViv(syb_thread_enabled()));

void
set_cslib_cb(cb)
    SV *        cb
    CODE:
    ST(0) = sv_2mortal(newSVsv(syb_set_cslib_cb(cb)));


MODULE = DBD::Sybase    PACKAGE = DBD::Sybase::db

void
_isdead(dbh)
    SV *	dbh
  ALIAS:
    syb_isdead     = 1
    CODE:
    D_imp_dbh(dbh);
    ST(0) = sv_2mortal(newSViv(imp_dbh->isDead));

void
_date_fmt(dbh, fmt)
    SV *	dbh
    char *	fmt
    ALIAS:
    syb_date_fmt     = 1
    CODE:
    D_imp_dbh(dbh);
    ST(0) = syb_db_date_fmt(dbh, imp_dbh, fmt) ? &PL_sv_yes : &PL_sv_no;

void
ping(dbh)
    SV *	dbh
    CODE:
    D_imp_dbh(dbh);
    ST(0) = sv_2mortal(newSViv(syb_ping(dbh, imp_dbh)));


MODULE = DBD::Sybase    PACKAGE = DBD::Sybase::st

void
cancel(sth)
    SV *	sth
  ALIAS:
    syb_cancel     = 1
    CODE:
    D_imp_sth(sth);
    ST(0) = syb_st_cancel(sth, imp_sth) ? &PL_sv_yes : &PL_sv_no;

void
ct_get_data(sth, column, bufrv, buflen=0)
    SV *	sth
    int		column
    SV *	bufrv
    int		buflen
    ALIAS:
    syb_ct_get_data    = 1
    CODE:
    {
    D_imp_sth(sth);
    int len = syb_ct_get_data(sth, imp_sth, column, bufrv, buflen);
    ST(0) = sv_2mortal(newSViv(len));
    }

void
ct_data_info(sth, action, column, attr=&PL_sv_undef)
    SV *	sth
    char *	action
    int		column
    SV *	attr
    ALIAS:
    syb_ct_data_info   =   1
    CODE:
    {
    D_imp_sth(sth);
    int sybaction;
    if(strEQ(action, "CS_SET")) {
        sybaction = CS_SET;
    } else if (strEQ(action, "CS_GET")) {
        sybaction = CS_GET;
    }
    ST(0) = syb_ct_data_info(sth, imp_sth, sybaction, column, attr) ? &PL_sv_yes : &PL_sv_no;
    }

void
ct_send_data(sth, buffer, size)
    SV *	sth
    char *	buffer
    int		size
    ALIAS:
    syb_ct_send_data    =  1
    CODE:
    D_imp_sth(sth);
    ST(0) = syb_ct_send_data(sth, imp_sth, buffer, size) ? &PL_sv_yes : &PL_sv_no;

void
ct_prepare_send(sth)
    SV *	sth
    ALIAS:
    syb_ct_prepare_send   = 1
    CODE:
    D_imp_sth(sth);
    ST(0) = syb_ct_prepare_send(sth, imp_sth) ? &PL_sv_yes : &PL_sv_no;

void
ct_finish_send(sth)
    SV *	sth
    ALIAS:
    syb_ct_finish_send    = 1
    CODE:
    D_imp_sth(sth);
    ST(0) = syb_ct_finish_send(sth, imp_sth) ? &PL_sv_yes : &PL_sv_no;

void
syb_describe(sth, doAssoc = 0)
    SV *	sth
    int	doAssoc
  PPCODE:
{
    D_imp_sth(sth);
    int i, k;
    HV *hv;
    SV *sv;
    char statbuff[255];
    struct {
    int stat;
    char name[30];
    } stat[] = { { CS_CANBENULL, "CS_CANBENULL" }, 
         { CS_HIDDEN, "CS_HIDDEN" },
         { CS_IDENTITY, "CS_IDENTITY" },
         { CS_KEY, "CS_KEY" },
         { CS_VERSION_KEY, "CS_VERSION_KEY" },
         { CS_TIMESTAMP, "CS_TIMESTAMP" },
         { CS_UPDATABLE, "CS_UPDATABLE" },
         { CS_UPDATECOL, "CS_UPDATECOL" },
         { CS_RETURN, "CS_RETURN" },
         { 0, "" }
    };

    /* lifted almost verbatim from Sybase::CTlib's CTlib.xs file... */
    for(i = 0; i < imp_sth->numCols; ++i)
    {
    hv = newHV();

    hv_store(hv, "NAME", 4, newSVpv(imp_sth->datafmt[i].name,0), 0);
    hv_store(hv, "TYPE", 4, newSViv(imp_sth->datafmt[i].datatype), 0);
    hv_store(hv, "MAXLENGTH", 9, newSViv(imp_sth->datafmt[i].maxlength), 0);
    hv_store(hv, "SYBMAXLENGTH", 12, newSViv(imp_sth->coldata[i].realLength), 0);
    hv_store(hv, "SYBTYPE", 7, newSViv(imp_sth->coldata[i].realType), 0);
    hv_store(hv, "SCALE", 5, newSViv(imp_sth->datafmt[i].scale), 0);
    hv_store(hv, "PRECISION", 9, newSViv(imp_sth->datafmt[i].precision), 0);
    statbuff[0] = 0;
    for(k = 0; stat[k].stat > 0; ++k) {
        if(imp_sth->datafmt[i].status & stat[k].stat) {
        strcat(statbuff, stat[k].name);
        strcat(statbuff, " ");
        }
    }
    hv_store(hv, "STATUS", 6, newSVpv(statbuff, 0), 0);
    sv = newRV_noinc((SV*)hv);

    if(doAssoc)
        XPUSHs(sv_2mortal(newSVpv(imp_sth->datafmt[i].name, 0)));
    XPUSHs(sv_2mortal(sv));
    }
}




MODULE = DBD::Sybase	PACKAGE = DBD::Sybase

INCLUDE: Sybase.xsi