1 /* -*- Mode: C ; c-basic-offset: 2 -*- */
2 /*****************************************************************************
4 * $Id: sqlite.c,v 1.6 2004/05/16 18:57:12 nedko Exp $
7 * SQLite backend implementation.
10 * Nedko Arnaudov <nedko@users.sourceforge.net>
13 * GNU GENERAL PUBLIC LICENSE version 2
15 *****************************************************************************/
22 #include "../result.h"
26 #define MEDIADB_SQLITE_MEDIA_TABLE "media"
27 #define MEDIADB_SQLITE_FILES_TABLE "files"
28 #define MEDIADB_SQLITE_LOCATIONS_TABLE "locations"
30 //#define DUMMY_SQL_QUERIES
31 #define FORMATTING_BUFFER_SIZE 10240
37 const char *pszFormat
,
43 char Buffer
[FORMATTING_BUFFER_SIZE
];
45 va_start(argList
, pszFormat
);
46 vsnprintf(Buffer
, FORMATTING_BUFFER_SIZE
-1, pszFormat
, argList
);
51 r
= maybe_enlarge_buffer(
52 &pDB
->pErrorMsgBuffer
,
53 &pDB
->sizeErrorMsgBuffer
,
55 if (MEDIADB_IS_ERROR(r
))
57 if (pDB
->sizeErrorMsgBuffer
> 0)
59 pDB
->pErrorMsgBuffer
[0] = 0;
63 memcpy(pDB
->pErrorMsgBuffer
, Buffer
, s
+ 1);
71 if (pDB
->pErrorMsgBuffer
!= NULL
)
73 pDB
->pErrorMsgBuffer
[0] = 0;
78 mediadb_sqlite_get_error_message(
81 if (pDB
->pErrorMsgBuffer
== NULL
)
86 return pDB
->pErrorMsgBuffer
;
100 pDB
->pErrorMsgBuffer
= NULL
;
101 pDB
->sizeErrorMsgBuffer
= 0;
111 "Failed to open database. Error: %s",
121 reset_error_message(pDB
);
127 mediadb_sqlite_close(
130 if (pDB
->pErrorMsgBuffer
!= NULL
)
132 free(pDB
->pErrorMsgBuffer
);
135 sqlite_close(pDB
->hDB
);
141 mediadb_sqlite_media_add_new(
144 const char *pszComment
,
145 mediadb_mediatype nType
,
146 mediadb_uint
*pnNewMediaID
)
150 my_ulonglong nMediaID
;
152 nRet
= sqlite_exec_printf(
154 "INSERT INTO " MEDIADB_SQLITE_MEDIA_TABLE
155 " (catid,type,added,info1,info2,name,comment,location)"
156 " VALUES (0,%u,0,0,0,'%q','%q','0')",
163 if (nRet
!= SQLITE_OK
)
167 "Failed to execute SQL query. Error: %s",
175 nMediaID
= sqlite_last_insert_rowid(pDB
->hDB
);
176 if (nMediaID
== 0ULL)
180 "Invalid media ID 0 after media INSERT");
184 *pnNewMediaID
= nMediaID
;
186 reset_error_message(pDB
);
192 mediadb_sqlite_media_update_properties(
194 mediadb_uint nMediaID
,
195 mediadb_uint nTimeAdded
,
196 mediadb_uint nTotalFiles
,
197 mediadb_uint nTotalSize
)
202 nRet
= sqlite_exec_printf(
204 "UPDATE " MEDIADB_SQLITE_MEDIA_TABLE
" SET added=%u, info1=%u, info2=%u WHERE mediaid = %u",
208 (unsigned int)nTimeAdded
,
209 (unsigned int)nTotalFiles
,
210 (unsigned int)nTotalSize
,
211 (unsigned int)nMediaID
);
212 if (nRet
!= SQLITE_OK
)
216 "Failed to execute SQL query. Error: %s",
224 reset_error_message(pDB
);
230 mediadb_sqlite_file_add_new(
232 mediadb_uint nMediaID
,
233 mediadb_filetype Filetype
,
236 mediadb_uint nFileSize
,
237 mediadb_uint nFileTime
)
242 if (Filetype
!= MEDIADB_FILETYPE_FILE
&&
243 Filetype
!= MEDIADB_FILETYPE_DIR
)
247 "Cannot add file of unknown type");
248 return MEDIADB_INVAL_ARG
;
251 nRet
= sqlite_exec_printf(
253 "INSERT INTO " MEDIADB_SQLITE_FILES_TABLE
" (mediaid,size,time,path,name) VALUES (%u,%u,%u,'%q','%q%s')",
257 (unsigned int)nMediaID
,
258 (unsigned int)nFileSize
,
259 (unsigned int)nFileTime
,
262 (Filetype
== MEDIADB_FILETYPE_DIR
)?"/":"");
263 if (nRet
!= SQLITE_OK
)
267 "Failed to execute SQL query. Error: %s",
275 reset_error_message(pDB
);
281 mediadb_sqlite_media_get_properties(
283 mediadb_uint nMediaID
,
284 mediadb_uint
*pnTimeAdded
,
285 mediadb_uint
*pnTotalFiles
,
286 mediadb_uint
*pnTotalSize
,
294 nRet
= sqlite_get_table_printf(
296 "SELECT added, info1, info2, name FROM " MEDIADB_SQLITE_MEDIA_TABLE
" WHERE mediaid = %u",
301 (unsigned int)nMediaID
);
302 if (nRet
!= SQLITE_OK
)
306 "Failed to execute SQL query. Error: %s",
319 "SQL query returned unexpected result (%d, %d).",
323 sqlite_free_table(pResult
);
330 if (pResult
[4] == NULL
)
336 *pnTimeAdded
= strtoull(pResult
[4], NULL
, 10);
339 if (pResult
[5] == NULL
)
345 *pnTotalFiles
= strtoull(pResult
[5], NULL
, 10);
348 if (pResult
[6] == NULL
)
354 *pnTotalSize
= strtoull(pResult
[6], NULL
, 10);
357 if (pResult
[7] == NULL
)
359 *ppszTitle
= strdup("");
363 *ppszTitle
= strdup(pResult
[7]);
366 sqlite_free_table(pResult
);
368 reset_error_message(pDB
);
374 mediadb_sqlite_delete_media_files(
376 mediadb_uint nMediaID
)
381 nRet
= sqlite_exec_printf(
383 "DELETE FROM " MEDIADB_SQLITE_FILES_TABLE
" WHERE mediaid = %u",
387 (unsigned int)nMediaID
);
388 if (nRet
!= SQLITE_OK
)
392 "Failed to execute SQL query. Error: %s",
400 reset_error_message(pDB
);
406 mediadb_sqlite_media_update_name(
408 mediadb_uint nMediaID
,
414 nRet
= sqlite_exec_printf(
416 "UPDATE " MEDIADB_SQLITE_MEDIA_TABLE
" SET name = '%q' WHERE mediaid = %u",
421 (unsigned int)nMediaID
);
422 if (nRet
!= SQLITE_OK
)
426 "Failed to execute SQL query. Error: %s",
434 reset_error_message(pDB
);
439 struct mediadb_media_callback_context
441 mediadb_media_callback pCallback
;
447 mediadb_sqlite_media_get_callback(
455 const char *pszComment
;
460 mediadb_mediatype nType
;
461 char strLocation
[1000];
463 char *pLocationDescriptionBuffer
;
470 pLocationDescriptionBuffer
= NULL
;
482 nMediaID
= atol(argv
[0]);
492 nType
= atol(argv
[2]);
495 nType
= MEDIADB_MT_EMPTY
;
502 nAdded
= atol(argv
[3]);
509 nTotalFiles
= atol(argv
[4]);
516 nTotalSize
= atol(argv
[5]);
530 pszComment
= argv
[7];
535 nLocationID
= atol(argv
[8]);
539 nRet
= sqlite_get_table_printf(
540 ((struct mediadb_media_callback_context
*) pArg
)->hDB
,
541 "SELECT description FROM " MEDIADB_SQLITE_LOCATIONS_TABLE
" WHERE id = %u",
546 (unsigned int)nLocationID
);
547 if (nRet
!= SQLITE_OK
)
550 "Cannot get description for location with ID \"%ld\" (SQLite error \"%s\")",
556 pszLocation
= strLocation
;
558 else if (nColumns
!= 1 ||
562 "Cannot get description for location with ID \"%ld\" (SQLite query returned unexpected result (%d, %d).",
566 sqlite_free_table(pResult
);
567 pszLocation
= strLocation
;
569 else if (pResult
[1] == NULL
)
572 "Cannot get description for location with ID \"%ld\" (SQLite query returned NULL)",
574 sqlite_free_table(pResult
);
575 pszLocation
= strLocation
;
579 s
= strlen(pResult
[1]);
581 if (s
< sizeof(strLocation
))
583 memcpy(strLocation
, pResult
[1], s
);
585 pszLocation
= strLocation
;
589 pLocationDescriptionBuffer
= malloc(s
+1);
590 if (pLocationDescriptionBuffer
== NULL
)
593 "Cannot get description for location with ID \"%ld\" (out of memory)",
595 pszLocation
= strLocation
;
599 memcpy(pLocationDescriptionBuffer
, pResult
[1], s
);
600 pLocationDescriptionBuffer
[s
] = 0;
601 pszLocation
= pLocationDescriptionBuffer
;
605 sqlite_free_table(pResult
);
608 ((struct mediadb_media_callback_context
*) pArg
)->pCallback(
609 ((struct mediadb_media_callback_context
*) pArg
)->pUserContext
,
610 (mediadb_uint
)nMediaID
,
614 (mediadb_uint
)nAdded
,
615 (mediadb_uint
)nTotalFiles
,
616 (mediadb_uint
)nTotalSize
,
617 (mediadb_uint
)nLocationID
,
620 if (pLocationDescriptionBuffer
!= NULL
)
622 free(pLocationDescriptionBuffer
);
629 mediadb_sqlite_media_get_all(
631 mediadb_media_callback pCallback
,
634 struct mediadb_media_callback_context context
;
638 context
.pCallback
= pCallback
;
639 context
.pUserContext
= pUserContext
;
640 context
.hDB
= pDB
->hDB
;
644 "SELECT * FROM " MEDIADB_SQLITE_MEDIA_TABLE
" ORDER BY mediaid ASC",
645 mediadb_sqlite_media_get_callback
,
648 if (nRet
!= SQLITE_OK
)
652 "Failed to execute SQL query. Error: %s",
660 reset_error_message(pDB
);
665 /*****************************************************************************
669 * !!! WARNING !!! Following lines are automatically updated by the CVS system.
672 * Revision 1.6 2004/05/16 18:57:12 nedko
673 * media_get_all functionality implemented.
675 * Revision 1.5 2004/05/11 01:18:53 nedko
676 * Implement SQLite backend.
678 * Revision 1.4 2004/05/03 20:47:15 nedko
679 * Update mode for cui
681 * Revision 1.3 2004/05/02 20:12:11 nedko
682 * Improve error dumps.
684 * Revision 1.2 2004/05/02 13:16:58 nedko
685 * Supply filetype when adding new file
687 * Revision 1.1 2004/04/27 09:12:28 nedko
690 *****************************************************************************/