DBD-DtfSQLmac
view release on metacpan or search on metacpan
unsigned short
DtfConDestroy (hcon)
int hcon
CODE:
RETVAL = DtfConDestroy (&hcon);
OUTPUT:
hcon
RETVAL
unsigned short
DtfConDisconnect (hcon)
int hcon
CODE:
RETVAL = DtfConDisconnect (hcon);
OUTPUT:
RETVAL
unsigned short
DtfEnvDestroy (henv)
int henv
CODE:
RETVAL = DtfEnvDestroy (&henv);
OUTPUT:
henv
RETVAL
unsigned long
_define_Attribut(a3, a2, a1, a0)
int a3
int a2
int a1
int a0
CODE:
RETVAL = _define_Attribut(a3, a2, a1, a0);
OUTPUT:
RETVAL
void
dtf_connect (dsn, user, pass)
const char * dsn
const char * user
const char * pass
PREINIT:
int henv = 0; /* environment handle */
int hcon = 0; /* connection handle */
int htra = 0; /* transaction handle */
unsigned short err = 0; /* error code */
char * errstr = ""; /* error message */
unsigned char connected = 0; /* connected flag */
unsigned char dbExists = 0; /* dbExists flag */
unsigned char dbConsistent = 0; /* dbConsistent flag */
unsigned char network = 0; /* indicates a network connection */
PPCODE:
{
// First, we always need an environment handle before
// we are able to do anything else.
// NOTE
// Currently, the number of environment handles which may exist at a time is restricted to one.
if ( (err = DtfEnvCreate(&henv) ) != DTF_ERR_OK) {
errstr = "ERROR(dtf_connect): Can't create environment";
henv = 0;
EXTEND(SP, 5); /* extend Perl stack for 5 SVs (return values) */
PUSHs(sv_2mortal(newSViv(henv))); /* henv == 0 */
PUSHs(sv_2mortal(newSViv(hcon))); /* hcon == 0 */
PUSHs(sv_2mortal(newSViv(htra))); /* htra == 0 */
PUSHs(sv_2mortal(newSViv(err))); /* error code */
PUSHs(sv_2mortal(newSVpv(errstr, 0))); /* error message, let Perl determine the length */
XSRETURN(5); /* return from XSUB */
// return ( $henv, $hcon, $htra, $err, $errstr );
}
// When the environment handle (henv) was created successfully, a connection handle
// can be created as the environment handle's *dependent* handle.
//
// The parameter dsn (DSN = data source name) contains for the single-user version
// of dtF/SQL the database's partial or fully qualified path (flags = DTF_CF_FILENAME),
// for example "MacHD:path:to:DB:TESTDB.dtF", for the multi-user verion it contains
// a server specification, for example "tcp:host/port" (flags = DTF_CF_NETWORK).
// NOTE
// Currently, only a single connection can be created on every environment handle.
if ( strncmp ( dsn, "tcp:", 4 ) == 0) { // network, please
network = 1;
err = DtfConCreate(henv, dsn, DTF_CF_NETWORK, &hcon);
} else { // local
err = DtfConCreate(henv, dsn, DTF_CF_FILENAME, &hcon);
}
if (err != DTF_ERR_OK) {
errstr = strcat ("ERROR(dtf_connect): Can't create connection to ", dsn);
// clear up things
// at this point, henv has successfully been created, thus dispose this handle
DtfEnvDestroy (&henv);
henv = 0;
hcon = 0;
EXTEND(SP, 5); /* extend Perl stack for 5 SVs (return values) */
PUSHs(sv_2mortal(newSViv(henv))); /* henv == 0 */
PUSHs(sv_2mortal(newSViv(hcon))); /* hcon == 0 */
PUSHs(sv_2mortal(newSViv(htra))); /* htra == 0 */
PUSHs(sv_2mortal(newSViv(err))); /* error code */
PUSHs(sv_2mortal(newSVpv(errstr, 0))); /* error message, let Perl determine the length */
XSRETURN(5); /* return from XSUB */
//return ( $henv, $hcon, $htra, $err, $errstr );
}
// This function queries some information about the just established connection
if ( (err = DtfConConnect(hcon, user, pass) ) != DTF_ERR_OK) {
errstr = strcat ("ERROR(dtf_connect): Can't connect as " , user);
// clear up things
// at this point, henv and hcon have successfully been created, thus dispose these handles
DtfConDestroy (&hcon);
DtfEnvDestroy (&henv);
henv = 0;
hcon = 0;
EXTEND(SP, 5); /* extend Perl stack for 5 SVs (return values) */
PUSHs(sv_2mortal(newSViv(henv))); /* henv == 0 */
PUSHs(sv_2mortal(newSViv(hcon))); /* hcon == 0 */
PUSHs(sv_2mortal(newSViv(htra))); /* htra == 0 */
PUSHs(sv_2mortal(newSViv(err))); /* error code */
PUSHs(sv_2mortal(newSVpv(errstr, 0))); /* error message, let Perl determine the length */
XSRETURN(5); /* return from XSUB */
//return ( $henv, $hcon, $htra, $err, $errstr );
}
// We are connected, now create a transaction we are able
// to execute SQL statements with.
// NOTE
// The maximum number of concurrent transactions may be modified by
// setting the connection handle attribute DTF_CAT_TRANSACTIONS. The
// default value of this attribute is 1.
if (err = DtfTraCreate( hcon, &htra ) != DTF_ERR_OK) {
errstr = "ERROR(dtf_connect): Can't create transaction";
// clear up things
DtfConDisconnect (hcon); // first, disconnect the handle
// at this point, henv and hcon have successfully been created, thus dispose these handles
DtfConDestroy (&hcon);
DtfEnvDestroy (&henv);
henv = 0;
hcon = 0;
htra = 0;
EXTEND(SP, 5); /* extend Perl stack for 5 SVs (return values) */
PUSHs(sv_2mortal(newSViv(henv))); /* henv == 0 */
PUSHs(sv_2mortal(newSViv(hcon))); /* hcon == 0 */
PUSHs(sv_2mortal(newSViv(htra))); /* htra == 0 */
PUSHs(sv_2mortal(newSViv(err))); /* error code */
PUSHs(sv_2mortal(newSVpv(errstr, 0))); /* error message, let Perl determine the length */
XSRETURN(5); /* return from XSUB */
//return ( $henv, $hcon, $htra, $err, $errstr );
}
// everything is fine here
EXTEND(SP, 5); /* extend Perl stack for 5 SVs (return values) */
PUSHs(sv_2mortal(newSViv(henv))); /* henv ok */
PUSHs(sv_2mortal(newSViv(hcon))); /* hcon ok */
PUSHs(sv_2mortal(newSViv(htra))); /* htra ok */
PUSHs(sv_2mortal(newSViv(err))); /* error code == 0 */
PUSHs(sv_2mortal(newSVpv(errstr, 0))); /* error message == '', let Perl determine the length */
XSRETURN(5); /* return from XSUB */
//return ( $henv, $hcon, $htra, $err, $errstr );
} // end PPCODE
void
dtf_disconnect (henv, hcon, htra)
int henv
int hcon
int htra
PREINIT:
unsigned short err = 0; /* error code */
char * errstr = ""; /* error message */
unsigned char connected = 0; /* connected flag */
PPCODE:
{
if (htra != DTFHANDLE_NULL) {
if ( (err = DtfTraDestroy(&htra) ) != DTF_ERR_OK) {
errstr = "ERROR(dtf_disconnect): Can't destroy transaction handle";
EXTEND(SP, 2); /* extend Perl stack for 2 SVs (return values) */
PUSHs(sv_2mortal(newSViv(err))); /* error code */
PUSHs(sv_2mortal(newSVpv(errstr, 0))); /* error message, let Perl determine the length */
XSRETURN(2); /* return from XSUB */
// return ($err, $errstr);
}
} //if htra
if (hcon != DTFHANDLE_NULL) {
if ( (err = DtfConQueryStatus(hcon, &connected, NULL, NULL) ) != DTF_ERR_OK) {
errstr = "ERROR(dtf_disconnect): Can't query connection status";
EXTEND(SP, 2); /* extend Perl stack for 2 SVs (return values) */
PUSHs(sv_2mortal(newSViv(err))); /* error code */
PUSHs(sv_2mortal(newSVpv(errstr, 0))); /* error message, let Perl determine the length */
XSRETURN(2); /* return from XSUB */
// return ($err, $errstr);
}
if (connected) { // connected as user X (aka login)
if ( (err = DtfConDisconnect(hcon) ) != DTF_ERR_OK) {
errstr = "ERROR(dtf_disconnect): User can't disconnect (logout)";
EXTEND(SP, 2); /* extend Perl stack for 2 SVs (return values) */
PUSHs(sv_2mortal(newSViv(err))); /* error code */
PUSHs(sv_2mortal(newSVpv(errstr, 0))); /* error message, let Perl determine the length */
XSRETURN(2); /* return from XSUB */
// return ($err, $errstr);
}
} //connected
if ( (err = DtfConDestroy(&hcon) ) != DTF_ERR_OK) {
errstr = "ERROR(dtf_disconnect): Can't destroy connection handle";
EXTEND(SP, 2); /* extend Perl stack for 2 SVs (return values) */
PUSHs(sv_2mortal(newSViv(err))); /* error code */
PUSHs(sv_2mortal(newSVpv(errstr, 0))); /* error message, let Perl determine the length */
XSRETURN(2); /* return from XSUB */
//return ($err, $errstr);
}
} //if hcon
if (henv != DTFHANDLE_NULL) {
if ( (err = DtfEnvDestroy(&henv) ) != DTF_ERR_OK) {
errstr = "ERROR(dtf_disconnect): Can't destroy environment handle";
EXTEND(SP, 2); /* extend Perl stack for 2 SVs (return values) */
PUSHs(sv_2mortal(newSViv(err))); /* error code */
PUSHs(sv_2mortal(newSVpv(errstr, 0))); /* error message, let Perl determine the length */
XSRETURN(2); /* return from XSUB */
// return ($err, $errstr);
}
} //if henv
// everything is fine here
EXTEND(SP, 2); /* extend Perl stack for 2 SVs (return values) */
PUSHs(sv_2mortal(newSViv(err))); /* error code */
PUSHs(sv_2mortal(newSVpv(errstr, 0))); /* error message, let Perl determine the length */
XSRETURN(2); /* return from XSUB */
//return ($err, $errstr);
}// end PPCODE
( run in 1.307 second using v1.01-cache-2.11-cpan-71847e10f99 )