Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bind by C-type #36

Merged
merged 4 commits into from
Nov 24, 2015
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
122 changes: 57 additions & 65 deletions modules/godbcbackend/sodbc.cc
Original file line number Diff line number Diff line change
Expand Up @@ -72,37 +72,23 @@ class SODBCStatement: public SSqlStatement
// cerr<<"prepared ("<<query<<")"<<endl;
}

typedef struct {
struct ODBCParam {
SQLPOINTER ParameterValuePtr;
SQLLEN* LenPtr;
} ODBCParam;
SQLSMALLINT ParameterType;
SQLSMALLINT ValueType;
};

vector<ODBCParam> d_req_bind;

SSqlStatement* bind(const string& name, bool value) { return bind(name, (long)value); }
SSqlStatement* bind(const string& name, long value) {

// cerr<<"asked to bind long "<<value<<endl;
// cerr<<"d_req_bind.size()="<<d_req_bind.size()<<endl;
// cerr<<"d_parnum="<<d_parnum<<endl;

if(d_req_bind.size() > (d_parnum+1)) throw SSqlException("Trying to bind too many parameters.");

ODBCParam p;

p.ParameterValuePtr = new long[1];
*((long*)p.ParameterValuePtr) = value;
p.LenPtr = new SQLLEN;
*(p.LenPtr) = sizeof(long);

SSqlStatement* bind(const string& name, ODBCParam& p) {
d_req_bind.push_back(p);

SQLRETURN result = SQLBindParameter(
d_statement, // StatementHandle,
d_paridx+1, // ParameterNumber,
SQL_PARAM_INPUT, // InputOutputType,
SQL_C_SLONG, // ValueType,
SQL_BIGINT, // ParameterType,
p.ValueType, // ValueType,
p.ParameterType, // ParameterType,
0, // ColumnSize,
0, // DecimalDigits,
p.ParameterValuePtr, // ParameterValuePtr,
Expand All @@ -114,11 +100,42 @@ class SODBCStatement: public SSqlStatement

return this;
}
SSqlStatement* bind(const string& name, uint32_t value) { return bind(name, (long)value); }
SSqlStatement* bind(const string& name, int value) { return bind(name, (long)value); }
SSqlStatement* bind(const string& name, unsigned long value) { return bind(name, (long)value);}
SSqlStatement* bind(const string& name, long long value) { return bind(name, (long)value); };
SSqlStatement* bind(const string& name, unsigned long long value) { return bind(name, (long)value); }

SSqlStatement* bind(const string& name, bool value) { return bind(name, (uint32_t)value); }

SSqlStatement* bind(const string& name, long value) { return bind(name, (unsigned long)value); }

SSqlStatement* bind(const string& name, int value) { return bind(name, (uint32_t)value); }

SSqlStatement* bind(const string& name, long long value) { return bind(name, (unsigned long long)value); }

SSqlStatement* bind(const string& name, uint32_t value) {
ODBCParam p;
p.ParameterValuePtr = new UDWORD {value};
p.LenPtr = new SQLLEN {sizeof(UDWORD)};
p.ParameterType = SQL_INTEGER;
p.ValueType = SQL_INTEGER;
return bind(name, p);
}

SSqlStatement* bind(const string& name, unsigned long value) {
ODBCParam p;
p.ParameterValuePtr = new ULONG {value};
p.LenPtr = new SQLLEN {sizeof(ULONG)};
p.ParameterType = SQL_INTEGER;
p.ValueType = SQL_INTEGER;
return bind(name, p);
}

SSqlStatement* bind(const string& name, unsigned long long value) {
ODBCParam p;
p.ParameterValuePtr = new unsigned long long {value};
p.LenPtr = new SQLLEN {sizeof(unsigned long long)};
p.ParameterType = SQL_BIGINT;
p.ValueType = SQL_C_UBIGINT;
return bind(name, p);
}

SSqlStatement* bind(const string& name, const std::string& value) {

// cerr<<"asked to bind string "<<value<<endl;
Expand All @@ -132,25 +149,10 @@ class SODBCStatement: public SSqlStatement
((char*)p.ParameterValuePtr)[value.size()]=0;
p.LenPtr=new SQLLEN;
*(p.LenPtr)=value.size();
p.ParameterType = SQL_VARCHAR;
p.ValueType = SQL_C_CHAR;

d_req_bind.push_back(p);

SQLRETURN result = SQLBindParameter(
d_statement, // StatementHandle,
d_paridx+1, // ParameterNumber,
SQL_PARAM_INPUT, // InputOutputType,
SQL_C_CHAR, // ValueType,
SQL_VARCHAR, // ParameterType,
value.size(), // ColumnSize,
0, // DecimalDigits,
p.ParameterValuePtr, // ParameterValuePtr,
value.size()+1, // BufferLength,
p.LenPtr // StrLen_or_IndPtr
);
testResult( result, SQL_HANDLE_STMT, d_statement, "Binding parameter.");
d_paridx++;

return this;
return bind(name, p);
}

SSqlStatement* bindNull(const string& name) {
Expand All @@ -161,25 +163,10 @@ class SODBCStatement: public SSqlStatement
p.ParameterValuePtr = NULL;
p.LenPtr=new SQLLEN;
*(p.LenPtr)=SQL_NULL_DATA;
p.ParameterType = SQL_VARCHAR;
p.ValueType = SQL_C_CHAR;

d_req_bind.push_back(p);

SQLRETURN result = SQLBindParameter(
d_statement, // StatementHandle,
d_paridx+1, // ParameterNumber,
SQL_PARAM_INPUT, // InputOutputType,
SQL_C_CHAR, // ValueType,
SQL_VARCHAR, // ParameterType,
0, // ColumnSize,
0, // DecimalDigits,
p.ParameterValuePtr, // ParameterValuePtr,
0, // BufferLength,
p.LenPtr // StrLen_or_IndPtr
);
testResult( result, SQL_HANDLE_STMT, d_statement, "Binding parameter.");
d_paridx++;

return this;
return bind(name, p);
}

SSqlStatement* execute()
Expand Down Expand Up @@ -229,7 +216,12 @@ class SODBCStatement: public SSqlStatement
SSqlStatement* reset() {
SQLCloseCursor(d_statement); // hack, this probably violates some state transitions

for(auto &i: d_req_bind) { delete [] (char*) i.ParameterValuePtr; delete i.LenPtr; }
for(auto &i: d_req_bind) {
if (i.ParameterType == SQL_VARCHAR) delete [] (char*)i.ParameterValuePtr;
else if (i.ParameterType == SQL_INTEGER) delete (ULONG*)i.ParameterValuePtr;
else if (i.ParameterType == SQL_C_UBIGINT) delete (unsigned long long*)i.ParameterValuePtr;
delete i.LenPtr;
}
d_req_bind.clear();
d_residx = 0;
d_paridx = 0;
Expand All @@ -241,7 +233,8 @@ class SODBCStatement: public SSqlStatement
string d_query;
bool d_dolog;
bool d_havenextrow;
int d_residx, d_paridx, d_parnum;
int d_residx;
size_t d_paridx,d_parnum;
SQLRETURN d_result;

SQLHDBC d_conn;
Expand Down Expand Up @@ -386,7 +379,6 @@ SODBC::~SODBC( void )
// Executes a command.
void SODBC::execute( const std::string & command )
{
SQLRETURN result;
SODBCStatement stmt(command, false, 0, m_connection);

stmt.execute()->reset();
Expand Down