From c093f23578549cde3d08ddd5256ac13e461de81a Mon Sep 17 00:00:00 2001 From: Mr-Dave Date: Sun, 17 Apr 2022 20:39:57 -0600 Subject: [PATCH] Revise sql parameters/processing --- doc/motionplus_config.html | 150 ++++++++++--------------------------- src/conf.cpp | 100 +++++++++---------------- src/conf.hpp | 12 ++- src/dbse.cpp | 80 ++++++-------------- src/dbse.hpp | 7 +- src/event.cpp | 113 ++++++++-------------------- src/motion_loop.cpp | 9 ++- src/motionplus.hpp | 17 +++-- 8 files changed, 152 insertions(+), 336 deletions(-) diff --git a/doc/motionplus_config.html b/doc/motionplus_config.html index e039638b..c6fd3c8b 100644 --- a/doc/motionplus_config.html +++ b/doc/motionplus_config.html @@ -919,43 +919,31 @@
- sql_log_movie + sql_event_end
- sql_log_picture + sql_event_start
- sql_log_snapshot + sql_movie_end
- sql_log_timelapse + sql_movie_start
- sql_query - - -
- - - sql_query_start - - -
- - - sql_query_stop + sql_pic_save
@@ -1683,17 +1671,13 @@ database_user database_password database_busy_timeout - sql_log_picture + sql_event_end - sql_log_snapshot - sql_log_movie - sql_log_timelapse - sql_query - - - sql_query_start - sql_query_stop + sql_event_start + sql_movie_end + sql_movie_start + sql_pic_save @@ -4008,123 +3992,67 @@

-

sql_log_picture

+

sql_event_end

- Log to the database when MotionPlus triggers a image file to be saved. + SQL query to execute at the end of the event.

-

sql_log_snapshot

+

+

sql_event_start

- Log to the database when creating a snapshot image file. + SQL query to execute at the start of the event.

-

sql_log_movie

+

+

sql_movie_end

- Log to the database when creating motion triggered movie file. + SQL query to execute at the end of the movie.

-

sql_log_timelapse

+

+

sql_movie_start

- Log to the database when creating timelapse movie file + SQL query to execute at the start of the movie.

-

sql_query_start

+

+

sql_pic_save

- SQL query that executes against the event table which tracks the unique events of motion. -

- Once the new record is added to this table, the mysql function mysql_insert_id is then - executed to provide the key back into the dbeventid specifier. -

- The dbeventid specifier can then be used in the sql_query as a parameter - to that query for inserting into the table. -

- Although this query is run for all the different database options, the dbeventid is - only set for mysql databases. For the other databases, the dbeventid is always set - to zero. -

+ SQL query to execute when a picture has been saved.

You can use Conversion Specifiers within the query.

- Sample Query -

- insert into security_events(camera, event_time_stamp) values('%t', '%Y-%m-%d %T')" -

-

- -

sql_query_stop

-

- -

- SQL query that executes after a movie has finished. - This can be used to for example update the events table with an end timestamp for the recording. -

-

- You can use Conversion Specifiers within the query. -

-

- Sample Query -

- update security_events set event_end_time_stamp='%Y-%m-%d %T' where filename='%f' -

-

- -

sql_query

-

- -

- SQL query string that is sent to the database when the sql_log_* item is triggered. -

-

- You can use Conversion Specifiers - within the query. -

-

- Sample Queries (depend upon the table created) -

-
insert into security(camera, filename, frame, file_type, time_stamp, text_event) values('%t', '%f', '%q', '%n', '%Y-%m-%d %T', '%C') -
insert or ignore into images (camera_nbr, file_name, year, month, day, hour, minute) values (8, '%f', '%Y','%m','%d','%H','%M') -
insert into security_file(camera, event_id, filename, frame, file_type, time_stamp) values('%t', '%{dbeventid}', '%f', '%q', '%n', '%Y-%m-%d %T')" -

-

diff --git a/src/conf.cpp b/src/conf.cpp index 22acfe85..8c1abaaf 100644 --- a/src/conf.cpp +++ b/src/conf.cpp @@ -186,13 +186,11 @@ struct ctx_parm config_parms[] = { {"database_password", PARM_TYP_STRING, PARM_CAT_15, WEBUI_LEVEL_RESTRICTED }, {"database_busy_timeout", PARM_TYP_INT, PARM_CAT_15, WEBUI_LEVEL_ADVANCED }, - {"sql_log_picture", PARM_TYP_BOOL, PARM_CAT_16, WEBUI_LEVEL_LIMITED }, - {"sql_log_snapshot", PARM_TYP_BOOL, PARM_CAT_16, WEBUI_LEVEL_LIMITED}, - {"sql_log_movie", PARM_TYP_BOOL, PARM_CAT_16, WEBUI_LEVEL_LIMITED }, - {"sql_log_timelapse", PARM_TYP_BOOL, PARM_CAT_16, WEBUI_LEVEL_LIMITED}, - {"sql_query_start", PARM_TYP_STRING, PARM_CAT_16, WEBUI_LEVEL_ADVANCED }, - {"sql_query_stop", PARM_TYP_STRING, PARM_CAT_16, WEBUI_LEVEL_ADVANCED }, - {"sql_query", PARM_TYP_STRING, PARM_CAT_16, WEBUI_LEVEL_ADVANCED}, + {"sql_event_start", PARM_TYP_STRING, PARM_CAT_16, WEBUI_LEVEL_ADVANCED }, + {"sql_event_end", PARM_TYP_STRING, PARM_CAT_16, WEBUI_LEVEL_ADVANCED }, + {"sql_movie_start", PARM_TYP_STRING, PARM_CAT_16, WEBUI_LEVEL_ADVANCED }, + {"sql_movie_end", PARM_TYP_STRING, PARM_CAT_16, WEBUI_LEVEL_ADVANCED }, + {"sql_pic_save", PARM_TYP_STRING, PARM_CAT_16, WEBUI_LEVEL_ADVANCED}, {"ptz_auto_track", PARM_TYP_BOOL, PARM_CAT_17, WEBUI_LEVEL_LIMITED }, {"ptz_wait", PARM_TYP_INT, PARM_CAT_17, WEBUI_LEVEL_LIMITED }, @@ -2660,95 +2658,69 @@ static void conf_edit_database_busy_timeout(struct ctx_cam *cam, std::string &pa MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","database_busy_timeout",_("database_busy_timeout")); } -static void conf_edit_sql_log_picture(struct ctx_cam *cam, std::string &parm, enum PARM_ACT pact) +static void conf_edit_sql_event_start(struct ctx_cam *cam, std::string &parm, enum PARM_ACT pact) { if (pact == PARM_ACT_DFLT) { - cam->conf->sql_log_picture = false; + cam->conf->sql_event_start = ""; } else if (pact == PARM_ACT_SET) { - conf_edit_set_bool(cam->conf->sql_log_picture, parm); + cam->conf->sql_event_start = parm; } else if (pact == PARM_ACT_GET) { - conf_edit_get_bool(parm, cam->conf->sql_log_picture); + parm = cam->conf->sql_event_start; } return; - MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","sql_log_picture",_("sql_log_picture")); + MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","sql_event_start",_("sql_event_start")); } -static void conf_edit_sql_log_snapshot(struct ctx_cam *cam, std::string &parm, enum PARM_ACT pact) +static void conf_edit_sql_event_end(struct ctx_cam *cam, std::string &parm, enum PARM_ACT pact) { if (pact == PARM_ACT_DFLT) { - cam->conf->sql_log_snapshot = false; + cam->conf->sql_event_end = ""; } else if (pact == PARM_ACT_SET) { - conf_edit_set_bool(cam->conf->sql_log_snapshot, parm); + cam->conf->sql_event_end = parm; } else if (pact == PARM_ACT_GET) { - conf_edit_get_bool(parm, cam->conf->sql_log_snapshot); + parm = cam->conf->sql_event_end; } return; - MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","sql_log_snapshot",_("sql_log_snapshot")); + MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","sql_event_end",_("sql_event_end")); } -static void conf_edit_sql_log_movie(struct ctx_cam *cam, std::string &parm, enum PARM_ACT pact) +static void conf_edit_sql_movie_start(struct ctx_cam *cam, std::string &parm, enum PARM_ACT pact) { if (pact == PARM_ACT_DFLT) { - cam->conf->sql_log_movie = false; + cam->conf->sql_movie_start = ""; } else if (pact == PARM_ACT_SET) { - conf_edit_set_bool(cam->conf->sql_log_movie, parm); + cam->conf->sql_movie_start = parm; } else if (pact == PARM_ACT_GET) { - conf_edit_get_bool(parm, cam->conf->sql_log_movie); + parm = cam->conf->sql_movie_start; } return; - MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","sql_log_movie",_("sql_log_movie")); + MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","sql_movie_start",_("sql_movie_start")); } -static void conf_edit_sql_log_timelapse(struct ctx_cam *cam, std::string &parm, enum PARM_ACT pact) +static void conf_edit_sql_movie_end(struct ctx_cam *cam, std::string &parm, enum PARM_ACT pact) { if (pact == PARM_ACT_DFLT) { - cam->conf->sql_log_timelapse = false; + cam->conf->sql_movie_end = ""; } else if (pact == PARM_ACT_SET) { - conf_edit_set_bool(cam->conf->sql_log_timelapse, parm); + cam->conf->sql_movie_end = parm; } else if (pact == PARM_ACT_GET) { - conf_edit_get_bool(parm, cam->conf->sql_log_timelapse); + parm = cam->conf->sql_movie_end; } return; - MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","sql_log_timelapse",_("sql_log_timelapse")); + MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","sql_movie_end",_("sql_movie_end")); } -static void conf_edit_sql_query_start(struct ctx_cam *cam, std::string &parm, enum PARM_ACT pact) +static void conf_edit_sql_pic_save(struct ctx_cam *cam, std::string &parm, enum PARM_ACT pact) { if (pact == PARM_ACT_DFLT) { - cam->conf->sql_query_start = ""; + cam->conf->sql_pic_save = ""; } else if (pact == PARM_ACT_SET) { - cam->conf->sql_query_start = parm; + cam->conf->sql_pic_save = parm; } else if (pact == PARM_ACT_GET) { - parm = cam->conf->sql_query_start; + parm = cam->conf->sql_pic_save; } return; - MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","sql_query_start",_("sql_query_start")); -} - -static void conf_edit_sql_query_stop(struct ctx_cam *cam, std::string &parm, enum PARM_ACT pact) -{ - if (pact == PARM_ACT_DFLT) { - cam->conf->sql_query_stop = ""; - } else if (pact == PARM_ACT_SET) { - cam->conf->sql_query_stop = parm; - } else if (pact == PARM_ACT_GET) { - parm = cam->conf->sql_query_stop; - } - return; - MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","sql_query_stop",_("sql_query_stop")); -} - -static void conf_edit_sql_query(struct ctx_cam *cam, std::string &parm, enum PARM_ACT pact) -{ - if (pact == PARM_ACT_DFLT) { - cam->conf->sql_query = ""; - } else if (pact == PARM_ACT_SET) { - cam->conf->sql_query = parm; - } else if (pact == PARM_ACT_GET) { - parm = cam->conf->sql_query; - } - return; - MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","sql_query",_("sql_query")); + MOTION_LOG(DBG, TYPE_ALL, NO_ERRNO,"%s:%s","sql_pic_save",_("sql_pic_save")); } static void conf_edit_ptz_auto_track(struct ctx_cam *cam, std::string &parm, enum PARM_ACT pact) @@ -3123,13 +3095,11 @@ static void conf_edit_cat15(struct ctx_cam *cam, std::string parm_nm, std::strin static void conf_edit_cat16(struct ctx_cam *cam, std::string parm_nm , std::string &parm_val, enum PARM_ACT pact) { - if (parm_nm == "sql_log_picture") { conf_edit_sql_log_picture(cam, parm_val, pact); - } else if (parm_nm == "sql_log_snapshot") { conf_edit_sql_log_snapshot(cam, parm_val, pact); - } else if (parm_nm == "sql_log_movie") { conf_edit_sql_log_movie(cam, parm_val, pact); - } else if (parm_nm == "sql_log_timelapse") { conf_edit_sql_log_timelapse(cam, parm_val, pact); - } else if (parm_nm == "sql_query_start") { conf_edit_sql_query_start(cam, parm_val, pact); - } else if (parm_nm == "sql_query_stop") { conf_edit_sql_query_stop(cam, parm_val, pact); - } else if (parm_nm == "sql_query") { conf_edit_sql_query(cam, parm_val, pact); + if (parm_nm == "sql_event_start") { conf_edit_sql_event_start(cam, parm_val, pact); + } else if (parm_nm == "sql_event_end") { conf_edit_sql_event_end(cam, parm_val, pact); + } else if (parm_nm == "sql_movie_start") { conf_edit_sql_movie_start(cam, parm_val, pact); + } else if (parm_nm == "sql_movie_end") { conf_edit_sql_movie_end(cam, parm_val, pact); + } else if (parm_nm == "sql_pic_save") { conf_edit_sql_pic_save(cam, parm_val, pact); } } diff --git a/src/conf.hpp b/src/conf.hpp index 43ae2f35..9e48b89e 100644 --- a/src/conf.hpp +++ b/src/conf.hpp @@ -178,13 +178,11 @@ std::string database_password; int database_busy_timeout; - bool sql_log_picture; - bool sql_log_snapshot; - bool sql_log_movie; - bool sql_log_timelapse; - std::string sql_query_start; - std::string sql_query_stop; - std::string sql_query; + std::string sql_event_start; + std::string sql_event_end; + std::string sql_movie_start; + std::string sql_movie_end; + std::string sql_pic_save; bool ptz_auto_track; /* Bool to enable auto tracking */ int ptz_wait; /* Frames to wait after a PTZ move */ diff --git a/src/dbse.cpp b/src/dbse.cpp index b4b69801..b3d2bb0a 100644 --- a/src/dbse.cpp +++ b/src/dbse.cpp @@ -344,7 +344,6 @@ void dbse_init(struct ctx_cam *cam) ,_("Invalid Database backend %s") , cam->conf->database_type.c_str()); } - dbse_sqlmask_update(cam); } return; @@ -386,20 +385,6 @@ void dbse_deinit(struct ctx_cam *cam) } -void dbse_sqlmask_update(struct ctx_cam *cam) -{ - /* - * Set the sql mask file according to the SQL config options - * We update it for every frame in case the config was updated - * via remote control. - */ - cam->dbse->sql_mask = cam->conf->sql_log_picture * (FTYPE_IMAGE + FTYPE_IMAGE_MOTION) + - cam->conf->sql_log_snapshot * FTYPE_IMAGE_SNAPSHOT + - cam->conf->sql_log_movie * (FTYPE_MPEG + FTYPE_MPEG_MOTION) + - cam->conf->sql_log_timelapse * FTYPE_MPEG_TIMELAPSE; - -} - static void dbse_mysql_exec(char *sqlquery,struct ctx_cam *cam, int save_id) { @@ -571,38 +556,37 @@ static void dbse_sqlite3_exec(char *sqlquery,struct ctx_cam *cam, int save_id) #endif /* HAVE_SQLITE3 */ } -void dbse_firstmotion(struct ctx_cam *cam) +void dbse_exec(struct ctx_cam *cam, char *filename + , int sqltype, struct timespec *ts1, const char *cmd) { - char sqlquery[PATH_MAX]; - mystrftime(cam, sqlquery, sizeof(sqlquery), cam->conf->sql_query_start.c_str(), - &cam->current_image->imgts, NULL, 0); - - if (strlen(sqlquery) <= 0) { - MOTION_LOG(WRN, TYPE_DB, NO_ERRNO, "Ignoring empty sql query"); + if (cam->conf->database_type == "") { return; } - if (cam->conf->database_type == "mysql") { - dbse_mysql_exec(sqlquery, cam, 1); - } else if (cam->conf->database_type == "mariadb") { - dbse_mariadb_exec(sqlquery, cam, 1); - } else if (cam->conf->database_type == "postgresql") { - dbse_pgsql_exec(sqlquery, cam, 1); - } else if (cam->conf->database_type == "sqlite3") { - dbse_sqlite3_exec(sqlquery, cam, 1); + if (mystreq(cmd,"pic_save")) { + mystrftime(cam, sqlquery, sizeof(sqlquery) + , cam->conf->sql_pic_save.c_str() + , ts1, filename, sqltype); + } else if (mystreq(cmd,"movie_start")) { + mystrftime(cam, sqlquery, sizeof(sqlquery) + , cam->conf->sql_movie_start.c_str() + , ts1, filename, sqltype); + } else if (mystreq(cmd,"movie_end")) { + mystrftime(cam, sqlquery, sizeof(sqlquery) + , cam->conf->sql_movie_end.c_str() + , ts1, filename, sqltype); + } else if (mystreq(cmd,"event_start")) { + mystrftime(cam, sqlquery, sizeof(sqlquery) + , cam->conf->sql_event_start.c_str() + , ts1, filename, sqltype); + } else if (mystreq(cmd,"event_end")) { + mystrftime(cam, sqlquery, sizeof(sqlquery) + , cam->conf->sql_event_end.c_str() + , ts1, filename, sqltype); } -} - -void dbse_newfile(struct ctx_cam *cam, char *filename, int sqltype, struct timespec *ts1) -{ - char sqlquery[PATH_MAX]; - - mystrftime(cam, sqlquery, sizeof(sqlquery), cam->conf->sql_query.c_str(), - ts1, filename, sqltype); - if (strlen(sqlquery) <= 0) { MOTION_LOG(WRN, TYPE_DB, NO_ERRNO, "Ignoring empty sql query"); return; @@ -620,24 +604,6 @@ void dbse_newfile(struct ctx_cam *cam, char *filename, int sqltype, struct times } -void dbse_fileclose(struct ctx_cam *cam, char *filename, int sqltype, struct timespec *ts1) -{ - char sqlquery[PATH_MAX]; - - mystrftime(cam, sqlquery, sizeof(sqlquery), cam->conf->sql_query_stop.c_str(), - ts1, filename, sqltype); - - if (cam->conf->database_type == "mysql") { - dbse_mysql_exec(sqlquery, cam, 0); - } else if (cam->conf->database_type == "mariadb") { - dbse_mariadb_exec(sqlquery, cam, 0); - } else if (cam->conf->database_type == "postgresql") { - dbse_pgsql_exec(sqlquery, cam, 0); - } else if (cam->conf->database_type == "sqlite3") { - dbse_sqlite3_exec(sqlquery, cam, 0); - } - -} static int dbse_motpls_callback( void *ptr, int arg_nb, char **arg_val, char **col_nm) diff --git a/src/dbse.hpp b/src/dbse.hpp index fd785f7c..ed248a47 100644 --- a/src/dbse.hpp +++ b/src/dbse.hpp @@ -62,7 +62,6 @@ PGconn *database_pg; #endif - int sql_mask; uint64_t database_event_id; }; @@ -94,14 +93,12 @@ void dbse_global_init(struct ctx_motapp *motapp); void dbse_init(struct ctx_cam *cam); void dbse_deinit(struct ctx_cam *cam); - void dbse_sqlmask_update(struct ctx_cam *cam); - void dbse_firstmotion(struct ctx_cam *cam); - void dbse_newfile(struct ctx_cam *cam, char *filename, int sqltype, struct timespec *ts1); - void dbse_fileclose(struct ctx_cam *cam, char *filename, int sqltype, struct timespec *ts1); void dbse_motpls_init(struct ctx_cam *cam); void dbse_motpls_deinit(struct ctx_cam *cam); void dbse_motpls_exec(char *sqlquery, struct ctx_cam *cam); int dbse_motpls_getlist(struct ctx_cam *cam); void dbse_motpls_addrec(struct ctx_cam *cam,char *fname, struct timespec *ts1); + void dbse_exec(struct ctx_cam *cam, char *filename + , int sqltype, struct timespec *ts1, const char *cmd); #endif /* _INCLUDE_DBSE_HPP_ */ \ No newline at end of file diff --git a/src/event.cpp b/src/event.cpp index cc601f5a..1d30a9d4 100644 --- a/src/event.cpp +++ b/src/event.cpp @@ -74,7 +74,7 @@ static void event_newfile(struct ctx_cam *cam, motion_event evnt * on_picture_save_command * handles both on_picture_save and on_movie_start * If arg = FTYPE_IMAGE_ANY on_picture_save script is executed - * If arg = FTYPE_MPEG_ANY on_movie_start script is executed + * If arg = FTYPE_MOVIE_ANY on_movie_start script is executed * The scripts are executed with the filename of picture or movie appended * to the config parameter. */ @@ -92,7 +92,7 @@ static void on_picture_save_command(struct ctx_cam *cam, motion_event evnt util_exec_command(cam, cam->conf->on_picture_save.c_str(), fname, filetype); } - if ((filetype & FTYPE_MPEG_ANY) != 0 && (cam->conf->on_movie_start != "")) { + if ((filetype & FTYPE_MOVIE_ANY) != 0 && (cam->conf->on_movie_start != "")) { util_exec_command(cam, cam->conf->on_movie_start.c_str(), fname, filetype); } } @@ -112,60 +112,6 @@ static void on_motion_detected_command(struct ctx_cam *cam, motion_event evnt } } -static void event_sqlfirstmotion(struct ctx_cam *cam, motion_event evnt - ,struct ctx_image_data *img_data, char *fname, void *ftype, struct timespec *ts1) -{ - - (void)evnt; - (void)img_data; - (void)fname; - (void)ftype; - (void)ts1; - - if (cam->conf->database_type == "") { - return; - } else { - dbse_firstmotion(cam); - } -} - -static void event_sqlnewfile(struct ctx_cam *cam, motion_event evnt - ,struct ctx_image_data *img_data, char *fname, void *ftype, struct timespec *ts1) -{ - - int sqltype = (unsigned long)ftype; - - (void)evnt; - (void)img_data; - - /* Only log the file types we want */ - if ((cam->conf->database_type == "") || (sqltype & cam->dbse->sql_mask) == 0) { - return; - } else { - dbse_newfile(cam, fname, sqltype, ts1); - } - -} - -static void event_sqlfileclose(struct ctx_cam *cam, motion_event evnt - ,struct ctx_image_data *img_data, char *fname, void *ftype, struct timespec *ts1) -{ - - int sqltype = (unsigned long)ftype; - - (void)evnt; - (void)img_data; - - /* Only log the file types we want */ - if ((cam->conf->database_type == "") || (sqltype & cam->dbse->sql_mask) == 0) { - return; - } else { - dbse_fileclose(cam, fname, sqltype, ts1); - } - - -} - static void on_area_command(struct ctx_cam *cam, motion_event evnt ,struct ctx_image_data *img_data, char *fname, void *ftype, struct timespec *ts1) { @@ -276,6 +222,7 @@ static void event_image_detect(struct ctx_cam *cam, motion_event evnt pic_save_norm(cam, fullfilename,img_data->image_norm, FTYPE_IMAGE); } event(cam, EVENT_FILECREATE, NULL, fullfilename, (void *)FTYPE_IMAGE, ts1); + dbse_exec(cam, fullfilename, FTYPE_IMAGE, ts1, "pic_save"); } } @@ -302,7 +249,8 @@ static void event_imagem_detect(struct ctx_cam *cam, motion_event evnt return; } pic_save_norm(cam, fullfilename, cam->imgs.image_motion.image_norm, FTYPE_IMAGE_MOTION); - event(cam, EVENT_FILECREATE, NULL, fullfilename, (void *)FTYPE_IMAGE, ts1); + event(cam, EVENT_FILECREATE, NULL, fullfilename, (void *)FTYPE_IMAGE_MOTION, ts1); + dbse_exec(cam, fullfilename, FTYPE_IMAGE_MOTION, ts1, "pic_save"); } else if (cam->conf->picture_output_motion == "roi") { mystrftime(cam, filename, sizeof(filename), cam->conf->picture_filename.c_str(), ts1, NULL, 0); retcd = snprintf(fullfilename, PATH_MAX, "%s/%sr.%s" @@ -313,7 +261,8 @@ static void event_imagem_detect(struct ctx_cam *cam, motion_event evnt return; } pic_save_roi(cam, fullfilename, cam->current_image->image_norm); - event(cam, EVENT_FILECREATE, NULL, fullfilename, (void *)FTYPE_IMAGE, ts1); + event(cam, EVENT_FILECREATE, NULL, fullfilename, (void *)FTYPE_IMAGE_ROI, ts1); + dbse_exec(cam, fullfilename, FTYPE_IMAGE_ROI, ts1, "pic_save"); } } @@ -350,6 +299,7 @@ static void event_image_snapshot(struct ctx_cam *cam, motion_event evnt pic_save_norm(cam, fullfilename, img_data->image_norm, FTYPE_IMAGE_SNAPSHOT); event(cam, EVENT_FILECREATE, NULL, fullfilename, (void *)FTYPE_IMAGE_SNAPSHOT, ts1); + dbse_exec(cam, fullfilename, FTYPE_IMAGE_SNAPSHOT, ts1, "pic_save"); /* Update symbolic link */ snprintf(linkpath, PATH_MAX, "%s/lastsnap.%s", cam->conf->target_dir.c_str(), imageext(cam)); @@ -374,6 +324,7 @@ static void event_image_snapshot(struct ctx_cam *cam, motion_event evnt remove(fullfilename); pic_save_norm(cam, fullfilename, img_data->image_norm, FTYPE_IMAGE_SNAPSHOT); event(cam, EVENT_FILECREATE, NULL, fullfilename, (void *)FTYPE_IMAGE_SNAPSHOT, ts1); + dbse_exec(cam, fullfilename, FTYPE_IMAGE_SNAPSHOT, ts1, "pic_save"); } cam->snapshot = 0; @@ -413,6 +364,7 @@ static void event_image_preview(struct ctx_cam *cam, motion_event evnt pic_save_norm(cam, previewname, cam->imgs.image_preview.image_norm, FTYPE_IMAGE); } event(cam, EVENT_FILECREATE, NULL, previewname, (void *)FTYPE_IMAGE, ts1); + dbse_exec(cam, previewname, FTYPE_IMAGE, ts1, "pic_save"); /* Restore global context values. */ cam->current_image = saved_current_image; @@ -476,7 +428,7 @@ static void on_movie_end_command(struct ctx_cam *cam, motion_event evnt (void)img_data; (void)ts1; - if ((filetype & FTYPE_MPEG_ANY) && (cam->conf->on_movie_end != "")) { + if ((filetype & FTYPE_MOVIE_ANY) && (cam->conf->on_movie_end != "")) { util_exec_command(cam, cam->conf->on_movie_end.c_str(), fname, filetype); } } @@ -508,10 +460,12 @@ static void event_extpipe_end(struct ctx_cam *cam, motion_event evnt , _("Unable to remove file %s"), cam->extpipefilename); } } else { - event(cam, EVENT_FILECLOSE, NULL, cam->extpipefilename, (void *)FTYPE_MPEG, ts1); + event(cam, EVENT_FILECLOSE, NULL, cam->extpipefilename, (void *)FTYPE_MOVIE, ts1); + dbse_exec(cam, cam->extpipefilename, FTYPE_MOVIE, ts1, "movie_end"); } } else { - event(cam, EVENT_FILECLOSE, NULL, cam->extpipefilename, (void *)FTYPE_MPEG, ts1); + event(cam, EVENT_FILECLOSE, NULL, cam->extpipefilename, (void *)FTYPE_MOVIE, ts1); + dbse_exec(cam, cam->extpipefilename, FTYPE_MOVIE, ts1, "movie_end"); } } @@ -576,7 +530,8 @@ static void event_extpipe_start(struct ctx_cam *cam, motion_event evnt MOTION_LOG(NTC, TYPE_EVENTS, NO_ERRNO, "cam->moviefps: %d", cam->movie_fps); - event(cam, EVENT_FILECREATE, NULL, cam->extpipefilename, (void *)FTYPE_MPEG, ts1); + event(cam, EVENT_FILECREATE, NULL, cam->extpipefilename, (void *)FTYPE_MOVIE, ts1); + dbse_exec(cam, cam->extpipefilename, FTYPE_MOVIE, ts1, "movie_start"); cam->extpipe = popen(cam->extpipecmdline, "we"); if (cam->extpipe == NULL) { @@ -654,7 +609,8 @@ static void event_movie_start(struct ctx_cam *cam, motion_event evnt cam->movie_norm = NULL; return; } - event(cam, EVENT_FILECREATE, NULL, cam->movie_norm->filename, (void *)FTYPE_MPEG, ts1); + event(cam, EVENT_FILECREATE, NULL, cam->movie_norm->filename, (void *)FTYPE_MOVIE, ts1); + dbse_exec(cam, cam->movie_norm->filename, FTYPE_MOVIE, ts1, "movie_start"); } if (cam->conf->movie_output_motion) { @@ -716,11 +672,13 @@ static void event_movie_end(struct ctx_cam *cam, motion_event evnt , _("Unable to remove file %s"), cam->newfilename); } } else { - event(cam, EVENT_FILECLOSE, NULL, cam->newfilename, (void *)FTYPE_MPEG, ts1); + event(cam, EVENT_FILECLOSE, NULL, cam->newfilename, (void *)FTYPE_MOVIE, ts1); + dbse_exec(cam, cam->newfilename, FTYPE_MOVIE, ts1, "movie_end"); dbse_motpls_addrec(cam, cam->newfilename, ts1); } } else { - event(cam, EVENT_FILECLOSE, NULL, cam->newfilename, (void *)FTYPE_MPEG, ts1); + event(cam, EVENT_FILECLOSE, NULL, cam->newfilename, (void *)FTYPE_MOVIE, ts1); + dbse_exec(cam, cam->newfilename, FTYPE_MOVIE, ts1, "movie_end"); dbse_motpls_addrec(cam, cam->newfilename, ts1); } } @@ -740,11 +698,13 @@ static void event_movie_end(struct ctx_cam *cam, motion_event evnt , _("Unable to remove file %s"), cam->motionfilename); } } else { - event(cam, EVENT_FILECLOSE, NULL, cam->motionfilename, (void *)FTYPE_MPEG_MOTION, ts1); + event(cam, EVENT_FILECLOSE, NULL, cam->motionfilename, (void *)FTYPE_MOVIE_MOTION, ts1); + dbse_exec(cam, cam->motionfilename, FTYPE_MOVIE_MOTION, ts1, "movie_end"); dbse_motpls_addrec(cam, cam->motionfilename, ts1); } } else { - event(cam, EVENT_FILECLOSE, NULL, cam->motionfilename, (void *)FTYPE_MPEG_MOTION, ts1); + event(cam, EVENT_FILECLOSE, NULL, cam->motionfilename, (void *)FTYPE_MOVIE_MOTION, ts1); + dbse_exec(cam, cam->motionfilename, FTYPE_MOVIE_MOTION, ts1, "movie_end"); dbse_motpls_addrec(cam, cam->motionfilename, ts1); } } @@ -773,7 +733,9 @@ static void event_tlapse_start(struct ctx_cam *cam, motion_event evnt return; } event(cam, EVENT_FILECREATE, NULL, cam->movie_timelapse->filename - , (void *)FTYPE_MPEG_TIMELAPSE, ts1); + , (void *)FTYPE_MOVIE_TIMELAPSE, ts1); + dbse_exec(cam, cam->movie_timelapse->filename, FTYPE_MOVIE_TIMELAPSE + , ts1, "movie_start"); } if (movie_put_image(cam->movie_timelapse, img_data, ts1) == -1) { @@ -797,7 +759,8 @@ static void event_tlapse_end(struct ctx_cam *cam, motion_event evnt free(cam->movie_timelapse); } cam->movie_timelapse = NULL; - event(cam, EVENT_FILECLOSE, NULL, cam->timelapsefilename, (void *)FTYPE_MPEG_TIMELAPSE, ts1); + event(cam, EVENT_FILECLOSE, NULL, cam->timelapsefilename, (void *)FTYPE_MOVIE_TIMELAPSE, ts1); + dbse_exec(cam, cam->timelapsefilename, FTYPE_MOVIE_TIMELAPSE, ts1, "movie_end"); } } @@ -807,10 +770,6 @@ struct event_handlers { }; struct event_handlers event_handlers[] = { - { - EVENT_FILECREATE, - event_sqlnewfile - }, { EVENT_FILECREATE, on_picture_save_command @@ -829,10 +788,6 @@ struct event_handlers event_handlers[] = { }, { EVENT_START, - event_sqlfirstmotion - }, - { - EVENT_START, on_event_start_command }, { @@ -909,10 +864,6 @@ struct event_handlers event_handlers[] = { }, { EVENT_FILECLOSE, - event_sqlfileclose - }, - { - EVENT_FILECLOSE, on_movie_end_command }, { diff --git a/src/motion_loop.cpp b/src/motion_loop.cpp index 1880a749..81fc401b 100644 --- a/src/motion_loop.cpp +++ b/src/motion_loop.cpp @@ -211,6 +211,9 @@ static void mlp_detected_trigger(struct ctx_cam *cam, struct ctx_image_data *img event(cam, EVENT_START, img, NULL, NULL, &cam->imgs.image_ring[cam->imgs.ring_out].imgts); + dbse_exec(cam, NULL, 0 + , &cam->imgs.image_ring[cam->imgs.ring_out].imgts + , "event_start"); if (cam->new_img & (NEWIMG_FIRST | NEWIMG_BEST | NEWIMG_CENTER)) { pic_save_preview(cam, img); @@ -742,6 +745,8 @@ void mlp_cleanup(struct ctx_cam *cam) } event(cam, EVENT_END, NULL, NULL, NULL, &cam->current_image->imgts); + dbse_exec(cam, NULL, 0, &cam->current_image->imgts, "event_end"); + } } else { movie_free(cam->movie_norm); @@ -1329,6 +1334,8 @@ static void mlp_actions_event(struct ctx_cam *cam) cam->imgs.image_preview.diffs = 0; } event(cam, EVENT_END, NULL, NULL, NULL, &cam->current_image->imgts); + dbse_exec(cam, NULL, 0, &cam->current_image->imgts, "event_end"); + mlp_track_center(cam); @@ -1570,8 +1577,6 @@ static void mlp_parmsupdate(struct ctx_cam *cam) cam->smartmask_ratio = 5 * cam->lastrate * (11 - cam->smartmask_speed); } - dbse_sqlmask_update(cam); - cam->threshold = cam->conf->threshold; if (cam->conf->threshold_maximum > cam->conf->threshold ) { cam->threshold_maximum = cam->conf->threshold_maximum; diff --git a/src/motionplus.hpp b/src/motionplus.hpp index ffa830ec..e47e21ad 100644 --- a/src/motionplus.hpp +++ b/src/motionplus.hpp @@ -88,15 +88,16 @@ struct ctx_v4l2cam; #define THRESHOLD_TUNE_LENGTH 256 /* Filetype defines */ -#define FTYPE_IMAGE 1 -#define FTYPE_IMAGE_SNAPSHOT 2 -#define FTYPE_IMAGE_MOTION 4 -#define FTYPE_MPEG 8 -#define FTYPE_MPEG_MOTION 16 -#define FTYPE_MPEG_TIMELAPSE 32 +#define FTYPE_IMAGE 1 +#define FTYPE_IMAGE_SNAPSHOT 2 +#define FTYPE_IMAGE_MOTION 4 +#define FTYPE_MOVIE 8 +#define FTYPE_MOVIE_MOTION 16 +#define FTYPE_MOVIE_TIMELAPSE 32 +#define FTYPE_IMAGE_ROI 64 -#define FTYPE_MPEG_ANY (FTYPE_MPEG | FTYPE_MPEG_MOTION | FTYPE_MPEG_TIMELAPSE) -#define FTYPE_IMAGE_ANY (FTYPE_IMAGE | FTYPE_IMAGE_SNAPSHOT | FTYPE_IMAGE_MOTION) +#define FTYPE_MOVIE_ANY (FTYPE_MOVIE | FTYPE_MOVIE_MOTION | FTYPE_MOVIE_TIMELAPSE) +#define FTYPE_IMAGE_ANY (FTYPE_IMAGE | FTYPE_IMAGE_SNAPSHOT | FTYPE_IMAGE_MOTION | FTYPE_IMAGE_ROI) /* What types of images files do we want to have */ #define NEWIMG_OFF 0