sqlite_orm icon indicating copy to clipboard operation
sqlite_orm copied to clipboard

Version 1.7.1: 'constraints' namespace is gone. How are constraints now set when manually defining a storage type?

Open prospectumdev opened this issue 3 years ago • 6 comments

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!

prospectumdev avatar May 25 '22 15:05 prospectumdev

replace constraints with internal

fnc12 avatar May 25 '22 18:05 fnc12

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<...>?

prospectumdev avatar May 30 '22 14:05 prospectumdev

don't understand your concern. What error do you get?

fnc12 avatar May 30 '22 16:05 fnc12

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

prospectumdev avatar Jun 27 '22 10:06 prospectumdev

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::* >

prospectumdev avatar Jun 27 '22 11:06 prospectumdev

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.

prospectumdev avatar Jun 27 '22 12:06 prospectumdev