From: <me...@us...> - 2008-03-01 23:15:41
|
Revision: 943 http://gmyth.svn.sourceforge.net/gmyth/?rev=943&view=rev Author: melunko Date: 2008-03-01 15:15:42 -0800 (Sat, 01 Mar 2008) Log Message: ----------- Added new functions to add live recording Modified Paths: -------------- trunk/gmyth/gmyth/gmyth_livetv.c trunk/gmyth/gmyth/gmyth_query.c trunk/gmyth/gmyth/gmyth_query.h trunk/gmyth/gmyth/gmyth_recorder.c trunk/gmyth/gmyth/gmyth_recorder.h trunk/gmyth/gmyth/gmyth_remote_util.c trunk/gmyth/gmyth/gmyth_remote_util.h trunk/gmyth/gmyth/gmyth_scheduler.c trunk/gmyth/gmyth/gmyth_util.c Modified: trunk/gmyth/gmyth/gmyth_livetv.c =================================================================== --- trunk/gmyth/gmyth/gmyth_livetv.c 2008-02-29 19:03:41 UTC (rev 942) +++ trunk/gmyth/gmyth/gmyth_livetv.c 2008-03-01 23:15:42 UTC (rev 943) @@ -116,7 +116,7 @@ } if (livetv->recorder != NULL) { - // gmyth_recorder_close(livetv->recorder); + gmyth_recorder_close(livetv->recorder); g_object_unref(livetv->recorder); livetv->recorder = NULL; } Modified: trunk/gmyth/gmyth/gmyth_query.c =================================================================== --- trunk/gmyth/gmyth/gmyth_query.c 2008-02-29 19:03:41 UTC (rev 942) +++ trunk/gmyth/gmyth/gmyth_query.c 2008-03-01 23:15:42 UTC (rev 943) @@ -181,6 +181,15 @@ return TRUE; } +gboolean +gmyth_query_is_alive (GMythQuery *gmyth_query) +{ + g_return_val_if_fail (gmyth_query != NULL, FALSE); + + return (mysql_ping (gmyth_query->conn) == 0); +} + + /** Disconnects from the Mysql database in the backend. * * @param gmyth_query the GMythQuery instance to be disconnected Modified: trunk/gmyth/gmyth/gmyth_query.h =================================================================== --- trunk/gmyth/gmyth/gmyth_query.h 2008-02-29 19:03:41 UTC (rev 942) +++ trunk/gmyth/gmyth/gmyth_query.h 2008-03-01 23:15:42 UTC (rev 943) @@ -38,12 +38,16 @@ #include "gmyth_backendinfo.h" G_BEGIN_DECLS + +#define GMYTH_QUERY_STANDARD_TIMEOUT 10 /*seconds*/ + #define GMYTH_QUERY_TYPE (gmyth_query_get_type ()) #define GMYTH_QUERY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMYTH_QUERY_TYPE, GMythQuery)) #define GMYTH_QUERY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMYTH_QUERY_TYPE, GMythQueryClass)) #define IS_GMYTH_QUERY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMYTH_QUERY_TYPE)) #define IS_GMYTH_QUERY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMYTH_QUERY_TYPE)) #define GMYTH_QUERY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMYTH_QUERY_TYPE, GMythQueryClass)) + typedef struct _GMythQuery GMythQuery; typedef struct _GMythQueryClass GMythQueryClass; @@ -84,9 +88,9 @@ gboolean gmyth_query_connect(GMythQuery * gmyth_query, GMythBackendInfo * backend_info); gboolean gmyth_query_connect_with_timeout(GMythQuery * gmyth_query, - GMythBackendInfo * - backend_info, + GMythBackendInfo *backend_info, guint timeout); +gboolean gmyth_query_is_alive (GMythQuery *gmyth_query); gboolean gmyth_query_disconnect(GMythQuery * gmyth_query); G_END_DECLS Modified: trunk/gmyth/gmyth/gmyth_recorder.c =================================================================== --- trunk/gmyth/gmyth/gmyth_recorder.c 2008-02-29 19:03:41 UTC (rev 942) +++ trunk/gmyth/gmyth/gmyth_recorder.c 2008-03-01 23:15:42 UTC (rev 943) @@ -69,8 +69,6 @@ { GMythRecorder *recorder = GMYTH_RECORDER(object); - gmyth_recorder_close(recorder); - if (recorder->mutex != NULL) { g_mutex_free(recorder->mutex); recorder->mutex = NULL; @@ -118,7 +116,7 @@ * @return a new instance of GMythRecorder. */ GMythRecorder * -gmyth_recorder_new(int num, GString * hostname, gshort port) +gmyth_recorder_new(int num, GString *hostname, gshort port) { GMythRecorder *encoder = GMYTH_RECORDER(g_object_new(GMYTH_RECORDER_TYPE, FALSE)); @@ -738,7 +736,7 @@ * @return The actual program info. */ GMythProgramInfo * -gmyth_recorder_get_current_program_info(GMythRecorder * recorder) +gmyth_recorder_get_current_program_info(GMythRecorder *recorder) { GMythStringList *str_list = NULL; GMythProgramInfo *program_info = NULL; @@ -1135,7 +1133,7 @@ * @return <code>true</code>, if the actual remote file is bein recorded. */ gboolean -gmyth_recorder_is_recording(GMythRecorder * recorder) +gmyth_recorder_is_recording (GMythRecorder* recorder) { gboolean ret = TRUE; Modified: trunk/gmyth/gmyth/gmyth_recorder.h =================================================================== --- trunk/gmyth/gmyth/gmyth_recorder.h 2008-02-29 19:03:41 UTC (rev 942) +++ trunk/gmyth/gmyth/gmyth_recorder.h 2008-03-01 23:15:42 UTC (rev 943) @@ -136,15 +136,13 @@ gboolean gmyth_recorder_pause_recording(GMythRecorder * recorder); -GMythProgramInfo *gmyth_recorder_get_current_program_info(GMythRecorder * - recorder); +GMythProgramInfo *gmyth_recorder_get_current_program_info(GMythRecorder *recorder); GMythProgramInfo *gmyth_recorder_get_next_program_info(GMythRecorder * recorder, const GMythRecorderBrowseDirection direction); -GMythRecorder *gmyth_recorder_get_recorder_from_num(gint rec_id); gint64 gmyth_recorder_get_file_position(GMythRecorder * recorder); Modified: trunk/gmyth/gmyth/gmyth_remote_util.c =================================================================== --- trunk/gmyth/gmyth/gmyth_remote_util.c 2008-02-29 19:03:41 UTC (rev 942) +++ trunk/gmyth/gmyth/gmyth_remote_util.c 2008-03-01 23:15:42 UTC (rev 943) @@ -34,6 +34,7 @@ #include "gmyth_recorder.h" #include "gmyth_stringlist.h" #include "gmyth_debug.h" +#include "gmyth_query.h" /** * Requests the Mythtv backend for a free remote recorder. @@ -93,7 +94,7 @@ * @return the number of remote encoders instance available, or 0 if no one is actually free.. */ gint -gmyth_remote_util_get_free_recorder_count(GMythSocket * socket) +gmyth_remote_util_get_free_recorder_count (GMythSocket * socket) { gint num_recs = 0; @@ -124,3 +125,51 @@ return num_recs; } + +/* Gets all available recorders in the backend. + * @returns the num of recorders found, or -1 if any error happens. + **/ +gint +gmyth_remote_util_get_recorder_list (GMythBackendInfo* binfo, GList **list) +{ + GMythQuery *sqlquery; + MYSQL_RES *msql_res; + gchar *query_str = "SELECT cardid FROM cardinput"; + + sqlquery = gmyth_query_new (); + if (!gmyth_query_connect_with_timeout (sqlquery, binfo, GMYTH_QUERY_STANDARD_TIMEOUT)) { + g_warning ("[%s] Could not connect to mysql server", __FUNCTION__); + g_object_unref (sqlquery); + return FALSE; + } + + /* Retrieves the list of recorders num */ + msql_res = gmyth_query_process_statement(sqlquery, query_str); + if (msql_res == NULL) { + g_warning("DB retrieval of recording list failed"); + return -1; + } else { + MYSQL_ROW row; + + *list = NULL; + + while ((row = mysql_fetch_row(msql_res)) != NULL) { + GMythRecorder *recorder; + gint recorder_num = (gint) g_ascii_strtoull (row[0], NULL, 10); + GString *hostname = g_string_new (binfo->hostname); + + g_debug ("XXXXXXXXXXXX Recorded found: %d", recorder_num); + recorder = gmyth_recorder_new (recorder_num, hostname, binfo->port); + if (gmyth_recorder_setup (recorder)) { + *list = g_list_append(*list, recorder); + } else { + g_object_unref (recorder); + } + + g_string_free (hostname, TRUE); + } + } + + return g_list_length (*list); +} + Modified: trunk/gmyth/gmyth/gmyth_remote_util.h =================================================================== --- trunk/gmyth/gmyth/gmyth_remote_util.h 2008-02-29 19:03:41 UTC (rev 942) +++ trunk/gmyth/gmyth/gmyth_remote_util.h 2008-03-01 23:15:42 UTC (rev 943) @@ -28,14 +28,20 @@ #define __REMOTE_UTIL_H__ #include <glib.h> + #include "gmyth_recorder.h" #include "gmyth_socket.h" +#include "gmyth_backendinfo.h" G_BEGIN_DECLS - GMythRecorder * remote_request_next_free_recorder(GMythSocket * socket, - gint curr); -gint gmyth_remote_util_get_free_recorder_count(GMythSocket * - socket); +GMythRecorder * remote_request_next_free_recorder(GMythSocket *socket, + gint curr); + +gint gmyth_remote_util_get_free_recorder_count(GMythSocket* socket); + +gint gmyth_remote_util_get_recorder_list (GMythBackendInfo* binfo, GList **list); + G_END_DECLS + #endif Modified: trunk/gmyth/gmyth/gmyth_scheduler.c =================================================================== --- trunk/gmyth/gmyth/gmyth_scheduler.c 2008-02-29 19:03:41 UTC (rev 942) +++ trunk/gmyth/gmyth/gmyth_scheduler.c 2008-03-01 23:15:42 UTC (rev 943) @@ -39,6 +39,7 @@ #include "gmyth_query.h" #include "gmyth_socket.h" #include "gmyth_debug.h" +#include "gmyth_remote_util.h" static void gmyth_scheduler_class_init(GMythSchedulerClass * klass); static void gmyth_scheduler_init(GMythScheduler * object); @@ -46,6 +47,22 @@ static void gmyth_scheduler_dispose(GObject * object); static void gmyth_scheduler_finalize(GObject * object); + +static gint +gmyth_scheduler_is_program_live_recorded (GMythScheduler * scheduler, + ScheduleInfo *schedule_info, + GMythProgramInfo **prog_info); +static gboolean +gmyth_scheduler_set_live_record (GMythScheduler * scheduler, + ScheduleInfo * schedule_info, + gint recorder_num, gboolean enable); +static gboolean +gmyth_scheduler_change_record_group (GMythScheduler* scheduler, + GMythProgramInfo *prog_info, + gchar *new_group); + + + static gboolean update_backend(GMythScheduler * scheduler, gint record_id); G_DEFINE_TYPE(GMythScheduler, gmyth_scheduler, G_TYPE_OBJECT) @@ -491,6 +508,28 @@ return FALSE; } + /* + if (!gmyth_query_is_alive (scheduler->msqlquery)) { + g_warning ("[%s] MySql connection is not alive", __FUNCTION__); + return FALSE; + } + */ + + { + /* Before adding the schedule, we need to check if program is been played */ + GMythProgramInfo *prog_info = NULL; + gint recorder_num = + gmyth_scheduler_is_program_live_recorded (scheduler, schedule_info, + &prog_info); + if (recorder_num > 0) { + g_debug ("Recording already found in livetv... setting live record"); + gmyth_scheduler_change_record_group (scheduler, prog_info, "Default"); + + return gmyth_scheduler_set_live_record (scheduler, schedule_info, + recorder_num, TRUE); + } + } + msql_res = gmyth_query_process_statement_with_increment(scheduler->msqlquery, query_str, &rec_id); @@ -609,6 +648,110 @@ GMYTH_SCHEDULE_ONE_OCCURRENCE); } +/** Queries if the given schedule info is currently been recorded by any + * backend recorder. + * @return The recorder num currently recording the scheduled item, or -1 + * if program is not been recorded. + */ +static gint +gmyth_scheduler_is_program_live_recorded (GMythScheduler * scheduler, + ScheduleInfo *schedule_info, + GMythProgramInfo **prog_info) +{ + GList *list; + gint recorder_num = -1; + + if (gmyth_remote_util_get_recorder_list (scheduler->backend_info, &list) > 0) { + GList *iter = list; + while (iter) { + GMythRecorder *recorder = GMYTH_RECORDER ( iter->data ); + g_debug ("XXXX verifying the recorder %d", recorder->recorder_num); + + if (gmyth_recorder_is_recording (recorder)) { + GMythProgramInfo *pinfo = gmyth_recorder_get_current_program_info (recorder); + if (pinfo != NULL) { + if ((schedule_info->channel_id == pinfo->channel_id)) { + g_debug ("XXXXXX recorder %d is recording the program", recorder->recorder_num); + recorder_num = recorder->recorder_num; + *prog_info = pinfo; + break; + } + g_object_unref (pinfo); + } + } + + iter = iter->next; + } + + g_list_foreach (list, (GFunc) g_object_unref, NULL); + g_list_free (list); + } + + return recorder_num; + +} + +static gboolean +gmyth_scheduler_set_live_record (GMythScheduler * scheduler, + ScheduleInfo * schedule_info, + gint recorder_num, gboolean enable) +{ + gchar* datastr; + GMythSocket *socket; + gboolean ret = FALSE; + GMythStringList *strlist = gmyth_string_list_new(); + + datastr = g_strdup_printf ("QUERY_RECORDER %d", recorder_num); + gmyth_string_list_append_char_array (strlist, datastr); + gmyth_string_list_append_char_array (strlist, "SET_LIVE_RECORDING"); + gmyth_string_list_append_int (strlist, enable ? 1 : 0); + + socket = gmyth_backend_info_get_connected_socket (scheduler->backend_info); + if (socket != NULL) { + g_debug ("XXXX sending command for live recording"); + ret = (gmyth_socket_sendreceive_stringlist(socket, strlist) > 0); + g_object_unref (socket); + } else { + g_warning("[%s] Connection to backend failed!", __FUNCTION__); + } + + g_free(datastr); + g_object_unref(strlist); + return ret; +} + +static gboolean +gmyth_scheduler_change_record_group (GMythScheduler* scheduler, + GMythProgramInfo *prog_info, + gchar *new_group) + +{ + gchar *query_str = NULL; + gchar* startts = NULL; + + if (prog_info == NULL) { + g_warning ("Scheduler receiver a NULL program info to change its record group"); + return FALSE; + } + + //prog_info->recstartts->tv_sec += 60*60*2; + startts = gmyth_util_time_to_string_from_time_val (prog_info->recstartts); + + g_debug ("\n\n%s\n\n", startts); + query_str = g_strdup_printf("UPDATE recorded SET recgroup = \"%s\" " + "WHERE chanid = \"%d\" AND starttime = \"%s\"", + new_group, prog_info->channel_id, startts); + + gmyth_query_process_statement(scheduler->msqlquery, query_str); + + g_free (query_str); + g_free (startts); + + return TRUE ; +} + + + /** Requests the Mysql database in the backend to remove an existing schedule. * * @param scheduler the GMythScheduler instance. Modified: trunk/gmyth/gmyth/gmyth_util.c =================================================================== --- trunk/gmyth/gmyth/gmyth_util.c 2008-02-29 19:03:41 UTC (rev 942) +++ trunk/gmyth/gmyth/gmyth_util.c 2008-03-01 23:15:42 UTC (rev 943) @@ -255,10 +255,10 @@ * @param time_value the time value to be converted * @return GString* the converted string */ -gchar * +gchar* gmyth_util_time_to_string_from_time_val(const GTimeVal * time_val) { - gchar *result = + gchar *result = gmyth_util_time_to_isoformat_from_time_val_fmt("%Y-%m-%d %H:%M:%S", time_val); @@ -597,7 +597,7 @@ * * @return a pointer to a GList with all the channels. */ -GList * +GList* gmyth_util_get_channel_list(GMythBackendInfo * backend_info) { GMythRecorder *recorder; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <me...@us...> - 2008-03-03 11:33:48
|
Revision: 944 http://gmyth.svn.sourceforge.net/gmyth/?rev=944&view=rev Author: melunko Date: 2008-03-03 03:33:49 -0800 (Mon, 03 Mar 2008) Log Message: ----------- Now add/cancel a schedule recording while livetv is running is finnaly working fine. Modified Paths: -------------- trunk/gmyth/gmyth/gmyth_scheduler.c trunk/gmyth/gmyth/gmyth_scheduler.h trunk/gmyth/gmyth/gmyth_util.c Modified: trunk/gmyth/gmyth/gmyth_scheduler.c =================================================================== --- trunk/gmyth/gmyth/gmyth_scheduler.c 2008-03-01 23:15:42 UTC (rev 943) +++ trunk/gmyth/gmyth/gmyth_scheduler.c 2008-03-03 11:33:49 UTC (rev 944) @@ -61,6 +61,10 @@ GMythProgramInfo *prog_info, gchar *new_group); +static gint +gmyth_scheduler_query_schedule_list (GMythScheduler * scheduler, + GList ** schedule_list, + gchar *filter); static gboolean update_backend(GMythScheduler * scheduler, gint record_id); @@ -225,25 +229,62 @@ * @return The amount of schedules retrieved from database, or -1 if error. */ gint -gmyth_scheduler_get_schedule_list(GMythScheduler * scheduler, - GList ** schedule_list) +gmyth_scheduler_get_schedule_list (GMythScheduler * scheduler, + GList ** schedule_list) { + return gmyth_scheduler_query_schedule_list (scheduler, schedule_list, NULL); +} + +ScheduleInfo* +gmyth_scheduler_get_schedule (GMythScheduler * scheduler, gint sched_id) +{ + GList *sched_list = NULL; + ScheduleInfo *schedule = NULL; + gchar *filter; + gint count; + + filter = g_strdup_printf ("WHERE recordid=%d", sched_id); + + count = gmyth_scheduler_query_schedule_list (scheduler, &sched_list, filter); + if ((count > 0) && (sched_list != NULL)) { + schedule = (ScheduleInfo*) sched_list->data; + g_list_free (sched_list); + } + + g_free (filter); + return schedule; +} + +static gint +gmyth_scheduler_query_schedule_list (GMythScheduler * scheduler, + GList ** schedule_list, + gchar *filter) +{ + ScheduleInfo *schedule; MYSQL_RES *msql_res; GString *query_str = g_string_new(""); gchar *date_time = NULL; assert(scheduler); - - g_string_printf(query_str, - "SELECT recordid,programid,chanid,starttime,startdate," - "endtime,enddate,title,subtitle,description,category,type,parentid,seriesid FROM record;"); - if (scheduler->msqlquery == NULL) { g_warning("[%s] Scheduler db connection not initialized", __FUNCTION__); return -1; } + + if (filter == NULL) { + g_string_printf(query_str, + "SELECT recordid,programid,chanid,starttime,startdate," + "endtime,enddate,title,subtitle,description,category,type,parentid,seriesid FROM record;"); + } else { + g_string_printf(query_str, + "SELECT recordid,programid,chanid,starttime,startdate," + "endtime,enddate,title,subtitle,description,category,type,parentid,seriesid FROM record " + "%s;", filter); + + } + msql_res = gmyth_query_process_statement(scheduler->msqlquery, query_str->str); @@ -496,7 +537,7 @@ ScheduleInfo * schedule_info, GMythScheduleType type) { MYSQL_RES *msql_res; - gchar *query_str = "INSERT record (recordid) VALUE (0);"; + gchar *query_str = NULL; gchar *station = NULL; gulong rec_id; @@ -521,9 +562,9 @@ gint recorder_num = gmyth_scheduler_is_program_live_recorded (scheduler, schedule_info, &prog_info); - if (recorder_num > 0) { - g_debug ("Recording already found in livetv... setting live record"); + if ((recorder_num > 0) && (prog_info != NULL)) { gmyth_scheduler_change_record_group (scheduler, prog_info, "Default"); + schedule_info->schedule_id = prog_info->recordid; return gmyth_scheduler_set_live_record (scheduler, schedule_info, recorder_num, TRUE); @@ -532,7 +573,8 @@ msql_res = gmyth_query_process_statement_with_increment(scheduler->msqlquery, - query_str, &rec_id); + "INSERT record (recordid) VALUE (0);", + &rec_id); mysql_free_result(msql_res); // Retrieves the station info @@ -665,13 +707,12 @@ GList *iter = list; while (iter) { GMythRecorder *recorder = GMYTH_RECORDER ( iter->data ); - g_debug ("XXXX verifying the recorder %d", recorder->recorder_num); if (gmyth_recorder_is_recording (recorder)) { GMythProgramInfo *pinfo = gmyth_recorder_get_current_program_info (recorder); if (pinfo != NULL) { - if ((schedule_info->channel_id == pinfo->channel_id)) { - g_debug ("XXXXXX recorder %d is recording the program", recorder->recorder_num); + if ((schedule_info->channel_id == pinfo->channel_id) && + (schedule_info->start_time->tv_sec == pinfo->startts->tv_sec)) { recorder_num = recorder->recorder_num; *prog_info = pinfo; break; @@ -708,7 +749,6 @@ socket = gmyth_backend_info_get_connected_socket (scheduler->backend_info); if (socket != NULL) { - g_debug ("XXXX sending command for live recording"); ret = (gmyth_socket_sendreceive_stringlist(socket, strlist) > 0); g_object_unref (socket); } else { @@ -734,10 +774,8 @@ return FALSE; } - //prog_info->recstartts->tv_sec += 60*60*2; startts = gmyth_util_time_to_string_from_time_val (prog_info->recstartts); - g_debug ("\n\n%s\n\n", startts); query_str = g_strdup_printf("UPDATE recorded SET recgroup = \"%s\" " "WHERE chanid = \"%d\" AND starttime = \"%s\"", new_group, prog_info->channel_id, startts); @@ -759,12 +797,11 @@ * @return gboolean TRUE if success, FALSE if error */ gboolean -gmyth_scheduler_delete_schedule(GMythScheduler * scheduler, gint schedule_id) +gmyth_scheduler_delete_schedule (GMythScheduler * scheduler, gint schedule_id) { + MYSQL_RES *msql_res; + GString *query_str = NULL; - MYSQL_RES *msql_res; - GString *query_str = NULL; - g_return_val_if_fail (scheduler != NULL, FALSE); @@ -774,6 +811,28 @@ return FALSE; } + { + /* Before adding the schedule, we need to check if program is been played */ + GMythProgramInfo *prog_info = NULL; + ScheduleInfo *sched_info = NULL; + + sched_info = gmyth_scheduler_get_schedule (scheduler, schedule_id); + if (sched_info != NULL) { + gint recorder_num = + gmyth_scheduler_is_program_live_recorded (scheduler, sched_info, + &prog_info); + if ((recorder_num > 0) && (prog_info != NULL)) { + gboolean ret; + gmyth_scheduler_change_record_group (scheduler, prog_info, "LiveTV"); + + ret = gmyth_scheduler_set_live_record (scheduler, sched_info, + recorder_num, FALSE); + gmyth_schedule_info_free (sched_info); + return ret; + } + } + } + query_str = g_string_new(""); g_string_printf(query_str, "DELETE FROM record WHERE recordid=%d", schedule_id); @@ -883,175 +942,6 @@ return FALSE; } - -gboolean gmyth_scheduler_reactivate_schedule(GMythScheduler* scheduler, gint channel_id, - time_t start_time) - -{ - MYSQL_RES *msql_res; - GString *query_str = g_string_new(""); - - assert(scheduler); - g_string_printf(query_str, "SELECT callsign FROM channel " - "WHERE chanid = \"%d\"", channel_id); - - msql_res = gmyth_query_process_statement(scheduler->msqlquery, query_str->str); - if (msql_res) { - MYSQL_ROW msql_row = mysql_fetch_row(msql_res); - if (msql_row) { - GString* callsign = g_string_new(msql_row[0]); - GString* startts = gmyth_util_time_to_string(start_time); - g_string_printf(query_str, "UPDATE oldrecorded SET reactivate = 1 " - "WHERE station = \"%s\" AND starttime = \"%s\"", - callsign->str, startts->str); - gmyth_query_process_statement(scheduler->msqlquery, query_str->str); - g_string_free(callsign, TRUE); - g_string_free(startts, TRUE); - g_string_free(query_str, TRUE); - return TRUE; - } - - } - - return FALSE; -} - - -/* - * This should only be used in special situations. We do not know the time that - * the recording was set. We just know that it is an "ongoing" record and then - * we have to use this to get it's info. It's always the oldest one -> first on list - * - */ -GMythProgramInfo* -gmyth_scheduler_get_recorded_on_time(GMythScheduler* scheduler, - guint channel_id) -{ - MYSQL_RES *msql_res; - GMythProgramInfo *proginfo = NULL; - GString *query_str = g_string_new(""); - - assert(scheduler); - - g_string_printf(query_str, - "SELECT recorded.chanid,starttime,endtime,title," - "subtitle,description,channel.channum," - "channel.callsign,channel.name,channel.commfree," - "channel.outputfilters,seriesid,programid,filesize," - "lastmodified,stars,previouslyshown,originalairdate," - "hostname,recordid,transcoder,playgroup," - "recorded.recpriority,progstart,progend,basename,recgroup," - "category,findid,duplicate " - "FROM recorded " "LEFT JOIN channel " - "ON recorded.chanid = channel.chanid " - "WHERE recorded.chanid = %d " - "ORDER BY starttime DESC", channel_id); - - msql_res = - gmyth_query_process_statement(scheduler->msqlquery, query_str->str); - - if (msql_res) { - MYSQL_ROW msql_row = mysql_fetch_row(msql_res); - - if (msql_row) { - proginfo = gmyth_program_info_new(); - - proginfo->channel_id = (gint) g_ascii_strtoull (msql_row[0], NULL, 10); - proginfo->recstartts = gmyth_util_string_to_time_val(msql_row[1]); - proginfo->recendts = gmyth_util_string_to_time_val(msql_row[2]); - - proginfo->title = g_string_new(msql_row[3]); - proginfo->subtitle = g_string_new(msql_row[4]); - proginfo->description = g_string_new(msql_row[5]); - - proginfo->chanstr = g_string_new(msql_row[6]); - proginfo->chansign = g_string_new(msql_row[7]); - proginfo->channame = g_string_new(msql_row[8]); - proginfo->chancommfree = (gint) g_ascii_strtoull(msql_row[9], NULL, 10); - proginfo->chanOutputFilters = g_string_new(msql_row[10]); - proginfo->seriesid = g_string_new(msql_row[11]); - proginfo->program_id = g_string_new(msql_row[12]); - proginfo->filesize = g_ascii_strtoull(msql_row[13], NULL, 10); - - proginfo->lastmodified = gmyth_util_string_to_time_val(msql_row[14]); - proginfo->stars = g_ascii_strtod(msql_row[15], NULL); - proginfo->repeat = (gint)g_ascii_strtoull(msql_row[16], NULL, 10); - - if (msql_row[17] == NULL) { - proginfo->originalAirDate = 0; - proginfo->hasAirDate = FALSE; - } else { - proginfo->originalAirDate = gmyth_util_string_to_time_val(msql_row[17]); - proginfo->hasAirDate = TRUE; - } - - proginfo->hostname = g_string_new(msql_row[18]); - proginfo->recordid = (gint) g_ascii_strtoull(msql_row[19], NULL, 10); - proginfo->transcoder = (gint) g_ascii_strtoull(msql_row[20], NULL, 10); - - proginfo->playgroup = g_string_new(msql_row[21]); - proginfo->recpriority = (gint) g_ascii_strtoull(msql_row[22], NULL, 10); - - proginfo->startts = gmyth_util_string_to_time_val(msql_row[23]); - proginfo->endts = gmyth_util_string_to_time_val(msql_row[24]); - proginfo->pathname = g_string_new(g_strdup(msql_row[25])); - proginfo->recgroup = g_string_new(msql_row[26]); - proginfo->category = g_string_new(msql_row[27]); - proginfo->findid = (gint) g_ascii_strtoull(msql_row[28], NULL, 10); - - proginfo->recpriority2 = 0; - - g_string_printf(query_str, - "SELECT dupmethod,dupin,parentid,type " - "FROM record WHERE recordid = \"%d\"", proginfo->recordid); - - msql_res = - gmyth_query_process_statement(scheduler->msqlquery, - query_str->str); - - if (msql_res) { - MYSQL_ROW msql_row = mysql_fetch_row(msql_res); - - if (msql_row) { - proginfo->dupmethod = (gint) g_ascii_strtoull(msql_row[0], NULL, 10); - proginfo->dupin = (gint) g_ascii_strtoull(msql_row[1], NULL, 10); - proginfo->parentid = (gint) g_ascii_strtoull(msql_row[2], NULL, 10); - proginfo->rectype = 0; - } - } - - - g_string_printf(query_str, - "SELECT sourceid,cardid,cardinputid,shareable " - "FROM cardinput"); - - msql_res = - gmyth_query_process_statement(scheduler->msqlquery, - query_str->str); - - if (msql_res) { - MYSQL_ROW msql_row = mysql_fetch_row(msql_res); - - if (msql_row) { - proginfo->sourceid = 0; - proginfo->cardid = 0; - proginfo->inputid = 0; - if (msql_row[3] != NULL && g_ascii_strcasecmp("Y", msql_row[3]) == 0) - proginfo->shareable = 1; - else - proginfo->shareable = 0; - } - } - - - - } - } - - g_string_free(query_str, TRUE); - return proginfo; -} - /** Retrieves an existing recorded item information from database. The information * is used to fill the returned GMythProgramInfo. * @@ -1167,115 +1057,7 @@ return proginfo; } -gboolean -gmyth_scheduler_stop_recording (GMythScheduler * scheduler, - gint channel_id) -{ - GMythProgramInfo *program; - GMythSocket *socket; - gboolean res = FALSE; - GMythStringList *slist; - socket = gmyth_backend_info_get_connected_socket (scheduler->backend_info); - program = gmyth_scheduler_get_recorded_on_time (scheduler, channel_id); - - if (program) { - slist = gmyth_string_list_new(); - gmyth_string_list_append_char_array(slist, "STOP_RECORDING"); - - gmyth_string_list_append_string(slist, program->title); /* 0 */ - gmyth_string_list_append_string(slist, program->subtitle); /* 1 */ - gmyth_string_list_append_string(slist, program->description); /* 2 */ - gmyth_string_list_append_string(slist, program->category); /* 3 */ - gmyth_string_list_append_int(slist, program->channel_id); /* 4 */ - gmyth_string_list_append_string(slist, program->chanstr); /* 5 */ - gmyth_string_list_append_string(slist, program->chansign); /* 6 */ - gmyth_string_list_append_string(slist, program->channame); /* 7 */ - gmyth_string_list_append_string(slist, program->pathname); /* 8 */ - gmyth_string_list_append_int64(slist, program->filesize); /* 9 */ - - if (program->startts) - gmyth_string_list_append_int(slist, program->startts->tv_sec); /* 10 */ - else - gmyth_string_list_append_int(slist, 0); - - if (program->endts) - gmyth_string_list_append_int(slist, program->endts->tv_sec); /* 11 */ - else - gmyth_string_list_append_int(slist, 0); - - gmyth_string_list_append_int(slist, program->duplicate); /* 12 */ - gmyth_string_list_append_int(slist, program->shareable); /* 13 */ - gmyth_string_list_append_int(slist, program->findid); /* 14 */ - gmyth_string_list_append_string(slist, program->hostname); /* 15 */ - gmyth_string_list_append_int(slist, program->sourceid); /* 16 */ - gmyth_string_list_append_int(slist, program->cardid); /* 17 */ - gmyth_string_list_append_int(slist, program->inputid); /* 18 */ - gmyth_string_list_append_int(slist, program->recpriority); /* 19 */ - - // recstatus == recording - gmyth_string_list_append_int(slist, -3); /* 20 */ - - gmyth_string_list_append_int(slist, program->recordid); /* 21 */ - gmyth_string_list_append_int(slist, program->rectype); /* 22 */ - gmyth_string_list_append_int(slist, program->dupin); /* 23 */ - gmyth_string_list_append_int(slist, program->dupmethod); /* 24 */ - - - //fixme - program->recstartts->tv_sec -= (60*60); - - gmyth_string_list_append_int(slist, - program->recstartts != NULL ? - program->recstartts->tv_sec : 0); /* 26 */ - - gmyth_string_list_append_int(slist, - program->recendts != NULL ? - program->recendts->tv_sec : 0); /* 27 */ - - gmyth_string_list_append_int(slist, program->repeat); /* 28 */ - gmyth_string_list_append_int(slist, program->programflags); /* 29 */ - - gmyth_string_list_append_char_array(slist, - program->recgroup != NULL ? - program->recgroup->str : "Default"); /* 30 */ - - gmyth_string_list_append_int(slist, program->chancommfree); /* 31 */ - gmyth_string_list_append_string(slist, program->chanOutputFilters); /* 32 */ - gmyth_string_list_append_string(slist, program->seriesid); /* 33 */ - gmyth_string_list_append_string(slist, program->program_id); /* 34 */ - - gmyth_string_list_append_int(slist, - program->lastmodified != NULL ? - program->lastmodified->tv_sec : 0); /* 35 */ - - gmyth_string_list_append_float(slist, program->stars); /* 36 */ - - gmyth_string_list_append_int(slist, - program->originalAirDate != NULL ? - program->originalAirDate->tv_sec : 0); /* 37 */ - - gmyth_string_list_append_int(slist, program->hasAirDate); /* 38 */ - - gmyth_string_list_append_char_array(slist, - program->playgroup != NULL ? - program->playgroup->str : "Default"); /* 39 */ - - gmyth_string_list_append_int(slist, program->recpriority2); /* 40 */ - gmyth_string_list_append_int(slist, program->recpriority2); /* 40 */ - - gmyth_socket_sendreceive_stringlist(socket, slist); - res = (gmyth_string_list_get_int(slist, 0) == 1); - - g_object_unref (program); - g_object_unref (slist); - } - - g_object_unref (socket); - return res; -} - - /** Notifies the backend of an update in the db. * * @param record_id the id of the modified recording. Modified: trunk/gmyth/gmyth/gmyth_scheduler.h =================================================================== --- trunk/gmyth/gmyth/gmyth_scheduler.h 2008-03-01 23:15:42 UTC (rev 943) +++ trunk/gmyth/gmyth/gmyth_scheduler.h 2008-03-03 11:33:49 UTC (rev 944) @@ -149,18 +149,12 @@ gboolean gmyth_scheduler_disconnect (GMythScheduler * scheduler); gint gmyth_scheduler_get_schedule_list (GMythScheduler * scheduler, GList ** sched_list); +ScheduleInfo* gmyth_scheduler_get_schedule (GMythScheduler * scheduler, + gint schedule_id); gint gmyth_scheduler_get_recorded_list (GMythScheduler * scheduler, GList ** rec_list); RecordedInfo* gmyth_scheduler_get_recorded_info (GMythScheduler *scheduler, const char *basename); -gboolean gmyth_scheduler_was_recorded_before (GMythScheduler* scheduler, - gint channel_id, - time_t start_time); -gboolean gmyth_scheduler_reactivate_schedule (GMythScheduler* scheduler, - gint channel_id, - time_t start_time); -GMythProgramInfo* gmyth_scheduler_get_recorded_on_time (GMythScheduler* scheduler, - guint channel_id); GMythProgramInfo* gmyth_scheduler_get_recorded (GMythScheduler * scheduler, GString * channel, GTimeVal * starttime); @@ -179,8 +173,6 @@ gint record_id); gint gmyth_scheduler_delete_recorded (GMythScheduler * scheduler, gint record_id); -gboolean gmyth_scheduler_stop_recording (GMythScheduler * scheduler, - gint channel_id); void gmyth_scheduler_recorded_info_get_preview(RecordedInfo * info, GByteArray * data); Modified: trunk/gmyth/gmyth/gmyth_util.c =================================================================== --- trunk/gmyth/gmyth/gmyth_util.c 2008-03-01 23:15:42 UTC (rev 943) +++ trunk/gmyth/gmyth/gmyth_util.c 2008-03-03 11:33:49 UTC (rev 944) @@ -95,7 +95,7 @@ * @param time_value the GTimeValue to be converted * @return GString* the converted isoformat string */ -gchar * +gchar* gmyth_util_time_to_isoformat_from_time_val_fmt(const gchar * fmt_string, const GTimeVal * time_val) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <me...@us...> - 2008-03-03 17:38:28
|
Revision: 948 http://gmyth.svn.sourceforge.net/gmyth/?rev=948&view=rev Author: melunko Date: 2008-03-03 09:38:32 -0800 (Mon, 03 Mar 2008) Log Message: ----------- Added new function to retrieve old schedules in order to reactivate them Modified Paths: -------------- trunk/gmyth/gmyth/gmyth_recorder.c trunk/gmyth/gmyth/gmyth_scheduler.c Modified: trunk/gmyth/gmyth/gmyth_recorder.c =================================================================== --- trunk/gmyth/gmyth/gmyth_recorder.c 2008-03-03 13:50:41 UTC (rev 947) +++ trunk/gmyth/gmyth/gmyth_recorder.c 2008-03-03 17:38:32 UTC (rev 948) @@ -707,14 +707,14 @@ return ret; } -static gboolean +static gboolean gmyth_recorder_find_if_program_exists(GMythRecorder * recorder, GMythProgramInfo * prog) { - GList *lst = NULL; + GList *lst = NULL; - g_return_val_if_fail(recorder != NULL - && recorder->progs_info_list != NULL, FALSE); + g_return_val_if_fail (recorder != NULL, FALSE); + g_return_val_if_fail (recorder->progs_info_list != NULL, FALSE); for (lst = recorder->progs_info_list; lst != NULL; lst = g_list_next(lst)) { @@ -736,7 +736,7 @@ * @return The actual program info. */ GMythProgramInfo * -gmyth_recorder_get_current_program_info(GMythRecorder *recorder) +gmyth_recorder_get_current_program_info (GMythRecorder *recorder) { GMythStringList *str_list = NULL; GMythProgramInfo *program_info = NULL; Modified: trunk/gmyth/gmyth/gmyth_scheduler.c =================================================================== --- trunk/gmyth/gmyth/gmyth_scheduler.c 2008-03-03 13:50:41 UTC (rev 947) +++ trunk/gmyth/gmyth/gmyth_scheduler.c 2008-03-03 17:38:32 UTC (rev 948) @@ -65,8 +65,13 @@ gmyth_scheduler_query_schedule_list (GMythScheduler * scheduler, GList ** schedule_list, gchar *filter); +static gint +gmyth_scheduler_query_schedule_id (GMythScheduler *scheduler, + GMythProgramInfo *prog_info); +static gint gmyth_scheduler_query_old_schedule (GMythScheduler *scheduler, + gint channel_id, GTimeVal *startts, + gboolean reactivate); - static gboolean update_backend(GMythScheduler * scheduler, gint record_id); G_DEFINE_TYPE(GMythScheduler, gmyth_scheduler, G_TYPE_OBJECT) @@ -534,7 +539,7 @@ gboolean gmyth_scheduler_add_schedule_full (GMythScheduler * scheduler, - ScheduleInfo * schedule_info, GMythScheduleType type) + ScheduleInfo *schedule_info, GMythScheduleType type) { MYSQL_RES *msql_res; gchar *query_str = NULL; @@ -563,11 +568,29 @@ gmyth_scheduler_is_program_live_recorded (scheduler, schedule_info, &prog_info); if ((recorder_num > 0) && (prog_info != NULL)) { + gboolean res; gmyth_scheduler_change_record_group (scheduler, prog_info, "Default"); - schedule_info->schedule_id = prog_info->recordid; - return gmyth_scheduler_set_live_record (scheduler, schedule_info, + res = gmyth_scheduler_set_live_record (scheduler, schedule_info, recorder_num, TRUE); + schedule_info->schedule_id = gmyth_scheduler_query_schedule_id (scheduler, prog_info); + return res; + } + } + + /* Now, verifies if there is an old schedule for this program */ + /* If threre is one, we reactivate it */ + { + gint sched_id; + time_t now = time (NULL); + + if (schedule_info->start_time->tv_sec < now) { + sched_id = gmyth_scheduler_query_old_schedule (scheduler, schedule_info->channel_id, + schedule_info->start_time, TRUE); + if (sched_id > 0) { + schedule_info->schedule_id = sched_id; + return TRUE; + } } } @@ -690,6 +713,68 @@ GMYTH_SCHEDULE_ONE_OCCURRENCE); } +static gint +gmyth_scheduler_query_schedule_id (GMythScheduler *scheduler, + GMythProgramInfo *prog_info) +{ + MYSQL_RES *mysql_res; + gint sched_id = -1; + gchar *query_str, *startts; + + startts = gmyth_util_time_to_string_from_time_val (prog_info->recstartts); + query_str = g_strdup_printf ("SELECT recordid from recorded " + "WHERE chanid= \"%d\" AND starttime = \"%s\";", + prog_info->channel_id, startts); + + mysql_res = gmyth_query_process_statement(scheduler->msqlquery, query_str); + + if (mysql_res) { + MYSQL_ROW msql_row = mysql_fetch_row(mysql_res); + if (msql_row) { + sched_id = g_ascii_strtoull (msql_row[0], NULL, 10); + } + } + + return sched_id; +} + +/* Queries if there is an old schedule previously set to this program. + * If reactivate flag is set, the recording will be reactivated. + * @returns the schedule id. + */ +static int +gmyth_scheduler_query_old_schedule (GMythScheduler *scheduler, + gint channel_id, GTimeVal *startts, + gboolean reactivate) +{ + MYSQL_RES *mysql_res; + gint sched_id = -1; + gchar *query_str, *startts_str; + + startts_str = gmyth_util_time_to_string_from_time_val (startts); + query_str = g_strdup_printf ("SELECT recordid from oldrecorded " + "WHERE chanid= \"%d\" AND starttime=\"%s\";", + channel_id, startts_str); + + mysql_res = gmyth_query_process_statement(scheduler->msqlquery, query_str); + g_free (query_str); + + if (mysql_res) { + MYSQL_ROW msql_row = mysql_fetch_row(mysql_res); + if (msql_row) { + sched_id = g_ascii_strtoull (msql_row[0], NULL, 10); + if ((sched_id > 0) && (reactivate)) { + query_str = g_strdup_printf ("UPDATE oldrecorded SET reactivate = 1 " + "WHERE chanid= \"%d\" AND starttime=\"%s\";", + channel_id, startts_str); + update_backend (scheduler, 0); + } + } + } + + return sched_id; +} + /** Queries if the given schedule info is currently been recorded by any * backend recorder. * @return The recorder num currently recording the scheduled item, or -1 @@ -777,7 +862,7 @@ startts = gmyth_util_time_to_string_from_time_val (prog_info->recstartts); query_str = g_strdup_printf("UPDATE recorded SET recgroup = \"%s\" " - "WHERE chanid = \"%d\" AND starttime = \"%s\"", + "WHERE chanid = \"%d\" AND starttime = \"%s\";", new_group, prog_info->channel_id, startts); gmyth_query_process_statement(scheduler->msqlquery, query_str); @@ -804,7 +889,6 @@ g_return_val_if_fail (scheduler != NULL, FALSE); - if (scheduler->msqlquery == NULL) { g_warning("[%s] Scheduler db connection not initialized", __FUNCTION__); @@ -831,6 +915,7 @@ return ret; } } + } query_str = g_string_new(""); @@ -911,37 +996,6 @@ return update_backend(scheduler, record_id); } - -gboolean gmyth_scheduler_was_recorded_before(GMythScheduler* scheduler, gint channel_id, - time_t start_time) -{ - MYSQL_RES *msql_res; - GString *query_str = g_string_new(""); - - assert(scheduler); - g_string_printf(query_str, "SELECT callsign FROM channel " - "WHERE chanid = \"%d\"", channel_id); - - msql_res = gmyth_query_process_statement(scheduler->msqlquery, query_str->str); - - if (msql_res) { - MYSQL_ROW msql_row = mysql_fetch_row(msql_res); - if (msql_row) { - GString* callsign = g_string_new(msql_row[0]); - GString* startts = gmyth_util_time_to_string(start_time); - g_string_printf(query_str, "SELECT * FROM oldrecorded " - "WHERE station = \"%s\" AND starttime = \"%s\"", - callsign->str, startts->str); - msql_res = gmyth_query_process_statement(scheduler->msqlquery, query_str->str); - g_string_free(callsign, TRUE); - g_string_free(startts, TRUE); - g_string_free(query_str, TRUE); - if (mysql_fetch_row(msql_res)) return TRUE; - } - } - return FALSE; -} - /** Retrieves an existing recorded item information from database. The information * is used to fill the returned GMythProgramInfo. * This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <me...@us...> - 2008-03-14 13:13:20
|
Revision: 953 http://gmyth.svn.sourceforge.net/gmyth/?rev=953&view=rev Author: melunko Date: 2008-03-14 06:13:18 -0700 (Fri, 14 Mar 2008) Log Message: ----------- Added several functions to handle with schedule exceptions Modified Paths: -------------- trunk/gmyth/gmyth/gmyth_remote_util.c trunk/gmyth/gmyth/gmyth_scheduler.c trunk/gmyth/gmyth/gmyth_scheduler.h Modified: trunk/gmyth/gmyth/gmyth_remote_util.c =================================================================== --- trunk/gmyth/gmyth/gmyth_remote_util.c 2008-03-14 12:45:05 UTC (rev 952) +++ trunk/gmyth/gmyth/gmyth_remote_util.c 2008-03-14 13:13:18 UTC (rev 953) @@ -158,7 +158,6 @@ gint recorder_num = (gint) g_ascii_strtoull (row[0], NULL, 10); GString *hostname = g_string_new (binfo->hostname); - g_debug ("XXXXXXXXXXXX Recorded found: %d", recorder_num); recorder = gmyth_recorder_new (recorder_num, hostname, binfo->port); if (gmyth_recorder_setup (recorder)) { *list = g_list_append(*list, recorder); Modified: trunk/gmyth/gmyth/gmyth_scheduler.c =================================================================== --- trunk/gmyth/gmyth/gmyth_scheduler.c 2008-03-14 12:45:05 UTC (rev 952) +++ trunk/gmyth/gmyth/gmyth_scheduler.c 2008-03-14 13:13:18 UTC (rev 953) @@ -273,7 +273,6 @@ GList ** schedule_list, gchar *filter) { - ScheduleInfo *schedule; MYSQL_RES *msql_res; GString *query_str = g_string_new(""); @@ -965,6 +964,133 @@ return res; } +gboolean +gmyth_scheduler_is_exception (GMythScheduler *scheduler, ScheduleInfo *sch_info, + gint *recordid, gint *parentid) +{ + MYSQL_RES *msql_res; + gboolean ret = FALSE; + gchar *query_str; + gchar *start_time, *start_date; + gchar *end_time, *end_date; + + g_return_val_if_fail (scheduler != NULL, FALSE); + g_return_val_if_fail (sch_info != NULL, FALSE); + + if (scheduler->msqlquery == NULL) { + g_warning("[%s] Scheduler db connection not initialized", __FUNCTION__); + return FALSE; + } + + start_time = gmyth_util_time_to_string_only_time (sch_info->start_time); + start_date = gmyth_util_time_to_string_only_date (sch_info->start_time); + + end_time = gmyth_util_time_to_string_only_time (sch_info->end_time); + end_date = gmyth_util_time_to_string_only_date (sch_info->end_time); + + query_str = g_strdup_printf ("SELECT recordid,parentid FROM record WHERE type=8 and " + "chanid=\"%d\" and starttime=\"%s\" and startdate=\"%s\" and " + "endtime=\"%s\" and enddate=\"%s\";", sch_info->channel_id, + start_time, start_date, end_time, end_date); + + msql_res = gmyth_query_process_statement(scheduler->msqlquery, query_str); + + if (msql_res == NULL) { + g_warning("DB retrieval of exception schedule info failed"); + goto clean_me; + } else { + MYSQL_ROW row = mysql_fetch_row(msql_res); + if (row) { + *recordid = g_ascii_strtoull (row[0], NULL, 10); + *parentid = g_ascii_strtoull (row[1], NULL, 10); + + ret = TRUE; + } + + mysql_free_result(msql_res); + } + +clean_me: + g_free (start_time); + g_free (start_date); + g_free (end_time); + g_free (end_date); + g_free (query_str); + + return ret; +} + +gboolean +gmyth_scheduler_remove_all_exceptions (GMythScheduler *scheduler, gint parentid) +{ + MYSQL_RES *msql_res; + gboolean ret = FALSE; + gchar *list_query; + + g_return_val_if_fail (scheduler != NULL, FALSE); + + if (scheduler->msqlquery == NULL) { + g_warning("[%s] Scheduler db connection not initialized", __FUNCTION__); + return FALSE; + } + + list_query = g_strdup_printf ("SELECT recordid FROM record WHERE parentid=%d;", + parentid); + + msql_res = gmyth_query_process_statement(scheduler->msqlquery, list_query); + + if (msql_res == NULL) { + g_warning("DB retrieval of schedule list failed"); + goto clean_me; + } else { + MYSQL_ROW row; + + while ((row = mysql_fetch_row(msql_res)) != NULL) { + + gint recordid = g_ascii_strtoull (row[0], NULL, 10); + ret = gmyth_scheduler_remove_exception (scheduler, recordid); + if (!ret) { + g_warning ("Fail to remove schedule exception"); + break; + } + } + + mysql_free_result(msql_res); + } + +clean_me: + g_free (list_query); + + return ret; +} + +gboolean +gmyth_scheduler_remove_exception (GMythScheduler *scheduler, gint scheduleid) +{ + MYSQL_RES *msql_res; + gchar *query_str = NULL; + + g_return_val_if_fail (scheduler != NULL, FALSE); + + if (scheduler->msqlquery == NULL) { + g_warning("[%s] Scheduler db connection not initialized", + __FUNCTION__); + return FALSE; + } + + query_str = g_strdup_printf ("DELETE FROM record WHERE recordid=%d", scheduleid); + + msql_res = gmyth_query_process_statement(scheduler->msqlquery, + query_str); + + mysql_free_result(msql_res); + g_free (query_str); + + // Notify the backend of the changes + return update_backend(scheduler, scheduleid); +} + + /** Requests the Mysql database in the backend to remove an existing recorded item. * * @param scheduler the GMythScheduler instance. Modified: trunk/gmyth/gmyth/gmyth_scheduler.h =================================================================== --- trunk/gmyth/gmyth/gmyth_scheduler.h 2008-03-14 12:45:05 UTC (rev 952) +++ trunk/gmyth/gmyth/gmyth_scheduler.h 2008-03-14 13:13:18 UTC (rev 953) @@ -167,9 +167,19 @@ gboolean gmyth_scheduler_add_schedule_full (GMythScheduler * scheduler, ScheduleInfo * schedule_info, GMythScheduleType type); + +/* Schedule exception handling. When one program is not part of an "all schedule programs */ gboolean gmyth_scheduler_add_exception (GMythScheduler *scheduler, gint schedule_id, ScheduleInfo *exception_info); +gboolean gmyth_scheduler_is_exception (GMythScheduler *scheduler, + ScheduleInfo *sch_info, + gint *recordid, gint *parentid); +gboolean gmyth_scheduler_remove_all_exceptions (GMythScheduler *scheduler, + gint parentid); +gboolean gmyth_scheduler_remove_exception (GMythScheduler *scheduler, + gint scheduleid); + gboolean gmyth_scheduler_delete_schedule (GMythScheduler * scheduler, gint record_id); gint gmyth_scheduler_delete_recorded (GMythScheduler * scheduler, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |