Skip to content

Commit

Permalink
added content
Browse files Browse the repository at this point in the history
  • Loading branch information
fnc12 committed May 19, 2024
1 parent 58a1abc commit 4a62772
Show file tree
Hide file tree
Showing 7 changed files with 89 additions and 6 deletions.
17 changes: 17 additions & 0 deletions dev/constraints.h
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,13 @@ namespace sqlite_orm {
value_type value;
};

template<class T>
struct content_t {
using value_type = T;

value_type value;
};

/**
* DEFAULT constraint class.
* T is a value type.
Expand Down Expand Up @@ -563,6 +570,16 @@ namespace sqlite_orm {
return {std::move(value)};
}

/**
* content='' table constraint builder function. Used in FTS virtual tables.
*
* https://www.sqlite.org/fts5.html#contentless_tables
*/
template<class T>
internal::content_t<T> content(T value) {
return {std::move(value)};
}

/**
* PRIMARY KEY table constraint builder function.
*/
Expand Down
3 changes: 2 additions & 1 deletion dev/schema/table.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ namespace sqlite_orm {
check_if_is_template<unique_t>,
check_if_is_template<check_t>,
check_if_is_template<prefix_t>,
check_if_is_template<tokenize_t>>,
check_if_is_template<tokenize_t>,
check_if_is_template<content_t>>,
T>;

#ifdef SQLITE_ORM_WITH_CTE
Expand Down
16 changes: 14 additions & 2 deletions dev/statement_serializer.h
Original file line number Diff line number Diff line change
Expand Up @@ -1079,6 +1079,18 @@ namespace sqlite_orm {
}
};

template<class T>
struct statement_serializer<content_t<T>, void> {
using statement_type = content_t<T>;

template<class Ctx>
std::string operator()(const statement_type& statement, const Ctx& context) const {
std::stringstream ss;
ss << "content=" << serialize(statement.value, context);
return ss.str();
}
};

template<>
struct statement_serializer<collate_constraint_t, void> {
using statement_type = collate_constraint_t;
Expand All @@ -1094,8 +1106,8 @@ namespace sqlite_orm {
using statement_type = default_t<T>;

template<class Ctx>
std::string operator()(const statement_type& c, const Ctx& context) const {
return static_cast<std::string>(c) + " (" + serialize(c.value, context) + ")";
std::string operator()(const statement_type& statement, const Ctx& context) const {
return static_cast<std::string>(statement) + " (" + serialize(statement.value, context) + ")";
}
};

Expand Down
36 changes: 33 additions & 3 deletions include/sqlite_orm/sqlite_orm.h
Original file line number Diff line number Diff line change
Expand Up @@ -1935,6 +1935,13 @@ namespace sqlite_orm {
value_type value;
};

template<class T>
struct content_t {
using value_type = T;

value_type value;
};

/**
* DEFAULT constraint class.
* T is a value type.
Expand Down Expand Up @@ -2342,6 +2349,16 @@ namespace sqlite_orm {
return {std::move(value)};
}

/**
* content='' table constraint builder function. Used in FTS virtual tables.
*
* https://www.sqlite.org/fts5.html#contentless_tables
*/
template<class T>
internal::content_t<T> content(T value) {
return {std::move(value)};
}

/**
* PRIMARY KEY table constraint builder function.
*/
Expand Down Expand Up @@ -11419,7 +11436,8 @@ namespace sqlite_orm {
check_if_is_template<unique_t>,
check_if_is_template<check_t>,
check_if_is_template<prefix_t>,
check_if_is_template<tokenize_t>>,
check_if_is_template<tokenize_t>,
check_if_is_template<content_t>>,
T>;

#ifdef SQLITE_ORM_WITH_CTE
Expand Down Expand Up @@ -19617,6 +19635,18 @@ namespace sqlite_orm {
}
};

template<class T>
struct statement_serializer<content_t<T>, void> {
using statement_type = content_t<T>;

template<class Ctx>
std::string operator()(const statement_type& statement, const Ctx& context) const {
std::stringstream ss;
ss << "content=" << serialize(statement.value, context);
return ss.str();
}
};

template<>
struct statement_serializer<collate_constraint_t, void> {
using statement_type = collate_constraint_t;
Expand All @@ -19632,8 +19662,8 @@ namespace sqlite_orm {
using statement_type = default_t<T>;

template<class Ctx>
std::string operator()(const statement_type& c, const Ctx& context) const {
return static_cast<std::string>(c) + " (" + serialize(c.value, context) + ")";
std::string operator()(const statement_type& statement, const Ctx& context) const {
return static_cast<std::string>(statement) + " (" + serialize(statement.value, context) + ")";
}
};

Expand Down
1 change: 1 addition & 0 deletions tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ add_executable(unit_tests
statement_serializer_tests/table_constraints/prefix.cpp
statement_serializer_tests/table_constraints/foreign_key.cpp
statement_serializer_tests/table_constraints/tokenize.cpp
statement_serializer_tests/table_constraints/content.cpp
statement_serializer_tests/bindables.cpp
statement_serializer_tests/ast/upsert_clause.cpp
statement_serializer_tests/ast/excluded.cpp
Expand Down
5 changes: 5 additions & 0 deletions tests/statement_serializer_tests/schema/using_fts5.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,5 +43,10 @@ TEST_CASE("statement_serializer using_fts5") {
expected = R"(USING FTS5("title", "body", tokenize = 'unicode61 remove_diacritics 1'))";
}
}
SECTION("content") {
auto node = using_fts5(make_column("title", &Post::title), make_column("body", &Post::body), content(""));
value = serialize(node, context);
expected = R"(USING FTS5("title", "body", content=''))";
}
REQUIRE(value == expected);
}
17 changes: 17 additions & 0 deletions tests/statement_serializer_tests/table_constraints/content.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#include <sqlite_orm/sqlite_orm.h>
#include <catch2/catch_all.hpp>

using namespace sqlite_orm;

TEST_CASE("statement_serializer content") {
internal::db_objects_tuple<> storage;
internal::serializer_context<internal::db_objects_tuple<>> context{storage};
std::string value;
std::string expected;
SECTION("empty") {
auto node = content("");
value = serialize(node, context);
expected = "content=''";
}
REQUIRE(value == expected);
}

0 comments on commit 4a62772

Please sign in to comment.