2019-07-20 21:33:17 +00:00
# include <cstdio>
# include <cstring>
# include <cstring>
# include <trantor/utils/Logger.h>
# include <helpers.h>
# include "relay_dbo.h"
# include "globals.h"
2019-07-22 20:06:13 +00:00
# include "controller_dbo.h"
2019-07-29 20:02:38 +00:00
# include "schedule_dbo.h"
2019-07-20 21:33:17 +00:00
static bool relay_db_update_insert ( relay_dbo * relay , sqlite3_stmt * stmt )
{
int rc ;
sqlite3_bind_int ( stmt , 1 , relay - > id ) ;
sqlite3_bind_int ( stmt , 2 , relay - > number ) ;
sqlite3_bind_text ( stmt , 3 , relay - > name , - 1 , SQLITE_STATIC ) ;
sqlite3_bind_text ( stmt , 4 , relay - > active_schedule_id , - 1 , SQLITE_STATIC ) ;
2019-07-22 20:06:13 +00:00
sqlite3_bind_text ( stmt , 5 , relay - > controller_id , - 1 , SQLITE_STATIC ) ;
2019-07-20 21:33:17 +00:00
rc = sqlite3_step ( stmt ) ;
if ( rc ! = SQLITE_DONE )
{
printf ( " ERROR inserting data: %s \n " , sqlite3_errmsg ( globals : : db ) ) ;
return false ;
}
sqlite3_finalize ( stmt ) ;
return true ;
}
static relay_dbo *
relay_db_select_mapper ( sqlite3_stmt * stmt )
{
2019-07-21 22:00:07 +00:00
auto * new_relay = new relay_dbo ( ) ;
2019-07-20 21:33:17 +00:00
for ( int i = 0 ; i < sqlite3_column_count ( stmt ) ; i + + )
{
const char * name = sqlite3_column_name ( stmt , i ) ;
switch ( name [ 0 ] )
{
case ' a ' : // active_schedule_id
strncpy ( new_relay - > active_schedule_id , ( const char * ) sqlite3_column_text ( stmt , i ) , 33 ) ;
break ;
2019-07-29 20:02:38 +00:00
case ' c ' : // controller_id
2019-07-22 20:06:13 +00:00
strncpy ( new_relay - > controller_id , ( const char * ) sqlite3_column_text ( stmt , i ) , 33 ) ;
2019-07-20 21:33:17 +00:00
break ;
case ' i ' :
new_relay - > id = sqlite3_column_int ( stmt , i ) ;
break ;
case ' n ' :
2019-07-20 22:29:05 +00:00
switch ( name [ 1 ] )
2019-07-20 21:33:17 +00:00
{
case ' a ' : // name
strncpy ( new_relay - > name , ( const char * ) sqlite3_column_text ( stmt , i ) , 127 ) ;
break ;
case ' u ' : // number
new_relay - > number = sqlite3_column_int ( stmt , i ) ;
break ;
default :
break ;
}
default : // ignore columns not implemented
break ;
}
}
return new_relay ;
}
static relay_dbo * *
relay_db_select ( sqlite3_stmt * stmt )
{
auto * * all_relays = ( relay_dbo * * ) malloc ( sizeof ( relay_dbo * ) ) ;
int row = 0 ;
while ( true )
{
int s ;
s = sqlite3_step ( stmt ) ;
if ( s = = SQLITE_ROW )
{
relay_dbo * new_relay = relay_db_select_mapper ( stmt ) ;
2019-07-29 20:02:38 +00:00
schedule_dbo * * schedules = schedule_dbo : : get_by_simple ( " id " , new_relay - > active_schedule_id , ( intptr_t ) & sqlite3_bind_text ) ;
if ( ! schedules [ 0 ] )
{
free ( schedules ) ;
schedules = schedule_dbo : : get_by_simple ( " id " , " off " , ( intptr_t ) & sqlite3_bind_text ) ;
strcpy ( new_relay - > active_schedule_id , " off " ) ;
}
new_relay - > active_schedule = schedules [ 0 ] ;
free ( schedules ) ;
2019-07-20 21:33:17 +00:00
row + + ;
all_relays = ( relay_dbo * * ) realloc ( all_relays , sizeof ( relay_dbo * ) * ( row + 1 ) ) ;
all_relays [ row - 1 ] = new_relay ;
}
else
{
if ( s = = SQLITE_DONE )
{
break ;
}
else
{
2019-07-20 22:29:05 +00:00
LOG_ERROR < < " Error Selecting relays from database: " < < sqlite3_errstr ( s ) ;
break ;
2019-07-20 21:33:17 +00:00
}
}
}
sqlite3_finalize ( stmt ) ;
all_relays [ row ] = nullptr ;
return all_relays ;
}
bool
relay_dbo : : update ( )
{
sqlite3_stmt * stmt ;
2019-07-22 20:06:13 +00:00
sqlite3_prepare_v2 ( globals : : db , " UPDATE relays set number = ?2, name = ?3, active_schedule_id = ?4, controller_id = ?5 WHERE id = ?1; " , - 1 , & stmt , nullptr ) ;
2019-07-20 21:33:17 +00:00
return relay_db_update_insert ( this , stmt ) ;
}
bool
relay_dbo : : insert ( )
{
sqlite3_stmt * stmt ;
2019-07-22 20:06:13 +00:00
sqlite3_prepare_v2 ( globals : : db , " INSERT INTO relays(number, name, active_schedule_id, controller_id) values (?2, ?3, ?4, ?5); " , - 1 , & stmt , nullptr ) ;
2019-07-20 21:33:17 +00:00
return relay_db_update_insert ( this , stmt ) ;
}
bool
relay_dbo : : remove ( )
{
sqlite3_stmt * stmt ;
int rc ;
sqlite3_prepare_v2 ( globals : : db , " DELETE FROM relays WHERE id=?1; " , - 1 , & stmt , nullptr ) ;
sqlite3_bind_int ( stmt , 1 , this - > id ) ;
rc = sqlite3_step ( stmt ) ;
sqlite3_finalize ( stmt ) ;
return rc = = SQLITE_DONE ;
}
Json : : Value
relay_dbo : : to_json ( )
{
Json : : Value relay_json ;
2019-07-20 22:29:05 +00:00
// relay_json["id"] = this->id;
2019-07-20 21:33:17 +00:00
relay_json [ " name " ] = this - > name ;
2019-07-20 22:29:05 +00:00
relay_json [ " number " ] = this - > number ;
relay_json [ " active_schedule_id " ] = this - > active_schedule_id ;
2019-07-22 20:06:13 +00:00
relay_json [ " controller_id " ] = this - > controller_id ;
2019-07-29 20:02:38 +00:00
relay_json [ " active_schedule " ] = this - > active_schedule - > to_json ( ) ;
2019-07-20 21:33:17 +00:00
return relay_json ;
}
relay_dbo * *
relay_dbo : : get_all ( )
{
sqlite3_stmt * stmt ;
sqlite3_prepare_v2 ( globals : : db , " SELECT * FROM relays; " , - 1 , & stmt , nullptr ) ;
return relay_db_select ( stmt ) ;
}
relay_dbo * *
relay_dbo : : get_by_simple ( const char * key , const void * value , intptr_t bind_func )
{
helpers : : sql_filter_builder * filters [ 1 ] ;
helpers : : sql_filter_builder filter
{
key ,
value ,
bind_func ,
" ; "
} ;
filters [ 0 ] = & filter ;
sqlite3_stmt * stmt = helpers : : create_sql_filtered_query ( " SELECT * FROM relays WHERE " , filters ) ;
return relay_db_select ( stmt ) ;
}
2019-07-20 22:29:05 +00:00
relay_dbo * *
relay_dbo : : get_by ( helpers : : sql_filter_builder * * filters )
{
sqlite3_stmt * stmt = helpers : : create_sql_filtered_query ( " SELECT * FROM relays WHERE " , filters ) ;
return relay_db_select ( stmt ) ;
}
2019-07-21 22:00:07 +00:00
relay_dbo *
2019-07-22 20:06:13 +00:00
relay_dbo : : get_relay_for_controller ( const char * controller_id , int relay_num )
2019-07-21 22:00:07 +00:00
{
helpers : : sql_filter_builder * filters [ 2 ] ;
helpers : : sql_filter_builder filter (
" number " ,
( void * ) ( intptr_t ) relay_num ,
( intptr_t ) & sqlite3_bind_int ,
" AND "
) ;
helpers : : sql_filter_builder filter2 (
2019-07-22 20:06:13 +00:00
" controller_id " ,
( void * ) controller_id ,
2019-07-21 22:00:07 +00:00
( intptr_t ) sqlite3_bind_text ,
" ; "
) ;
filters [ 0 ] = & filter ;
filters [ 1 ] = & filter2 ;
auto relays = relay_dbo : : get_by ( filters ) ;
relay_dbo * relay = relays [ 0 ] ;
free ( relays ) ;
return relay ;
}
bool
2019-07-22 20:06:13 +00:00
relay_dbo : : valid_num_for_controller ( const char * search_controller_id , int relay_num )
2019-07-21 22:00:07 +00:00
{
2019-07-22 20:06:13 +00:00
controller_dbo * * controllers = controller_dbo : : get_by_simple ( " id " , search_controller_id , ( intptr_t ) & sqlite3_bind_text ) ;
2019-07-21 22:00:07 +00:00
2019-07-22 20:06:13 +00:00
bool valid_id_and_num = controllers [ 0 ] & & controllers [ 0 ] - > relay_count > relay_num ;
controller_dbo : : free_list ( controllers ) ;
2019-07-21 22:00:07 +00:00
return valid_id_and_num ;
}
2019-07-20 21:33:17 +00:00
void
relay_dbo : : free_list ( relay_dbo * * relays_list )
{
for ( int i = 0 ; relays_list [ i ] ! = nullptr ; i + + )
{
free ( relays_list [ i ] ) ;
}
free ( relays_list ) ;
2019-07-21 22:00:07 +00:00
}