diff options
Diffstat (limited to 'Src/Plugins/Library/ml_wire/db.cpp')
-rw-r--r-- | Src/Plugins/Library/ml_wire/db.cpp | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/Src/Plugins/Library/ml_wire/db.cpp b/Src/Plugins/Library/ml_wire/db.cpp new file mode 100644 index 00000000..d46b2a7d --- /dev/null +++ b/Src/Plugins/Library/ml_wire/db.cpp @@ -0,0 +1,171 @@ +#include <shlwapi.h> + +#include "api__ml_wire.h" +#include "Downloaded.h" +#include "../nde/nde_c.h" +#include "../nu/AutoLock.h" + +/* DB Schema +ChannelTitle +ItemUrl +ItemTitle +PublishDate +Length +Filename +*/ + +static Nullsoft::Utility::LockGuard dbcs; +static nde_table_t table = 0; +static nde_database_t db = 0; +using namespace Nullsoft::Utility; + +enum +{ + DB_ID_CHANNELTITLE = 0, + DB_ID_ITEMURL = 1, + DB_ID_ITEMTITLE = 2, + DB_ID_PUBLISHDATE = 3, + DB_ID_LENGTH = 4, + DB_ID_FILENAME = 5 +}; + +static bool OpenDatabase() +{ + AutoLock lock(dbcs); + if (!db) + db = NDE_CreateDatabase(); + + return true; +} + +void CloseDatabase() +{ + AutoLock lock( dbcs ); + if ( db ) + { + if ( table ) + NDE_Database_CloseTable( db, table ); + + NDE_DestroyDatabase( db ); + } + + db = 0; +} + +static void CreateFields(nde_table_t table) +{ + // create defaults + NDE_Table_NewColumnW(table, DB_ID_CHANNELTITLE, L"channeltitle", FIELD_STRING); + NDE_Table_NewColumnW(table, DB_ID_ITEMURL, L"itemurl", FIELD_STRING); + NDE_Table_NewColumnW(table, DB_ID_ITEMTITLE, L"itemtitle", FIELD_STRING); + NDE_Table_NewColumnW(table, DB_ID_PUBLISHDATE, L"publishdate", FIELD_DATETIME); + NDE_Table_NewColumnW(table, DB_ID_LENGTH, L"length", FIELD_INTEGER); + NDE_Table_NewColumnW(table, DB_ID_FILENAME, L"filename", FIELD_FILENAME); + NDE_Table_PostColumns(table); + NDE_Table_AddIndexByIDW(table, DB_ID_ITEMURL, L"itemurl"); +} + +static bool OpenTable() +{ + AutoLock lock( dbcs ); + if ( !OpenDatabase() ) + return false; + + if ( !table ) + { + const wchar_t *inidir = WASABI_API_APP->path_getUserSettingsPath(); + wchar_t tablePath[ MAX_PATH ] = { 0 }, indexPath[ MAX_PATH ] = { 0 }; + + PathCombineW( tablePath, inidir, L"plugins" ); + PathAppendW( tablePath, L"podcasts.dat" ); + PathCombineW( indexPath, inidir, L"plugins" ); + PathAppendW( indexPath, L"podcasts.idx" ); + + table = NDE_Database_OpenTable( db, tablePath, indexPath, NDE_OPEN_ALWAYS, NDE_CACHE ); + if ( table ) + CreateFields( table ); + } + + return !!table; +} + +static void db_add( nde_scanner_t s, unsigned char id, wchar_t *data ) +{ + if ( data ) + { + nde_field_t f = NDE_Scanner_NewFieldByID( s, id ); + NDE_StringField_SetString( f, data ); + } +} + +static void db_add_int( nde_scanner_t s, unsigned char id, int data ) +{ + if ( data ) + { + nde_field_t f = NDE_Scanner_NewFieldByID( s, id ); + NDE_IntegerField_SetValue( f, data ); + } +} + +static void db_add_time( nde_scanner_t s, unsigned char id, time_t data ) +{ + if ( data ) + { + nde_field_t f = NDE_Scanner_NewFieldByID( s, id ); + NDE_IntegerField_SetValue( f, static_cast<int>( data ) ); + } +} + +bool AddPodcastData( const DownloadedFile &data ) +{ + AutoLock lock( dbcs ); + if ( !OpenTable() ) + return false; + + nde_scanner_t s = NDE_Table_CreateScanner( table ); + if ( s ) + { + NDE_Scanner_New( s ); + db_add( s, DB_ID_CHANNELTITLE, data.channel ); + db_add( s, DB_ID_ITEMURL, data.url ); + db_add( s, DB_ID_ITEMTITLE, data.item ); + db_add_time( s, DB_ID_PUBLISHDATE, data.publishDate ); + db_add_int( s, DB_ID_LENGTH, (int)data.totalSize ); + db_add( s, DB_ID_FILENAME, data.path ); + NDE_Scanner_Post( s ); + NDE_Table_DestroyScanner( table, s ); + NDE_Table_Sync( table ); + + return true; + } + + return false; +} + +bool IsPodcastDownloaded( const wchar_t *url ) +{ + AutoLock lock( dbcs ); + if ( !OpenTable() ) + return false; + + nde_scanner_t s = NDE_Table_CreateScanner( table ); + if ( s ) + { + if ( NDE_Scanner_LocateString( s, DB_ID_ITEMURL, FIRST_RECORD, url ) ) + { + NDE_Table_DestroyScanner( table, s ); + return true; + } + + NDE_Table_DestroyScanner( table, s ); + } + + return false; +} + +void CompactDatabase() +{ + AutoLock lock( dbcs ); + if ( OpenTable() ) + NDE_Table_Compact( table ); +} |