8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-01-23 18:43:03 +01:00

Support for named parameters for PreparedStatement using C++ variables

This commit is contained in:
asfernandes 2009-12-28 22:18:40 +00:00
parent 076395bb88
commit acbd61f20f
2 changed files with 61 additions and 17 deletions

View File

@ -45,6 +45,47 @@ class PreparedStatement : public Firebird::PermanentStorage
{
friend class ResultSet;
private:
// Auxiliary class to use named parameters with C++ variables.
class Builder
{
public:
Builder(const Firebird::string& aText)
: text(aText),
params(0)
{
}
Builder& operator <<(const char* chunk)
{
text += chunk;
return *this;
}
Builder& operator <<(unsigned& param)
{
text += "?";
param = ++params;
return *this;
}
operator const Firebird::string& ()
{
return text;
}
private:
Firebird::string text;
unsigned params;
};
public:
// Create a PreparedStatement builder to use named parameters with C++ variables.
static Builder build(const Firebird::string& text)
{
return Builder(text);
}
public:
PreparedStatement(thread_db* tdbb, Firebird::MemoryPool& aPool, Attachment* attachment,
jrd_tra* transaction, const Firebird::string& text, bool isInternalRequest);

View File

@ -287,9 +287,12 @@ void INI_format(const TEXT* owner, const TEXT* charset)
// Store RELATIONS and RELATION_FIELDS
Firebird::string sql("insert into rdb$relations (rdb$relation_id, rdb$relation_name, "
"rdb$field_id, rdb$format, rdb$system_flag, rdb$dbkey_length, rdb$owner_name, "
"rdb$relation_type) values (?, ?, ?, 0, ?, 8, ?, ?)");
unsigned paramRelId, paramRelName, paramN, paramSystem, paramOwner, paramRelType;
Firebird::string sql(PreparedStatement::build("insert into rdb$relations (rdb$relation_id, "
"rdb$relation_name, rdb$field_id, rdb$format, rdb$system_flag, rdb$dbkey_length, "
"rdb$owner_name, rdb$relation_type) values (") <<
paramRelId << ", " << paramRelName << ", " << paramN << ", 0, " << paramSystem <<
", 8, " << paramOwner << ", " << paramRelType << ")");
Firebird::AutoPtr<PreparedStatement> ps(tdbb->getAttachment()->prepareStatement(tdbb,
*tdbb->getDefaultPool(), transaction, sql));
@ -298,21 +301,19 @@ void INI_format(const TEXT* owner, const TEXT* charset)
{
for (n = 0, fld = relfld + RFLD_RPT; fld[RFLD_F_NAME]; fld += RFLD_F_LENGTH)
{
const int* pFld = fld;
const int* pFld = fld;
const int* pRelFld = relfld;
store_relation_field(tdbb, pFld, pRelFld, n, &handle1);
n++;
}
unsigned col = 0;
ps->setInt(tdbb, ++col, relfld[RFLD_R_ID]);
ps->setString(tdbb, ++col, names[relfld[RFLD_R_NAME]]);
ps->setInt(tdbb, ++col, n);
ps->setInt(tdbb, ++col, RDB_system);
++col;
ps->setInt(tdbb, paramRelId, relfld[RFLD_R_ID]);
ps->setString(tdbb, paramRelName, names[relfld[RFLD_R_NAME]]);
ps->setInt(tdbb, paramN, n);
ps->setInt(tdbb, paramSystem, RDB_system);
if (string.hasData())
ps->setString(tdbb, col, string);
ps->setInt(tdbb, ++col, relfld[RFLD_R_TYPE]);
ps->setString(tdbb, paramOwner, string);
ps->setInt(tdbb, paramRelType, relfld[RFLD_R_TYPE]);
ps->execute(tdbb, transaction);
}
@ -329,11 +330,13 @@ void INI_format(const TEXT* owner, const TEXT* charset)
handle1 = NULL;
// Store DATABASE record
sql = "insert into rdb$database (rdb$relation_id, rdb$character_set_name) values (?, ?)";
ps.reset(tdbb->getAttachment()->prepareStatement(tdbb,
*tdbb->getDefaultPool(), transaction, sql));
ps->setInt(tdbb, 1, USER_DEF_REL_INIT_ID);
ps->setString(tdbb, 2, (string2.hasData() ? string2 : DEFAULT_DB_CHARACTER_SET_NAME));
unsigned paramCharSet;
sql = PreparedStatement::build("insert into rdb$database (rdb$relation_id, "
"rdb$character_set_name) values (") <<
paramRelId << ", " << paramCharSet << ")";
ps.reset(tdbb->getAttachment()->prepareStatement(tdbb, *tdbb->getDefaultPool(), transaction, sql));
ps->setInt(tdbb, paramRelId, USER_DEF_REL_INIT_ID);
ps->setString(tdbb, paramCharSet, (string2.hasData() ? string2 : DEFAULT_DB_CHARACTER_SET_NAME));
ps->execute(tdbb, transaction);
// Store ADMIN_ROLE record