dtable removal: celebrate new idnode system
This commit is contained in:
parent
d307001c52
commit
40d12b5fd4
7 changed files with 1 additions and 412 deletions
1
Makefile
1
Makefile
|
@ -95,7 +95,6 @@ SRCS = src/version.c \
|
|||
src/utils.c \
|
||||
src/wrappers.c \
|
||||
src/access.c \
|
||||
src/dtable.c \
|
||||
src/tcp.c \
|
||||
src/udp.c \
|
||||
src/url.c \
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
#include "epg.h"
|
||||
#include "epggrab.h"
|
||||
#include "channels.h"
|
||||
#include "dtable.h"
|
||||
#include "access.h"
|
||||
#include "notify.h"
|
||||
#include "dvr/dvr.h"
|
||||
#include "htsp_server.h"
|
||||
|
|
243
src/dtable.c
243
src/dtable.c
|
@ -1,243 +0,0 @@
|
|||
/**
|
||||
* Dtable (dyanmic, data, etc) table
|
||||
* Copyright (C) 2008 Andreas Öman
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
#include <pthread.h>
|
||||
#include <ctype.h>
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "settings.h"
|
||||
|
||||
#include "tvheadend.h"
|
||||
#include "dtable.h"
|
||||
#include "notify.h"
|
||||
|
||||
static LIST_HEAD(, dtable) dtables;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
void
|
||||
dtable_store_changed(const dtable_t *dt)
|
||||
{
|
||||
htsmsg_t *m = htsmsg_create_map();
|
||||
|
||||
htsmsg_add_u32(m, "reload", 1);
|
||||
notify_by_msg(dt->dt_tablename, m);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
dtable_t *
|
||||
dtable_create(const dtable_class_t *dtc, const char *name, void *opaque)
|
||||
{
|
||||
dtable_t *dt = calloc(1, sizeof(dtable_t));
|
||||
|
||||
dt->dt_opaque = opaque;
|
||||
dt->dt_tablename = strdup(name);
|
||||
dt->dt_dtc = dtc;
|
||||
|
||||
LIST_INSERT_HEAD(&dtables, dt, dt_link);
|
||||
return dt;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
void
|
||||
dtable_delete(const char *name)
|
||||
{
|
||||
dtable_t *dt = dtable_find(name);
|
||||
|
||||
if (dt) {
|
||||
pthread_mutex_lock(&global_lock);
|
||||
LIST_REMOVE(dt, dt_link);
|
||||
pthread_mutex_unlock(&global_lock);
|
||||
free(dt->dt_tablename);
|
||||
free(dt);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
int
|
||||
dtable_load(dtable_t *dt)
|
||||
{
|
||||
htsmsg_t *l, *c, *m;
|
||||
htsmsg_field_t *f;
|
||||
const char *id;
|
||||
|
||||
int records = 0;
|
||||
|
||||
if((l = hts_settings_load("%s", dt->dt_tablename)) != NULL) {
|
||||
HTSMSG_FOREACH(f, l) {
|
||||
if((c = htsmsg_get_map_by_field(f)) == NULL)
|
||||
continue;
|
||||
|
||||
if((id = htsmsg_get_str(c, "id")) == NULL)
|
||||
continue;
|
||||
|
||||
m = dt->dt_dtc->dtc_record_update(dt->dt_opaque, id, c, 1);
|
||||
if(m != NULL) {
|
||||
records++;
|
||||
htsmsg_destroy(m);
|
||||
}
|
||||
}
|
||||
htsmsg_destroy(l);
|
||||
}
|
||||
return records;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
dtable_t *
|
||||
dtable_find(const char *name)
|
||||
{
|
||||
dtable_t *dt;
|
||||
LIST_FOREACH(dt, &dtables, dt_link)
|
||||
if(!strcmp(dt->dt_tablename, name))
|
||||
break;
|
||||
return dt;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
int
|
||||
dtable_record_update_by_array(dtable_t *dt, htsmsg_t *msg)
|
||||
{
|
||||
htsmsg_t *c, *update;
|
||||
htsmsg_field_t *f;
|
||||
const char *id;
|
||||
int changed = 0;
|
||||
|
||||
TAILQ_FOREACH(f, &msg->hm_fields, hmf_link) {
|
||||
if((c = htsmsg_get_map_by_field(f)) == NULL)
|
||||
continue;
|
||||
if((id = htsmsg_get_str(c, "id")) == NULL)
|
||||
continue;
|
||||
|
||||
if((update = dt->dt_dtc->dtc_record_update(dt->dt_opaque, id, c, 0))
|
||||
!= NULL) {
|
||||
/* Data changed */
|
||||
changed = 1;
|
||||
hts_settings_save(update, "%s/%s", dt->dt_tablename, id);
|
||||
htsmsg_destroy(update);
|
||||
}
|
||||
}
|
||||
if(changed)
|
||||
dtable_store_changed(dt);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
void
|
||||
dtable_record_delete(dtable_t *dt, const char *id)
|
||||
{
|
||||
dt->dt_dtc->dtc_record_delete(dt->dt_opaque, id);
|
||||
hts_settings_remove("%s/%s", dt->dt_tablename, id);
|
||||
dtable_store_changed(dt);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
int
|
||||
dtable_record_delete_by_array(dtable_t *dt, htsmsg_t *msg)
|
||||
{
|
||||
htsmsg_field_t *f;
|
||||
const char *id;
|
||||
int changed = 0;
|
||||
|
||||
TAILQ_FOREACH(f, &msg->hm_fields, hmf_link) {
|
||||
if((id = htsmsg_field_get_string(f)) != NULL) {
|
||||
changed = 1;
|
||||
dtable_record_delete(dt, id);
|
||||
}
|
||||
}
|
||||
if(changed)
|
||||
dtable_store_changed(dt);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
htsmsg_t *
|
||||
dtable_record_create(dtable_t *dt)
|
||||
{
|
||||
htsmsg_t *r;
|
||||
const char *id;
|
||||
|
||||
if((r = dt->dt_dtc->dtc_record_create(dt->dt_opaque)) == NULL)
|
||||
return NULL;
|
||||
|
||||
if((id = htsmsg_get_str(r, "id")) == NULL) {
|
||||
htsmsg_destroy(r);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
hts_settings_save(r, "%s/%s", dt->dt_tablename, id);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
htsmsg_t *
|
||||
dtable_record_get_all(dtable_t *dt)
|
||||
{
|
||||
return dt->dt_dtc->dtc_record_get_all(dt->dt_opaque);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
void
|
||||
dtable_record_store(dtable_t *dt, const char *id, htsmsg_t *r)
|
||||
{
|
||||
hts_settings_save(r, "%s/%s", dt->dt_tablename, id);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
void
|
||||
dtable_record_erase(dtable_t *dt, const char *id)
|
||||
{
|
||||
hts_settings_remove("%s/%s", dt->dt_tablename, id);
|
||||
}
|
83
src/dtable.h
83
src/dtable.h
|
@ -1,83 +0,0 @@
|
|||
/**
|
||||
* Dtable (dyanmic, data, etc) table
|
||||
* Copyright (C) 2008 Andreas Öman
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef DTABLE_H__
|
||||
#define DTABLE_H__
|
||||
|
||||
#include "htsmsg.h"
|
||||
|
||||
#include "access.h"
|
||||
|
||||
typedef struct dtable_class {
|
||||
const char *dtc_name;
|
||||
|
||||
htsmsg_t *(*dtc_record_get_all)(void *opaque);
|
||||
|
||||
htsmsg_t *(*dtc_record_get)(void *opaque, const char *id);
|
||||
|
||||
htsmsg_t *(*dtc_record_create)(void *opaque);
|
||||
|
||||
htsmsg_t *(*dtc_record_update)(void *opaque, const char *id,
|
||||
htsmsg_t *values, int maycreate);
|
||||
|
||||
int (*dtc_record_delete)(void *opaque, const char *id);
|
||||
|
||||
int dtc_read_access;
|
||||
int dtc_write_access;
|
||||
|
||||
pthread_mutex_t *dtc_mutex;
|
||||
|
||||
} dtable_class_t;
|
||||
|
||||
|
||||
typedef struct dtable {
|
||||
LIST_ENTRY(dtable) dt_link;
|
||||
|
||||
void *dt_opaque;
|
||||
char *dt_tablename;
|
||||
|
||||
const dtable_class_t *dt_dtc;
|
||||
|
||||
} dtable_t;
|
||||
|
||||
dtable_t *dtable_create(const dtable_class_t *dtc, const char *name,
|
||||
void *opaque);
|
||||
|
||||
void dtable_delete(const char *name);
|
||||
|
||||
int dtable_load(dtable_t *dt);
|
||||
|
||||
dtable_t *dtable_find(const char *name);
|
||||
|
||||
int dtable_record_update_by_array(dtable_t *dt, htsmsg_t *msg);
|
||||
|
||||
void dtable_record_delete(dtable_t *dt, const char *id);
|
||||
|
||||
int dtable_record_delete_by_array(dtable_t *dt, htsmsg_t *msg);
|
||||
|
||||
htsmsg_t *dtable_record_create(dtable_t *dt);
|
||||
|
||||
htsmsg_t *dtable_record_get_all(dtable_t *dt);
|
||||
|
||||
void dtable_record_store(dtable_t *dt, const char *id, htsmsg_t *r);
|
||||
|
||||
void dtable_record_erase(dtable_t *dt, const char *id);
|
||||
|
||||
void dtable_store_changed(const dtable_t *dt);
|
||||
|
||||
#endif /* DTABLE_H__ */
|
|
@ -31,7 +31,6 @@
|
|||
#include "tvheadend.h"
|
||||
#include "settings.h"
|
||||
#include "dvr.h"
|
||||
#include "dtable.h"
|
||||
#include "epg.h"
|
||||
#include "htsp_server.h"
|
||||
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
#include "tvheadend.h"
|
||||
#include "settings.h"
|
||||
#include "dvr.h"
|
||||
#include "dtable.h"
|
||||
#include "epg.h"
|
||||
|
||||
static int dvr_timerec_in_init = 0;
|
||||
|
|
|
@ -34,7 +34,6 @@
|
|||
#include "http.h"
|
||||
#include "webui.h"
|
||||
#include "access.h"
|
||||
#include "dtable.h"
|
||||
#include "channels.h"
|
||||
|
||||
#include "dvr/dvr.h"
|
||||
|
@ -275,86 +274,6 @@ page_about(http_connection_t *hc, const char *remain, void *opaque)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
static int
|
||||
extjs_tablemgr(http_connection_t *hc, const char *remain, void *opaque)
|
||||
{
|
||||
htsbuf_queue_t *hq = &hc->hc_reply;
|
||||
dtable_t *dt;
|
||||
htsmsg_t *out = NULL, *in, *array;
|
||||
|
||||
const char *tablename = http_arg_get(&hc->hc_req_args, "table");
|
||||
const char *op = http_arg_get(&hc->hc_req_args, "op");
|
||||
const char *entries = http_arg_get(&hc->hc_req_args, "entries");
|
||||
|
||||
if(op == NULL)
|
||||
return 400;
|
||||
|
||||
if(tablename == NULL || (dt = dtable_find(tablename)) == NULL)
|
||||
return 404;
|
||||
|
||||
if(http_access_verify(hc, dt->dt_dtc->dtc_read_access))
|
||||
return HTTP_STATUS_UNAUTHORIZED;
|
||||
|
||||
in = entries != NULL ? htsmsg_json_deserialize(entries) : NULL;
|
||||
|
||||
pthread_mutex_lock(dt->dt_dtc->dtc_mutex);
|
||||
|
||||
if(!strcmp(op, "create")) {
|
||||
if(http_access_verify(hc, dt->dt_dtc->dtc_write_access))
|
||||
goto noaccess;
|
||||
|
||||
out = dtable_record_create(dt);
|
||||
|
||||
} else if(!strcmp(op, "get")) {
|
||||
array = dtable_record_get_all(dt);
|
||||
|
||||
out = htsmsg_create_map();
|
||||
htsmsg_add_msg(out, "entries", array);
|
||||
|
||||
} else if(!strcmp(op, "update")) {
|
||||
if(http_access_verify(hc, dt->dt_dtc->dtc_write_access))
|
||||
goto noaccess;
|
||||
|
||||
if(in == NULL)
|
||||
goto bad;
|
||||
|
||||
dtable_record_update_by_array(dt, in);
|
||||
|
||||
} else if(!strcmp(op, "delete")) {
|
||||
if(http_access_verify(hc, dt->dt_dtc->dtc_write_access))
|
||||
goto noaccess;
|
||||
|
||||
if(in == NULL)
|
||||
goto bad;
|
||||
|
||||
dtable_record_delete_by_array(dt, in);
|
||||
|
||||
} else {
|
||||
bad:
|
||||
pthread_mutex_unlock(dt->dt_dtc->dtc_mutex);
|
||||
return HTTP_STATUS_BAD_REQUEST;
|
||||
|
||||
noaccess:
|
||||
pthread_mutex_unlock(dt->dt_dtc->dtc_mutex);
|
||||
return HTTP_STATUS_BAD_REQUEST;
|
||||
}
|
||||
|
||||
pthread_mutex_unlock(dt->dt_dtc->dtc_mutex);
|
||||
|
||||
if(in != NULL)
|
||||
htsmsg_destroy(in);
|
||||
|
||||
if(out == NULL)
|
||||
out = htsmsg_create_map();
|
||||
htsmsg_json_serialize(out, hq, 0);
|
||||
htsmsg_destroy(out);
|
||||
http_output_content(hc, "text/x-json; charset=UTF-8");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
@ -810,7 +729,6 @@ extjs_start(void)
|
|||
http_path_add("/extjs.html", NULL, extjs_root, ACCESS_WEB_INTERFACE);
|
||||
http_path_add("/tv.html", NULL, extjs_livetv, ACCESS_WEB_INTERFACE);
|
||||
http_path_add("/capabilities", NULL, extjs_capabilities, ACCESS_WEB_INTERFACE);
|
||||
http_path_add("/tablemgr", NULL, extjs_tablemgr, ACCESS_WEB_INTERFACE);
|
||||
http_path_add("/epggrab", NULL, extjs_epggrab, ACCESS_WEB_INTERFACE);
|
||||
http_path_add("/config", NULL, extjs_config, ACCESS_WEB_INTERFACE);
|
||||
http_path_add("/languages", NULL, extjs_languages, ACCESS_WEB_INTERFACE);
|
||||
|
|
Loading…
Add table
Reference in a new issue