ephoto/src/bin/ephoto_database.c

249 lines
6.8 KiB
C

#include "ephoto.h"
/*Ephoto databasing callbacks*/
static int get_album_id(void *notused, int argc, char **argv, char **col);
static int get_image_id(void *notused, int argc, char **argv, char **col);
static int list_albums(void *notused, int argc, char **argv, char **col);
static int list_images(void *notused, int argc, char **argv, char **col);
static int list_image_ids(void *notused, int argc, char **argv, char **col);
/*Ephoto databasing global variables*/
static int image_id, album_id;
/*Ephoto databasing ecore global variables*/
static Ecore_List *albums, *images_list, *image_ids;
/*Open the sqlite3 database. Create the database if it does not already exits.*/
sqlite3 *ephoto_db_init(void)
{
char path[PATH_MAX];
char path2[PATH_MAX];
sqlite3 *db;
albums = ecore_list_new();
images_list = ecore_dlist_new();
image_ids = ecore_list_new();
snprintf(path, PATH_MAX, "%s/.ephoto/.ephoto_database", getenv("HOME"));
snprintf(path2, PATH_MAX, "%s/.ephoto", getenv("HOME"));
if (!ecore_file_exists(path))
{
if (!ecore_file_exists(path2))
{
ecore_file_mkdir(path2);
}
sqlite3_open(path, &db);
sqlite3_exec(db, "CREATE TABLE 'albums'( "
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
"name VARCHAR( 255 ) NOT NULL, "
"description VARCHAR( 255 ) NULL);", 0, 0, 0);
sqlite3_exec(db, "CREATE TABLE images( "
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
"name VARCHAR( 255 ) NULL, "
"path VARCHAR( 255 ) NOT NULL);", 0, 0, 0);
sqlite3_exec(db, "CREATE TABLE album_images( "
"image_id INTEGER NOT NULL, "
"album_id INTEGER NOT NULL);", 0, 0, 0);
ephoto_db_add_album(db, "Complete Library", "Contains every tagged image!");
}
else
{
sqlite3_open(path, &db);
}
return db;
}
/*Get the id of an image in the images table*/
static int get_image_id(void *notused, int argc, char **argv, char **col)
{
int i;
notused = 0;
i = 0;
image_id = atoi(argv[i] ? argv[i] : "NULL");
return 0;
}
/*Get the id of an album in the albums table*/
static int get_album_id(void *notused, int argc, char **argv, char **col)
{
int i;
notused = 0;
i = 0;
album_id = atoi(argv[i] ? argv[i] : "NULL");
return 0;
}
/*Add a new album to the album table*/
void ephoto_db_add_album(sqlite3 *db, const char *name, const char *description)
{
char command[PATH_MAX];
snprintf(command, PATH_MAX, "INSERT or IGNORE INTO albums(name, description) "
"VALUES('%s', '%s');", name, description);
sqlite3_exec(db, command, 0, 0, 0);
return;
}
/*Deleate an album from the album table*/
void ephoto_db_delete_album(sqlite3 *db, const char *name)
{
char command[PATH_MAX];
snprintf(command, PATH_MAX, "DELETE FROM albums WHERE name = '%s';", name);
sqlite3_exec(db, command, 0, 0, 0);
snprintf(command, PATH_MAX, "SELECT id FROM albums WHERE name = '%s';", name);
sqlite3_exec(db, command, get_album_id, 0, 0);
snprintf(command, PATH_MAX, "DELETE FROM album_images WHERE album_id = '%d';", album_id);
sqlite3_exec(db, command, 0, 0, 0);
return;
}
/*Add a new image to a particular album*/
void ephoto_db_add_image(sqlite3 *db, const char *album, const char *name, const char *path)
{
char command[PATH_MAX];
snprintf(command, PATH_MAX, "INSERT or IGNORE INTO images(name, path) "
"VALUES('%s', '%s');", name, path);
sqlite3_exec(db, command, 0, 0, 0);
snprintf(command, PATH_MAX, "SELECT id FROM images WHERE path = '%s';", path);
sqlite3_exec(db, command, get_image_id, 0, 0);
snprintf(command, PATH_MAX, "SELECT id FROM albums WHERE name = '%s';", album);
sqlite3_exec(db, command, get_album_id, 0, 0);
snprintf(command, PATH_MAX, "INSERT or IGNORE into album_images(image_id, album_id) "
"VALUES('%d', '%d');", image_id, album_id);
sqlite3_exec(db, command, 0, 0, 0);
/*This is to make sure the complete library has all images*/
snprintf(command, PATH_MAX, "SELECT id FROM albums WHERE name = 'Complete Library';");
sqlite3_exec(db, command, get_album_id, 0, 0);
snprintf(command, PATH_MAX, "INSERT into album_images(image_id, album_id) "
"VALUES('%d', '%d');", image_id, album_id);
sqlite3_exec(db, command, 0, 0, 0);
return;
}
/*Delete an image from a particular album*/
void ephoto_db_delete_image(sqlite3 *db, const char *album, const char *path)
{
char command[PATH_MAX];
snprintf(command, PATH_MAX, "SELECT id FROM albums WHERE name = '%s';", album);
sqlite3_exec(db, command, get_album_id, 0, 0);
snprintf(command, PATH_MAX, "SELECT id FROM images WHERE path = '%s';", path);
sqlite3_exec(db, command, get_image_id, 0, 0);
snprintf(command, PATH_MAX, "DELETE FROM album_images WHERE "
"image_id = '%d' AND album_id = '%d';", image_id, album_id);
sqlite3_exec(db, command, 0, 0, 0);
return;
}
/*Populate a list the albums in the albums table*/
static int list_albums(void *notused, int argc, char **argv, char **col)
{
int i;
notused = 0;
for(i = 0; i < argc; i++)
{
ecore_list_append(albums, strdup(argv[i] ? argv[i] : "NULL"));
}
return 0;
}
/*Return a list of albums in the albums table*/
Ecore_List *ephoto_db_list_albums(sqlite3 *db)
{
if(!ecore_list_is_empty(albums))
{
ecore_list_destroy(albums);
}
albums = ecore_list_new();
sqlite3_exec(db, "SELECT name FROM albums;", list_albums, 0, 0);
return albums;
}
/*Populate a list of images belonging to a certain album*/
static int list_images(void *notused, int argc, char **argv, char **col)
{
int i;
notused = 0;
for(i = 0; i < argc; i++)
{
ecore_dlist_append(images_list, strdup(argv[i] ? argv[i] : "NULL"));
}
return 0;
}
/*Populate a list of the id's of images belonging to a certain album*/
static int list_image_ids(void *notused, int argc, char **argv, char **col)
{
int i;
notused = 0;
for(i = 0; i < argc; i++)
{
ecore_list_append(image_ids, strdup(argv[i] ? argv[i] : "NULL"));
}
return 0;
}
/*Return a list of images belonging to a certain album*/
Ecore_List *ephoto_db_list_images(sqlite3 *db, const char *album)
{
char command[PATH_MAX];
char *id;
if(!ecore_list_is_empty(images_list))
{
ecore_dlist_destroy(images_list);
}
if(!ecore_list_is_empty(image_ids))
{
ecore_list_destroy(image_ids);
}
images_list = ecore_dlist_new();
image_ids = ecore_list_new();
snprintf(command, PATH_MAX, "SELECT id FROM albums WHERE name = '%s';", album);
sqlite3_exec(db, command, get_album_id, 0, 0);
snprintf(command, PATH_MAX, "SELECT image_id FROM album_images WHERE album_id = '%d';", album_id);
sqlite3_exec(db, command, list_image_ids, 0, 0);
while(!ecore_list_is_empty(image_ids))
{
id = ecore_list_remove_first(image_ids);
snprintf(command, PATH_MAX, "SELECT path FROM images WHERE id"
" = '%s'", id);
sqlite3_exec(db, command, list_images, 0, 0);
}
return images_list;
}
/*Close the sqlite3 database*/
void ephoto_db_close(sqlite3 *db)
{
sqlite3_close(db);
return;
}