Skip to content

Commit

Permalink
Merge pull request #36 from cmouse/godbc-squash-rebase
Browse files Browse the repository at this point in the history
Bind by C-type
  • Loading branch information
Habbie committed Nov 24, 2015
2 parents 4f983d1 + 0a547e0 commit 68666f2
Showing 1 changed file with 57 additions and 65 deletions.
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

0 comments on commit 68666f2

Please sign in to comment.