Skip to content

Commit

Permalink
Fixing the bug in yesterday's change (missing "break" in a switch.)
Browse files Browse the repository at this point in the history
Also, adding support for unsigned long long for vectors, and for use() in
addition to into().
  • Loading branch information
Pawel Aleksander Fedorynski committed Jul 3, 2012
1 parent e64ef42 commit cbeda1d
Show file tree
Hide file tree
Showing 5 changed files with 104 additions and 5 deletions.
1 change: 1 addition & 0 deletions src/backends/mysql/standard-into-type.cpp
Expand Up @@ -121,6 +121,7 @@ void mysql_standard_into_type_backend::post_fetch(
static_cast<unsigned long long*>(data_);
parse_num(buf, *dest);
}
break;
case x_double:
{
double *dest = static_cast<double*>(data_);
Expand Down
10 changes: 10 additions & 0 deletions src/backends/mysql/standard-use-type.cpp
Expand Up @@ -100,6 +100,16 @@ void mysql_standard_use_type_backend::pre_use(indicator const *ind)
snprintf(buf_, bufSize, "%lld", *static_cast<long long *>(data_));
}
break;
case x_unsigned_long_long:
{
std::size_t const bufSize
= std::numeric_limits<unsigned long long>::digits10 + 3;
buf_ = new char[bufSize];
snprintf(buf_, bufSize, "%llu",
*static_cast<unsigned long long *>(data_));
}
break;

case x_double:
{
// no need to overengineer it (KISS)...
Expand Down
70 changes: 65 additions & 5 deletions src/backends/mysql/test/test-mysql.cpp
Expand Up @@ -199,13 +199,73 @@ void test3()
}

{
session sql(backEnd, connectString);
session sql(backEnd, connectString);

bigint_unsigned_table_creator tableCreator(sql);

sql << "insert into soci_test set val = 18446744073709551615";
row v;
sql << "select * from soci_test", into(v);
}

{
session sql(backEnd, connectString);

bigint_unsigned_table_creator tableCreator(sql);

const char* source = "18446744073709551615";
sql << "insert into soci_test set val = " << source;
unsigned long long vv = 0;
sql << "select val from soci_test", into(vv);
std::stringstream buf;
buf << vv;
assert(buf.str() == source);
}

{
session sql(backEnd, connectString);

bigint_unsigned_table_creator tableCreator(sql);

const char* source = "18446744073709551615";
sql << "insert into soci_test set val = " << source;
std::vector<unsigned long long> v(1);
sql << "select val from soci_test", into(v);
std::stringstream buf;
buf << v.at(0);
assert(buf.str() == source);
}

{
session sql(backEnd, connectString);

bigint_unsigned_table_creator tableCreator(sql);

unsigned long long n = 18446744073709551615ULL;
sql << "insert into soci_test(val) values (:n)", use(n);
unsigned long long m = 0;
sql << "select val from soci_test", into(m);
assert(n == m);
}

{
session sql(backEnd, connectString);

bigint_unsigned_table_creator tableCreator(sql);

std::vector<unsigned long long> v1;
v1.push_back(18446744073709551615ULL);
v1.push_back(18446744073709551614ULL);
v1.push_back(18446744073709551613ULL);
sql << "insert into soci_test(val) values(:val)", use(v1);

bigint_unsigned_table_creator tableCreator(sql);
std::vector<unsigned long long> v2(10);
sql << "select val from soci_test order by val", into(v2);

sql << "insert into soci_test set val = 18446744073709551615";
row v;
sql << "select * from soci_test", into(v);
assert(v2.size() == 3);
assert(v2[0] == 18446744073709551613ULL);
assert(v2[1] == 18446744073709551614ULL);
assert(v2[2] == 18446744073709551615ULL);
}

std::cout << "test 3 passed" << std::endl;
Expand Down
13 changes: 13 additions & 0 deletions src/backends/mysql/vector-into-type.cpp
Expand Up @@ -140,6 +140,13 @@ void mysql_vector_into_type_backend::post_fetch(bool gotData, indicator *ind)
set_invector_(data_, i, val);
}
break;
case x_unsigned_long_long:
{
unsigned long long val;
parse_num(buf, val);
set_invector_(data_, i, val);
}
break;
case x_double:
{
double val;
Expand Down Expand Up @@ -190,6 +197,9 @@ void mysql_vector_into_type_backend::resize(std::size_t sz)
case x_integer: resizevector_<int> (data_, sz); break;
case x_unsigned_long: resizevector_<unsigned long>(data_, sz); break;
case x_long_long: resizevector_<long long> (data_, sz); break;
case x_unsigned_long_long:
resizevector_<unsigned long long>(data_, sz);
break;
case x_double: resizevector_<double> (data_, sz); break;
case x_stdstring: resizevector_<std::string> (data_, sz); break;
case x_stdtm: resizevector_<std::tm> (data_, sz); break;
Expand All @@ -210,6 +220,9 @@ std::size_t mysql_vector_into_type_backend::size()
case x_integer: sz = get_vector_size<int> (data_); break;
case x_unsigned_long: sz = get_vector_size<unsigned long>(data_); break;
case x_long_long: sz = get_vector_size<long long> (data_); break;
case x_unsigned_long_long:
sz = get_vector_size<unsigned long long>(data_);
break;
case x_double: sz = get_vector_size<double> (data_); break;
case x_stdstring: sz = get_vector_size<std::string> (data_); break;
case x_stdtm: sz = get_vector_size<std::tm> (data_); break;
Expand Down
15 changes: 15 additions & 0 deletions src/backends/mysql/vector-use-type.cpp
Expand Up @@ -132,6 +132,18 @@ void mysql_vector_use_type_backend::pre_use(indicator const *ind)
snprintf(buf, bufSize, "%lld", v[i]);
}
break;
case x_unsigned_long_long:
{
std::vector<unsigned long long> *pv
= static_cast<std::vector<unsigned long long> *>(data_);
std::vector<unsigned long long> &v = *pv;

std::size_t const bufSize
= std::numeric_limits<unsigned long long>::digits10 + 3;
buf = new char[bufSize];
snprintf(buf, bufSize, "%llu", v[i]);
}
break;
case x_double:
{
// no need to overengineer it (KISS)...
Expand Down Expand Up @@ -193,6 +205,9 @@ std::size_t mysql_vector_use_type_backend::size()
case x_integer: sz = get_vector_size<int> (data_); break;
case x_unsigned_long: sz = get_vector_size<unsigned long>(data_); break;
case x_long_long: sz = get_vector_size<long long> (data_); break;
case x_unsigned_long_long:
sz = get_vector_size<unsigned long long>(data_);
break;
case x_double: sz = get_vector_size<double> (data_); break;
case x_stdstring: sz = get_vector_size<std::string> (data_); break;
case x_stdtm: sz = get_vector_size<std::tm> (data_); break;
Expand Down

0 comments on commit cbeda1d

Please sign in to comment.