#include <iostream>
#include <string>
#include <ibase.h>
using namespace std;
int main(int argc, char* argv[])
{
isc_db_handle hDb = NULL;
isc_tr_handle hTrn = NULL;
isc_stmt_handle hStmt = NULL;
ISC_STATUS_ARRAY status;
char* dpb = NULL;
short dpbLen = 0;
isc_expand_dpb(&dpb, &dpbLen, isc_dpb_user_name, "SYSDBA",
isc_dpb_password, "masterkey", NULL);
if (isc_attach_database(status, 0, "E:\\db\\test.fdb", &hDb, dpbLen, dpb)) {
cerr << "Failed to attach dadabase. status="
<< isc_sqlcode(status) << endl;
return 1;
}
if (isc_start_transaction(status, &hTrn, 1, &hDb, 0, NULL)) {
cerr << "Failed to start transaction. status="
<< isc_sqlcode(status) << endl;
return 1;
}
char* sql = "SELECT * FROM sample1 WHERE ITEM1 = ?";
XSQLDA* inDa = (XSQLDA*)new char[XSQLDA_LENGTH(1)];
inDa->version = SQLDA_VERSION1;
inDa->sqln = 1;
XSQLDA paraDa;
paraDa.version = SQLDA_VERSION1;
paraDa.sqln = 1;
if (isc_dsql_allocate_statement(status, &hDb, &hStmt)) {
cerr << "Failed to allocate statement. status="
<< isc_sqlcode(status) << endl;
return 1;
}
if (isc_dsql_prepare(status, &hTrn, &hStmt, 0, sql, 1, ¶Da)) {
cerr << "Failed to prepare statement. status="
<< isc_sqlcode(status) << endl;
return 1;
}
if (isc_dsql_describe_bind(status, &hStmt, 1, inDa)) {
cerr << "Failed to describe bind. status="
<< isc_sqlcode(status) << endl;
return 1;
}
if (inDa->sqld > inDa->sqln) {
short sqld = inDa->sqld;
delete [] inDa;
inDa = (XSQLDA*)new char[XSQLDA_LENGTH(sqld)];
inDa->sqln = sqld;
inDa->version = SQLDA_VERSION1;
if (isc_dsql_describe_bind(status, &hStmt, 1, inDa)) {
cerr << "Failed to describe bind. status="
<< isc_sqlcode(status) << endl;
return 1;
}
}
XSQLVAR *var;
int i;
for (i = 0, var = inDa->sqlvar; i < inDa->sqld; i++, var++) {
switch (var->sqltype & ~1) {
case SQL_VARYING:
var->sqldata = (char *)new char[var->sqllen + 2];
break;
default:
var->sqldata = (char *)new char[var->sqllen];
break;
}
if (var->sqltype & 1) {
var->sqlind = (short *)new short;
*(var->sqlind) = 0;
}
}
var = inDa->sqlvar;
*(short*)(var->sqldata) = 2;
XSQLDA* outDa = (XSQLDA*)new char[XSQLDA_LENGTH(paraDa.sqld)];
outDa->version = SQLDA_VERSION1;
outDa->sqln = paraDa.sqld;
if (isc_dsql_describe(status, &hStmt, 1, outDa)) {
cerr << "Failed to describe. status="
<< isc_sqlcode(status) << endl;
return 1;
}
for (i = 0, var = outDa->sqlvar; i < outDa->sqld; i++, var++) {
switch (var->sqltype & ~1) {
case SQL_VARYING:
var->sqldata = (char *)new char[var->sqllen + 2];
break;
default:
var->sqldata = (char *)new char[var->sqllen];
break;
}
if (var->sqltype & 1) {
var->sqlind = (short *)new short;
}
}
if (isc_dsql_execute(status, &hTrn, &hStmt, 1, inDa)) {
cerr << "Failed to execute statement. status="
<< isc_sqlcode(status) << endl;
return 1;
}
int w_len;
string w_str;
int w_row = 0;
long fetch_stat;
while ((fetch_stat = isc_dsql_fetch(status, &hStmt, 1, outDa)) == 0) {
cout << "== Row Index: " << w_row++ << "============" << endl;
for (i = 0, var = outDa->sqlvar; i < outDa->sqld; i++, var++) {
cout << " Column Index: " << i << endl;
switch (var->sqltype & ~1) {
case SQL_VARYING:
cout << " type: SQL_VARYING:"
<< var->sqltype << endl;
if ((var->sqltype & 1) && (*(var->sqlind) == -1)) {
cout << " data: NULL" << endl;
} else {
w_len = *(short*)var->sqldata;
w_str.assign(var->sqldata + 2, w_len);
cout << " data: "
<< w_str << endl;
}
break;
case SQL_TEXT:
cout << " type: SQL_TEXT:"
<< var->sqltype << endl;
if ((var->sqltype & 1) && (*(var->sqlind) == -1)) {
cout << " data: NULL" << endl;
} else {
w_len = var->sqllen;
w_str.assign(var->sqldata, w_len);
cout << " data: "
<< w_str << endl;
}
break;
case SQL_LONG:
cout << " type: SQL_LONG:"
<< var->sqltype << endl;
if ((var->sqltype & 1) && (*(var->sqlind) == -1)) {
cout << " data: NULL" << endl;
} else {
cout << " data: "
<< *(long*)var->sqldata << endl;
}
break;
case SQL_SHORT:
cout << " type: SQL_SHORT:"
<< var->sqltype << endl;
if ((var->sqltype & 1) && (*(var->sqlind) == -1)) {
cout << " data: NULL" << endl;
} else {
cout << " data: "
<< *(short*)var->sqldata << endl;
}
break;
default:
cout << " type: "
<< var->sqltype << endl;
cout << " data: Not implement." << endl;
break;
}
}
}
if (fetch_stat != 100L) {
cerr << "Failed to fetch. status="
<< isc_sqlcode(status) << endl;
return 1;
}
if (isc_commit_transaction(status, &hTrn)) {
cerr << "Failed to commit transaction. status="
<< isc_sqlcode(status) << endl;
return 1;
}
isc_dsql_free_statement(status, &hStmt, DSQL_close);
if (isc_detach_database(status, &hDb)) {
cerr << "Failed to detach database. status="
<< isc_sqlcode(status) << endl;
return 1;
}
for (i = 0, var = inDa->sqlvar; i < inDa->sqld; i++, var++) {
delete [] var->sqldata;
if (var->sqltype & 1) {
delete var->sqlind;
}
}
delete inDa;
for (i = 0, var = outDa->sqlvar; i < outDa->sqld; i++, var++) {
delete [] var->sqldata;
if (var->sqltype & 1) {
delete var->sqlind;
}
}
delete outDa;
return 0;
}