sqlite_orm
sqlite_orm copied to clipboard
Version 1.7.1: 'constraints' namespace is gone. How are constraints now set when manually defining a storage type?
In version 1.6, I think, there was a namespace sqlite_orm::constraints but in version 1.7.1 it is no longer there.
So, obviously, using it like in
template<class O, class T, class ...Op>
using Column = internal::column_t<O, T, const T & (O::*)() const, void (O::*)(T), Op...>;
using HW5CODMDB = internal::storage_t <
internal::table_t < Coupler,
Column< Coupler, decltype(Coupler::CouplerCode), constraints::unique_t>,
Column< Coupler, decltype(Coupler::Name), constraints::unique_t>,
Column< Coupler, decltype(Coupler::CustomDisplay1_DisplayPageID)>,
Column< Coupler, decltype(Coupler::CustomDisplay1_Text)>,
Column< Coupler, decltype(Coupler::CustomDisplay1_ControlStyleID)>,
Column< Coupler, decltype(Coupler::CustomDisplay1_PosPixels_X), constraints::default_t<unsigned int>>,
Column< Coupler, decltype(Coupler::CustomDisplay1_PosPixels_Y), constraints::default_t<unsigned int>>,
...
does not work anymore.
What is the correct way to manually define a storage type now? Thanks!
replace constraints with internal
Thanks! That worked with internal::default_t<...> and internal::primary_key_t<...> but not with internal::unique_t.
However, internal::unique_t<type>, as in internal::unique_t<unsigned int> or internal::unique_t<string>, does work.
The remaining question is: What happens whenever type is unique_ptr<...>?
don't understand your concern. What error do you get?
Looking at the code now, it seems that the storage type I manually define and the one that is created by make_storage(...) do not match any more.
Here is a little example:
namespace test
{
struct TestData
{
unsigned int id;
string Name;
};
template<class O, class T, class ...Op>
using Column = internal::column_t<O, T, const T& (O::*)() const, void (O::*)(T), Op...>;
using TESTDB = internal::storage_t
<
internal::table_t
< TestData,
Column< TestData, decltype(TestData::id), internal::unique_t<unsigned int>>,
Column< TestData, decltype(TestData::Name), internal::unique_t<string>>,
internal::primary_key_t<decltype(TestData::id)>
>
>;
TESTDB initmyDB(const string& path)
{
return make_storage(path,
make_table
(
"TestData",
make_column("id", &TestData::id, unique()),
make_column("Name", &TestData::Name, unique()),
primary_key(&TestData::id)
)
);
}
}
When compiling this, I get C2440, meaning that the type of the result of make_storage(...) does not match/cannot be converted to TESTDB:
1>C:\SHARE\vpolab\lib\200127_sqlite_orm_HW5_lib\200127_sqlite_orm_HW5_lib\200127_sqlite_orm_HW5_lib.cpp(32,3): error C2440: "return": "sqlite_orm::internal::storage_t<sqlite_orm::internal::table_t<test::TestData,sqlite_orm::internal::column_t<test::TestData,unsigned int,const unsigned int &(__cdecl test::TestData::* )(void) const,void (__cdecl test::TestData::* )(unsigned int),sqlite_orm::internal::unique_t<>>,sqlite_orm::internal::column_t<test::TestData,std::string,const std::string &(__cdecl test::TestData::* )(void) const,void (__cdecl test::TestData::* )(std::string),sqlite_orm::internal::unique_t<>>,sqlite_orm::internal::primary_key_t<unsigned int test::TestData::* >>>" kann nicht in "sqlite_orm::internal::storage_t<sqlite_orm::internal::table_t<test::TestData,sqlite_orm::internal::column_t<test::TestData,unsigned int,const unsigned int &(__cdecl test::TestData::* )(void) const,void (__cdecl test::TestData::* )(unsigned int),sqlite_orm::internal::unique_t
>,sqlite_orm::internal::column_t<test::TestData,std::string,const std::string &(__cdecl test::TestData::* )(void) const,void (__cdecl test::TestData::* )(std::string),sqlite_orm::internal::unique_tstd::string>,sqlite_orm::internal::primary_key_t >>" konvertiert werden
P.S.: This compiles successfully
using TESTDB = internal::storage_t
<
internal::table_t
< TestData,
Column< TestData, decltype(TestData::id), internal::unique_t<>>,
Column< TestData, decltype(TestData::Name), internal::unique_t<>>//,
//internal::primary_key_t<decltype(TestData::id)>
>
>;
TESTDB initmyDB(const string& path)
{
return make_storage(path,
make_table
(
"TestData",
make_column("id", &TestData::id, unique()),
make_column("Name", &TestData::Name, unique())//,
//primary_key(&TestData::id)
)
);
}
so the problem is the primary key definition
sqlite_orm::internal::primary_key_t<unsigned int> vs sqlite_orm::internal::primary_key_t<unsigned int test::TestData::* >
By trial and error I discovered that this compiles:
using TESTDB = internal::storage_t
<
internal::table_t
< TestData,
Column< TestData, decltype(TestData::id), internal::unique_t<>, internal::primary_key_t<>>,
Column< TestData, decltype(TestData::Name), internal::unique_t<>>
>
>;
TESTDB initmyDB(const string& path)
{
return make_storage(path,
make_table
(
"TestData",
make_column("id", &TestData::id, unique(), primary_key()),
make_column("Name", &TestData::Name, unique())
)
);
}
Next, I'll give it a try in my code... ...yes, compiles successfully now.