コード例 #1
0
ファイル: database.c プロジェクト: sanek701/CCTV-linux-msiu
int db_find_video_file(int cam_id, char *fname, time_t *timestamp) {
  char query[256];
  time_t start_ts;
  int found, extension;

  snprintf(query, sizeof(query),
    "SELECT date_part('epoch', started_at at time zone 'UTC'), mp4 FROM videofiles WHERE camera_id = %d AND started_at <= to_timestamp(%ld) at time zone 'UTC' AND (finished_at >= to_timestamp(%ld) at time zone 'UTC' OR finished_at IS NULL);",
    cam_id, *timestamp, *timestamp);

  PGresult *result = exec_query(query);
  if(PQresultStatus(result) != PGRES_TUPLES_OK) {
    fprintf(stderr, "Selection failed(videofile): %s\n", PQresultErrorMessage(result));
    exit(EXIT_FAILURE);
  }

  found = PQntuples(result);
  if(found == 1) {
    char *ts  = PQgetvalue(result, 0, 0);
    char *mp4 = PQgetvalue(result, 0, 1);
    
    sscanf(ts, "%ld", &start_ts);

    *timestamp -= start_ts;

    extension = mk_file_name(cam_id, &start_ts, mp4, fname);
    if(extension < 0) {
      PQclear(result);
      return -1;
    }

    fprintf(stderr, "Found file: %s at %d\n", fname, (int)*timestamp);
  } else {
    extension = -1;
    fprintf(stderr, "Files found: %d\n", found);
  }

  PQclear(result);

  return extension;
}
コード例 #2
0
ファイル: list_files.c プロジェクト: TimLand/datacl
// START FUNC DECL
int
list_files(
    char *in_data_dir
	 )
// STOP FUNC DECL
{
  int status = 0;
  struct stat st;
  FILE *ofp = NULL;
  int ddir_id = INT_MAX;
  char data_dir[MAX_LEN_DIR_NAME+1];
  char filename[32];

  if ( ( in_data_dir == NULL ) || ( *in_data_dir == '\0' ) )  {
    ddir_id = 0; 
    status = chdir(g_ddirs[0].name); cBYE(status);
  }
  else {
    status = strip_trailing_slash(in_data_dir, data_dir, MAX_LEN_DIR_NAME+1);
    cBYE(status);
    status = get_ddir_id(data_dir, g_ddirs, g_n_ddir, false, &ddir_id);
    cBYE(status);
    if ( ddir_id < 0 ) { go_BYE(-1); }
    status = chdir(in_data_dir); cBYE(status);
  }

  ofp = stdout;
  for ( int i = 0; i < g_n_fld; i++ ) { 
    if ( g_flds[i].name[0] == '\0' ) { continue; } /* null entry */
    if ( ddir_id != g_flds[i].ddir_id ) { continue; }
    mk_file_name(filename, g_flds[i].fileno);
    status = stat(filename, &st); cBYE(status);
    unsigned long long size = st.st_size;
    if ( size <= 0 ) { go_BYE(-1); }
    fprintf(ofp, "%d,%llu,_%d\n", g_flds[i].is_external,size,g_flds[i].fileno);
  }
BYE:
  status = chdir(g_cwd);
  return(status);
}
コード例 #3
0
ファイル: database.c プロジェクト: sanek701/CCTV-linux-msiu
int db_unlink_oldest_file() {
  int video_id, camera_id;
  time_t start_ts;
  char query[256], fname[1024];

  strcpy(query, "SELECT id, camera_id, date_part('epoch', started_at at time zone 'UTC'), mp4 FROM videofiles WHERE finished_at IS NOT NULL AND deleted_at is NULL ORDER BY started_at DESC LIMIT 1;");
  PGresult *result = exec_query(query);
  if(PQntuples(result) == 1) {
    char *id     = PQgetvalue(result, 0, 0);
    char *cam_id = PQgetvalue(result, 0, 1);
    char *ts     = PQgetvalue(result, 0, 2);
    char *mp4    = PQgetvalue(result, 0, 3);

    sscanf(id,     "%d", &video_id);
    sscanf(cam_id, "%d", &camera_id);
    sscanf(ts,    "%ld", &start_ts);

    if(mk_file_name(camera_id, &start_ts, mp4, fname) < 0) {
      PQclear(result);
      return -1;
    }

    PQclear(result);

    snprintf(query, sizeof(query), "UPDATE videofiles SET deleted_at = NOW() at time zone 'UTC' WHERE id = %d;", video_id);
    PGresult *result = exec_query(query);
    if(PQresultStatus(result) == PGRES_COMMAND_OK) {
      fprintf(stderr, "Deleting: %s\n", fname);
      unlink(fname);
      return 1;
    } else {
      fprintf(stderr, "Update failed(videofile): %s\n", PQresultErrorMessage(result));
      exit(EXIT_FAILURE);
    }
  }

  PQclear(result);
  return 0;
}