2022-11-29 00:06:35 -03:00
# include "models/error.h"
2022-11-01 01:04:41 -03:00
# include "models/fact.h"
const char * obelisk : : Fact : : createTable ( )
{
return R " (
CREATE TABLE " fact " (
" id " INTEGER NOT NULL UNIQUE ,
" left_entity " INTEGER NOT NULL ,
" verb " INTEGER NOT NULL ,
2023-02-13 23:03:31 -03:00
" right_entity " INTEGER NOT NULL ,
2023-02-03 23:16:03 -03:00
" is_true " INTEGER NOT NULL DEFAULT 0 ,
2022-11-01 01:04:41 -03:00
PRIMARY KEY ( " id " AUTOINCREMENT ) ,
2022-11-29 00:06:35 -03:00
UNIQUE ( " left_entity " , " right_entity " , " verb " )
2022-11-01 01:04:41 -03:00
FOREIGN KEY ( " verb " ) REFERENCES " verb " ( " id " ) ON DELETE RESTRICT ,
FOREIGN KEY ( " right_entity " ) REFERENCES " entity " ( " id " ) ON DELETE RESTRICT ,
FOREIGN KEY ( " left_entity " ) REFERENCES " entity " ( " id " ) ON DELETE RESTRICT
) ;
) " ;
}
2023-02-18 21:06:42 -03:00
void obelisk : : Fact : : selectById ( sqlite3 * dbConnection )
2022-11-26 00:32:06 -03:00
{
2022-11-29 00:06:35 -03:00
if ( dbConnection = = nullptr )
{
throw obelisk : : DatabaseException ( " database isn't open " ) ;
}
2022-11-26 00:32:06 -03:00
sqlite3_stmt * ppStmt = nullptr ;
2023-02-20 09:11:10 -03:00
const char * query ;
if ( getId ( ) = = 0 )
{
query
= " SELECT id, left_entity, right_entity, verb, is_true FROM fact WHERE (left_entity=? AND right_entity=? AND verb=?) " ;
}
else
{
2023-02-20 22:05:57 -03:00
query
= " SELECT id, left_entity, right_entity, verb, is_true FROM fact WHERE (id=?) " ;
2023-02-20 09:11:10 -03:00
}
auto result = sqlite3_prepare_v2 ( dbConnection , query , - 1 , & ppStmt , nullptr ) ;
2022-11-26 00:32:06 -03:00
if ( result ! = SQLITE_OK )
{
2022-11-29 00:06:35 -03:00
throw obelisk : : DatabaseException ( sqlite3_errmsg ( dbConnection ) ) ;
2022-11-26 00:32:06 -03:00
}
2023-02-20 09:11:10 -03:00
if ( getId ( ) = = 0 )
2022-11-26 00:32:06 -03:00
{
2023-02-20 09:11:10 -03:00
result = sqlite3_bind_int ( ppStmt , 1 , getLeftEntity ( ) . getId ( ) ) ;
switch ( result )
{
case SQLITE_OK :
break ;
case SQLITE_TOOBIG :
throw obelisk : : DatabaseSizeException ( ) ;
break ;
case SQLITE_RANGE :
throw obelisk : : DatabaseRangeException ( ) ;
break ;
case SQLITE_NOMEM :
throw obelisk : : DatabaseMemoryException ( ) ;
break ;
default :
throw obelisk : : DatabaseException ( sqlite3_errmsg ( dbConnection ) ) ;
break ;
}
2022-11-26 00:32:06 -03:00
2023-02-20 09:11:10 -03:00
result = sqlite3_bind_int ( ppStmt , 2 , getRightEntity ( ) . getId ( ) ) ;
switch ( result )
{
case SQLITE_OK :
break ;
case SQLITE_TOOBIG :
throw obelisk : : DatabaseSizeException ( ) ;
break ;
case SQLITE_RANGE :
throw obelisk : : DatabaseRangeException ( ) ;
break ;
case SQLITE_NOMEM :
throw obelisk : : DatabaseMemoryException ( ) ;
break ;
default :
throw obelisk : : DatabaseException ( sqlite3_errmsg ( dbConnection ) ) ;
break ;
}
2022-11-26 00:32:06 -03:00
2023-02-20 09:11:10 -03:00
result = sqlite3_bind_int ( ppStmt , 3 , getVerb ( ) . getId ( ) ) ;
switch ( result )
{
case SQLITE_OK :
break ;
case SQLITE_TOOBIG :
throw obelisk : : DatabaseSizeException ( ) ;
break ;
case SQLITE_RANGE :
throw obelisk : : DatabaseRangeException ( ) ;
break ;
case SQLITE_NOMEM :
throw obelisk : : DatabaseMemoryException ( ) ;
break ;
default :
throw obelisk : : DatabaseException ( sqlite3_errmsg ( dbConnection ) ) ;
break ;
}
}
else
2022-11-26 00:32:06 -03:00
{
2023-02-20 09:11:10 -03:00
result = sqlite3_bind_int ( ppStmt , 1 , getId ( ) ) ;
switch ( result )
{
case SQLITE_OK :
break ;
case SQLITE_TOOBIG :
throw obelisk : : DatabaseSizeException ( ) ;
break ;
case SQLITE_RANGE :
throw obelisk : : DatabaseRangeException ( ) ;
break ;
case SQLITE_NOMEM :
throw obelisk : : DatabaseMemoryException ( ) ;
break ;
default :
throw obelisk : : DatabaseException ( sqlite3_errmsg ( dbConnection ) ) ;
break ;
}
2022-11-26 00:32:06 -03:00
}
result = sqlite3_step ( ppStmt ) ;
2022-11-29 00:06:35 -03:00
switch ( result )
2022-11-26 00:32:06 -03:00
{
2022-11-29 00:06:35 -03:00
case SQLITE_DONE :
// no rows in the database
break ;
case SQLITE_ROW :
setId ( sqlite3_column_int ( ppStmt , 0 ) ) ;
getLeftEntity ( ) . setId ( sqlite3_column_int ( ppStmt , 1 ) ) ;
getRightEntity ( ) . setId ( sqlite3_column_int ( ppStmt , 2 ) ) ;
getVerb ( ) . setId ( sqlite3_column_int ( ppStmt , 3 ) ) ;
2023-02-15 21:49:53 -03:00
setIsTrue ( sqlite3_column_int ( ppStmt , 4 ) ) ;
2022-11-29 00:06:35 -03:00
break ;
case SQLITE_BUSY :
2022-12-10 21:11:39 -03:00
throw obelisk : : DatabaseBusyException ( ) ;
2022-11-29 00:06:35 -03:00
break ;
case SQLITE_MISUSE :
2022-12-10 21:11:39 -03:00
throw obelisk : : DatabaseMisuseException ( ) ;
2022-11-29 00:06:35 -03:00
break ;
default :
throw obelisk : : DatabaseException ( sqlite3_errmsg ( dbConnection ) ) ;
break ;
2022-11-26 00:32:06 -03:00
}
2022-11-29 00:06:35 -03:00
result = sqlite3_finalize ( ppStmt ) ;
if ( result ! = SQLITE_OK )
2022-11-26 00:32:06 -03:00
{
2022-11-29 00:06:35 -03:00
throw obelisk : : DatabaseException ( sqlite3_errmsg ( dbConnection ) ) ;
2022-11-26 00:32:06 -03:00
}
}
2023-02-22 00:42:40 -03:00
void obelisk : : Fact : : selectByName ( sqlite3 * dbConnection )
{
if ( dbConnection = = nullptr )
{
throw obelisk : : DatabaseException ( " database isn't open " ) ;
}
sqlite3_stmt * ppStmt = nullptr ;
auto result = sqlite3_prepare_v2 ( dbConnection ,
" SELECT fact.id, fact.left_entity, fact.right_entity, fact.verb, fact.is_true FROM fact LEFT JOIN entity le ON le.id = fact.left_entity LEFT JOIN entity re ON re.id = fact.right_entity LEFT JOIN verb v ON fact.verb = v.id WHERE (le.name=? AND v.name=? AND re.name=?) " ,
- 1 ,
& ppStmt ,
nullptr ) ;
if ( result ! = SQLITE_OK )
{
throw obelisk : : DatabaseException ( sqlite3_errmsg ( dbConnection ) ) ;
}
result = sqlite3_bind_text ( ppStmt ,
1 ,
getLeftEntity ( ) . getName ( ) . c_str ( ) ,
- 1 ,
SQLITE_STATIC ) ;
switch ( result )
{
case SQLITE_OK :
break ;
case SQLITE_TOOBIG :
throw obelisk : : DatabaseSizeException ( ) ;
break ;
case SQLITE_RANGE :
throw obelisk : : DatabaseRangeException ( ) ;
break ;
case SQLITE_NOMEM :
throw obelisk : : DatabaseMemoryException ( ) ;
break ;
default :
throw obelisk : : DatabaseException ( sqlite3_errmsg ( dbConnection ) ) ;
break ;
}
result = sqlite3_bind_text ( ppStmt ,
2 ,
getVerb ( ) . getName ( ) . c_str ( ) ,
- 1 ,
SQLITE_STATIC ) ;
switch ( result )
{
case SQLITE_OK :
break ;
case SQLITE_TOOBIG :
throw obelisk : : DatabaseSizeException ( ) ;
break ;
case SQLITE_RANGE :
throw obelisk : : DatabaseRangeException ( ) ;
break ;
case SQLITE_NOMEM :
throw obelisk : : DatabaseMemoryException ( ) ;
break ;
default :
throw obelisk : : DatabaseException ( sqlite3_errmsg ( dbConnection ) ) ;
break ;
}
result = sqlite3_bind_text ( ppStmt ,
3 ,
getRightEntity ( ) . getName ( ) . c_str ( ) ,
- 1 ,
SQLITE_STATIC ) ;
switch ( result )
{
case SQLITE_OK :
break ;
case SQLITE_TOOBIG :
throw obelisk : : DatabaseSizeException ( ) ;
break ;
case SQLITE_RANGE :
throw obelisk : : DatabaseRangeException ( ) ;
break ;
case SQLITE_NOMEM :
throw obelisk : : DatabaseMemoryException ( ) ;
break ;
default :
throw obelisk : : DatabaseException ( sqlite3_errmsg ( dbConnection ) ) ;
break ;
}
result = sqlite3_step ( ppStmt ) ;
switch ( result )
{
case SQLITE_DONE :
// no rows in the database
break ;
case SQLITE_ROW :
setId ( sqlite3_column_int ( ppStmt , 0 ) ) ;
getLeftEntity ( ) . setId ( sqlite3_column_int ( ppStmt , 1 ) ) ;
getRightEntity ( ) . setId ( sqlite3_column_int ( ppStmt , 2 ) ) ;
getVerb ( ) . setId ( sqlite3_column_int ( ppStmt , 3 ) ) ;
setIsTrue ( sqlite3_column_int ( ppStmt , 4 ) ) ;
break ;
case SQLITE_BUSY :
throw obelisk : : DatabaseBusyException ( ) ;
break ;
case SQLITE_MISUSE :
throw obelisk : : DatabaseMisuseException ( ) ;
break ;
default :
throw obelisk : : DatabaseException ( sqlite3_errmsg ( dbConnection ) ) ;
break ;
}
result = sqlite3_finalize ( ppStmt ) ;
if ( result ! = SQLITE_OK )
{
throw obelisk : : DatabaseException ( sqlite3_errmsg ( dbConnection ) ) ;
}
}
2023-02-23 01:07:44 -03:00
void obelisk : : Fact : : selectActionByFact ( sqlite3 * dbConnection ,
obelisk : : Action & action )
{
if ( dbConnection = = nullptr )
{
throw obelisk : : DatabaseException ( " database isn't open " ) ;
}
sqlite3_stmt * ppStmt = nullptr ;
auto result = sqlite3_prepare_v2 ( dbConnection ,
" SELECT CASE f.is_true WHEN 0 THEN (SELECT name FROM action WHERE id = fa.id) WHEN 1 THEN (SELECT name from action WHERE id = ta.id) END action FROM suggest_action LEFT JOIN action ta ON ta.id = suggest_action.true_action LEFT JOIN action fa ON fa.id = suggest_action.false_action LEFT JOIN fact f ON f.id = suggest_action.fact WHERE (f.id = ?) " ,
- 1 ,
& ppStmt ,
nullptr ) ;
if ( result ! = SQLITE_OK )
{
throw obelisk : : DatabaseException ( sqlite3_errmsg ( dbConnection ) ) ;
}
result = sqlite3_bind_int ( ppStmt , 1 , getId ( ) ) ;
switch ( result )
{
case SQLITE_OK :
break ;
case SQLITE_TOOBIG :
throw obelisk : : DatabaseSizeException ( ) ;
break ;
case SQLITE_RANGE :
throw obelisk : : DatabaseRangeException ( ) ;
break ;
case SQLITE_NOMEM :
throw obelisk : : DatabaseMemoryException ( ) ;
break ;
default :
throw obelisk : : DatabaseException ( sqlite3_errmsg ( dbConnection ) ) ;
break ;
}
result = sqlite3_step ( ppStmt ) ;
switch ( result )
{
case SQLITE_DONE :
// no rows in the database
break ;
case SQLITE_ROW :
action . setName ( ( char * ) sqlite3_column_text ( ppStmt , 0 ) ) ;
break ;
case SQLITE_BUSY :
throw obelisk : : DatabaseBusyException ( ) ;
break ;
case SQLITE_MISUSE :
throw obelisk : : DatabaseMisuseException ( ) ;
break ;
default :
throw obelisk : : DatabaseException ( sqlite3_errmsg ( dbConnection ) ) ;
break ;
}
result = sqlite3_finalize ( ppStmt ) ;
if ( result ! = SQLITE_OK )
{
throw obelisk : : DatabaseException ( sqlite3_errmsg ( dbConnection ) ) ;
}
}
2023-02-16 00:40:43 -03:00
void obelisk : : Fact : : insert ( sqlite3 * dbConnection )
2022-11-26 00:32:06 -03:00
{
2022-11-29 00:06:35 -03:00
if ( dbConnection = = nullptr )
2022-11-26 00:32:06 -03:00
{
2022-11-29 00:06:35 -03:00
throw obelisk : : DatabaseException ( " database isn't open " ) ;
}
2022-11-26 00:32:06 -03:00
sqlite3_stmt * ppStmt = nullptr ;
auto result = sqlite3_prepare_v2 ( dbConnection ,
2023-02-15 21:49:53 -03:00
" INSERT INTO fact (left_entity, right_entity, verb, is_true) VALUES (?, ?, ?, ?) " ,
2022-11-26 00:32:06 -03:00
- 1 ,
& ppStmt ,
2022-11-29 00:06:35 -03:00
nullptr ) ;
2022-11-26 00:32:06 -03:00
if ( result ! = SQLITE_OK )
{
2022-11-29 00:06:35 -03:00
throw obelisk : : DatabaseException ( sqlite3_errmsg ( dbConnection ) ) ;
2022-11-26 00:32:06 -03:00
}
result = sqlite3_bind_int ( ppStmt , 1 , getLeftEntity ( ) . getId ( ) ) ;
2022-11-29 00:06:35 -03:00
switch ( result )
2022-11-26 00:32:06 -03:00
{
2022-11-29 00:06:35 -03:00
case SQLITE_OK :
break ;
case SQLITE_TOOBIG :
2022-12-10 21:11:39 -03:00
throw obelisk : : DatabaseSizeException ( ) ;
2022-11-29 00:06:35 -03:00
break ;
case SQLITE_RANGE :
2022-12-10 21:11:39 -03:00
throw obelisk : : DatabaseRangeException ( ) ;
2022-11-29 00:06:35 -03:00
break ;
case SQLITE_NOMEM :
2022-12-10 21:11:39 -03:00
throw obelisk : : DatabaseMemoryException ( ) ;
2022-11-29 00:06:35 -03:00
break ;
default :
throw obelisk : : DatabaseException ( sqlite3_errmsg ( dbConnection ) ) ;
break ;
2022-11-26 00:32:06 -03:00
}
result = sqlite3_bind_int ( ppStmt , 2 , getRightEntity ( ) . getId ( ) ) ;
2022-11-29 00:06:35 -03:00
switch ( result )
2022-11-26 00:32:06 -03:00
{
2022-11-29 00:06:35 -03:00
case SQLITE_OK :
break ;
case SQLITE_TOOBIG :
2022-12-10 21:11:39 -03:00
throw obelisk : : DatabaseSizeException ( ) ;
2022-11-29 00:06:35 -03:00
break ;
case SQLITE_RANGE :
2022-12-10 21:11:39 -03:00
throw obelisk : : DatabaseRangeException ( ) ;
2022-11-29 00:06:35 -03:00
break ;
case SQLITE_NOMEM :
2022-12-10 21:11:39 -03:00
throw obelisk : : DatabaseMemoryException ( ) ;
2022-11-29 00:06:35 -03:00
break ;
default :
throw obelisk : : DatabaseException ( sqlite3_errmsg ( dbConnection ) ) ;
break ;
2022-11-26 00:32:06 -03:00
}
result = sqlite3_bind_int ( ppStmt , 3 , getVerb ( ) . getId ( ) ) ;
2022-11-29 00:06:35 -03:00
switch ( result )
2022-11-26 00:32:06 -03:00
{
2022-11-29 00:06:35 -03:00
case SQLITE_OK :
break ;
case SQLITE_TOOBIG :
2022-12-10 21:11:39 -03:00
throw obelisk : : DatabaseSizeException ( ) ;
2022-11-29 00:06:35 -03:00
break ;
case SQLITE_RANGE :
2022-12-10 21:11:39 -03:00
throw obelisk : : DatabaseRangeException ( ) ;
2022-11-29 00:06:35 -03:00
break ;
case SQLITE_NOMEM :
2022-12-10 21:11:39 -03:00
throw obelisk : : DatabaseMemoryException ( ) ;
2022-11-29 00:06:35 -03:00
break ;
default :
throw obelisk : : DatabaseException ( sqlite3_errmsg ( dbConnection ) ) ;
break ;
2022-11-26 00:32:06 -03:00
}
2023-02-15 21:49:53 -03:00
result = sqlite3_bind_int ( ppStmt , 4 , getIsTrue ( ) ) ;
switch ( result )
{
case SQLITE_OK :
break ;
case SQLITE_TOOBIG :
throw obelisk : : DatabaseSizeException ( ) ;
break ;
case SQLITE_RANGE :
throw obelisk : : DatabaseRangeException ( ) ;
break ;
case SQLITE_NOMEM :
throw obelisk : : DatabaseMemoryException ( ) ;
break ;
default :
throw obelisk : : DatabaseException ( sqlite3_errmsg ( dbConnection ) ) ;
break ;
}
2022-11-26 00:32:06 -03:00
result = sqlite3_step ( ppStmt ) ;
2022-11-29 00:06:35 -03:00
switch ( result )
2022-11-27 23:58:40 -03:00
{
2022-11-29 00:06:35 -03:00
case SQLITE_DONE :
setId ( ( int ) sqlite3_last_insert_rowid ( dbConnection ) ) ;
sqlite3_set_last_insert_rowid ( dbConnection , 0 ) ;
break ;
case SQLITE_CONSTRAINT :
2023-02-20 22:05:57 -03:00
throw obelisk : : DatabaseConstraintException (
sqlite3_errmsg ( dbConnection ) ) ;
2022-11-29 00:06:35 -03:00
case SQLITE_BUSY :
2022-12-10 21:11:39 -03:00
throw obelisk : : DatabaseBusyException ( ) ;
2022-11-29 00:06:35 -03:00
break ;
case SQLITE_MISUSE :
2022-12-10 21:11:39 -03:00
throw obelisk : : DatabaseMisuseException ( ) ;
2023-02-20 09:11:10 -03:00
break ;
default :
throw obelisk : : DatabaseException ( sqlite3_errmsg ( dbConnection ) ) ;
break ;
}
result = sqlite3_finalize ( ppStmt ) ;
if ( result ! = SQLITE_OK )
{
throw obelisk : : DatabaseException ( sqlite3_errmsg ( dbConnection ) ) ;
}
}
void obelisk : : Fact : : updateIsTrue ( sqlite3 * dbConnection )
{
if ( dbConnection = = nullptr )
{
throw obelisk : : DatabaseException ( " database isn't open " ) ;
}
sqlite3_stmt * ppStmt = nullptr ;
2023-02-20 22:05:57 -03:00
auto result = sqlite3_prepare_v2 ( dbConnection ,
" UPDATE fact SET is_true=? WHERE id=? " ,
- 1 ,
& ppStmt ,
nullptr ) ;
2023-02-20 09:11:10 -03:00
if ( result ! = SQLITE_OK )
{
throw obelisk : : DatabaseException ( sqlite3_errmsg ( dbConnection ) ) ;
}
result = sqlite3_bind_int ( ppStmt , 1 , getIsTrue ( ) ) ;
switch ( result )
{
case SQLITE_OK :
break ;
case SQLITE_TOOBIG :
throw obelisk : : DatabaseSizeException ( ) ;
break ;
case SQLITE_RANGE :
throw obelisk : : DatabaseRangeException ( ) ;
break ;
case SQLITE_NOMEM :
throw obelisk : : DatabaseMemoryException ( ) ;
break ;
default :
throw obelisk : : DatabaseException ( sqlite3_errmsg ( dbConnection ) ) ;
break ;
}
result = sqlite3_bind_int ( ppStmt , 2 , getId ( ) ) ;
switch ( result )
{
case SQLITE_OK :
break ;
case SQLITE_TOOBIG :
throw obelisk : : DatabaseSizeException ( ) ;
break ;
case SQLITE_RANGE :
throw obelisk : : DatabaseRangeException ( ) ;
break ;
case SQLITE_NOMEM :
throw obelisk : : DatabaseMemoryException ( ) ;
break ;
default :
throw obelisk : : DatabaseException ( sqlite3_errmsg ( dbConnection ) ) ;
break ;
}
result = sqlite3_step ( ppStmt ) ;
switch ( result )
{
case SQLITE_DONE :
// Row updated
break ;
case SQLITE_CONSTRAINT :
2023-02-20 22:05:57 -03:00
throw obelisk : : DatabaseConstraintException (
sqlite3_errmsg ( dbConnection ) ) ;
2023-02-20 09:11:10 -03:00
case SQLITE_BUSY :
throw obelisk : : DatabaseBusyException ( ) ;
break ;
case SQLITE_MISUSE :
throw obelisk : : DatabaseMisuseException ( ) ;
2022-11-29 00:06:35 -03:00
break ;
default :
throw obelisk : : DatabaseException ( sqlite3_errmsg ( dbConnection ) ) ;
break ;
2022-11-27 23:58:40 -03:00
}
2022-11-26 00:32:06 -03:00
result = sqlite3_finalize ( ppStmt ) ;
if ( result ! = SQLITE_OK )
{
2022-11-29 00:06:35 -03:00
throw obelisk : : DatabaseException ( sqlite3_errmsg ( dbConnection ) ) ;
2022-11-26 00:32:06 -03:00
}
}
int & obelisk : : Fact : : getId ( )
2022-11-01 01:04:41 -03:00
{
return id_ ;
}
void obelisk : : Fact : : setId ( int id )
{
id_ = id ;
}
2022-11-26 00:32:06 -03:00
obelisk : : Entity & obelisk : : Fact : : getLeftEntity ( )
2022-11-01 01:04:41 -03:00
{
return leftEntity_ ;
}
void obelisk : : Fact : : setLeftEntity ( obelisk : : Entity leftEntity )
{
leftEntity_ = leftEntity ;
}
2022-11-26 00:32:06 -03:00
obelisk : : Entity & obelisk : : Fact : : getRightEntity ( )
2022-11-01 01:04:41 -03:00
{
return rightEntity_ ;
}
void obelisk : : Fact : : setRightEntity ( obelisk : : Entity rightEntity )
{
rightEntity_ = rightEntity ;
}
2022-11-26 00:32:06 -03:00
obelisk : : Verb & obelisk : : Fact : : getVerb ( )
2022-11-01 01:04:41 -03:00
{
return verb_ ;
}
void obelisk : : Fact : : setVerb ( obelisk : : Verb verb )
{
verb_ = verb ;
}
2023-02-15 21:49:53 -03:00
2023-02-22 00:42:40 -03:00
double & obelisk : : Fact : : getIsTrue ( )
2023-02-15 21:49:53 -03:00
{
return isTrue_ ;
}
2023-02-22 00:42:40 -03:00
void obelisk : : Fact : : setIsTrue ( double isTrue )
2023-02-15 21:49:53 -03:00
{
isTrue_ = isTrue ;
}