# HG changeset patch # User teknolog # Date 1272392808 -3600 # Node ID 4d230e702aa3cba9932cc652f1fee0b5b15a4553 # Parent 9569ea080d5a49a5570a638fbe8382a54c74cbdf Moved development branch from MCL to FCL diff -r 9569ea080d5a -r 4d230e702aa3 application/data/PodcastClient_english.rls --- a/application/data/PodcastClient_english.rls Thu Mar 11 20:53:00 2010 +0100 +++ b/application/data/PodcastClient_english.rls Tue Apr 27 19:26:48 2010 +0100 @@ -38,8 +38,8 @@ rls_string STRING_r_tabgroup_queue_counter "Queue (%d)" // Question dialogs -rls_string STRING_r_add_feed_prompt "Enter search terms or feed URL" -rls_string STRING_r_edit_feed_prompt "Feed URL" +rls_string STRING_r_add_feed_prompt "Enter search terms or feed address" +rls_string STRING_r_edit_feed_prompt "Feed address" rls_string STRING_r_add_feed_title_prompt "Feed title" rls_string STRING_r_remove_feed_prompt "Remove feed '%S'?" rls_string STRING_r_enable_downloads_prompt "There are shows in the download queue. Do you want to download now?" @@ -50,7 +50,7 @@ // Settings view rls_string STRING_r_podcast_settings_title "Settings" -rls_string STRING_r_podcast_setting_showdir "Podcast directory" +rls_string STRING_r_podcast_setting_showdir "Podcast folder" rls_string STRING_r_podcast_setting_autoupdate "Automatic update" rls_string STRING_r_podcast_setting_autodownload "Automatic download" rls_string STRING_r_podcast_setting_connection "Connection" @@ -58,6 +58,13 @@ rls_string STRING_r_podcast_setting_alwaysask "Always ask" rls_string STRING_r_podcast_setting_useiap "Select access point" rls_string STRING_r_podcast_setting_iaplist "Access points" +rls_string STRING_r_podcast_select_folder "Select folder" +rls_string STRING_r_on "On" +rls_string STRING_r_off "Off" +rls_string STRING_r_podcast_setting_reset_db "Reset database" +rls_string STRING_r_podcast_setting_reset_db_query "Reset database? All data will be lost!" + + // Choicelist for autodownload rls_string STRING_podcast_autoupdate_option1 "Off" @@ -66,6 +73,10 @@ rls_string STRING_podcast_autoupdate_option4 "Twice a day" rls_string STRING_podcast_autoupdate_option5 "Daily" +// Auto download settings +rls_string STRING_r_on "On" +rls_string STRING_r_off "Off" + // Feed import/export rls_string STRING_r_view_import_feeds_title "Select OPML file" rls_string STRING_r_enter_filename "Enter file name" @@ -92,7 +103,7 @@ rls_string STRING_r_cancel_update_all_feeds_cmd "Cancel update" rls_string STRING_r_cancel_update_all_feeds_short_cmd "Cancel" rls_string STRING_r_podcast_feeds_status_format "%d new" -rls_string STRING_r_podcast_shows_never_updated "Never" +rls_string STRING_r_podcast_shows_never_updated "Never updated" rls_string STRING_r_view_add_feed_cmd "Add feed" rls_string STRING_r_view_add_feed_cmd_short "Add" rls_string STRING_r_view_edit_feed_cmd "Edit feed" @@ -110,7 +121,7 @@ rls_string STRING_add_feed_success "Feed added. Update now?" rls_string STRING_add_feed_error "Could not add feed" rls_string STRING_r_add_feed_replace "All existing shows in this feed will be deleted! Continue?" // shown when changing an existing feed URL -rls_string STRING_r_add_feed_exists "A feed with this URL already exists" // shown when adding or changing a feed to a URL that already exists +rls_string STRING_r_add_feed_exists "A feed with this address already exists" // shown when adding or changing a feed to a URL that already exists // Feed searching @@ -132,6 +143,13 @@ rls_string STRING_r_view_stop_downloads_cmd "Suspend downloading" rls_string STRING_r_view_resume_downloads_cmd "Resume downloading" rls_string STRING_r_view_remove_all_downloads_cmd_short "Clear" +rls_string STRING_r_view_remove_all_downloads_cmd "Clear download queue" rls_string STRING_r_clear_query "Clear download queue?" rls_string STRING_r_view_remove_download_short_cmd "Remove" -rls_string STRING_r_view_remove_download_cmd "Remove Download" +rls_string STRING_r_view_remove_download_cmd "Remove download" + +rls_string STRING_r_error_notfound "Error: Not found on server" +rls_string STRING_r_error_invalid_address "Error: Invalid address" +rls_string STRING_r_error_general "Error: General error %d" +rls_string STRING_r_error_http "Error: HTTP error %d" +rls_string STRING_r_error_disk_full "Error: Disk full" diff -r 9569ea080d5a -r 4d230e702aa3 application/data/PodcastFeedView.ra --- a/application/data/PodcastFeedView.ra Thu Mar 11 20:53:00 2010 +0100 +++ b/application/data/PodcastFeedView.ra Tue Apr 27 19:26:48 2010 +0100 @@ -270,40 +270,3 @@ } }; } - -RESOURCE FILESELECTIONDIALOG r_podcast_import_podcast - { - title = STRING_r_view_import_feeds_title; - root_path = ""; - filters = - { - FILTER - { - filter_type = EFilenameFilter; - filter_style = EInclusiveFilter; - filter_data = { "*.*" }; - } - }; - } - -RESOURCE FILESELECTIONDIALOG r_podcast_export_feeds - { - title = STRING_r_view_export_feeds_title; - root_path = ""; - filters = - { - FILTER - { - filter_type = EFilenameFilter; - filter_style = EInclusiveFilter; - filter_data = { "*.*" }; - } - }; - } - -RESOURCE FILENAMEPROMPTDIALOG r_podcast_filename_prompt_dialog -{ - filename_prompt = STRING_r_enter_filename; - default_filename = "feeds.opml"; - path = ""; -} diff -r 9569ea080d5a -r 4d230e702aa3 application/data/PodcastQueueView.ra --- a/application/data/PodcastQueueView.ra Thu Mar 11 20:53:00 2010 +0100 +++ b/application/data/PodcastQueueView.ra Tue Apr 27 19:26:48 2010 +0100 @@ -140,11 +140,6 @@ { items = { - /* STYLUS_POPUP_MENU_ITEM - { - txt = STRING_r_view_show_info_cmd; - command = EPodcastShowInfo; - },*/ STYLUS_POPUP_MENU_ITEM { txt = STRING_r_view_remove_download_short_cmd; diff -r 9569ea080d5a -r 4d230e702aa3 application/data/PodcastSettingsView.ra --- a/application/data/PodcastSettingsView.ra Thu Mar 11 20:53:00 2010 +0100 +++ b/application/data/PodcastSettingsView.ra Tue Apr 27 19:26:48 2010 +0100 @@ -30,9 +30,14 @@ { MENU_ITEM { + command = EPodcastResetDb; + txt = STRING_r_podcast_setting_reset_db; + }, + MENU_ITEM + { command = EPodcastHelp; txt = STRING_r_view_help; - } + } }; } @@ -225,6 +230,18 @@ }; } +RESOURCE MEMORYSELECTIONDIALOG r_podcast_memory_selection + { + title = "Select memory:"; + softkey_1 = text_softkey_ok; // The text for the left softkey. + softkey_2 = text_softkey_cancel; // The text for the right softkey. + locations = + { + LOCATION { root_path = text_phone_memory_root_path; }, + LOCATION { root_path = text_memory_card_root_path; } + }; + } + RESOURCE TBUF r_podcast_softkey_select { buf = STRING_r_view_export_feeds_softkey; } RESOURCE TBUF r_settings_title { buf = STRING_r_podcast_settings_title; } diff -r 9569ea080d5a -r 4d230e702aa3 application/data/PodcastShowsView.ra --- a/application/data/PodcastShowsView.ra Thu Mar 11 20:53:00 2010 +0100 +++ b/application/data/PodcastShowsView.ra Tue Apr 27 19:26:48 2010 +0100 @@ -98,9 +98,10 @@ } }; }; - } -#ifdef SYMBIAN1_UI - ,TBAR_CTRL + }, +// we keep the download toolbar button in S^3, but always disable it +// because there are drawing issues with only one item in the toolbar + TBAR_CTRL { type = EAknCtButton; id = EPodcastDownloadShow; @@ -117,7 +118,9 @@ } }; }; - }, + } +#ifdef SYMBIAN1_UI + , TBAR_CTRL { type = EAknCtButton; diff -r 9569ea080d5a -r 4d230e702aa3 application/data/PodcastStrings.ra --- a/application/data/PodcastStrings.ra Thu Mar 11 20:53:00 2010 +0100 +++ b/application/data/PodcastStrings.ra Tue Apr 27 19:26:48 2010 +0100 @@ -16,22 +16,10 @@ * */ -RESOURCE TBUF r_podcast_main_player_cmd{buf = STRING_r_view_player_cmd;} -RESOURCE TBUF r_podcast_show_cmd{buf = STRING_r_view_show_cmd;} -RESOURCE TBUF r_podcast_update_cmd{buf = STRING_r_update_feeds_cmd;} RESOURCE TBUF r_podcast_update_all_cmd{buf = STRING_r_update_all_feeds_cmd;} -RESOURCE TBUF r_podcast_view_cmd {buf = STRING_r_view_cmd;} -RESOURCE TBUF r_podcast_remove_feed_title {buf = STRING_r_remove_feed_title;} RESOURCE TBUF r_podcast_remove_feed_prompt {buf = STRING_r_remove_feed_prompt;} -RESOURCE TBUF r_podcast_update_new_feed_title {buf = STRING_r_update_new_feed_title;} RESOURCE TBUF r_podcast_update_new_feed_prompt {buf = STRING_r_update_new_feed_prompt;} -RESOURCE TBUF r_podcast_delete_played_title {buf = STRING_r_delete_played_title;} -RESOURCE TBUF r_podcast_delete_played_prompt {buf = STRING_r_delete_played_prompt;} -RESOURCE TBUF r_podcast_delete_show_title {buf = STRING_r_delete_show_title;} RESOURCE TBUF r_podcast_delete_show_prompt {buf = STRING_r_delete_show_prompt;} -RESOURCE TBUF r_podcast_remove_chapter_title {buf = STRING_r_remove_chapter_title;} -RESOURCE TBUF r_podcast_remove_chapter_prompt {buf = STRING_r_remove_chapter_prompt;} -RESOURCE TBUF r_podcast_enable_downloads_title {buf = STRING_r_enable_downloads_title;} RESOURCE TBUF r_podcast_enable_downloads_prompt {buf = STRING_r_enable_downloads_prompt;} RESOURCE TBUF r_podcast_feeds_title_format {buf = STRING_r_podcast_feeds_title_format;} RESOURCE TBUF r_podcast_feeds_status_format {buf = STRING_r_podcast_feeds_status_format;} @@ -47,30 +35,19 @@ RESOURCE TBUF r_podcast_feeds_never_updated {buf = STRING_r_podcast_shows_never_updated;} RESOURCE TBUF r_podcast_feeds_is_updating {buf = STRING_r_podcast_feeds_is_updating;} RESOURCE TBUF r_podcast_feeds_no_feeds {buf = STRING_r_podcast_no_feeds;} -RESOURCE TBUF r_podcast_import_feeds_title {buf = STRING_r_view_import_feeds_title;} -RESOURCE TBUF r_podcast_export_feeds_title {buf = STRING_r_view_export_feeds_title;} RESOURCE TBUF r_podcast_export_feeds_softkey {buf = STRING_r_view_export_feeds_softkey;} RESOURCE TBUF r_podcast_pending_status_active {buf = STRING_r_podcast_shows_title_download;} RESOURCE TBUF r_podcast_pending_status_suspended {buf = STRING_r_podcast_shows_downloads_suspended;} RESOURCE TBUF r_podcast_feeds_status {buf = STRING_r_view_feeds_status;} RESOURCE TBUF r_add_feed_exists {buf = STRING_r_add_feed_exists;} -RESOURCE TBUF r_add_feed_exists_title {buf = STRING_r_add_feed_exists_title;} RESOURCE TBUF r_add_feed_replace {buf = STRING_r_add_feed_replace;} -RESOURCE TBUF r_add_feed_replace_title {buf = STRING_r_add_feed_replace_title;} -RESOURCE TBUF r_catchup_feed {buf = STRING_r_catchup_feed;} -RESOURCE TBUF r_catchup_feed_title {buf = STRING_r_catchup_feed_title;} RESOURCE TBUF r_remove_all_dlg {buf = STRING_r_remove_all_dlg;} -RESOURCE TBUF r_question_title {buf = STRING_r_question_title;} RESOURCE TBUF r_podcast_addfeed_prompt {buf = STRING_r_add_feed_prompt;} RESOURCE TBUF r_podcast_addfeed_title_prompt {buf = STRING_r_add_feed_title_prompt;} RESOURCE TBUF r_tabgroup_feeds {buf = STRING_r_tabgroup_feeds;} RESOURCE TBUF r_tabgroup_queue {buf = STRING_r_tabgroup_queue;} RESOURCE TBUF r_tabgroup_queue_counter {buf = STRING_r_tabgroup_queue_counter;} -RESOURCE TBUF r_tabgroup_search {buf = STRING_r_search;} -RESOURCE TBUF r_tabgroup_shows {buf = STRING_r_tabgroup_shows;} -RESOURCE TBUF r_search_prompt {buf = STRING_r_search_title;} RESOURCE TBUF r_podcast_no_search_results {buf = STRING_r_podcast_empty_list;} -RESOURCE TBUF r_add_feed_title {buf=STRING_add_feed_title;} RESOURCE TBUF r_add_feed_query {buf=STRING_add_feed_query;} RESOURCE TBUF r_add_feed_success {buf=STRING_add_feed_success;} RESOURCE TBUF r_add_feed_failure {buf=STRING_add_feed_error;} @@ -87,3 +64,14 @@ RESOURCE TBUF r_exit_shows_downloading {buf=STRING_r_exit_shows_downloading;} RESOURCE TBUF r_search_results {buf=STRING_r_search_results;} RESOURCE TBUF r_podcast_no_feeds {buf=STRING_r_podcast_no_feeds;} +RESOURCE TBUF r_podcast_select_folder {buf = STRING_r_podcast_select_folder;} +RESOURCE TBUF r_podcast_select_opml {buf = STRING_r_view_import_feeds_title;} + +RESOURCE TBUF r_error_notfound {buf=STRING_r_error_notfound;} +RESOURCE TBUF r_error_general {buf=STRING_r_error_general;} +RESOURCE TBUF r_error_http {buf=STRING_r_error_http;} +RESOURCE TBUF r_error_invalid_address {buf=STRING_r_error_invalid_address;} + +RESOURCE TBUF r_reset_db_query {buf = STRING_r_podcast_setting_reset_db_query;} + +RESOURCE TBUF r_error_disk_full {buf = STRING_r_error_disk_full; } diff -r 9569ea080d5a -r 4d230e702aa3 application/data/images/new/Video.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/application/data/images/new/Video.svg Tue Apr 27 19:26:48 2010 +0100 @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 9569ea080d5a -r 4d230e702aa3 application/data/images/new/Video_downloaded.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/application/data/images/new/Video_downloaded.svg Tue Apr 27 19:26:48 2010 +0100 @@ -0,0 +1,193 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 9569ea080d5a -r 4d230e702aa3 application/data/images/new/Video_downloaded_new.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/application/data/images/new/Video_downloaded_new.svg Tue Apr 27 19:26:48 2010 +0100 @@ -0,0 +1,230 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 9569ea080d5a -r 4d230e702aa3 application/data/images/new/Video_downloading.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/application/data/images/new/Video_downloading.svg Tue Apr 27 19:26:48 2010 +0100 @@ -0,0 +1,169 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 9569ea080d5a -r 4d230e702aa3 application/data/images/new/Video_failed.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/application/data/images/new/Video_failed.svg Tue Apr 27 19:26:48 2010 +0100 @@ -0,0 +1,182 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 9569ea080d5a -r 4d230e702aa3 application/data/images/new/Video_new.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/application/data/images/new/Video_new.svg Tue Apr 27 19:26:48 2010 +0100 @@ -0,0 +1,193 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 9569ea080d5a -r 4d230e702aa3 application/data/images/new/Video_queued.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/application/data/images/new/Video_queued.svg Tue Apr 27 19:26:48 2010 +0100 @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 9569ea080d5a -r 4d230e702aa3 application/data/images/new/Video_suspended.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/application/data/images/new/Video_suspended.svg Tue Apr 27 19:26:48 2010 +0100 @@ -0,0 +1,167 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 9569ea080d5a -r 4d230e702aa3 application/group/Podcast.mmp --- a/application/group/Podcast.mmp Thu Mar 11 20:53:00 2010 +0100 +++ b/application/group/Podcast.mmp Tue Apr 27 19:26:48 2010 +0100 @@ -33,6 +33,12 @@ SYSTEMINCLUDE \epoc32\include\mw // for Symbian^3 SYSTEMINCLUDE \epoc32\include\platform\mw // for Symbian^3 +#ifdef SQLITE_INCLUDED +SYSTEMINCLUDE ..\..\engine\sqlite\inc +#else +SYSTEMINCLUDE \epoc32\include\stdapis +#endif + USERINCLUDE ..\..\engine\inc USERINCLUDE . USERINCLUDE ..\inc @@ -85,6 +91,7 @@ LIBRARY bitmaptransforms.lib #else LIBRARY PodCastEngine.lib +LIBRARY sqlite3.lib #endif LIBRARY euser.lib LIBRARY apparc.lib @@ -114,4 +121,3 @@ LIBRARY ws32.lib LIBRARY hlplch.lib LIBRARY bitgdi.lib - diff -r 9569ea080d5a -r 4d230e702aa3 application/group/icons.mk --- a/application/group/icons.mk Thu Mar 11 20:53:00 2010 +0100 +++ b/application/group/icons.mk Tue Apr 27 19:26:48 2010 +0100 @@ -33,6 +33,14 @@ $(DPATH)\new\Audio_downloaded_new.svg\ $(DPATH)\new\Audio_failed.svg\ $(DPATH)\new\Audio_suspended.svg\ + $(DPATH)\new\Video.svg\ + $(DPATH)\new\Video_new.svg\ + $(DPATH)\new\Video_queued.svg\ + $(DPATH)\new\Video_downloading.svg\ + $(DPATH)\new\Video_downloaded.svg\ + $(DPATH)\new\Video_downloaded_new.svg\ + $(DPATH)\new\Video_failed.svg\ + $(DPATH)\new\Video_suspended.svg\ $(DPATH)\new\Feed.svg FREEZE : do_nothing diff -r 9569ea080d5a -r 4d230e702aa3 application/inc/Podcast.hrh --- a/application/inc/Podcast.hrh Thu Mar 11 20:53:00 2010 +0100 +++ b/application/inc/Podcast.hrh Tue Apr 27 19:26:48 2010 +0100 @@ -59,7 +59,8 @@ EPodcastHide, EPodcastHelp, EPodcastSearch, - EPodcastAddSearchResult + EPodcastAddSearchResult, + EPodcastResetDb }; enum TPodcastControl @@ -80,7 +81,7 @@ enum TShowsIconIndex { - EShowIcon, + EShowIcon = 0, ENewShowIcon, EQuedShowIcon, EDownloadingShowIcon, diff -r 9569ea080d5a -r 4d230e702aa3 application/inc/PodcastAppui.h --- a/application/inc/PodcastAppui.h Thu Mar 11 20:53:00 2010 +0100 +++ b/application/inc/PodcastAppui.h Tue Apr 27 19:26:48 2010 +0100 @@ -58,7 +58,7 @@ class MTimeoutObserver { public: - virtual void HandleTimeout(const CTimeout& aId, TInt aError)=0; + virtual void HandleTimeoutL(const CTimeout& aId, TInt aError)=0; protected: virtual ~MTimeoutObserver() {} }; @@ -99,7 +99,7 @@ void RunL() { TInt r=iStatus.Int(); - iObserver.HandleTimeout(*this, r); + iObserver.HandleTimeoutL(*this, r); } protected: @@ -115,12 +115,13 @@ ~CPodcastAppUi(); void SetActiveTab(TInt aIndex); - void UpdateQueueTab(TInt aQueueLength); - void TabLeft(); - void TabRight(); + void UpdateQueueTabL(TInt aQueueLength); + void TabLeftL(); + void TabRightL(); void NaviSetTextL(TInt aResourceId); void NaviShowTabGroupL(); - + void GetErrorTextL(TDes &aErrorMessage, TInt aErrorCode); + private: // From MEikMenuObserver void DynInitMenuPaneL(TInt aResourceId,CEikMenuPane* aMenuPane); @@ -128,7 +129,7 @@ CArrayFix* HelpContextL() const; void HandleCommandL(TInt aCommand); protected: - void HandleTimeout(const CTimeout& aId, TInt aError); + void HandleTimeoutL(const CTimeout& aId, TInt aError); protected: // from MConnectionObserver diff -r 9569ea080d5a -r 4d230e702aa3 application/inc/PodcastFeedView.h --- a/application/inc/PodcastFeedView.h Thu Mar 11 20:53:00 2010 +0100 +++ b/application/inc/PodcastFeedView.h Tue Apr 27 19:26:48 2010 +0100 @@ -39,9 +39,10 @@ static CPodcastFeedView* NewLC(CPodcastModel& aPodcastModel); ~CPodcastFeedView(); void UpdateItemL(TInt aIndex); - void CheckResumeDownload(); + void CheckResumeDownloadL(); void UpdateToolbar(TBool aVisible=ETrue); - + TBool ViewingShows(); + protected: void ConstructL(); CPodcastFeedView(CPodcastModel& aPodcastModel); @@ -95,7 +96,7 @@ void DialogDismissedL(TInt aButtonId); // from MImageHandlerCallback - void ImageOperationCompleteL(TInt aError, TUint aHandle); + void ImageOperationCompleteL(TInt aError, TUint aHandle, CPodcastModel& aPodcastModel); void HandleLongTapEventL( const TPoint& aPenEventLocation, const TPoint& aPenEventScreenLocation); @@ -108,6 +109,7 @@ void HandleExportFeedsL(); void HandleUpdateFeedL(); void GetFeedErrorText(TDes &aErrorMessage, TInt aErrorCode); + void OpmlParsingCompleteL(TInt aError, TUint aNumFeedsImported); private: CPodcastModel& iPodcastModel; @@ -118,6 +120,7 @@ TBool iFirstActivateAfterLaunch; TOpmlState iOpmlState; TBool iViewingShows; + RArray iFeedIdForIconArray; }; #endif // PODCASTFEEDVIEWH diff -r 9569ea080d5a -r 4d230e702aa3 application/inc/PodcastListView.h --- a/application/inc/PodcastListView.h Thu Mar 11 20:53:00 2010 +0100 +++ b/application/inc/PodcastListView.h Tue Apr 27 19:26:48 2010 +0100 @@ -63,7 +63,7 @@ void ScrollToVisible(); void Draw(const TRect& aRect) const; - void SetLongTapDetected(TBool aLongTapDetected); + void SetLongTapDetectedL(TBool aLongTapDetected); CEikFormattedCellListBox * iListbox; @@ -87,7 +87,8 @@ public: ~CPodcastListView(); virtual void UpdateToolbar(TBool aVisible=ETrue) = 0; - + TBool IsVisible(); + protected: void ConstructL(); CPodcastListView(); @@ -133,9 +134,9 @@ void RunAboutDialogL(); void SetEmptyTextL(TInt aResourceId); - void ShowOkMessage(TDesC &aText); - void ShowErrorMessage(TDesC &aText); - TInt ShowQueryMessage(TDesC &aText); + void ShowOkMessageL(TDesC &aText); + void ShowErrorMessageL(TDesC &aText); + TInt ShowQueryMessageL(TDesC &aText); void CloseToolbarExtension(); void ShowWaitDialogL(TDesC &aWaitText); void CloseWaitDialog(); diff -r 9569ea080d5a -r 4d230e702aa3 application/inc/PodcastQueueView.h --- a/application/inc/PodcastQueueView.h Thu Mar 11 20:53:00 2010 +0100 +++ b/application/inc/PodcastQueueView.h Tue Apr 27 19:26:48 2010 +0100 @@ -28,10 +28,9 @@ #include "FeedEngine.h" #include "PodcastModel.h" #include "Podcast.hrh" -#include "PodcastListView.h" +#include "PodcastShowsView.h" -class CPodcastQueueView : public CPodcastListView, public MEikListBoxObserver, - public MFeedEngineObserver, public MShowEngineObserver +class CPodcastQueueView : public CPodcastShowsView { public: static CPodcastQueueView* NewL(CPodcastModel& aPodcastModel); @@ -68,18 +67,8 @@ void UpdateListboxItemsL(); - // From // MEikListBoxObserverClass + // From MEikListBoxObserverClass void HandleListBoxEventL(CEikListBox* aListBox, TListBoxEvent aEventType); - // From showengine observer - void ShowListUpdatedL(); - void ShowDownloadUpdatedL(TInt aBytesOfCurrentDownload, TInt aBytesTotal); - void DownloadQueueUpdatedL(TInt aDownloadingShows, TInt aQueuedShows); - void ShowDownloadFinishedL(TUint aShowUid, TInt aError) ; - // from MFeedEngineObserver - void FeedDownloadStartedL(TFeedState aState,TUint aFeedUid); - void FeedDownloadFinishedL(TFeedState aState,TUint aFeedUid, TInt aError); - void FeedUpdateAllCompleteL(TFeedState aState); - void OpmlParsingComplete(TInt /*aError*/, TUint /*aNumFeedsImported*/) {} /** * Command handling function intended for overriding by sub classes. @@ -88,24 +77,9 @@ */ void HandleCommandL(TInt aCommand); TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType); - - void UpdateFeedUpdateStateL(); - void UpdateShowItemL(TUint aUid, TInt aSizeDownloaded); - void UpdateShowItemDataL(CShowInfo* aShowInfo,TInt aIndex, TInt aSizeDownloaded = KErrNotFound); void DynInitMenuPaneL(TInt aResourceId,CEikMenuPane* aMenuPane); - void FormatShowInfoListBoxItemL(CShowInfo& aShowInfo, TInt aSizeDownloaded = 0); - -private: - void GetShowIcons(CShowInfo* aShowInfo, TInt& aIconIndex); - -private: - - CPodcastModel& iPodcastModel; - TBool iProgressAdded; - TInt iLastImageHandlerError; - TBool iSetTitlebarImage; }; -#endif // PODCASTSHOWSVIEWH +#endif diff -r 9569ea080d5a -r 4d230e702aa3 application/inc/PodcastShowsView.h --- a/application/inc/PodcastShowsView.h Thu Mar 11 20:53:00 2010 +0100 +++ b/application/inc/PodcastShowsView.h Tue Apr 27 19:26:48 2010 +0100 @@ -29,12 +29,9 @@ #include "PodcastModel.h" #include "Podcast.hrh" #include "PodcastListView.h" -#include "Imagehandler.h" - -class CImageHandler; class CPodcastShowsView : public CPodcastListView, public MEikListBoxObserver, - public MFeedEngineObserver, public MShowEngineObserver, public MImageHandlerCallback + public MFeedEngineObserver, public MShowEngineObserver { public: static CPodcastShowsView* NewL(CPodcastModel& aPodcastModel); @@ -100,23 +97,20 @@ void FormatShowInfoListBoxItemL(CShowInfo& aShowInfo, TInt aSizeDownloaded = 0); void HandleLongTapEventL( const TPoint& aPenEventLocation, const TPoint& aPenEventScreenLocation); + void GetShowIcons(CShowInfo* aShowInfo, TInt& aIconIndex); + void CreateIconsL(); private: - void GetShowIcons(CShowInfo* aShowInfo, TInt& aIconIndex); void DisplayShowInfoDialogL(); - /* - * Called by CImageHandler when an image has been loaded. - * @param aError Error code given by the CImageHandler or 0 (zero) if the - * image was loaded successfully. - */ - virtual void ImageOperationCompleteL(TInt aError, TUint aHandle); + void HandleSetShowPlayedL(TBool aPlayed); + void HandleDeleteShowL(); + void ImageOperationCompleteL(TInt /* aError */, TUint /* aHandle */, CPodcastModel& /* aPodcastModel */) {} void HandleSetShowPlayed(TBool aPlayed); void HandleDeleteShow(); void UpdateViewTitleL(); - void CreateIconsL(); void GetShowErrorText(TDes &aErrorMessage, TInt aErrorCode); -private: +protected: CPodcastModel& iPodcastModel; TBool iProgressAdded; diff -r 9569ea080d5a -r 4d230e702aa3 application/sis/podcatcher_udeb.sis Binary file application/sis/podcatcher_udeb.sis has changed diff -r 9569ea080d5a -r 4d230e702aa3 application/sis/podcatcher_udeb_signed.sis Binary file application/sis/podcatcher_udeb_signed.sis has changed diff -r 9569ea080d5a -r 4d230e702aa3 application/sis/podcatcher_urel.sis Binary file application/sis/podcatcher_urel.sis has changed diff -r 9569ea080d5a -r 4d230e702aa3 application/sis/podcatcher_urel_signed.sis Binary file application/sis/podcatcher_urel_signed.sis has changed diff -r 9569ea080d5a -r 4d230e702aa3 application/src/PodcastAppui.cpp --- a/application/src/PodcastAppui.cpp Thu Mar 11 20:53:00 2010 +0100 +++ b/application/src/PodcastAppui.cpp Tue Apr 27 19:26:48 2010 +0100 @@ -29,7 +29,7 @@ #include "debug.h" #include "..\help\podcatcher.hlp.hrh" #include "PodcastApp.h" - +#include #include #include @@ -127,15 +127,35 @@ } case EEikCmdExit: { - TApaTask task(CEikonEnv::Static()->WsSession()); - task.SetWgId(CEikonEnv::Static()->RootWin().Identifier()); - task.SendToBackground(); + // we want to prevent red button from closing podcatcher, and + // instead we send it to background + // however, we want to respect the task manager (fast swap) close + // command, so we check if task manager is the focussed window group + + RWsSession& ws = iEikonEnv->WsSession(); + TInt wgid = ws.GetFocusWindowGroup(); + CApaWindowGroupName* gn = CApaWindowGroupName::NewLC(ws, wgid); + TUid activeAppUid = gn->AppUid(); + CleanupStack::PopAndDestroy(gn); + + const TUid KUidFastSwap = { 0x10207218 }; + if (activeAppUid == KUidFastSwap) + { + // closed by task manager + Exit(); + } + else + { + // red button pressed + TApaTask task(iEikonEnv->WsSession()); + task.SetWgId(iEikonEnv->RootWin().Identifier()); + task.SendToBackground(); + } break; } case EPodcastHelp: - { - CArrayFix* buf = CPodcastAppUi::AppHelpContextL(); - HlpLauncher::LaunchHelpApplicationL(iEikonEnv->WsSession(), buf); + { + HlpLauncher::LaunchHelpApplicationL(iEikonEnv->WsSession(), HelpContextL()); } break; default: @@ -148,11 +168,15 @@ CArrayFixFlat* array = new(ELeave)CArrayFixFlat(1); CleanupStack::PushL(array); - // todo: view detection doesn't seem to work - if (ViewShown(KUidPodcastSearchViewID)) { + + if (iFeedView->IsVisible()) { + array->AppendL(TCoeHelpContext(KUidPodcast,KContextFeedsView)); + } else if (iShowsView->IsVisible()) { + array->AppendL(TCoeHelpContext(KUidPodcast,KContextShowsView)); + } else if (iQueueView->IsVisible()) { + array->AppendL(TCoeHelpContext(KUidPodcast,KContextDownloadQueue)); + } else { array->AppendL(TCoeHelpContext(KUidPodcast,KContextSettings)); - } else { - array->AppendL(TCoeHelpContext(KUidPodcast,KContextApplication)); } CleanupStack::Pop(array); @@ -202,7 +226,7 @@ iNaviPane->PushL(*iNaviTabGroup); iNaviStyle = ENaviTabGroup; - UpdateQueueTab(iPodcastModel->ShowEngine().GetNumDownloadingShows()); + UpdateQueueTabL(iPodcastModel->ShowEngine().GetNumDownloadingShows()); } void CPodcastAppUi::TabChangedL (TInt aIndex) @@ -213,14 +237,25 @@ { TUid newview = TUid::Uid(0); TUid messageUid = TUid::Uid(0); - - if (aIndex == KTabIdFeeds) { - newview = KUidPodcastFeedViewID; - } else if (aIndex == KTabIdQueue) { + if (aIndex == KTabIdFeeds) + { + if (iFeedView->ViewingShows()) + { + newview = KUidPodcastShowsViewID; + } + else + { + newview = KUidPodcastFeedViewID; + } + } + else if (aIndex == KTabIdQueue) + { newview = KUidPodcastQueueViewID; - } else { + } + else + { User::Leave(KErrTooBig); - } + } if(newview.iUid != 0) { @@ -236,12 +271,12 @@ } } -void CPodcastAppUi::HandleTimeout(const CTimeout& /*aId*/, TInt /*aError*/) +void CPodcastAppUi::HandleTimeoutL(const CTimeout& /*aId*/, TInt /*aError*/) { - iFeedView->CheckResumeDownload(); + iFeedView->CheckResumeDownloadL(); } -void CPodcastAppUi::UpdateQueueTab(TInt aQueueLength) +void CPodcastAppUi::UpdateQueueTabL(TInt aQueueLength) { if (iNaviStyle == ENaviTabGroup) { @@ -264,7 +299,7 @@ } } -void CPodcastAppUi::TabLeft() +void CPodcastAppUi::TabLeftL() { if (iNaviStyle == ENaviTabGroup) { @@ -277,7 +312,7 @@ } } -void CPodcastAppUi::TabRight() +void CPodcastAppUi::TabRightL() { if (iNaviStyle == ENaviTabGroup) { @@ -308,3 +343,47 @@ iQueueView->UpdateToolbar(ETrue); iSearchView->UpdateToolbar(ETrue); } + +void CPodcastAppUi::GetErrorTextL(TDes &aErrorMessage, TInt aErrorCode) + { + switch (aErrorCode) + { + case KErrNotFound: + { + HBufC* error = iCoeEnv->AllocReadResourceLC(R_ERROR_INVALID_ADDRESS); + aErrorMessage.Copy(*error); + CleanupStack::PopAndDestroy(error); + } + break; + case KErrDiskFull: + { + HBufC* error = iCoeEnv->AllocReadResourceLC(R_ERROR_DISK_FULL); + aErrorMessage.Copy(*error); + CleanupStack::PopAndDestroy(error); + } + break; + case 404: + { + HBufC* error = iCoeEnv->AllocReadResourceLC(R_ERROR_NOTFOUND); + aErrorMessage.Copy(*error); + CleanupStack::PopAndDestroy(error); + } + break; + default: + { + if (aErrorCode > 200) + { + HBufC* error = iCoeEnv->AllocReadResourceLC(R_ERROR_HTTP); + aErrorMessage.Format(*error, aErrorCode); + CleanupStack::PopAndDestroy(error); + } + else + { + HBufC* error = iCoeEnv->AllocReadResourceLC(R_ERROR_GENERAL); + aErrorMessage.Format(*error, aErrorCode); + CleanupStack::PopAndDestroy(error); + } + } + break; + } + } diff -r 9569ea080d5a -r 4d230e702aa3 application/src/PodcastFeedView.cpp --- a/application/src/PodcastFeedView.cpp Thu Mar 11 20:53:00 2010 +0100 +++ b/application/src/PodcastFeedView.cpp Tue Apr 27 19:26:48 2010 +0100 @@ -29,10 +29,10 @@ #include #include #include -#include -#include #include #include +#include +#include "Podcatcher.pan" const TInt KMaxFeedNameLength = 100; const TInt KMaxUnplayedFeedsLength =64; @@ -105,7 +105,6 @@ // Append the feed icon to icon array icons->AppendL( CGulIcon::NewL( bitmap, mask ) ); CleanupStack::Pop(2); // bitmap, mask - iListContainer->Listbox()->ItemDrawer()->FormattedCellData()->SetIconArrayL( icons ); CleanupStack::Pop(icons); // icons @@ -128,16 +127,16 @@ delete iNeverUpdated; delete iStylusPopupMenu; delete iUpdater; + iFeedIdForIconArray.Close(); } void CPodcastFeedView::UpdateItemL(TInt aIndex) { - _LIT(KPanicCategory, "CPodcastFeedView::UpdateItemL"); - __ASSERT_DEBUG(iListContainer->IsVisible(), User::Panic(KPanicCategory, 0)); - __ASSERT_ALWAYS(iItemIdArray.Count() > aIndex, User::Panic(KPanicCategory, 1)); + __ASSERT_DEBUG(iListContainer->IsVisible(), Panic(EPodcatcherPanicFeedView)); + __ASSERT_ALWAYS(iItemIdArray.Count() > aIndex, Panic(EPodcatcherPanicFeedView)); const RFeedInfoArray& sortedItems = iPodcastModel.FeedEngine().GetSortedFeeds(); - __ASSERT_ALWAYS(sortedItems.Count() > aIndex, User::Panic(KPanicCategory, 2)); + __ASSERT_ALWAYS(sortedItems.Count() > aIndex, Panic(EPodcatcherPanicFeedView)); // Update UID of for the feed at aIndex iItemIdArray[aIndex] = sortedItems[aIndex]->Uid(); @@ -175,27 +174,19 @@ const TDesC8& aCustomMessage) { CPodcastListView::DoActivateL(aPrevViewId, aCustomMessageId, aCustomMessage); - + if (aPrevViewId.iViewUid == KUidPodcastShowsViewID) { // back key from shows view iViewingShows = EFalse; } - if (iViewingShows) - { - // go to shows view - AppUi()->ActivateLocalViewL(KUidPodcastShowsViewID, TUid::Uid(0), KNullDesC8()); - } - else - { UpdateListboxItemsL(); UpdateToolbar(); - if (iFirstActivateAfterLaunch) - { - iFirstActivateAfterLaunch = EFalse; - } + if (iFirstActivateAfterLaunch) + { + iFirstActivateAfterLaunch = EFalse; } } @@ -212,19 +203,12 @@ switch(aEventType) { - case EEventPenDownOnItem: - DP("PEN DOWN"); - break; - -//#ifndef SYMBIAN1_UI +#ifndef SYMBIAN1_UI case EEventItemClicked: - DP("SINGLE TAP"); - break; -//#endif +#endif case EEventEnterKeyPressed: case EEventItemDoubleClicked: case EEventItemActioned: - DP("DOUBLE TAP"); { const RFeedInfoArray* sortedItems = NULL; TInt index = iListContainer->Listbox()->CurrentItemIndex(); @@ -232,7 +216,6 @@ if(index >= 0 && index < sortedItems->Count()) { - iPodcastModel.ActiveShowList().Reset(); iPodcastModel.SetActiveFeedInfo((*sortedItems)[index]); iViewingShows = ETrue; AppUi()->ActivateLocalViewL(KUidPodcastShowsViewID, TUid::Uid(0), KNullDesC8()); @@ -269,7 +252,7 @@ { TBuf message; iEikonEnv->ReadResourceL(message, R_PODCAST_CONNECTION_ERROR); - ShowErrorMessage(message); + ShowErrorMessageL(message); } } break; @@ -344,7 +327,8 @@ } else { - iPodcastModel.FeedEngine().GetStatsByFeed(aFeedInfo.Uid(), showCount, unplayedCount); + // we will get a leave if there are no shows for this feed, for instance, which is fine + TRAP_IGNORE(iPodcastModel.FeedEngine().GetStatsByFeedL(aFeedInfo.Uid(), showCount, unplayedCount)); if (unplayedCount) { unplayedShows.Format(*iFeedsFormat, unplayedCount); @@ -376,48 +360,42 @@ if(aFeedInfo.LastError() != KErrNone) { GetFeedErrorText(unplayedShows, aFeedInfo.LastError()); + updatedDate.Zero(); } } CArrayPtr* icons = iListContainer->Listbox()->ItemDrawer()->FormattedCellData()->IconArray(); - - if (aFeedInfo.FeedIconIndex() != -1) { - iconIndex = aFeedInfo.FeedIconIndex(); - } else { - if(aFeedInfo.FeedIcon() != NULL && - aFeedInfo.FeedIcon()->SizeInPixels().iHeight > 0 && - aFeedInfo.FeedIcon()->SizeInPixels().iWidth > 0) - { - // Hopefully temporary haxx to prevent double delete. I would prefer if - // this could be solved with a little better design. - CFbsBitmap* bmpCopy = new (ELeave) CFbsBitmap; - CleanupStack::PushL(bmpCopy); - bmpCopy->Duplicate(aFeedInfo.FeedIcon()->Handle()); - icons->AppendL( CGulIcon::NewL(bmpCopy, NULL)); - CleanupStack::Pop(bmpCopy); - iconIndex = icons->Count()-1; - aFeedInfo.SetFeedIconIndex(iconIndex); - } - else { - if(BaflUtils::FileExists(iEikonEnv->FsSession(), aFeedInfo.ImageFileName())) - { - // If this fails, no reason to worry - TRAP_IGNORE(iPodcastModel.ImageHandler().LoadFileAndScaleL(aFeedInfo.FeedIcon(), aFeedInfo.ImageFileName(), TSize(64,56), *this, aFeedInfo.Uid())); - } - } - } - - if (unplayedShows.Length() > 0) { + iconIndex = iFeedIdForIconArray.Find(aFeedInfo.Uid()); + if(iconIndex == KErrNotFound && aFeedInfo.FeedIcon() != NULL && aFeedInfo.ImageFileName().Length() > 0 && + aFeedInfo.FeedIcon()->SizeInPixels().iHeight > 0 && + aFeedInfo.FeedIcon()->SizeInPixels().iWidth > 0) + { + // Hopefully temporary haxx to prevent double delete. I would prefer if + // this could be solved with a little better design. + CFbsBitmap* bmpCopy = new (ELeave) CFbsBitmap; + CleanupStack::PushL(bmpCopy); + bmpCopy->Duplicate(aFeedInfo.FeedIcon()->Handle()); + icons->AppendL( CGulIcon::NewL(bmpCopy, NULL)); + iFeedIdForIconArray.Append(aFeedInfo.Uid()); + CleanupStack::Pop(bmpCopy); + iconIndex = icons->Count()-1; + } + else + { + iconIndex++; + } + + if (unplayedShows.Length() > 0 && updatedDate.Length() > 0) { unplayedShows.Insert(0,_L(", ")); } iListboxFormatbuffer.Format(KFeedFormat(), iconIndex, &(aFeedInfo.Title()), &updatedDate, &unplayedShows); } -void CPodcastFeedView::ImageOperationCompleteL(TInt aError, TUint aHandle) +void CPodcastFeedView::ImageOperationCompleteL(TInt aError, TUint aHandle, CPodcastModel& /*aPodcastModel*/) { if (aError == KErrNone) { - UpdateFeedInfoStatusL(aHandle, EFalse); - } + UpdateFeedInfoStatusL(aHandle, EFalse); + } } void CPodcastFeedView::UpdateFeedInfoDataL(CFeedInfo* aFeedInfo, TInt aIndex, TBool aIsUpdating ) @@ -552,7 +530,7 @@ { TBuf message; iEikonEnv->ReadResourceL(message, R_EXIT_SHOWS_DOWNLOADING); - if(ShowQueryMessage(message)) + if(ShowQueryMessageL(message)) { // pass it on to AppUi, which will exit for us CPodcastListView::HandleCommandL(aCommand); @@ -570,7 +548,7 @@ break; } - iListContainer->SetLongTapDetected(EFalse); // in case we got here by long tapping + iListContainer->SetLongTapDetectedL(EFalse); // in case we got here by long tapping UpdateToolbar(); } @@ -631,11 +609,10 @@ // ask if users wants to update it now TBuf message; iEikonEnv->ReadResourceL(message, R_ADD_FEED_SUCCESS); - if(ShowQueryMessage(message)) + if(ShowQueryMessageL(message)) { CFeedInfo *info = iPodcastModel.FeedEngine().GetFeedInfoByUid(newFeedInfo->Uid()); - iPodcastModel.ActiveShowList().Reset(); iPodcastModel.SetActiveFeedInfo(info); AppUi()->ActivateLocalViewL(KUidPodcastShowsViewID, TUid::Uid(0), KNullDesC8()); iPodcastModel.FeedEngine().UpdateFeedL(newFeedInfo->Uid()); @@ -645,7 +622,7 @@ { TBuf message; iEikonEnv->ReadResourceL(message, R_ADD_FEED_EXISTS); - ShowErrorMessage(message); + ShowErrorMessageL(message); } CleanupStack::PopAndDestroy(newFeedInfo); @@ -676,7 +653,7 @@ iEikonEnv->ReadResourceL(dlgMessage, R_ADD_FEED_REPLACE); // Ask the user if it is OK to remove all shows - if ( ShowQueryMessage(dlgMessage)) + if ( ShowQueryMessageL(dlgMessage)) { PodcastUtils::FixProtocolsL(url); @@ -703,7 +680,7 @@ // the feed existed. Object deleted in AddFeed. TBuf dlgMessage; iEikonEnv->ReadResourceL(dlgMessage, R_ADD_FEED_EXISTS); - ShowErrorMessage(dlgMessage); + ShowErrorMessageL(dlgMessage); } CleanupStack::PopAndDestroy(temp); } @@ -713,7 +690,7 @@ { info->SetTitleL(title); info->SetCustomTitle(); - iPodcastModel.FeedEngine().UpdateFeed(info); + iPodcastModel.FeedEngine().UpdateFeedInfoL(info); UpdateListboxItemsL(); } } @@ -734,7 +711,7 @@ TBuf message; iEikonEnv->ReadResourceL(templ, R_PODCAST_REMOVE_FEED_PROMPT); message.Format(templ, &info->Title()); - if(ShowQueryMessage(message)) + if(ShowQueryMessageL(message)) { iPodcastModel.FeedEngine().RemoveFeedL(iItemIdArray[index]); iItemArray->Delete(index); @@ -760,117 +737,75 @@ void CPodcastFeedView::HandleImportFeedsL() { - CAknMemorySelectionDialog* memDlg = - CAknMemorySelectionDialog::NewL(ECFDDialogTypeNormal, ETrue); - CleanupStack::PushL(memDlg); - CAknMemorySelectionDialog::TMemory memory = - CAknMemorySelectionDialog::EPhoneMemory; - - if (memDlg->ExecuteL(memory)) - { - TFileName importName; + TFileName fileName; + fileName.Zero(); + TFileName startFolder; + startFolder.Zero(); + TInt types = AknCommonDialogsDynMem::EMemoryTypePhone | AknCommonDialogsDynMem::EMemoryTypeMMC |AknCommonDialogsDynMem::EMemoryTypeInternalMassStorage| AknCommonDialogsDynMem::EMemoryTypeRemote; - if (memory==CAknMemorySelectionDialog::EMemoryCard) - { - importName = PathInfo:: MemoryCardRootPath(); - } - else + HBufC *title = iCoeEnv->AllocReadResourceLC(R_PODCAST_SELECT_OPML); + if (AknCommonDialogsDynMem::RunSelectDlgLD (types, fileName, + startFolder, NULL, NULL, *title)) { - importName = PathInfo:: PhoneMemoryRootPath(); - } - - CAknFileSelectionDialog* dlg = CAknFileSelectionDialog::NewL(ECFDDialogTypeNormal, R_PODCAST_IMPORT_PODCAST); - CleanupStack::PushL(dlg); + + if(fileName.Length()>0) + { + HBufC *waitText = iEikonEnv->AllocReadResourceLC(R_IMPORTING); + iOpmlState = EOpmlImporting; + ShowWaitDialogL(*waitText); + CleanupStack::PopAndDestroy(waitText); - dlg->SetDefaultFolderL(importName); - - if(dlg->ExecuteL(importName)) - { - if(importName.Length()>0) - { - HBufC *waitText = iEikonEnv->AllocReadResourceLC(R_IMPORTING); - iOpmlState = EOpmlImporting; - ShowWaitDialogL(*waitText); - CleanupStack::PopAndDestroy(waitText); + TRAPD(err, iPodcastModel.FeedEngine().ImportFeedsL(fileName)); + + if (err != KErrNone) { + TBuf message; + iEikonEnv->ReadResourceL(message, R_IMPORT_FEED_FAILURE); + ShowErrorMessageL(message); + } + } - TRAPD(err, iPodcastModel.FeedEngine().ImportFeedsL(importName)); - - if (err != KErrNone) { - TBuf message; - iEikonEnv->ReadResourceL(message, R_IMPORT_FEED_FAILURE); - ShowErrorMessage(message); - } - } - - } - CleanupStack::PopAndDestroy(dlg); } - CleanupStack::PopAndDestroy(memDlg); + CleanupStack::PopAndDestroy(title); } void CPodcastFeedView::HandleExportFeedsL() { - CAknMemorySelectionDialog* memDlg = - CAknMemorySelectionDialog::NewL(ECFDDialogTypeSave, ETrue); - CleanupStack::PushL(memDlg); - CAknMemorySelectionDialog::TMemory memory = - CAknMemorySelectionDialog::EPhoneMemory; - - if (memDlg->ExecuteL(memory)) + TFileName fileName; + fileName.Copy(_L("feeds.opml")); + TFileName startFolder; + startFolder.Zero(); + TInt types = AknCommonDialogsDynMem::EMemoryTypePhone | AknCommonDialogsDynMem::EMemoryTypeMMC |AknCommonDialogsDynMem::EMemoryTypeInternalMassStorage| AknCommonDialogsDynMem::EMemoryTypeRemote; + + HBufC *title = iCoeEnv->AllocReadResourceLC(R_PODCAST_SELECT_FOLDER); + if (AknCommonDialogsDynMem::RunSaveDlgLD (types, fileName, + startFolder, NULL, NULL, *title)) { - TFileName pathName; - - if (memory==CAknMemorySelectionDialog::EMemoryCard) - { - pathName = PathInfo::MemoryCardRootPath(); - } - else - { - pathName = PathInfo::PhoneMemoryRootPath(); - } - - CAknFileSelectionDialog* dlg = CAknFileSelectionDialog::NewL(ECFDDialogTypeSave, R_PODCAST_EXPORT_FEEDS); - CleanupStack::PushL(dlg); + TFileName temp; + TRAPD(err, iPodcastModel.FeedEngine().ExportFeedsL(temp)); + BaflUtils::CopyFile(iEikonEnv->FsSession(), temp, fileName); + BaflUtils::DeleteFile(iEikonEnv->FsSession(),temp); + if (err == KErrNone) + { + UpdateListboxItemsL(); + TInt numFeeds = iPodcastModel.FeedEngine().GetSortedFeeds().Count(); - if(dlg->ExecuteL(pathName)) - { - CAknFileNamePromptDialog *fileDlg = CAknFileNamePromptDialog::NewL(R_PODCAST_FILENAME_PROMPT_DIALOG); - CleanupStack::PushL(fileDlg); - fileDlg->SetPathL(pathName); - TFileName fileName; - if (fileDlg->ExecuteL(fileName) && fileName.Length() > 0) + TBuf message; + TBuf templ; + iEikonEnv->ReadResourceL(templ, R_EXPORT_FEED_SUCCESS); + message.Format(templ, numFeeds); + ShowOkMessageL(message); + } + else { - pathName.Append(fileName); - TFileName temp; - TRAPD(err, iPodcastModel.FeedEngine().ExportFeedsL(temp)); - BaflUtils::CopyFile(iEikonEnv->FsSession(), temp, pathName); - BaflUtils::DeleteFile(iEikonEnv->FsSession(),temp); - if (err == KErrNone) - { - UpdateListboxItemsL(); - TInt numFeeds = iPodcastModel.FeedEngine().GetSortedFeeds().Count(); - - TBuf message; - TBuf templ; - iEikonEnv->ReadResourceL(templ, R_EXPORT_FEED_SUCCESS); - message.Format(templ, numFeeds); - ShowOkMessage(message); - } - else - { - TBuf message; - iEikonEnv->ReadResourceL(message, R_EXPORT_FEED_FAILURE); - ShowErrorMessage(message); - } + TBuf message; + iEikonEnv->ReadResourceL(message, R_EXPORT_FEED_FAILURE); + ShowErrorMessageL(message); } - CleanupStack::PopAndDestroy(fileDlg); - } - CleanupStack::PopAndDestroy(dlg); - } - CleanupStack::PopAndDestroy(memDlg); + } + CleanupStack::PopAndDestroy(title); } -void CPodcastFeedView::CheckResumeDownload() +void CPodcastFeedView::CheckResumeDownloadL() { // if there are shows queued for downloading, ask if we should resume now RShowInfoArray showsDownloading; @@ -881,7 +816,7 @@ TBuf msg; iEikonEnv->ReadResourceL(msg, R_PODCAST_ENABLE_DOWNLOADS_PROMPT); - if (ShowQueryMessage(msg)) + if (ShowQueryMessageL(msg)) { // need to suspend downloads before ResumeDownloadL will work :) iPodcastModel.SettingsEngine().SetDownloadSuspended(ETrue); @@ -901,6 +836,11 @@ void CPodcastFeedView::OpmlParsingComplete(TInt aError, TUint aNumFeedsImported) { + TRAP_IGNORE(OpmlParsingCompleteL(aError, aNumFeedsImported)); + } + +void CPodcastFeedView::OpmlParsingCompleteL(TInt aError, TUint aNumFeedsImported) + { DP("CPodcastFeedView::OpmlParsingComplete BEGIN"); switch (aError) @@ -909,7 +849,7 @@ { TBuf message; iEikonEnv->ReadResourceL(message, R_PODCAST_CONNECTION_ERROR); - ShowErrorMessage(message); + ShowErrorMessageL(message); } break; case KErrNone: @@ -929,7 +869,7 @@ iEikonEnv->ReadResourceL(templ, R_IMPORT_FEED_SUCCESS); message.Format(templ, aNumFeedsImported); - if(ShowQueryMessage(message)) + if(ShowQueryMessageL(message)) { HandleCommandL(EPodcastUpdateAllFeeds); } @@ -937,11 +877,12 @@ break; case EOpmlSearching: delete iWaitDialog; + iWaitDialog = NULL; if (iPodcastModel.FeedEngine().GetSearchResults().Count() == 0) { TBuf message; iEikonEnv->ReadResourceL(message, R_SEARCH_NORESULTS); - ShowErrorMessage(message); + ShowErrorMessageL(message); } else { @@ -964,18 +905,14 @@ void CPodcastFeedView::GetFeedErrorText(TDes &aErrorMessage, TInt aErrorCode) { - iEikonEnv->GetErrorText(aErrorMessage, aErrorCode); + TRAP_IGNORE(((CPodcastAppUi*)AppUi())->GetErrorTextL(aErrorMessage,aErrorCode)); } void CPodcastFeedView::HandleLongTapEventL( const TPoint& aPenEventLocation, const TPoint& /* aPenEventScreenLocation */) { DP("CPodcastListView::HandleLongTapEventL BEGIN"); - if (iUpdatingAllRunning) { - return; // we don't allow feed manipulation while update is running - } - - iListContainer->SetLongTapDetected(ETrue); + iListContainer->SetLongTapDetectedL(ETrue); const TInt KListboxDefaultHeight = 19; // for some reason it returns 19 for an empty listbox in S^1 TInt lbHeight = iListContainer->Listbox()->CalcHeightBasedOnNumOfItems( @@ -988,3 +925,8 @@ } DP("CPodcastListView::HandleLongTapEventL END"); } + +TBool CPodcastFeedView::ViewingShows() + { + return iViewingShows; + } diff -r 9569ea080d5a -r 4d230e702aa3 application/src/PodcastFeedViewUpdater.cpp --- a/application/src/PodcastFeedViewUpdater.cpp Thu Mar 11 20:53:00 2010 +0100 +++ b/application/src/PodcastFeedViewUpdater.cpp Tue Apr 27 19:26:48 2010 +0100 @@ -65,8 +65,6 @@ void CPodcastFeedViewUpdater::RunL() { - _LIT(KPanicCategory, "CPodcastFeedViewUpdater::RunL"); - __ASSERT_DEBUG(iNextItem < iNbrItems, User::Panic(KPanicCategory, 0)); iPodcastFeedView.UpdateItemL(iNextItem++); if (iNextItem < iNbrItems) { diff -r 9569ea080d5a -r 4d230e702aa3 application/src/PodcastListView.cpp --- a/application/src/PodcastListView.cpp Thu Mar 11 20:53:00 2010 +0100 +++ b/application/src/PodcastListView.cpp Tue Apr 27 19:26:48 2010 +0100 @@ -29,6 +29,7 @@ #include #include #include +#include const TInt KDefaultGran = 5; @@ -100,7 +101,7 @@ } } -void CPodcastListContainer::SetLongTapDetected(TBool aLongTapDetected) +void CPodcastListContainer::SetLongTapDetectedL(TBool aLongTapDetected) { iLongTapDetected = aLongTapDetected; @@ -262,6 +263,11 @@ AppUi()->AddToStackL(*this, iListContainer); iListContainer->MakeVisible(ETrue); } + + CAknTitlePane* titlePane = static_cast + ( StatusPane()->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) ); + titlePane->SetTextToDefaultL(); + DP("CPodcastListView::DoActivateL() END"); } @@ -296,10 +302,9 @@ case EAknSoftkeyBack: { AppUi()->ActivateViewL(iPreviousView); - if (iPreviousView.iViewUid == KUidPodcastFeedViewID) { - ((CPodcastAppUi*)AppUi())->SetActiveTab(KTabIdFeeds); + ((CPodcastAppUi*)AppUi())->SetActiveTab(KTabIdFeeds); } - }break; + break; case EPodcastSettings: AppUi()->ActivateLocalViewL(KUidPodcastSettingsViewID); break; @@ -311,6 +316,10 @@ } } +TBool CPodcastListView::IsVisible() + { + return iListContainer->IsVisible(); + } void CPodcastListView::RunAboutDialogL() { @@ -325,7 +334,7 @@ CleanupStack::PopAndDestroy(emptyText); } -void CPodcastListView::ShowOkMessage(TDesC &aText) +void CPodcastListView::ShowOkMessageL(TDesC &aText) { CAknNoteDialog* dlg= new(ELeave) CAknNoteDialog(); CleanupStack::PushL(dlg); @@ -334,7 +343,7 @@ dlg->ExecuteLD(R_MESSAGEDLG_OK); } -void CPodcastListView::ShowErrorMessage(TDesC &aText) +void CPodcastListView::ShowErrorMessageL(TDesC &aText) { CAknNoteDialog* dlg= new(ELeave) CAknNoteDialog(); CleanupStack::PushL(dlg); @@ -343,7 +352,7 @@ dlg->ExecuteLD(R_ERRORDLG_OK); } -TInt CPodcastListView::ShowQueryMessage(TDesC &aText) +TInt CPodcastListView::ShowQueryMessageL(TDesC &aText) { CAknQueryDialog* dlg= new(ELeave) CAknQueryDialog(); @@ -375,16 +384,17 @@ void CPodcastListView::HandleLongTapEventL( const TPoint& aPenEventLocation, const TPoint& /* aPenEventScreenLocation */) { DP("CPodcastListView::HandleLongTapEventL BEGIN"); - iListContainer->SetLongTapDetected(ETrue); const TInt KListboxDefaultHeight = 19; // for some reason it returns 19 for an empty listbox in S^1 TInt lbHeight = iListContainer->Listbox()->CalcHeightBasedOnNumOfItems( iListContainer->Listbox()->Model()->NumberOfItems()) - KListboxDefaultHeight; if(iStylusPopupMenu && aPenEventLocation.iY < lbHeight) { + iListContainer->SetLongTapDetectedL(ETrue); iStylusPopupMenu->ShowMenu(); iStylusPopupMenu->SetPosition(aPenEventLocation); } + DP("CPodcastListView::HandleLongTapEventL END"); } @@ -421,10 +431,10 @@ switch (aKeyEvent.iCode) { case EKeyRightArrow: - ((CPodcastAppUi*)AppUi())->TabRight(); + ((CPodcastAppUi*)AppUi())->TabRightL(); return EKeyWasConsumed; case EKeyLeftArrow: - ((CPodcastAppUi*)AppUi())->TabLeft(); + ((CPodcastAppUi*)AppUi())->TabLeftL(); return EKeyWasConsumed; } } diff -r 9569ea080d5a -r 4d230e702aa3 application/src/PodcastQueueView.cpp --- a/application/src/PodcastQueueView.cpp Thu Mar 11 20:53:00 2010 +0100 +++ b/application/src/PodcastQueueView.cpp Tue Apr 27 19:26:48 2010 +0100 @@ -25,56 +25,15 @@ #include "imagehandler.h" #include "PodcastShowsView.h" -#include #include #include #include #include #include #include -#include "Podcast.hrh" #define KMaxMessageLength 200 -#define KPodcastImageWidth 160 -#define KPodcastImageHeight 120 -#define KPodcastDialogOffset 2 - -#define KOneHundredPercent 100 - -const TInt KSizeBufLen = 64; -const TInt KDefaultGran = 5; -_LIT(KSizeDownloadingOf, "%.1f/%.1f MB"); -_LIT(KShowsSizeFormatS60, "%.1f MB"); - -_LIT(KShowFormat, "%d\t%S\t%S %S\t"); -_LIT(KShowErrorFormat, "%d\t%S\t%S\t"); -_LIT(KShowQueueFormat, "%d\t%S\t%S%S\t"); - - -// these must correspond with TShowsIconIndex - -const TUint KShowIconArrayIds[] = - { - EMbmPodcastAudio, - EMbmPodcastAudio_mask, - EMbmPodcastAudio_new, - EMbmPodcastAudio_new_mask, - EMbmPodcastAudio_queued, - EMbmPodcastAudio_queued_mask, - EMbmPodcastAudio_downloading, - EMbmPodcastAudio_downloading_mask, - EMbmPodcastAudio_downloaded, - EMbmPodcastAudio_downloaded_mask, - EMbmPodcastAudio_downloaded_new, - EMbmPodcastAudio_downloaded_new_mask, - EMbmPodcastAudio_failed, - EMbmPodcastAudio_failed_mask, - EMbmPodcastAudio_suspended, - EMbmPodcastAudio_suspended_mask, - 0, - 0 - }; CPodcastQueueView* CPodcastQueueView::NewL(CPodcastModel& aPodcastModel) { @@ -92,7 +51,7 @@ } CPodcastQueueView::CPodcastQueueView(CPodcastModel& aPodcastModel) : - iPodcastModel(aPodcastModel) + CPodcastShowsView(aPodcastModel) { } @@ -100,39 +59,23 @@ { BaseConstructL(R_PODCAST_QUEUEVIEW); CPodcastListView::ConstructL(); - CArrayPtr< CGulIcon>* icons = new(ELeave) CArrayPtrFlat< CGulIcon>(1); - CleanupStack::PushL(icons); - TInt pos = 0; - while (KShowIconArrayIds[pos] > 0) - { - // Load the bitmap for play icon - CFbsBitmap* bitmap= NULL;//iEikonEnv->CreateBitmapL( _L("*"), KIconArrayIds[pos]); - CFbsBitmap* mask= NULL;////iEikonEnv->CreateBitmapL( _L("*"), KIconArrayIds[pos+1] ); - AknIconUtils::CreateIconL(bitmap, - mask, - iEikonEnv->EikAppUi()->Application()->BitmapStoreName(), - KShowIconArrayIds[pos], - KShowIconArrayIds[pos+1]); - CleanupStack::PushL(bitmap); - // Load the mask for play icon - CleanupStack::PushL(mask); - // Append the play icon to icon array - icons->AppendL(CGulIcon::NewL(bitmap, mask) ); - CleanupStack::Pop(2); // bitmap, mask - pos+=2; - } - iListContainer->Listbox()->ItemDrawer()->FormattedCellData()->SetIconArrayL(icons); - CleanupStack::Pop(icons); // icons + + CreateIconsL(); + iListContainer->Listbox()->SetListBoxObserver(this); iPodcastModel.FeedEngine().AddObserver(this); iPodcastModel.ShowEngine().AddObserver(this); + + // no popup options apply to S^1 +#ifndef SYMBIAN1_UI iStylusPopupMenu = CAknStylusPopUpMenu::NewL( this , TPoint(0,0)); TResourceReader reader; iCoeEnv->CreateResourceReaderLC(reader,R_QUEUEVIEW_POPUP_MENU); iStylusPopupMenu->ConstructFromResourceL(reader); CleanupStack::PopAndDestroy(); +#endif SetEmptyTextL(R_PODCAST_EMPTY_QUEUE); } @@ -151,21 +94,6 @@ if (activeShow != NULL) { DP1("aKeyEvent.iCode=%d", aKeyEvent.iCode); switch (aKeyEvent.iCode) { - case 117: - case '*': - case EKeySpace: - if (activeShow->PlayState() == EPlayed) { - HandleCommandL(EPodcastMarkAsUnplayed); - } else { - HandleCommandL(EPodcastMarkAsPlayed); - } - break; - case 106: - case '#': - if (activeShow->DownloadState() == ENotDownloaded) { - HandleCommandL(EPodcastDownloadShow); - } - break; case EKeyBackspace: case EKeyDelete: HandleCommandL(EPodcastRemoveDownload); @@ -200,7 +128,7 @@ DP("CPodcastQueueView::DoActivateL BEGIN"); CPodcastListView::DoActivateL(aPrevViewId, aCustomMessageId, aCustomMessage); - iPreviousView = TVwsViewId(KUidPodcast, KUidPodcastFeedViewID); + iPreviousView = aPrevViewId; UpdateFeedUpdateStateL(); UpdateToolbar(); @@ -212,78 +140,6 @@ CPodcastListView::DoDeactivate(); } -// Engine callback when new shows are available -void CPodcastQueueView::ShowListUpdatedL() - { - UpdateListboxItemsL(); - } - -void CPodcastQueueView::ShowDownloadUpdatedL(TInt aBytesOfCurrentDownload, TInt /*aBytesTotal*/) - { - if (!iListContainer->IsVisible()) - { - return; - } - - CShowInfo *info = iPodcastModel.ShowEngine().ShowDownloading(); - if (info) - { - UpdateShowItemL(info->Uid(), aBytesOfCurrentDownload); - } - } - -void CPodcastQueueView::ShowDownloadFinishedL(TUint /*aShowUid*/, TInt aError) - { - if (iListContainer->IsVisible()) - { - - iProgressAdded = EFalse; - - iPodcastModel.GetShowsDownloadingL(); - UpdateListboxItemsL(); - UpdateToolbar(); - - switch(aError) - { - case KErrCouldNotConnect: - { - TBuf message; - iEikonEnv->ReadResourceL(message, R_PODCAST_CONNECTION_ERROR); - ShowErrorMessage(message); - } - break; - default: // Do nothing - break; - } - } - } - - -void CPodcastQueueView::FeedDownloadStartedL(TFeedState /*aState*/, TUint aFeedUid) - { - // TODO make use of the fact that we know that the feed download is - // started instead of checking feed engine states in UpdateFeedUpdateStateL. - if (iPodcastModel.ActiveFeedInfo() != NULL - && iPodcastModel.ActiveFeedInfo()->Uid() == aFeedUid) - { - UpdateFeedUpdateStateL(); - UpdateToolbar(); - } - } - -void CPodcastQueueView::FeedDownloadFinishedL(TFeedState /*aState*/, TUint aFeedUid, TInt /*aError*/) - { - DP("CPodcastQueueView::FeedDownloadFinishedL BEGIN"); - // TODO make use of the fact that we know that the feed download is - // finished instead of checking feed engine states in UpdateFeedUpdateStateL. - if (iPodcastModel.ActiveFeedInfo() != NULL - && iPodcastModel.ActiveFeedInfo()->Uid() == aFeedUid) - { - UpdateFeedUpdateStateL(); - } - DP("CPodcastQueueView::FeedDownloadFinishedL END"); - } - void CPodcastQueueView::HandleListBoxEventL(CEikListBox* /*aListBox*/, TListBoxEvent aEventType) { @@ -302,137 +158,6 @@ UpdateToolbar(); } -void CPodcastQueueView::GetShowIcons(CShowInfo* aShowInfo, TInt& aIconIndex) - { - TBool dlStop = iPodcastModel.SettingsEngine().DownloadSuspended(); - - switch (aShowInfo->DownloadState()) - { - case EDownloaded: - if (aShowInfo->PlayState() == ENeverPlayed) { - aIconIndex = EDownloadedNewShowIcon; - } else { - aIconIndex = EDownloadedShowIcon; - } - break; - case ENotDownloaded: - if (aShowInfo->PlayState() == ENeverPlayed) { - aIconIndex = ENewShowIcon; - } else { - aIconIndex = EShowIcon; - } - break; - case EQueued: - aIconIndex = dlStop ? ESuspendedShowIcon : EQuedShowIcon; - break; - case EDownloading: - aIconIndex = dlStop ? ESuspendedShowIcon : EDownloadingShowIcon; - break; - case EFailedDownload: - aIconIndex = EFailedShowIcon; - break; - } - } - -void CPodcastQueueView::UpdateFeedUpdateStateL() - { - TBool listboxDimmed = EFalse; - - if (iPodcastModel.FeedEngine().ClientState() != EIdle && iPodcastModel.ActiveFeedInfo() - != NULL && iPodcastModel.FeedEngine().ActiveClientUid() == iPodcastModel.ActiveFeedInfo()->Uid()) - { - listboxDimmed = ETrue; - } - - if ((iListContainer->Listbox()->IsDimmed() && !listboxDimmed) || (!iListContainer->Listbox()->IsDimmed() && listboxDimmed)) - { - iListContainer->Listbox()->SetDimmed(listboxDimmed); - } - UpdateListboxItemsL(); - UpdateToolbar(); - } - -void CPodcastQueueView::FormatShowInfoListBoxItemL(CShowInfo& aShowInfo, TInt aSizeDownloaded) - { - TBuf<32> infoSize; - TInt iconIndex = 0; - TBuf showDate; - GetShowIcons(&aShowInfo, iconIndex); - - if(aSizeDownloaded > 0) - { - if (aShowInfo.ShowSize() > 0) - { - infoSize.Format(KSizeDownloadingOf(), ((float) aSizeDownloaded / (float) KSizeMb), - ((float)aShowInfo.ShowSize() / (float)KSizeMb)); - } - else - { - infoSize.Format(KShowsSizeFormatS60(), (float)aSizeDownloaded / (float)KSizeMb); - } - } - else if (aShowInfo.ShowSize() > 0) - { - infoSize.Format(KShowsSizeFormatS60(), (float)aShowInfo.ShowSize() / (float)KSizeMb); - } - else { - infoSize = KNullDesC(); - } - - if (aShowInfo.PubDate().Int64() == 0) - { - showDate = KNullDesC(); - } - else - { - aShowInfo.PubDate().FormatL(showDate, KDateFormatShort()); - } - - if(aShowInfo.LastError() != KErrNone) - { - TBuf errorBuffer; - iEikonEnv->GetErrorText(errorBuffer, aShowInfo.LastError()); - iListboxFormatbuffer.Format(KShowErrorFormat(), iconIndex, &aShowInfo.Title(), &errorBuffer); - } - else - { - if (infoSize.Length() > 0) { - infoSize.Insert(0,_L(", ")); - } - - iListboxFormatbuffer.Format(KShowQueueFormat(), iconIndex, &aShowInfo.Title(), &showDate, &infoSize); - } - } - -void CPodcastQueueView::UpdateShowItemDataL(CShowInfo* aShowInfo,TInt aIndex, TInt aSizeDownloaded) -{ - FormatShowInfoListBoxItemL(*aShowInfo, aSizeDownloaded); - iItemArray->Delete(aIndex); - if(aIndex>= iItemArray->MdcaCount()) - { - iItemArray->AppendL(iListboxFormatbuffer); - } - else - { - iItemArray->InsertL(aIndex, iListboxFormatbuffer); - } -} - -void CPodcastQueueView::UpdateShowItemL(TUint aUid, TInt aSizeDownloaded) -{ - RShowInfoArray& array = iPodcastModel.ActiveShowList(); - - for (int i=0;iUid() == aUid) { - UpdateShowItemDataL(array[i], i, aSizeDownloaded); - if (iListContainer->Listbox()->TopItemIndex() <= i && - iListContainer->Listbox()->BottomItemIndex() >= i) { - iListContainer->Listbox()->DrawItem(i); - } - } - } -} - void CPodcastQueueView::UpdateListboxItemsL() { if (iListContainer->IsVisible()) @@ -517,9 +242,9 @@ TBuf msg; iEikonEnv->ReadResourceL(msg, R_CLEAR_QUERY); - if(ShowQueryMessage(msg)) + if(ShowQueryMessageL(msg)) { - iPodcastModel.ShowEngine().RemoveAllDownloads(); + iPodcastModel.ShowEngine().RemoveAllDownloadsL(); UpdateListboxItemsL(); } } @@ -529,17 +254,7 @@ TInt index = iListContainer->Listbox()->CurrentItemIndex(); if (index >= 0 && index < iPodcastModel.ActiveShowList().Count()) { - if (iPodcastModel.ShowEngine().RemoveDownloadL(iPodcastModel.ActiveShowList()[index]->Uid())) - { - iItemArray->Delete(index); - iItemIdArray.Remove(index); - iListContainer->Listbox()->HandleItemRemovalL(); - iListContainer->Listbox()->SetCurrentItemIndex(index - 1 > 0 ? index - 1 : 0); - iListContainer->Listbox()->DrawNow(); - - delete iPodcastModel.ActiveShowList()[index]; - iPodcastModel.ActiveShowList().Remove(index); - } + TRAP_IGNORE(iPodcastModel.ShowEngine().RemoveDownloadL(iPodcastModel.ActiveShowList()[index]->Uid())); } } break; @@ -559,6 +274,7 @@ CPodcastListView::HandleCommandL(aCommand); break; } + iListContainer->SetLongTapDetectedL(EFalse); // in case we got here by long tapping UpdateToolbar(); } @@ -584,19 +300,6 @@ toolbar->SetItemDimmed(EPodcastRemoveAllDownloads, itemCnt == 0, ETrue); toolbar->HideItem(EPodcastSuspendDownloads,iPodcastModel.SettingsEngine().DownloadSuspended(), ETrue); toolbar->HideItem(EPodcastResumeDownloads,!iPodcastModel.SettingsEngine().DownloadSuspended(), ETrue); -#ifdef SYMBIAN1_UI - toolbar->HideItem(EPodcastRemoveDownload, EFalse, ETrue); toolbar->SetItemDimmed(EPodcastRemoveDownload, itemCnt == 0, ETrue); -#endif } } - -void CPodcastQueueView::DownloadQueueUpdatedL(TInt /*aDownloadingShows*/, TInt /*aQueuedShows*/) - { - } - -void CPodcastQueueView::FeedUpdateAllCompleteL(TFeedState /*aState*/) - { - UpdateListboxItemsL(); - UpdateToolbar(); - } diff -r 9569ea080d5a -r 4d230e702aa3 application/src/PodcastSearchView.cpp --- a/application/src/PodcastSearchView.cpp Thu Mar 11 20:53:00 2010 +0100 +++ b/application/src/PodcastSearchView.cpp Tue Apr 27 19:26:48 2010 +0100 @@ -37,7 +37,6 @@ #include #include #include -#include const TInt KMaxFeedNameLength = 100; const TInt KDefaultGran = 5; @@ -128,24 +127,19 @@ TUid aCustomMessageId, const TDesC8& aCustomMessage) { - UpdateToolbar(); - - CAknTitlePane* titlePane = static_cast - ( StatusPane()->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) ); - - ((CPodcastAppUi*)AppUi())->NaviSetTextL(R_SEARCH_RESULTS); - CPodcastListView::DoActivateL(aPrevViewId, aCustomMessageId, aCustomMessage); iPreviousView = TVwsViewId(KUidPodcast, KUidPodcastFeedViewID); + + ((CPodcastAppUi*)AppUi())->NaviSetTextL(R_SEARCH_RESULTS); + + UpdateListboxItemsL(); + UpdateToolbar(); } void CPodcastSearchView::DoDeactivate() { CPodcastListView::DoDeactivate(); - CAknTitlePane* titlePane = static_cast - ( StatusPane()->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) ); - titlePane->SetTextToDefaultL(); - ((CPodcastAppUi*)AppUi())->NaviShowTabGroupL(); + TRAP_IGNORE(((CPodcastAppUi*)AppUi())->NaviShowTabGroupL()); } @@ -239,7 +233,7 @@ iEikonEnv->ReadResourceL(templ, R_ADD_FEED_QUERY); message.Format(templ, &newInfo->Title()); - if(ShowQueryMessage(message)) { + if(ShowQueryMessageL(message)) { TBool added = iPodcastModel.FeedEngine().AddFeedL(*newInfo); if (added) @@ -247,11 +241,10 @@ // ask if user wants to update it now TBuf message; iEikonEnv->ReadResourceL(message, R_ADD_FEED_SUCCESS); - if(ShowQueryMessage(message)) + if(ShowQueryMessageL(message)) { CFeedInfo *info = iPodcastModel.FeedEngine().GetFeedInfoByUid(newInfo->Uid()); - iPodcastModel.ActiveShowList().Reset(); iPodcastModel.SetActiveFeedInfo(info); AppUi()->ActivateLocalViewL(KUidPodcastShowsViewID, TUid::Uid(0), KNullDesC8()); iPodcastModel.FeedEngine().UpdateFeedL(info->Uid()); @@ -261,7 +254,7 @@ { TBuf message; iEikonEnv->ReadResourceL(message, R_ADD_FEED_EXISTS); - ShowErrorMessage(message); + ShowErrorMessageL(message); } } } @@ -277,8 +270,7 @@ void CPodcastSearchView::OpmlParsingComplete(TInt /*aError*/, TUint /*aNumFeedsImported*/) { DP("CPodcastSearchView::OpmlParsingComplete BEGIN"); - UpdateListboxItemsL(); - UpdateToolbar(); + DP("CPodcastSearchView::OpmlParsingComplete END"); } diff -r 9569ea080d5a -r 4d230e702aa3 application/src/PodcastSettingsView.cpp --- a/application/src/PodcastSettingsView.cpp Thu Mar 11 20:53:00 2010 +0100 +++ b/application/src/PodcastSettingsView.cpp Tue Apr 27 19:26:48 2010 +0100 @@ -25,9 +25,9 @@ #include #include "SettingsEngine.h" -#include -#include +#include #include +#include class CIapSetting: public CAknEnumeratedTextPopupSettingItem @@ -289,42 +289,33 @@ { DP("EditItemL BEGIN"); if (aIndex == 0) { - CAknMemorySelectionDialog* memDlg = - CAknMemorySelectionDialog::NewL(ECFDDialogTypeNormal, ETrue); - CleanupStack::PushL(memDlg); - CAknMemorySelectionDialog::TMemory memory = - CAknMemorySelectionDialog::EPhoneMemory; - - if (memDlg->ExecuteL(memory)) + TFileName selectedFolder; + selectedFolder.Copy(iShowDir); + TFileName startFolder; + startFolder.Zero(); + TInt types = AknCommonDialogsDynMem::EMemoryTypePhone | AknCommonDialogsDynMem::EMemoryTypeMMC |AknCommonDialogsDynMem::EMemoryTypeInternalMassStorage| AknCommonDialogsDynMem::EMemoryTypeRemote; + + HBufC *title = iCoeEnv->AllocReadResourceLC(R_PODCAST_SELECT_FOLDER); + if (AknCommonDialogsDynMem::RunFolderSelectDlgLD (types, selectedFolder, + startFolder, NULL, NULL, *title)) { - TFileName importName; - - if (memory==CAknMemorySelectionDialog::EMemoryCard) - { - importName = PathInfo:: MemoryCardRootPath(); - } - else - { - importName = PathInfo:: PhoneMemoryRootPath(); + _LIT(KPodcastsDir, "Podcasts"); + TInt pos = selectedFolder.Find(KPodcastsDir); + if (pos == KErrNotFound || pos != selectedFolder.Length()-9) + { + // append "Podcasts" if the folder isn't already called this + selectedFolder.Append(KPodcastsDir); + } + + if (selectedFolder[selectedFolder.Length()-1] != '\\') + { + selectedFolder.Append(_L("\\")); + } + + iShowDir.Copy(selectedFolder); + LoadSettingsL(); } - - CAknFileSelectionDialog* dlg = CAknFileSelectionDialog::NewL(ECFDDialogTypeSave, R_PODCAST_SHOWDIR_SELECTOR); - HBufC* select = iEikonEnv->AllocReadResourceLC(R_PODCAST_SOFTKEY_SELECT); - dlg->SetLeftSoftkeyFileL(*select); - CleanupStack::PopAndDestroy(select); - CleanupStack::PushL(dlg); - - dlg->SetDefaultFolderL(importName); - - if(dlg->ExecuteL(importName)) - { - importName.Append(_L("Podcasts")); - iShowDir.Copy(importName); - LoadSettingsL(); - } - CleanupStack::PopAndDestroy(dlg); - } - CleanupStack::PopAndDestroy(memDlg); + CleanupStack::PopAndDestroy(title); } else { CAknSettingItemList::EditItemL(aIndex,aCalledFromMenu); @@ -511,6 +502,7 @@ { iNaviPane->PushL(*iNaviDecorator); } + DP("CPodcastSettingsView::DoActivateL END"); } @@ -549,7 +541,21 @@ iListbox->StoreSettings(); AppUi()->ActivateViewL(iPreviousView); } - break; + break; + case EPodcastResetDb: + CAknQueryDialog* dlg= new(ELeave) CAknQueryDialog(); + + CleanupStack::PushL(dlg); + HBufC *text = iCoeEnv->AllocReadResourceLC(R_RESET_DB_QUERY); + dlg->SetPromptL(*text); + CleanupStack::PopAndDestroy(text); + CleanupStack::Pop(dlg); + if(dlg->ExecuteLD(R_QUERYDLG)) + { + iPodcastModel.DropDB(); + AppUi()->Exit(); + } + break; default: AppUi()->HandleCommandL(aCommand); break; diff -r 9569ea080d5a -r 4d230e702aa3 application/src/PodcastShowsView.cpp --- a/application/src/PodcastShowsView.cpp Thu Mar 11 20:53:00 2010 +0100 +++ b/application/src/PodcastShowsView.cpp Tue Apr 27 19:26:48 2010 +0100 @@ -34,14 +34,6 @@ #define KMaxMessageLength 200 -#define KPodcastImageWidth 160 -#define KPodcastImageHeight 120 -#define KPodcastDialogOffset 2 - -#define KOneHundredPercent 100 - -const TInt KSizeBufLen = 64; -const TInt KDefaultGran = 5; _LIT(KSizeDownloadingOf, "%.1f/%.1f MB"); _LIT(KShowsSizeFormatS60, "%.1f MB"); @@ -69,10 +61,30 @@ EMbmPodcastAudio_failed_mask, EMbmPodcastAudio_suspended, EMbmPodcastAudio_suspended_mask, + EMbmPodcastVideo, + EMbmPodcastVideo_mask, + EMbmPodcastVideo_new, + EMbmPodcastVideo_new_mask, + EMbmPodcastVideo_queued, + EMbmPodcastVideo_queued_mask, + EMbmPodcastVideo_downloading, + EMbmPodcastVideo_downloading_mask, + EMbmPodcastVideo_downloaded, + EMbmPodcastVideo_downloaded_mask, + EMbmPodcastVideo_downloaded_new, + EMbmPodcastVideo_downloaded_new_mask, + EMbmPodcastVideo_failed, + EMbmPodcastVideo_failed_mask, + EMbmPodcastVideo_suspended, + EMbmPodcastVideo_suspended_mask, + EMbmPodcastFeed, + EMbmPodcastFeed_mask, 0, 0 }; +const TInt KVideoIconOffset = 8; + CPodcastShowsView* CPodcastShowsView::NewL(CPodcastModel& aPodcastModel) { CPodcastShowsView* self = CPodcastShowsView::NewLC(aPodcastModel); @@ -120,9 +132,9 @@ TInt pos = 0; while (KShowIconArrayIds[pos] > 0) { - // Load the bitmap for play icon - CFbsBitmap* bitmap= NULL;//iEikonEnv->CreateBitmapL( _L("*"), KIconArrayIds[pos]); - CFbsBitmap* mask= NULL;////iEikonEnv->CreateBitmapL( _L("*"), KIconArrayIds[pos+1] ); + // Load the icon + CFbsBitmap* bitmap= NULL; + CFbsBitmap* mask= NULL; AknIconUtils::CreateIconL(bitmap, mask, iEikonEnv->EikAppUi()->Application()->BitmapStoreName(), @@ -131,7 +143,7 @@ CleanupStack::PushL(bitmap); CleanupStack::PushL(mask); - // Append the play icon to icon array + // Append the icon to icon array icons->AppendL(CGulIcon::NewL(bitmap, mask) ); CleanupStack::Pop(2); // bitmap, mask pos+=2; @@ -203,12 +215,11 @@ TUid aCustomMessageId, const TDesC8& aCustomMessage) { DP("CPodcastShowsView::DoActivateL BEGIN"); + CPodcastListView::DoActivateL(aPrevViewId, aCustomMessageId, aCustomMessage); + + iPreviousView = TVwsViewId(KUidPodcast, KUidPodcastFeedViewID); UpdateViewTitleL(); - - CPodcastListView::DoActivateL(aPrevViewId, aCustomMessageId, aCustomMessage); - iPreviousView = TVwsViewId(KUidPodcast, KUidPodcastFeedViewID); - UpdateFeedUpdateStateL(); UpdateToolbar(); DP("CPodcastShowsView::DoActivateL END"); @@ -216,12 +227,6 @@ void CPodcastShowsView::DoDeactivate() { - CAknTitlePane* titlePane = static_cast - ( StatusPane()->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) ); - -// titlePane->SetSmallPicture(NULL, NULL, ETrue); - titlePane->SetPicture(NULL, NULL); - titlePane->SetTextToDefaultL(); CPodcastListView::DoDeactivate(); } @@ -269,7 +274,7 @@ { TBuf message; iEikonEnv->ReadResourceL(message, R_PODCAST_CONNECTION_ERROR); - ShowErrorMessage(message); + ShowErrorMessageL(message); } break; default: @@ -379,6 +384,11 @@ aIconIndex = EFailedShowIcon; break; } + + if (aShowInfo->ShowType() == EVideoPodcast) + { + aIconIndex += KVideoIconOffset; + } } @@ -439,9 +449,10 @@ if(aShowInfo.LastError() != KErrNone) { GetShowErrorText(infoSize, aShowInfo.LastError()); + showDate.Zero(); } - if (infoSize.Length() > 0) + if (infoSize.Length() > 0 && showDate.Length() > 0) { infoSize.Insert(0,_L(", ")); } @@ -451,7 +462,7 @@ void CPodcastShowsView::GetShowErrorText(TDes &aErrorMessage, TInt aErrorCode) { - iEikonEnv->GetErrorText(aErrorMessage, aErrorCode); + TRAP_IGNORE(((CPodcastAppUi*)AppUi())->GetErrorTextL(aErrorMessage,aErrorCode)); } void CPodcastShowsView::UpdateShowItemDataL(CShowInfo* aShowInfo,TInt aIndex, TInt aSizeDownloaded) @@ -563,17 +574,17 @@ switch (aCommand) { case EPodcastMarkAsPlayed: - HandleSetShowPlayed(ETrue); + HandleSetShowPlayedL(ETrue); break; case EPodcastMarkAsUnplayed: - HandleSetShowPlayed(EFalse); + HandleSetShowPlayedL(EFalse); break; case EPodcastMarkAllPlayed: - iPodcastModel.MarkSelectionPlayed(); + iPodcastModel.MarkSelectionPlayedL(); UpdateListboxItemsL(); break; case EPodcastDeleteShow: - HandleDeleteShow(); + HandleDeleteShowL(); break; case EPodcastDownloadShow: { @@ -614,7 +625,7 @@ CPodcastListView::HandleCommandL(aCommand); break; } - iListContainer->SetLongTapDetected(EFalse); + iListContainer->SetLongTapDetectedL(EFalse); UpdateToolbar(); } @@ -628,30 +639,6 @@ } } -void CPodcastShowsView::ImageOperationCompleteL(TInt aError, TUint /*aHandle*/) - { - iLastImageHandlerError = aError; - if(iSetTitlebarImage) - { - iSetTitlebarImage = EFalse; - if(aError == KErrNone) - { - CAknTitlePane* titlePane = static_cast - ( StatusPane()->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) ); - titlePane->SetSmallPicture(iPodcastModel.ImageHandler().ScaledBitmap(), NULL, ETrue); - } - else - { - iPodcastModel.ImageHandler().ScaledBitmap(); - } - - } - else - { - CActiveScheduler::Stop(); - } - } - void CPodcastShowsView::DisplayShowInfoDialogL() { TInt index = iListContainer->Listbox()->CurrentItemIndex(); @@ -683,8 +670,12 @@ toolbar->HideItem(EPodcastUpdateFeed, updatingState, ETrue ); toolbar->HideItem(EPodcastCancelUpdateAllFeeds, !updatingState, ETrue ); - -#ifdef SYMBIAN1_UI +#ifndef SYMBIAN1_UI + // there seems to be drawing bugs in the toolbar if there is only + // one or two buttons defined in the resource, so we have download + // there but always hidden + toolbar->HideItem(EPodcastDownloadShow, ETrue, ETrue ); +#else SYMBIAN1_UI RShowInfoArray &fItems = iPodcastModel.ActiveShowList(); TInt itemCnt = fItems.Count(); @@ -748,7 +739,7 @@ { DP("CPodcastShowsView::HandleLongTapEventL BEGIN"); - iListContainer->SetLongTapDetected(ETrue); + iListContainer->SetLongTapDetectedL(ETrue); const TInt KListboxDefaultHeight = 19; // for some reason it returns 19 for an empty listbox in S^1 TInt lbHeight = iListContainer->Listbox()->CalcHeightBasedOnNumOfItems( @@ -777,7 +768,7 @@ DP("CPodcastShowsView::HandleLongTapEventL END"); } -void CPodcastShowsView::HandleSetShowPlayed(TBool aPlayed) +void CPodcastShowsView::HandleSetShowPlayedL(TBool aPlayed) { TInt index = iListContainer->Listbox()->CurrentItemIndex(); @@ -786,13 +777,13 @@ { CShowInfo *info = iPodcastModel.ActiveShowList()[index]; info->SetPlayState(aPlayed ? EPlayed : ENeverPlayed); - iPodcastModel.ShowEngine().UpdateShow(*info); + iPodcastModel.ShowEngine().UpdateShowL(*info); UpdateShowItemDataL(iPodcastModel.ActiveShowList()[index], index, 0); iListContainer->Listbox()->DrawItem(index); } } -void CPodcastShowsView::HandleDeleteShow() +void CPodcastShowsView::HandleDeleteShowL() { TInt index = iListContainer->Listbox()->CurrentItemIndex(); @@ -803,7 +794,7 @@ TBuf templ; iEikonEnv->ReadResourceL(templ, R_PODCAST_DELETE_SHOW_PROMPT); msg.Format(templ, &(info->Title())); - if (ShowQueryMessage(msg)) + if (ShowQueryMessageL(msg)) { iPodcastModel.ShowEngine().DeleteShowL(iPodcastModel.ActiveShowList()[index]->Uid()); @@ -811,7 +802,7 @@ info->SetDownloadState(ENotDownloaded); info->SetPlayState(EPlayed); - iPodcastModel.ShowEngine().UpdateShow(*info); + iPodcastModel.ShowEngine().UpdateShowL(*info); UpdateShowItemDataL(iPodcastModel.ActiveShowList()[index], index, 0); iListContainer->Listbox()->DrawItem(index); @@ -821,7 +812,7 @@ void CPodcastShowsView::DownloadQueueUpdatedL(TInt aDownloadingShows, TInt aQueuedShows) { - ((CPodcastAppUi*)AppUi())->UpdateQueueTab(aDownloadingShows+aQueuedShows); + ((CPodcastAppUi*)AppUi())->UpdateQueueTabL(aDownloadingShows+aQueuedShows); UpdateListboxItemsL(); } @@ -855,7 +846,6 @@ } else { - titlePane->SetPicture(NULL, NULL); titlePane->SetTextToDefaultL(); } diff -r 9569ea080d5a -r 4d230e702aa3 engine/BWINS/podcastengineu.def --- a/engine/BWINS/podcastengineu.def Thu Mar 11 20:53:00 2010 +0100 +++ b/engine/BWINS/podcastengineu.def Tue Apr 27 19:26:48 2010 +0100 @@ -10,11 +10,11 @@ ?ActiveShowList@CPodcastModel@@QAEAAV?$RPointerArray@VCShowInfo@@@@XZ @ 9 NONAME ; class RPointerArray & CPodcastModel::ActiveShowList(void) ?AddDownloadL@CShowEngine@@QAEXAAVCShowInfo@@@Z @ 10 NONAME ; void CShowEngine::AddDownloadL(class CShowInfo &) ?AddFeedL@CFeedEngine@@QAEHABVCFeedInfo@@@Z @ 11 NONAME ; int CFeedEngine::AddFeedL(class CFeedInfo const &) - ?AddObserver@CFeedEngine@@QAEXPAVMFeedEngineObserver@@@Z @ 12 NONAME ; void CFeedEngine::AddObserver(class MFeedEngineObserver *) - ?AddObserver@CShowEngine@@QAEXPAVMShowEngineObserver@@@Z @ 13 NONAME ; void CShowEngine::AddObserver(class MShowEngineObserver *) - ?AddObserver@CSoundEngine@@QAEXPAVMSoundEngineObserver@@@Z @ 14 NONAME ; void CSoundEngine::AddObserver(class MSoundEngineObserver *) + ?AddObserver@CConnectionEngine@@QAEXPAVMConnectionObserver@@@Z @ 12 NONAME ; void CConnectionEngine::AddObserver(class MConnectionObserver *) + ?AddObserver@CFeedEngine@@QAEXPAVMFeedEngineObserver@@@Z @ 13 NONAME ; void CFeedEngine::AddObserver(class MFeedEngineObserver *) + ?AddObserver@CShowEngine@@QAEXPAVMShowEngineObserver@@@Z @ 14 NONAME ; void CShowEngine::AddObserver(class MShowEngineObserver *) ?AddSearchResultL@CFeedEngine@@QAEXPAVCFeedInfo@@@Z @ 15 NONAME ; void CFeedEngine::AddSearchResultL(class CFeedInfo *) - ?AddShowL@CShowEngine@@QAEHABVCShowInfo@@@Z @ 16 NONAME ; int CShowEngine::AddShowL(class CShowInfo const &) + ?AddShowL@CShowEngine@@QAEXABVCShowInfo@@@Z @ 16 NONAME ; void CShowEngine::AddShowL(class CShowInfo const &) ?BaseDir@CSettingsEngine@@QAEAAV?$TBuf@$0BAA@@@XZ @ 17 NONAME ; class TBuf<256> & CSettingsEngine::BaseDir(void) ?BuildDate@CFeedInfo@@QBE?AVTTime@@XZ @ 18 NONAME ; class TTime CFeedInfo::BuildDate(void) const ?CancelUpdateAllFeeds@CFeedEngine@@QAEXXZ @ 19 NONAME ; void CFeedEngine::CancelUpdateAllFeeds(void) @@ -25,8 +25,8 @@ ?CustomTitle@CFeedInfo@@QBEHXZ @ 24 NONAME ; int CFeedInfo::CustomTitle(void) const ?DBGetShowByFileNameL@CShowEngine@@QAEPAVCShowInfo@@V?$TBuf@$0BAA@@@@Z @ 25 NONAME ; class CShowInfo * CShowEngine::DBGetShowByFileNameL(class TBuf<256>) ?DeleteAllShowsByFeedL@CShowEngine@@QAEXIH@Z @ 26 NONAME ; void CShowEngine::DeleteAllShowsByFeedL(unsigned int, int) - ?DeleteOldShowsByFeed@CShowEngine@@QAEXI@Z @ 27 NONAME ; void CShowEngine::DeleteOldShowsByFeed(unsigned int) - ?DeletePlayedShows@CShowEngine@@QAEXAAV?$RPointerArray@VCShowInfo@@@@@Z @ 28 NONAME ; void CShowEngine::DeletePlayedShows(class RPointerArray &) + ?DeleteOldShowsByFeedL@CShowEngine@@QAEXI@Z @ 27 NONAME ; void CShowEngine::DeleteOldShowsByFeedL(unsigned int) + ?DeletePlayedShowsL@CShowEngine@@QAEXAAV?$RPointerArray@VCShowInfo@@@@@Z @ 28 NONAME ; void CShowEngine::DeletePlayedShowsL(class RPointerArray &) ?DeleteShowL@CShowEngine@@QAEXIH@Z @ 29 NONAME ; void CShowEngine::DeleteShowL(unsigned int, int) ?Description@CFeedInfo@@QBEABVTDesC16@@XZ @ 30 NONAME ; class TDesC16 const & CFeedInfo::Description(void) const ?Description@CShowInfo@@QBEABVTDesC16@@XZ @ 31 NONAME ; class TDesC16 const & CShowInfo::Description(void) const @@ -37,141 +37,128 @@ ?ExportFeedsL@CFeedEngine@@QAEHAAV?$TBuf@$0BAA@@@@Z @ 36 NONAME ; int CFeedEngine::ExportFeedsL(class TBuf<256> &) ?FeedEngine@CPodcastModel@@QAEAAVCFeedEngine@@XZ @ 37 NONAME ; class CFeedEngine & CPodcastModel::FeedEngine(void) ?FeedIcon@CFeedInfo@@QBEPAVCFbsBitmap@@XZ @ 38 NONAME ; class CFbsBitmap * CFeedInfo::FeedIcon(void) const - ?FeedIconIndex@CFeedInfo@@QBEHXZ @ 39 NONAME ; int CFeedInfo::FeedIconIndex(void) const - ?FeedUid@CShowInfo@@QBEIXZ @ 40 NONAME ; unsigned int CShowInfo::FeedUid(void) const - ?FileName@CShowInfo@@QBEABVTDesC16@@XZ @ 41 NONAME ; class TDesC16 const & CShowInfo::FileName(void) const - ?FileNameFromUrl@PodcastUtils@@SAXABVTDesC16@@AAV?$TBuf@$0BAA@@@@Z @ 42 NONAME ; void PodcastUtils::FileNameFromUrl(class TDesC16 const &, class TBuf<256> &) - ?FixProtocolsL@PodcastUtils@@SAXAAVTDes16@@@Z @ 43 NONAME ; void PodcastUtils::FixProtocolsL(class TDes16 &) - ?GetAllShowsL@CPodcastModel@@QAEXXZ @ 44 NONAME ; void CPodcastModel::GetAllShowsL(void) - ?GetAllShowsL@CShowEngine@@QAEXAAV?$RPointerArray@VCShowInfo@@@@@Z @ 45 NONAME ; void CShowEngine::GetAllShowsL(class RPointerArray &) - ?GetDownloadedStats@CFeedEngine@@QAEXAAI0@Z @ 46 NONAME ; void CFeedEngine::GetDownloadedStats(unsigned int &, unsigned int &) - ?GetFeedInfoByUid@CFeedEngine@@QAEPAVCFeedInfo@@I@Z @ 47 NONAME ; class CFeedInfo * CFeedEngine::GetFeedInfoByUid(unsigned int) - ?GetMimeType@CShowEngine@@QAEXABVTDesC16@@AAVTDes16@@@Z @ 48 NONAME ; void CShowEngine::GetMimeType(class TDesC16 const &, class TDes16 &) - ?GetNewShowsL@CPodcastModel@@QAEXXZ @ 49 NONAME ; void CPodcastModel::GetNewShowsL(void) - ?GetNewShowsL@CShowEngine@@QAEXAAV?$RPointerArray@VCShowInfo@@@@@Z @ 50 NONAME ; void CShowEngine::GetNewShowsL(class RPointerArray &) - ?GetNextShowByTrackL@CShowEngine@@QAEPAVCShowInfo@@PAV2@@Z @ 51 NONAME ; class CShowInfo * CShowEngine::GetNextShowByTrackL(class CShowInfo *) - ?GetNumDownloadingShows@CShowEngine@@QAEHXZ @ 52 NONAME ; int CShowEngine::GetNumDownloadingShows(void) - ?GetSearchResults@CFeedEngine@@QAEABV?$RPointerArray@VCFeedInfo@@@@XZ @ 53 NONAME ; class RPointerArray const & CFeedEngine::GetSearchResults(void) - ?GetShowByUidL@CShowEngine@@QAEPAVCShowInfo@@I@Z @ 54 NONAME ; class CShowInfo * CShowEngine::GetShowByUidL(unsigned int) - ?GetShowsByFeedL@CPodcastModel@@QAEXI@Z @ 55 NONAME ; void CPodcastModel::GetShowsByFeedL(unsigned int) - ?GetShowsByFeedL@CShowEngine@@QAEXAAV?$RPointerArray@VCShowInfo@@@@I@Z @ 56 NONAME ; void CShowEngine::GetShowsByFeedL(class RPointerArray &, unsigned int) - ?GetShowsDownloadedL@CPodcastModel@@QAEXXZ @ 57 NONAME ; void CPodcastModel::GetShowsDownloadedL(void) - ?GetShowsDownloadedL@CShowEngine@@QAEXAAV?$RPointerArray@VCShowInfo@@@@@Z @ 58 NONAME ; void CShowEngine::GetShowsDownloadedL(class RPointerArray &) - ?GetShowsDownloadingL@CPodcastModel@@QAEXXZ @ 59 NONAME ; void CPodcastModel::GetShowsDownloadingL(void) - ?GetShowsDownloadingL@CShowEngine@@QAEXAAV?$RPointerArray@VCShowInfo@@@@@Z @ 60 NONAME ; void CShowEngine::GetShowsDownloadingL(class RPointerArray &) - ?GetSortedFeeds@CFeedEngine@@QAEABV?$RPointerArray@VCFeedInfo@@@@XZ @ 61 NONAME ; class RPointerArray const & CFeedEngine::GetSortedFeeds(void) - ?GetStatsByFeed@CFeedEngine@@QAEXIAAI0@Z @ 62 NONAME ; void CFeedEngine::GetStatsByFeed(unsigned int, unsigned int &, unsigned int &) - ?IAPIds@CPodcastModel@@QAEAAV?$RArray@VTPodcastIAPItem@@@@XZ @ 63 NONAME ; class RArray & CPodcastModel::IAPIds(void) - ?IAPNames@CPodcastModel@@QAEPAVCDesC16ArrayFlat@@XZ @ 64 NONAME ; class CDesC16ArrayFlat * CPodcastModel::IAPNames(void) - ?ImageFileName@CFeedInfo@@QBEABVTDesC16@@XZ @ 65 NONAME ; class TDesC16 const & CFeedInfo::ImageFileName(void) const - ?ImageHandler@CPodcastModel@@QAEAAVCImageHandler@@XZ @ 66 NONAME ; class CImageHandler & CPodcastModel::ImageHandler(void) - ?ImageUrl@CFeedInfo@@QBEABVTDesC16@@XZ @ 67 NONAME ; class TDesC16 const & CFeedInfo::ImageUrl(void) const - ?ImportFeedsL@CFeedEngine@@QAEXABVTDesC16@@@Z @ 68 NONAME ; void CFeedEngine::ImportFeedsL(class TDesC16 const &) - ?IsFirstStartup@CPodcastModel@@QAEHXZ @ 69 NONAME ; int CPodcastModel::IsFirstStartup(void) - ?LastError@CFeedInfo@@QBEHXZ @ 70 NONAME ; int CFeedInfo::LastError(void) const - ?LastError@CShowInfo@@QBEHXZ @ 71 NONAME ; int CShowInfo::LastError(void) const - ?LastUpdated@CFeedInfo@@QBE?AVTTime@@XZ @ 72 NONAME ; class TTime CFeedInfo::LastUpdated(void) const - ?Link@CFeedInfo@@QBEABVTDesC16@@XZ @ 73 NONAME ; class TDesC16 const & CFeedInfo::Link(void) const - ?LoadFileAndScaleL@CImageHandler@@QAEXPAVCFbsBitmap@@ABV?$TBuf@$0BAA@@@ABVTSize@@AAVMImageHandlerCallback@@IH@Z @ 74 NONAME ; void CImageHandler::LoadFileAndScaleL(class CFbsBitmap *, class TBuf<256> const &, class TSize const &, class MImageHandlerCallback &, unsigned int, int) - ?MarkSelectionPlayed@CPodcastModel@@QAEXXZ @ 75 NONAME ; void CPodcastModel::MarkSelectionPlayed(void) - ?MetaDataReader@CShowEngine@@QAEAAVCMetaDataReader@@XZ @ 76 NONAME ; class CMetaDataReader & CShowEngine::MetaDataReader(void) - ?NewL@CFeedInfo@@SAPAV1@XZ @ 77 NONAME ; class CFeedInfo * CFeedInfo::NewL(void) - ?NewL@CImageHandler@@SAPAV1@AAVRFs@@@Z @ 78 NONAME ; class CImageHandler * CImageHandler::NewL(class RFs &) - ?NewL@CPodcastModel@@SAPAV1@XZ @ 79 NONAME ; class CPodcastModel * CPodcastModel::NewL(void) - ?NewL@CShowEngine@@SAPAV1@AAVCPodcastModel@@@Z @ 80 NONAME ; class CShowEngine * CShowEngine::NewL(class CPodcastModel &) - ?NewL@CShowInfo@@SAPAV1@I@Z @ 81 NONAME ; class CShowInfo * CShowInfo::NewL(unsigned int) - ?NewLC@CFeedInfo@@SAPAV1@XZ @ 82 NONAME ; class CFeedInfo * CFeedInfo::NewLC(void) - ?NewLC@CImageHandler@@SAPAV1@AAVRFs@@@Z @ 83 NONAME ; class CImageHandler * CImageHandler::NewLC(class RFs &) - ?NewLC@CShowInfo@@SAPAV1@I@Z @ 84 NONAME ; class CShowInfo * CShowInfo::NewLC(unsigned int) - ?NotifyShowListUpdatedL@CShowEngine@@QAEXXZ @ 85 NONAME ; void CShowEngine::NotifyShowListUpdatedL(void) - ?OpmlParsingComplete@CFeedEngine@@QAEXHI@Z @ 86 NONAME ; void CFeedEngine::OpmlParsingComplete(int, unsigned int) - ?Pause@CSoundEngine@@QAEXH@Z @ 87 NONAME ; void CSoundEngine::Pause(int) - ?Play@CSoundEngine@@QAEXXZ @ 88 NONAME ; void CSoundEngine::Play(void) - ?PlayPausePodcastL@CPodcastModel@@QAEXPAVCShowInfo@@H@Z @ 89 NONAME ; void CPodcastModel::PlayPausePodcastL(class CShowInfo *, int) - ?PlayState@CShowInfo@@QBE?AW4TPlayState@@XZ @ 90 NONAME ; enum TPlayState CShowInfo::PlayState(void) const - ?PlayTime@CShowInfo@@QBEIXZ @ 91 NONAME ; unsigned int CShowInfo::PlayTime(void) const - ?PlayingPodcast@CPodcastModel@@QAEPAVCShowInfo@@XZ @ 92 NONAME ; class CShowInfo * CPodcastModel::PlayingPodcast(void) - ?Position@CShowInfo@@QBE?AVTTimeIntervalMicroSeconds@@XZ @ 93 NONAME ; class TTimeIntervalMicroSeconds CShowInfo::Position(void) const - ?Position@CSoundEngine@@QAE?AVTTimeIntervalMicroSeconds@@XZ @ 94 NONAME ; class TTimeIntervalMicroSeconds CSoundEngine::Position(void) - ?PubDate@CShowInfo@@QBE?BVTTime@@XZ @ 95 NONAME ; class TTime const CShowInfo::PubDate(void) const - ?RemoveAllDownloads@CShowEngine@@QAEXXZ @ 96 NONAME ; void CShowEngine::RemoveAllDownloads(void) - ?RemoveAllFormatting@PodcastUtils@@SAXAAVTDes16@@@Z @ 97 NONAME ; void PodcastUtils::RemoveAllFormatting(class TDes16 &) - ?RemoveDownloadL@CShowEngine@@QAEHI@Z @ 98 NONAME ; int CShowEngine::RemoveDownloadL(unsigned int) - ?RemoveFeedL@CFeedEngine@@QAEXI@Z @ 99 NONAME ; void CFeedEngine::RemoveFeedL(unsigned int) - ?RemoveObserver@CFeedEngine@@QAEXPAVMFeedEngineObserver@@@Z @ 100 NONAME ; void CFeedEngine::RemoveObserver(class MFeedEngineObserver *) - ?RemoveObserver@CShowEngine@@QAEXPAVMShowEngineObserver@@@Z @ 101 NONAME ; void CShowEngine::RemoveObserver(class MShowEngineObserver *) - ?ReplaceChar@PodcastUtils@@SAXAAVTDes16@@II@Z @ 102 NONAME ; void PodcastUtils::ReplaceChar(class TDes16 &, unsigned int, unsigned int) - ?ReplaceString@PodcastUtils@@SAXAAVTDes16@@ABVTDesC16@@1@Z @ 103 NONAME ; void PodcastUtils::ReplaceString(class TDes16 &, class TDesC16 const &, class TDesC16 const &) - ?ResumeDownloadsL@CShowEngine@@QAEXXZ @ 104 NONAME ; void CShowEngine::ResumeDownloadsL(void) - ?SNAPIds@CPodcastModel@@QAEAAV?$RArray@VTPodcastIAPItem@@@@XZ @ 105 NONAME ; class RArray & CPodcastModel::SNAPIds(void) - ?SNAPNames@CPodcastModel@@QAEPAVCDesC16ArrayFlat@@XZ @ 106 NONAME ; class CDesC16ArrayFlat * CPodcastModel::SNAPNames(void) - ?SQLEncode@PodcastUtils@@SAXAAVTDes16@@@Z @ 107 NONAME ; void PodcastUtils::SQLEncode(class TDes16 &) - ?SaveSettingsL@CSettingsEngine@@QAEXXZ @ 108 NONAME ; void CSettingsEngine::SaveSettingsL(void) - ?ScaledBitmap@CImageHandler@@QAEPAVCFbsBitmap@@XZ @ 109 NONAME ; class CFbsBitmap * CImageHandler::ScaledBitmap(void) - ?SearchForFeedL@CFeedEngine@@QAEXAAVTDesC16@@@Z @ 110 NONAME ; void CFeedEngine::SearchForFeedL(class TDesC16 &) - ?SetActiveFeedInfo@CPodcastModel@@QAEXPAVCFeedInfo@@@Z @ 111 NONAME ; void CPodcastModel::SetActiveFeedInfo(class CFeedInfo *) - ?SetBaseDir@CSettingsEngine@@QAEXAAV?$TBuf@$0BAA@@@@Z @ 112 NONAME ; void CSettingsEngine::SetBaseDir(class TBuf<256> &) - ?SetBuildDate@CFeedInfo@@QAEXVTTime@@@Z @ 113 NONAME ; void CFeedInfo::SetBuildDate(class TTime) - ?SetCustomTitle@CFeedInfo@@QAEXXZ @ 114 NONAME ; void CFeedInfo::SetCustomTitle(void) - ?SetDescriptionL@CFeedInfo@@QAEXABVTDesC16@@@Z @ 115 NONAME ; void CFeedInfo::SetDescriptionL(class TDesC16 const &) - ?SetDescriptionL@CShowInfo@@QAEXABVTDesC16@@@Z @ 116 NONAME ; void CShowInfo::SetDescriptionL(class TDesC16 const &) - ?SetDownloadAutomatically@CSettingsEngine@@QAEXH@Z @ 117 NONAME ; void CSettingsEngine::SetDownloadAutomatically(int) - ?SetDownloadState@CShowInfo@@QAEXW4TDownloadState@@@Z @ 118 NONAME ; void CShowInfo::SetDownloadState(enum TDownloadState) - ?SetDownloadSuspended@CSettingsEngine@@QAEXH@Z @ 119 NONAME ; void CSettingsEngine::SetDownloadSuspended(int) - ?SetFeedIcon@CFeedInfo@@QAEXPAVCFbsBitmap@@@Z @ 120 NONAME ; void CFeedInfo::SetFeedIcon(class CFbsBitmap *) - ?SetFeedIconIndex@CFeedInfo@@QAEXH@Z @ 121 NONAME ; void CFeedInfo::SetFeedIconIndex(int) - ?SetFeedUid@CShowInfo@@QAEXI@Z @ 122 NONAME ; void CShowInfo::SetFeedUid(unsigned int) - ?SetFileNameL@CShowInfo@@QAEXABVTDesC16@@@Z @ 123 NONAME ; void CShowInfo::SetFileNameL(class TDesC16 const &) - ?SetImageFileNameL@CFeedInfo@@QAEXABVTDesC16@@@Z @ 124 NONAME ; void CFeedInfo::SetImageFileNameL(class TDesC16 const &) - ?SetImageUrlL@CFeedInfo@@QAEXABVTDesC16@@@Z @ 125 NONAME ; void CFeedInfo::SetImageUrlL(class TDesC16 const &) - ?SetLastError@CFeedInfo@@QAEXH@Z @ 126 NONAME ; void CFeedInfo::SetLastError(int) - ?SetLastError@CShowInfo@@QAEXH@Z @ 127 NONAME ; void CShowInfo::SetLastError(int) - ?SetLastUpdated@CFeedInfo@@QAEXVTTime@@@Z @ 128 NONAME ; void CFeedInfo::SetLastUpdated(class TTime) - ?SetLinkL@CFeedInfo@@QAEXABVTDesC16@@@Z @ 129 NONAME ; void CFeedInfo::SetLinkL(class TDesC16 const &) - ?SetPlayState@CShowInfo@@QAEXW4TPlayState@@@Z @ 130 NONAME ; void CShowInfo::SetPlayState(enum TPlayState) - ?SetPlayTime@CShowInfo@@QAEXI@Z @ 131 NONAME ; void CShowInfo::SetPlayTime(unsigned int) - ?SetPlayingPodcast@CPodcastModel@@QAEXPAVCShowInfo@@@Z @ 132 NONAME ; void CPodcastModel::SetPlayingPodcast(class CShowInfo *) - ?SetPosition@CShowInfo@@QAEXVTTimeIntervalMicroSeconds@@@Z @ 133 NONAME ; void CShowInfo::SetPosition(class TTimeIntervalMicroSeconds) - ?SetPosition@CSoundEngine@@QAEXI@Z @ 134 NONAME ; void CSoundEngine::SetPosition(unsigned int) - ?SetPubDate@CShowInfo@@QAEXVTTime@@@Z @ 135 NONAME ; void CShowInfo::SetPubDate(class TTime) - ?SetShowSize@CShowInfo@@QAEXI@Z @ 136 NONAME ; void CShowInfo::SetShowSize(unsigned int) - ?SetShowType@CShowInfo@@QAEXW4TShowType@@@Z @ 137 NONAME ; void CShowInfo::SetShowType(enum TShowType) - ?SetSpecificIAP@CSettingsEngine@@QAEXH@Z @ 138 NONAME ; void CSettingsEngine::SetSpecificIAP(int) - ?SetTitleL@CFeedInfo@@QAEXABVTDesC16@@@Z @ 139 NONAME ; void CFeedInfo::SetTitleL(class TDesC16 const &) - ?SetTitleL@CShowInfo@@QAEXABVTDesC16@@@Z @ 140 NONAME ; void CShowInfo::SetTitleL(class TDesC16 const &) - ?SetTrackNo@CShowInfo@@QAEXI@Z @ 141 NONAME ; void CShowInfo::SetTrackNo(unsigned int) - ?SetUid@CShowInfo@@QAEXI@Z @ 142 NONAME ; void CShowInfo::SetUid(unsigned int) - ?SetUpdateAutomatically@CSettingsEngine@@QAEXW4TAutoUpdateSetting@@@Z @ 143 NONAME ; void CSettingsEngine::SetUpdateAutomatically(enum TAutoUpdateSetting) - ?SetUpdateFeedInterval@CSettingsEngine@@QAEXH@Z @ 144 NONAME ; void CSettingsEngine::SetUpdateFeedInterval(int) - ?SetUpdateFeedTime@CSettingsEngine@@QAEXVTTime@@@Z @ 145 NONAME ; void CSettingsEngine::SetUpdateFeedTime(class TTime) - ?SetUrlL@CFeedInfo@@QAEXABVTDesC16@@@Z @ 146 NONAME ; void CFeedInfo::SetUrlL(class TDesC16 const &) - ?SetUrlL@CShowInfo@@QAEXABVTDesC16@@@Z @ 147 NONAME ; void CShowInfo::SetUrlL(class TDesC16 const &) - ?SettingsEngine@CPodcastModel@@QAEAAVCSettingsEngine@@XZ @ 148 NONAME ; class CSettingsEngine & CPodcastModel::SettingsEngine(void) - ?ShowDownloading@CShowEngine@@QAEPAVCShowInfo@@XZ @ 149 NONAME ; class CShowInfo * CShowEngine::ShowDownloading(void) - ?ShowEngine@CPodcastModel@@QAEAAVCShowEngine@@XZ @ 150 NONAME ; class CShowEngine & CPodcastModel::ShowEngine(void) - ?ShowSize@CShowInfo@@QBEIXZ @ 151 NONAME ; unsigned int CShowInfo::ShowSize(void) const - ?ShowType@CShowInfo@@QBE?AW4TShowType@@XZ @ 152 NONAME ; enum TShowType CShowInfo::ShowType(void) const - ?SoundEngine@CPodcastModel@@QAEAAVCSoundEngine@@XZ @ 153 NONAME ; class CSoundEngine & CPodcastModel::SoundEngine(void) - ?SpecificIAP@CSettingsEngine@@QAEHXZ @ 154 NONAME ; int CSettingsEngine::SpecificIAP(void) - ?State@CSoundEngine@@QAE?AW4TSoundEngineState@@XZ @ 155 NONAME ; enum TSoundEngineState CSoundEngine::State(void) - ?Stop@CSoundEngine@@QAEXH@Z @ 156 NONAME ; void CSoundEngine::Stop(int) - ?SuspendDownloads@CShowEngine@@QAEXXZ @ 157 NONAME ; void CShowEngine::SuspendDownloads(void) - ?Title@CFeedInfo@@QBEABVTDesC16@@XZ @ 158 NONAME ; class TDesC16 const & CFeedInfo::Title(void) const - ?Title@CShowInfo@@QBEABVTDesC16@@XZ @ 159 NONAME ; class TDesC16 const & CShowInfo::Title(void) const - ?TrackNo@CShowInfo@@QBEIXZ @ 160 NONAME ; unsigned int CShowInfo::TrackNo(void) const - ?Uid@CFeedInfo@@QBEIXZ @ 161 NONAME ; unsigned int CFeedInfo::Uid(void) const - ?Uid@CShowInfo@@QBEIXZ @ 162 NONAME ; unsigned int CShowInfo::Uid(void) const - ?UpdateAllFeedsL@CFeedEngine@@QAEXH@Z @ 163 NONAME ; void CFeedEngine::UpdateAllFeedsL(int) - ?UpdateAutomatically@CSettingsEngine@@QAE?AW4TAutoUpdateSetting@@XZ @ 164 NONAME ; enum TAutoUpdateSetting CSettingsEngine::UpdateAutomatically(void) - ?UpdateFeed@CFeedEngine@@QAEXPAVCFeedInfo@@@Z @ 165 NONAME ; void CFeedEngine::UpdateFeed(class CFeedInfo *) - ?UpdateFeedInterval@CSettingsEngine@@QAEHXZ @ 166 NONAME ; int CSettingsEngine::UpdateFeedInterval(void) - ?UpdateFeedL@CFeedEngine@@QAEHI@Z @ 167 NONAME ; int CFeedEngine::UpdateFeedL(unsigned int) - ?UpdateFeedTime@CSettingsEngine@@QAE?AVTTime@@XZ @ 168 NONAME ; class TTime CSettingsEngine::UpdateFeedTime(void) - ?UpdateIAPListL@CPodcastModel@@QAEXXZ @ 169 NONAME ; void CPodcastModel::UpdateIAPListL(void) - ?UpdateSNAPListL@CPodcastModel@@QAEXXZ @ 170 NONAME ; void CPodcastModel::UpdateSNAPListL(void) - ?UpdateShow@CShowEngine@@QAEXAAVCShowInfo@@@Z @ 171 NONAME ; void CShowEngine::UpdateShow(class CShowInfo &) - ?Url@CFeedInfo@@QBEABVTDesC16@@XZ @ 172 NONAME ; class TDesC16 const & CFeedInfo::Url(void) const - ?Url@CShowInfo@@QBEABVTDesC16@@XZ @ 173 NONAME ; class TDesC16 const & CShowInfo::Url(void) const - ?XMLEncode@PodcastUtils@@SAXAAVTDes16@@@Z @ 174 NONAME ; void PodcastUtils::XMLEncode(class TDes16 &) - ?AddObserver@CConnectionEngine@@QAEXPAVMConnectionObserver@@@Z @ 175 NONAME ; void CConnectionEngine::AddObserver(class MConnectionObserver *) + ?FeedUid@CShowInfo@@QBEIXZ @ 39 NONAME ; unsigned int CShowInfo::FeedUid(void) const + ?FileName@CShowInfo@@QBEABVTDesC16@@XZ @ 40 NONAME ; class TDesC16 const & CShowInfo::FileName(void) const + ?FileNameFromUrl@PodcastUtils@@SAXABVTDesC16@@AAV?$TBuf@$0BAA@@@@Z @ 41 NONAME ; void PodcastUtils::FileNameFromUrl(class TDesC16 const &, class TBuf<256> &) + ?FixProtocolsL@PodcastUtils@@SAXAAVTDes16@@@Z @ 42 NONAME ; void PodcastUtils::FixProtocolsL(class TDes16 &) + ?GetAllShowsL@CShowEngine@@QAEXAAV?$RPointerArray@VCShowInfo@@@@@Z @ 43 NONAME ; void CShowEngine::GetAllShowsL(class RPointerArray &) + ?GetFeedInfoByUid@CFeedEngine@@QAEPAVCFeedInfo@@I@Z @ 44 NONAME ; class CFeedInfo * CFeedEngine::GetFeedInfoByUid(unsigned int) + ?GetMimeType@CShowEngine@@QAEXABVTDesC16@@AAVTDes16@@@Z @ 45 NONAME ; void CShowEngine::GetMimeType(class TDesC16 const &, class TDes16 &) + ?GetNewShowsL@CShowEngine@@QAEXAAV?$RPointerArray@VCShowInfo@@@@@Z @ 46 NONAME ; void CShowEngine::GetNewShowsL(class RPointerArray &) + ?GetNextShowByTrackL@CShowEngine@@QAEPAVCShowInfo@@PAV2@@Z @ 47 NONAME ; class CShowInfo * CShowEngine::GetNextShowByTrackL(class CShowInfo *) + ?GetNumDownloadingShows@CShowEngine@@QAEHXZ @ 48 NONAME ; int CShowEngine::GetNumDownloadingShows(void) + ?GetSearchResults@CFeedEngine@@QAEABV?$RPointerArray@VCFeedInfo@@@@XZ @ 49 NONAME ; class RPointerArray const & CFeedEngine::GetSearchResults(void) + ?GetShowByUidL@CShowEngine@@QAEPAVCShowInfo@@I@Z @ 50 NONAME ; class CShowInfo * CShowEngine::GetShowByUidL(unsigned int) + ?GetShowsByFeedL@CPodcastModel@@QAEXI@Z @ 51 NONAME ; void CPodcastModel::GetShowsByFeedL(unsigned int) + ?GetShowsByFeedL@CShowEngine@@QAEXAAV?$RPointerArray@VCShowInfo@@@@I@Z @ 52 NONAME ; void CShowEngine::GetShowsByFeedL(class RPointerArray &, unsigned int) + ?GetShowsDownloadedL@CShowEngine@@QAEXAAV?$RPointerArray@VCShowInfo@@@@@Z @ 53 NONAME ; void CShowEngine::GetShowsDownloadedL(class RPointerArray &) + ?GetShowsDownloadingL@CPodcastModel@@QAEXXZ @ 54 NONAME ; void CPodcastModel::GetShowsDownloadingL(void) + ?GetShowsDownloadingL@CShowEngine@@QAEXAAV?$RPointerArray@VCShowInfo@@@@@Z @ 55 NONAME ; void CShowEngine::GetShowsDownloadingL(class RPointerArray &) + ?GetSortedFeeds@CFeedEngine@@QAEABV?$RPointerArray@VCFeedInfo@@@@XZ @ 56 NONAME ; class RPointerArray const & CFeedEngine::GetSortedFeeds(void) + ?GetStatsByFeedL@CFeedEngine@@QAEXIAAI0@Z @ 57 NONAME ; void CFeedEngine::GetStatsByFeedL(unsigned int, unsigned int &, unsigned int &) + ?IAPIds@CPodcastModel@@QAEAAV?$RArray@VTPodcastIAPItem@@@@XZ @ 58 NONAME ; class RArray & CPodcastModel::IAPIds(void) + ?IAPNames@CPodcastModel@@QAEPAVCDesC16ArrayFlat@@XZ @ 59 NONAME ; class CDesC16ArrayFlat * CPodcastModel::IAPNames(void) + ?ImageFileName@CFeedInfo@@QBEABVTDesC16@@XZ @ 60 NONAME ; class TDesC16 const & CFeedInfo::ImageFileName(void) const + ?ImageHandler@CPodcastModel@@QAEAAVCImageHandler@@XZ @ 61 NONAME ; class CImageHandler & CPodcastModel::ImageHandler(void) + ?ImageUrl@CFeedInfo@@QBEABVTDesC16@@XZ @ 62 NONAME ; class TDesC16 const & CFeedInfo::ImageUrl(void) const + ?ImportFeedsL@CFeedEngine@@QAEXABVTDesC16@@@Z @ 63 NONAME ; void CFeedEngine::ImportFeedsL(class TDesC16 const &) + ?IsFirstStartup@CPodcastModel@@QAEHXZ @ 64 NONAME ; int CPodcastModel::IsFirstStartup(void) + ?LastError@CFeedInfo@@QBEHXZ @ 65 NONAME ; int CFeedInfo::LastError(void) const + ?LastError@CShowInfo@@QBEHXZ @ 66 NONAME ; int CShowInfo::LastError(void) const + ?LastUpdated@CFeedInfo@@QBE?AVTTime@@XZ @ 67 NONAME ; class TTime CFeedInfo::LastUpdated(void) const + ?Link@CFeedInfo@@QBEABVTDesC16@@XZ @ 68 NONAME ; class TDesC16 const & CFeedInfo::Link(void) const + ?LoadFileAndScaleL@CImageHandler@@QAEXPAVCFbsBitmap@@ABV?$TBuf@$0BAA@@@ABVTSize@@AAVMImageHandlerCallback@@IH@Z @ 69 NONAME ; void CImageHandler::LoadFileAndScaleL(class CFbsBitmap *, class TBuf<256> const &, class TSize const &, class MImageHandlerCallback &, unsigned int, int) + ?MarkSelectionPlayedL@CPodcastModel@@QAEXXZ @ 70 NONAME ; void CPodcastModel::MarkSelectionPlayedL(void) + ?MetaDataReader@CShowEngine@@QAEAAVCMetaDataReader@@XZ @ 71 NONAME ; class CMetaDataReader & CShowEngine::MetaDataReader(void) + ?NewL@CFeedInfo@@SAPAV1@XZ @ 72 NONAME ; class CFeedInfo * CFeedInfo::NewL(void) + ?NewL@CImageHandler@@SAPAV1@AAVRFs@@AAVCPodcastModel@@@Z @ 73 NONAME ; class CImageHandler * CImageHandler::NewL(class RFs &, class CPodcastModel &) + ?NewL@CPodcastModel@@SAPAV1@XZ @ 74 NONAME ; class CPodcastModel * CPodcastModel::NewL(void) + ?NewL@CShowEngine@@SAPAV1@AAVCPodcastModel@@@Z @ 75 NONAME ; class CShowEngine * CShowEngine::NewL(class CPodcastModel &) + ?NewL@CShowInfo@@SAPAV1@I@Z @ 76 NONAME ; class CShowInfo * CShowInfo::NewL(unsigned int) + ?NewLC@CFeedInfo@@SAPAV1@XZ @ 77 NONAME ; class CFeedInfo * CFeedInfo::NewLC(void) + ?NewLC@CImageHandler@@SAPAV1@AAVRFs@@AAVCPodcastModel@@@Z @ 78 NONAME ; class CImageHandler * CImageHandler::NewLC(class RFs &, class CPodcastModel &) + ?NewLC@CShowInfo@@SAPAV1@I@Z @ 79 NONAME ; class CShowInfo * CShowInfo::NewLC(unsigned int) + ?NotifyShowListUpdatedL@CShowEngine@@QAEXXZ @ 80 NONAME ; void CShowEngine::NotifyShowListUpdatedL(void) + ?OpmlParsingCompleteL@CFeedEngine@@QAEXHI@Z @ 81 NONAME ; void CFeedEngine::OpmlParsingCompleteL(int, unsigned int) + ?PlayPausePodcastL@CPodcastModel@@QAEXPAVCShowInfo@@H@Z @ 82 NONAME ; void CPodcastModel::PlayPausePodcastL(class CShowInfo *, int) + ?PlayState@CShowInfo@@QBE?AW4TPlayState@@XZ @ 83 NONAME ; enum TPlayState CShowInfo::PlayState(void) const + ?PlayTime@CShowInfo@@QBEIXZ @ 84 NONAME ; unsigned int CShowInfo::PlayTime(void) const + ?PlayingPodcast@CPodcastModel@@QAEPAVCShowInfo@@XZ @ 85 NONAME ; class CShowInfo * CPodcastModel::PlayingPodcast(void) + ?Position@CShowInfo@@QBE?AVTTimeIntervalMicroSeconds@@XZ @ 86 NONAME ; class TTimeIntervalMicroSeconds CShowInfo::Position(void) const + ?PubDate@CShowInfo@@QBE?BVTTime@@XZ @ 87 NONAME ; class TTime const CShowInfo::PubDate(void) const + ?RemoveAllDownloadsL@CShowEngine@@QAEXXZ @ 88 NONAME ; void CShowEngine::RemoveAllDownloadsL(void) + ?RemoveAllFormatting@PodcastUtils@@SAXAAVTDes16@@@Z @ 89 NONAME ; void PodcastUtils::RemoveAllFormatting(class TDes16 &) + ?RemoveDownloadL@CShowEngine@@QAEXI@Z @ 90 NONAME ; void CShowEngine::RemoveDownloadL(unsigned int) + ?RemoveFeedL@CFeedEngine@@QAEXI@Z @ 91 NONAME ; void CFeedEngine::RemoveFeedL(unsigned int) + ?RemoveObserver@CFeedEngine@@QAEXPAVMFeedEngineObserver@@@Z @ 92 NONAME ; void CFeedEngine::RemoveObserver(class MFeedEngineObserver *) + ?RemoveObserver@CShowEngine@@QAEXPAVMShowEngineObserver@@@Z @ 93 NONAME ; void CShowEngine::RemoveObserver(class MShowEngineObserver *) + ?ReplaceChar@PodcastUtils@@SAXAAVTDes16@@II@Z @ 94 NONAME ; void PodcastUtils::ReplaceChar(class TDes16 &, unsigned int, unsigned int) + ?ReplaceString@PodcastUtils@@SAXAAVTDes16@@ABVTDesC16@@1@Z @ 95 NONAME ; void PodcastUtils::ReplaceString(class TDes16 &, class TDesC16 const &, class TDesC16 const &) + ?ResumeDownloadsL@CShowEngine@@QAEXXZ @ 96 NONAME ; void CShowEngine::ResumeDownloadsL(void) + ?SNAPIds@CPodcastModel@@QAEAAV?$RArray@VTPodcastIAPItem@@@@XZ @ 97 NONAME ; class RArray & CPodcastModel::SNAPIds(void) + ?SNAPNames@CPodcastModel@@QAEPAVCDesC16ArrayFlat@@XZ @ 98 NONAME ; class CDesC16ArrayFlat * CPodcastModel::SNAPNames(void) + ?SQLEncode@PodcastUtils@@SAXAAVTDes16@@@Z @ 99 NONAME ; void PodcastUtils::SQLEncode(class TDes16 &) + ?SaveSettingsL@CSettingsEngine@@QAEXXZ @ 100 NONAME ; void CSettingsEngine::SaveSettingsL(void) + ?ScaledBitmap@CImageHandler@@QAEPAVCFbsBitmap@@XZ @ 101 NONAME ; class CFbsBitmap * CImageHandler::ScaledBitmap(void) + ?SearchForFeedL@CFeedEngine@@QAEXAAVTDesC16@@@Z @ 102 NONAME ; void CFeedEngine::SearchForFeedL(class TDesC16 &) + ?SetActiveFeedInfo@CPodcastModel@@QAEXPAVCFeedInfo@@@Z @ 103 NONAME ; void CPodcastModel::SetActiveFeedInfo(class CFeedInfo *) + ?SetBaseDir@CSettingsEngine@@QAEXAAV?$TBuf@$0BAA@@@@Z @ 104 NONAME ; void CSettingsEngine::SetBaseDir(class TBuf<256> &) + ?SetBuildDate@CFeedInfo@@QAEXVTTime@@@Z @ 105 NONAME ; void CFeedInfo::SetBuildDate(class TTime) + ?SetCustomTitle@CFeedInfo@@QAEXXZ @ 106 NONAME ; void CFeedInfo::SetCustomTitle(void) + ?SetDescriptionL@CFeedInfo@@QAEXABVTDesC16@@@Z @ 107 NONAME ; void CFeedInfo::SetDescriptionL(class TDesC16 const &) + ?SetDescriptionL@CShowInfo@@QAEXABVTDesC16@@@Z @ 108 NONAME ; void CShowInfo::SetDescriptionL(class TDesC16 const &) + ?SetDownloadAutomatically@CSettingsEngine@@QAEXH@Z @ 109 NONAME ; void CSettingsEngine::SetDownloadAutomatically(int) + ?SetDownloadState@CShowInfo@@QAEXW4TDownloadState@@@Z @ 110 NONAME ; void CShowInfo::SetDownloadState(enum TDownloadState) + ?SetDownloadSuspended@CSettingsEngine@@QAEXH@Z @ 111 NONAME ; void CSettingsEngine::SetDownloadSuspended(int) + ?SetFeedIcon@CFeedInfo@@QAEXPAVCFbsBitmap@@@Z @ 112 NONAME ; void CFeedInfo::SetFeedIcon(class CFbsBitmap *) + ?SetFeedUid@CShowInfo@@QAEXI@Z @ 113 NONAME ; void CShowInfo::SetFeedUid(unsigned int) + ?SetFileNameL@CShowInfo@@QAEXABVTDesC16@@@Z @ 114 NONAME ; void CShowInfo::SetFileNameL(class TDesC16 const &) + ?SetImageFileNameL@CFeedInfo@@QAEXABVTDesC16@@PAVCPodcastModel@@@Z @ 115 NONAME ; void CFeedInfo::SetImageFileNameL(class TDesC16 const &, class CPodcastModel *) + ?SetImageUrlL@CFeedInfo@@QAEXABVTDesC16@@@Z @ 116 NONAME ; void CFeedInfo::SetImageUrlL(class TDesC16 const &) + ?SetLastError@CFeedInfo@@QAEXH@Z @ 117 NONAME ; void CFeedInfo::SetLastError(int) + ?SetLastError@CShowInfo@@QAEXH@Z @ 118 NONAME ; void CShowInfo::SetLastError(int) + ?SetLastUpdated@CFeedInfo@@QAEXVTTime@@@Z @ 119 NONAME ; void CFeedInfo::SetLastUpdated(class TTime) + ?SetLinkL@CFeedInfo@@QAEXABVTDesC16@@@Z @ 120 NONAME ; void CFeedInfo::SetLinkL(class TDesC16 const &) + ?SetPlayState@CShowInfo@@QAEXW4TPlayState@@@Z @ 121 NONAME ; void CShowInfo::SetPlayState(enum TPlayState) + ?SetPlayTime@CShowInfo@@QAEXI@Z @ 122 NONAME ; void CShowInfo::SetPlayTime(unsigned int) + ?SetPlayingPodcast@CPodcastModel@@QAEXPAVCShowInfo@@@Z @ 123 NONAME ; void CPodcastModel::SetPlayingPodcast(class CShowInfo *) + ?SetPosition@CShowInfo@@QAEXVTTimeIntervalMicroSeconds@@@Z @ 124 NONAME ; void CShowInfo::SetPosition(class TTimeIntervalMicroSeconds) + ?SetPubDate@CShowInfo@@QAEXVTTime@@@Z @ 125 NONAME ; void CShowInfo::SetPubDate(class TTime) + ?SetShowSize@CShowInfo@@QAEXI@Z @ 126 NONAME ; void CShowInfo::SetShowSize(unsigned int) + ?SetShowType@CShowInfo@@QAEXW4TShowType@@@Z @ 127 NONAME ; void CShowInfo::SetShowType(enum TShowType) + ?SetSpecificIAP@CSettingsEngine@@QAEXH@Z @ 128 NONAME ; void CSettingsEngine::SetSpecificIAP(int) + ?SetTitleL@CFeedInfo@@QAEXABVTDesC16@@@Z @ 129 NONAME ; void CFeedInfo::SetTitleL(class TDesC16 const &) + ?SetTitleL@CShowInfo@@QAEXABVTDesC16@@@Z @ 130 NONAME ; void CShowInfo::SetTitleL(class TDesC16 const &) + ?SetTrackNo@CShowInfo@@QAEXI@Z @ 131 NONAME ; void CShowInfo::SetTrackNo(unsigned int) + ?SetUid@CShowInfo@@QAEXI@Z @ 132 NONAME ; void CShowInfo::SetUid(unsigned int) + ?SetUpdateAutomatically@CSettingsEngine@@QAEXW4TAutoUpdateSetting@@@Z @ 133 NONAME ; void CSettingsEngine::SetUpdateAutomatically(enum TAutoUpdateSetting) + ?SetUpdateFeedInterval@CSettingsEngine@@QAEXH@Z @ 134 NONAME ; void CSettingsEngine::SetUpdateFeedInterval(int) + ?SetUpdateFeedTime@CSettingsEngine@@QAEXVTTime@@@Z @ 135 NONAME ; void CSettingsEngine::SetUpdateFeedTime(class TTime) + ?SetUrlL@CFeedInfo@@QAEXABVTDesC16@@@Z @ 136 NONAME ; void CFeedInfo::SetUrlL(class TDesC16 const &) + ?SetUrlL@CShowInfo@@QAEXABVTDesC16@@@Z @ 137 NONAME ; void CShowInfo::SetUrlL(class TDesC16 const &) + ?SettingsEngine@CPodcastModel@@QAEAAVCSettingsEngine@@XZ @ 138 NONAME ; class CSettingsEngine & CPodcastModel::SettingsEngine(void) + ?ShowDownloading@CShowEngine@@QAEPAVCShowInfo@@XZ @ 139 NONAME ; class CShowInfo * CShowEngine::ShowDownloading(void) + ?ShowEngine@CPodcastModel@@QAEAAVCShowEngine@@XZ @ 140 NONAME ; class CShowEngine & CPodcastModel::ShowEngine(void) + ?ShowSize@CShowInfo@@QBEIXZ @ 141 NONAME ; unsigned int CShowInfo::ShowSize(void) const + ?ShowType@CShowInfo@@QBE?AW4TShowType@@XZ @ 142 NONAME ; enum TShowType CShowInfo::ShowType(void) const + ?SpecificIAP@CSettingsEngine@@QAEHXZ @ 143 NONAME ; int CSettingsEngine::SpecificIAP(void) + ?SuspendDownloads@CShowEngine@@QAEXXZ @ 144 NONAME ; void CShowEngine::SuspendDownloads(void) + ?Title@CFeedInfo@@QBEABVTDesC16@@XZ @ 145 NONAME ; class TDesC16 const & CFeedInfo::Title(void) const + ?Title@CShowInfo@@QBEABVTDesC16@@XZ @ 146 NONAME ; class TDesC16 const & CShowInfo::Title(void) const + ?TrackNo@CShowInfo@@QBEIXZ @ 147 NONAME ; unsigned int CShowInfo::TrackNo(void) const + ?Uid@CFeedInfo@@QBEIXZ @ 148 NONAME ; unsigned int CFeedInfo::Uid(void) const + ?Uid@CShowInfo@@QBEIXZ @ 149 NONAME ; unsigned int CShowInfo::Uid(void) const + ?UpdateAllFeedsL@CFeedEngine@@QAEXH@Z @ 150 NONAME ; void CFeedEngine::UpdateAllFeedsL(int) + ?UpdateAutomatically@CSettingsEngine@@QAE?AW4TAutoUpdateSetting@@XZ @ 151 NONAME ; enum TAutoUpdateSetting CSettingsEngine::UpdateAutomatically(void) + ?UpdateFeedInfoL@CFeedEngine@@QAEXPAVCFeedInfo@@@Z @ 152 NONAME ; void CFeedEngine::UpdateFeedInfoL(class CFeedInfo *) + ?UpdateFeedInterval@CSettingsEngine@@QAEHXZ @ 153 NONAME ; int CSettingsEngine::UpdateFeedInterval(void) + ?UpdateFeedL@CFeedEngine@@QAEHI@Z @ 154 NONAME ; int CFeedEngine::UpdateFeedL(unsigned int) + ?UpdateFeedTime@CSettingsEngine@@QAE?AVTTime@@XZ @ 155 NONAME ; class TTime CSettingsEngine::UpdateFeedTime(void) + ?UpdateIAPListL@CPodcastModel@@QAEXXZ @ 156 NONAME ; void CPodcastModel::UpdateIAPListL(void) + ?UpdateSNAPListL@CPodcastModel@@QAEXXZ @ 157 NONAME ; void CPodcastModel::UpdateSNAPListL(void) + ?UpdateShowL@CShowEngine@@QAEXAAVCShowInfo@@@Z @ 158 NONAME ; void CShowEngine::UpdateShowL(class CShowInfo &) + ?Url@CFeedInfo@@QBEABVTDesC16@@XZ @ 159 NONAME ; class TDesC16 const & CFeedInfo::Url(void) const + ?Url@CShowInfo@@QBEABVTDesC16@@XZ @ 160 NONAME ; class TDesC16 const & CShowInfo::Url(void) const + ?XMLEncode@PodcastUtils@@SAXAAVTDes16@@@Z @ 161 NONAME ; void PodcastUtils::XMLEncode(class TDes16 &) + ?DropDB@CPodcastModel@@QAEXXZ @ 162 NONAME ; void CPodcastModel::DropDB(void) diff -r 9569ea080d5a -r 4d230e702aa3 engine/eabi/podcastengineu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/engine/eabi/podcastengineu.def Tue Apr 27 19:26:48 2010 +0100 @@ -0,0 +1,200 @@ +EXPORTS + _ZN11CFeedEngine11AddObserverEP19MFeedEngineObserver @ 1 NONAME + _ZN11CFeedEngine11ClientStateEv @ 2 NONAME + _ZN11CFeedEngine11RemoveFeedLEj @ 3 NONAME + _ZN11CFeedEngine11UpdateFeedLEj @ 4 NONAME + _ZN11CFeedEngine12ExportFeedsLER4TBufILi256EE @ 5 NONAME + _ZN11CFeedEngine12ImportFeedsLERK7TDesC16 @ 6 NONAME + _ZN11CFeedEngine14GetSortedFeedsEv @ 7 NONAME + _ZN11CFeedEngine14RemoveObserverEP19MFeedEngineObserver @ 8 NONAME + _ZN11CFeedEngine14SearchForFeedLER7TDesC16 @ 9 NONAME + _ZN11CFeedEngine15ActiveClientUidEv @ 10 NONAME + _ZN11CFeedEngine15GetStatsByFeedLEjRjS0_ @ 11 NONAME + _ZN11CFeedEngine15UpdateAllFeedsLEi @ 12 NONAME + _ZN11CFeedEngine15UpdateFeedInfoLEP9CFeedInfo @ 13 NONAME + _ZN11CFeedEngine16AddSearchResultLEP9CFeedInfo @ 14 NONAME + _ZN11CFeedEngine16GetFeedInfoByUidEj @ 15 NONAME + _ZN11CFeedEngine16GetSearchResultsEv @ 16 NONAME + _ZN11CFeedEngine20CancelUpdateAllFeedsEv @ 17 NONAME + _ZN11CFeedEngine20OpmlParsingCompleteLEij @ 18 NONAME + _ZN11CFeedEngine8AddFeedLERK9CFeedInfo @ 19 NONAME + _ZN11CShowEngine11AddObserverEP19MShowEngineObserver @ 20 NONAME + _ZN11CShowEngine11DeleteShowLEji @ 21 NONAME + _ZN11CShowEngine11GetMimeTypeERK7TDesC16R6TDes16 @ 22 NONAME + _ZN11CShowEngine11UpdateShowLER9CShowInfo @ 23 NONAME + _ZN11CShowEngine12AddDownloadLER9CShowInfo @ 24 NONAME + _ZN11CShowEngine12GetAllShowsLER13RPointerArrayI9CShowInfoE @ 25 NONAME + _ZN11CShowEngine12GetNewShowsLER13RPointerArrayI9CShowInfoE @ 26 NONAME + _ZN11CShowEngine13GetShowByUidLEj @ 27 NONAME + _ZN11CShowEngine14MetaDataReaderEv @ 28 NONAME + _ZN11CShowEngine14RemoveObserverEP19MShowEngineObserver @ 29 NONAME + _ZN11CShowEngine15GetShowsByFeedLER13RPointerArrayI9CShowInfoEj @ 30 NONAME + _ZN11CShowEngine15RemoveDownloadLEj @ 31 NONAME + _ZN11CShowEngine15ShowDownloadingEv @ 32 NONAME + _ZN11CShowEngine16ResumeDownloadsLEv @ 33 NONAME + _ZN11CShowEngine16SuspendDownloadsEv @ 34 NONAME + _ZN11CShowEngine18DeletePlayedShowsLER13RPointerArrayI9CShowInfoE @ 35 NONAME + _ZN11CShowEngine19GetNextShowByTrackLEP9CShowInfo @ 36 NONAME + _ZN11CShowEngine19GetShowsDownloadedLER13RPointerArrayI9CShowInfoE @ 37 NONAME + _ZN11CShowEngine19RemoveAllDownloadsLEv @ 38 NONAME + _ZN11CShowEngine20DBGetShowByFileNameLE4TBufILi256EE @ 39 NONAME + _ZN11CShowEngine20GetShowsDownloadingLER13RPointerArrayI9CShowInfoE @ 40 NONAME + _ZN11CShowEngine21DeleteAllShowsByFeedLEji @ 41 NONAME + _ZN11CShowEngine21DeleteOldShowsByFeedLEj @ 42 NONAME + _ZN11CShowEngine22GetNumDownloadingShowsEv @ 43 NONAME + _ZN11CShowEngine22NotifyShowListUpdatedLEv @ 44 NONAME + _ZN11CShowEngine4NewLER13CPodcastModel @ 45 NONAME + _ZN11CShowEngine8AddShowLERK9CShowInfo @ 46 NONAME + _ZN11CShowEngineD0Ev @ 47 NONAME + _ZN11CShowEngineD1Ev @ 48 NONAME + _ZN11CShowEngineD2Ev @ 49 NONAME + _ZN12PodcastUtils10CleanHtmlLER6TDes16 @ 50 NONAME + _ZN12PodcastUtils11ReplaceCharER6TDes16jj @ 51 NONAME + _ZN12PodcastUtils13FixProtocolsLER6TDes16 @ 52 NONAME + _ZN12PodcastUtils13ReplaceStringER6TDes16RK7TDesC16S4_ @ 53 NONAME + _ZN12PodcastUtils15FileNameFromUrlERK7TDesC16R4TBufILi256EE @ 54 NONAME + _ZN12PodcastUtils19RemoveAllFormattingER6TDes16 @ 55 NONAME + _ZN12PodcastUtils20EnsureProperPathNameER4TBufILi256EE @ 56 NONAME + _ZN12PodcastUtils9SQLEncodeER6TDes16 @ 57 NONAME + _ZN12PodcastUtils9XMLEncodeER6TDes16 @ 58 NONAME + _ZN13CImageHandler12ScaledBitmapEv @ 59 NONAME + _ZN13CImageHandler17LoadFileAndScaleLEP10CFbsBitmapRK4TBufILi256EERK5TSizeR21MImageHandlerCallbackji @ 60 NONAME + _ZN13CImageHandler4NewLER3RFsR13CPodcastModel @ 61 NONAME + _ZN13CImageHandler5NewLCER3RFsR13CPodcastModel @ 62 NONAME + _ZN13CImageHandlerD0Ev @ 63 NONAME + _ZN13CImageHandlerD1Ev @ 64 NONAME + _ZN13CImageHandlerD2Ev @ 65 NONAME + _ZN13CPodcastModel10FeedEngineEv @ 66 NONAME + _ZN13CPodcastModel10ShowEngineEv @ 67 NONAME + _ZN13CPodcastModel12ImageHandlerEv @ 68 NONAME + _ZN13CPodcastModel14ActiveFeedInfoEv @ 69 NONAME + _ZN13CPodcastModel14ActiveShowListEv @ 70 NONAME + _ZN13CPodcastModel14IsFirstStartupEv @ 71 NONAME + _ZN13CPodcastModel14PlayingPodcastEv @ 72 NONAME + _ZN13CPodcastModel14SettingsEngineEv @ 73 NONAME + _ZN13CPodcastModel14UpdateIAPListLEv @ 74 NONAME + _ZN13CPodcastModel15GetShowsByFeedLEj @ 75 NONAME + _ZN13CPodcastModel15UpdateSNAPListLEv @ 76 NONAME + _ZN13CPodcastModel16ConnectionEngineEv @ 77 NONAME + _ZN13CPodcastModel17PlayPausePodcastLEP9CShowInfoi @ 78 NONAME + _ZN13CPodcastModel17SetActiveFeedInfoEP9CFeedInfo @ 79 NONAME + _ZN13CPodcastModel17SetPlayingPodcastEP9CShowInfo @ 80 NONAME + _ZN13CPodcastModel20GetShowsDownloadingLEv @ 81 NONAME + _ZN13CPodcastModel20MarkSelectionPlayedLEv @ 82 NONAME + _ZN13CPodcastModel4NewLEv @ 83 NONAME + _ZN13CPodcastModel6DropDBEv @ 84 NONAME + _ZN13CPodcastModel6IAPIdsEv @ 85 NONAME + _ZN13CPodcastModel7SNAPIdsEv @ 86 NONAME + _ZN13CPodcastModel8IAPNamesEv @ 87 NONAME + _ZN13CPodcastModel9SNAPNamesEv @ 88 NONAME + _ZN15CSettingsEngine10SetBaseDirER4TBufILi256EE @ 89 NONAME + _ZN15CSettingsEngine11SpecificIAPEv @ 90 NONAME + _ZN15CSettingsEngine13SaveSettingsLEv @ 91 NONAME + _ZN15CSettingsEngine14SetSpecificIAPEi @ 92 NONAME + _ZN15CSettingsEngine14UpdateFeedTimeEv @ 93 NONAME + _ZN15CSettingsEngine17DownloadSuspendedEv @ 94 NONAME + _ZN15CSettingsEngine17SetUpdateFeedTimeE5TTime @ 95 NONAME + _ZN15CSettingsEngine18UpdateFeedIntervalEv @ 96 NONAME + _ZN15CSettingsEngine19UpdateAutomaticallyEv @ 97 NONAME + _ZN15CSettingsEngine20SetDownloadSuspendedEi @ 98 NONAME + _ZN15CSettingsEngine21DownloadAutomaticallyEv @ 99 NONAME + _ZN15CSettingsEngine21SetUpdateFeedIntervalEi @ 100 NONAME + _ZN15CSettingsEngine22SetUpdateAutomaticallyE18TAutoUpdateSetting @ 101 NONAME + _ZN15CSettingsEngine24SetDownloadAutomaticallyEi @ 102 NONAME + _ZN15CSettingsEngine7BaseDirEv @ 103 NONAME + _ZN17CConnectionEngine11AddObserverEP19MConnectionObserver @ 104 NONAME + _ZN9CFeedInfo11SetFeedIconEP10CFbsBitmap @ 105 NONAME + _ZN9CFeedInfo12SetBuildDateE5TTime @ 106 NONAME + _ZN9CFeedInfo12SetImageUrlLERK7TDesC16 @ 107 NONAME + _ZN9CFeedInfo12SetLastErrorEi @ 108 NONAME + _ZN9CFeedInfo14SetCustomTitleEv @ 109 NONAME + _ZN9CFeedInfo14SetLastUpdatedE5TTime @ 110 NONAME + _ZN9CFeedInfo15SetDescriptionLERK7TDesC16 @ 111 NONAME + _ZN9CFeedInfo17SetImageFileNameLERK7TDesC16P13CPodcastModel @ 112 NONAME + _ZN9CFeedInfo4NewLEv @ 113 NONAME + _ZN9CFeedInfo5NewLCEv @ 114 NONAME + _ZN9CFeedInfo7SetUrlLERK7TDesC16 @ 115 NONAME + _ZN9CFeedInfo8SetLinkLERK7TDesC16 @ 116 NONAME + _ZN9CFeedInfo9SetTitleLERK7TDesC16 @ 117 NONAME + _ZN9CFeedInfoD0Ev @ 118 NONAME + _ZN9CFeedInfoD1Ev @ 119 NONAME + _ZN9CFeedInfoD2Ev @ 120 NONAME + _ZN9CShowInfo10SetFeedUidEj @ 121 NONAME + _ZN9CShowInfo10SetPubDateE5TTime @ 122 NONAME + _ZN9CShowInfo10SetTrackNoEj @ 123 NONAME + _ZN9CShowInfo11SetPlayTimeEj @ 124 NONAME + _ZN9CShowInfo11SetPositionE25TTimeIntervalMicroSeconds @ 125 NONAME + _ZN9CShowInfo11SetShowSizeEj @ 126 NONAME + _ZN9CShowInfo11SetShowTypeE9TShowType @ 127 NONAME + _ZN9CShowInfo12SetFileNameLERK7TDesC16 @ 128 NONAME + _ZN9CShowInfo12SetLastErrorEi @ 129 NONAME + _ZN9CShowInfo12SetPlayStateE10TPlayState @ 130 NONAME + _ZN9CShowInfo15SetDescriptionLERK7TDesC16 @ 131 NONAME + _ZN9CShowInfo16SetDownloadStateE14TDownloadState @ 132 NONAME + _ZN9CShowInfo4NewLEj @ 133 NONAME + _ZN9CShowInfo5NewLCEj @ 134 NONAME + _ZN9CShowInfo6SetUidEj @ 135 NONAME + _ZN9CShowInfo7SetUrlLERK7TDesC16 @ 136 NONAME + _ZN9CShowInfo9SetTitleLERK7TDesC16 @ 137 NONAME + _ZN9CShowInfoC1EPS_ @ 138 NONAME + _ZN9CShowInfoC2EPS_ @ 139 NONAME + _ZN9CShowInfoD0Ev @ 140 NONAME + _ZN9CShowInfoD1Ev @ 141 NONAME + _ZN9CShowInfoD2Ev @ 142 NONAME + _ZNK9CFeedInfo11CustomTitleEv @ 143 NONAME + _ZNK9CFeedInfo11DescriptionEv @ 144 NONAME + _ZNK9CFeedInfo11LastUpdatedEv @ 145 NONAME + _ZNK9CFeedInfo13ImageFileNameEv @ 146 NONAME + _ZNK9CFeedInfo3UidEv @ 147 NONAME + _ZNK9CFeedInfo3UrlEv @ 148 NONAME + _ZNK9CFeedInfo4LinkEv @ 149 NONAME + _ZNK9CFeedInfo5CopyLEv @ 150 NONAME + _ZNK9CFeedInfo5TitleEv @ 151 NONAME + _ZNK9CFeedInfo8FeedIconEv @ 152 NONAME + _ZNK9CFeedInfo8ImageUrlEv @ 153 NONAME + _ZNK9CFeedInfo9BuildDateEv @ 154 NONAME + _ZNK9CFeedInfo9LastErrorEv @ 155 NONAME + _ZNK9CShowInfo11DescriptionEv @ 156 NONAME + _ZNK9CShowInfo13DownloadStateEv @ 157 NONAME + _ZNK9CShowInfo3UidEv @ 158 NONAME + _ZNK9CShowInfo3UrlEv @ 159 NONAME + _ZNK9CShowInfo5TitleEv @ 160 NONAME + _ZNK9CShowInfo7FeedUidEv @ 161 NONAME + _ZNK9CShowInfo7PubDateEv @ 162 NONAME + _ZNK9CShowInfo7TrackNoEv @ 163 NONAME + _ZNK9CShowInfo8FileNameEv @ 164 NONAME + _ZNK9CShowInfo8PlayTimeEv @ 165 NONAME + _ZNK9CShowInfo8PositionEv @ 166 NONAME + _ZNK9CShowInfo8ShowSizeEv @ 167 NONAME + _ZNK9CShowInfo8ShowTypeEv @ 168 NONAME + _ZNK9CShowInfo9LastErrorEv @ 169 NONAME + _ZNK9CShowInfo9PlayStateEv @ 170 NONAME + _ZTI10CFeedTimer @ 171 NONAME + _ZTI11CFeedEngine @ 172 NONAME + _ZTI11CFeedParser @ 173 NONAME + _ZTI11CHttpClient @ 174 NONAME + _ZTI11COpmlParser @ 175 NONAME + _ZTI11CShowEngine @ 176 NONAME + _ZTI13CImageHandler @ 177 NONAME + _ZTI13CPodcastModel @ 178 NONAME + _ZTI15CMetaDataReader @ 179 NONAME + _ZTI15CSettingsEngine @ 180 NONAME + _ZTI17CConnectionEngine @ 181 NONAME + _ZTI17CHttpEventHandler @ 182 NONAME + _ZTI9CFeedInfo @ 183 NONAME + _ZTI9CShowInfo @ 184 NONAME + _ZTV10CFeedTimer @ 185 NONAME + _ZTV11CFeedEngine @ 186 NONAME + _ZTV11CFeedParser @ 187 NONAME + _ZTV11CHttpClient @ 188 NONAME + _ZTV11COpmlParser @ 189 NONAME + _ZTV11CShowEngine @ 190 NONAME + _ZTV13CImageHandler @ 191 NONAME + _ZTV13CPodcastModel @ 192 NONAME + _ZTV15CMetaDataReader @ 193 NONAME + _ZTV15CSettingsEngine @ 194 NONAME + _ZTV17CConnectionEngine @ 195 NONAME + _ZTV17CHttpEventHandler @ 196 NONAME + _ZTV9CFeedInfo @ 197 NONAME + _ZTV9CShowInfo @ 198 NONAME + diff -r 9569ea080d5a -r 4d230e702aa3 engine/group/engine.mmp --- a/engine/group/engine.mmp Thu Mar 11 20:53:00 2010 +0100 +++ b/engine/group/engine.mmp Tue Apr 27 19:26:48 2010 +0100 @@ -31,13 +31,18 @@ SYSTEMINCLUDE \epoc32\include SYSTEMINCLUDE \epoc32\include\mw // needed for S^3 +#ifdef SQLITE_INCLUDED +SYSTEMINCLUDE ..\..\engine\sqlite\inc +#else +SYSTEMINCLUDE \epoc32\include\stdapis +#endif + // Engine SOURCE HttpClient.cpp SOURCE HttpEventHandler.cpp SOURCE FeedParser.cpp SOURCE FeedEngine.cpp SOURCE ShowInfo.cpp -SOURCE SoundEngine.cpp SOURCE FeedInfo.cpp SOURCE FeedTimer.cpp SOURCE ShowEngine.cpp @@ -75,3 +80,5 @@ LIBRARY fbscli.lib LIBRARY imageconversion.lib LIBRARY bitmaptransforms.lib +LIBRARY eikcore.lib +//staticlibrary sqlite_podcatcher.lib \ No newline at end of file diff -r 9569ea080d5a -r 4d230e702aa3 engine/inc/ConnectionEngine.h --- a/engine/inc/ConnectionEngine.h Thu Mar 11 20:53:00 2010 +0100 +++ b/engine/inc/ConnectionEngine.h Tue Apr 27 19:26:48 2010 +0100 @@ -90,7 +90,7 @@ // UI Setting TBool ConnectionSettingL(); - void ReportConnection(TInt aError); + void ReportConnectionL(TInt aError); void ReportConnectionSelectionStart(); void ReportConnectionSelectionEnd(); diff -r 9569ea080d5a -r 4d230e702aa3 engine/inc/FeedEngine.h --- a/engine/inc/FeedEngine.h Thu Mar 11 20:53:00 2010 +0100 +++ b/engine/inc/FeedEngine.h Tue Apr 27 19:26:48 2010 +0100 @@ -28,7 +28,7 @@ #include "Constants.h" #include "FeedEngineObserver.h" #include "FeedTimer.h" -#include "sqlite3.h" +#include class CPodcastModel; class COpmlParser; @@ -70,15 +70,14 @@ IMPORT_C void CancelUpdateAllFeeds(); IMPORT_C const RFeedInfoArray& GetSortedFeeds(); IMPORT_C CFeedInfo* GetFeedInfoByUid(TUint aFeedUid); - IMPORT_C void GetStatsByFeed(TUint aFeedUid, TUint &aNumShows, TUint &aNumUnplayed); - IMPORT_C void GetDownloadedStats(TUint &aNumShows, TUint &aNumUnplayed); + IMPORT_C void GetStatsByFeedL(TUint aFeedUid, TUint &aNumShows, TUint &aNumUnplayed); IMPORT_C void AddObserver(MFeedEngineObserver *observer); IMPORT_C void RemoveObserver(MFeedEngineObserver *observer); void RunFeedTimer(); - IMPORT_C void UpdateFeed(CFeedInfo *aItem); + IMPORT_C void UpdateFeedInfoL(CFeedInfo *aItem); /** * Returns the current internal state of the feed engine4 */ @@ -94,7 +93,8 @@ IMPORT_C void AddSearchResultL(CFeedInfo *item); IMPORT_C const RFeedInfoArray& GetSearchResults(); - IMPORT_C void OpmlParsingComplete(TInt aError, TUint aNumFeedsAdded); + IMPORT_C void OpmlParsingCompleteL(TInt aError, TUint aNumFeedsAdded); + void NotifyFeedUpdateComplete(TInt aFeedUid, TInt aError); protected: static TInt CompareFeedsByTitle(const CFeedInfo &a, const CFeedInfo &b); @@ -117,18 +117,17 @@ void GetFeedImageL(CFeedInfo *aFeedInfo); void UpdateNextFeedL(); - void NotifyFeedUpdateComplete(TInt aError); - void NotifyOpmlParsingComplete(TInt aError, TUint aNumFeedsAdded); + void NotifyOpmlParsingCompleteL(TInt aError, TUint aNumFeedsAdded); private: void DBLoadFeedsL(); - TBool DBRemoveFeed(TUint aUid); - TBool DBAddFeedL(const CFeedInfo& aTtem); + void DBRemoveFeedL(TUint aUid); + void DBAddFeedL(const CFeedInfo& aTtem); CFeedInfo* DBGetFeedInfoByUidL(TUint aFeedUid); - TUint DBGetFeedCount(); - TBool DBUpdateFeed(const CFeedInfo& aItem); - void DBGetStatsByFeed(TUint aFeedUid, TUint &aNumShows, TUint &aNumUnplayed); + TUint DBGetFeedCountL(); + void DBUpdateFeedL(const CFeedInfo& aItem); + void DBGetStatsByFeedL(TUint aFeedUid, TUint &aNumShows, TUint &aNumUnplayed); private: @@ -147,7 +146,7 @@ CFeedInfo *iActiveFeed; TFileName iUpdatingFeedFileName; TFileName iSearchResultsFileName; - RFeedInfoArray iFeedsUpdating; + RArray iFeedsUpdating; // observers that will receive callbacks, not owning RArray iObservers; diff -r 9569ea080d5a -r 4d230e702aa3 engine/inc/FeedInfo.h --- a/engine/inc/FeedInfo.h Thu Mar 11 20:53:00 2010 +0100 +++ b/engine/inc/FeedInfo.h Tue Apr 27 19:26:48 2010 +0100 @@ -60,7 +60,7 @@ IMPORT_C TUint Uid() const; IMPORT_C const TDesC& ImageFileName() const; - IMPORT_C void SetImageFileNameL(const TDesC &aFileName); + IMPORT_C void SetImageFileNameL(const TDesC &aFileName, CPodcastModel* aPodcastModel); IMPORT_C void SetCustomTitle(); IMPORT_C TBool CustomTitle() const; @@ -71,12 +71,10 @@ IMPORT_C CFbsBitmap* FeedIcon() const; IMPORT_C void SetFeedIcon(CFbsBitmap* aBitmapToClone); - IMPORT_C TInt FeedIconIndex() const; - IMPORT_C void SetFeedIconIndex(TInt aIndex); private: CFeedInfo(); void ConstructL(); - void ImageOperationCompleteL(TInt aError, TUint aHandle); + void ImageOperationCompleteL(TInt aError, TUint aHandle, CPodcastModel& aPodcastModel); private: HBufC* iUrl; HBufC* iTitle; @@ -90,7 +88,6 @@ TBool iCustomTitle; TInt iLastError; CFbsBitmap* iFeedIcon; - TInt iFeedIconIndex; }; typedef RPointerArray RFeedInfoArray; diff -r 9569ea080d5a -r 4d230e702aa3 engine/inc/ImageHandler.h --- a/engine/inc/ImageHandler.h Thu Mar 11 20:53:00 2010 +0100 +++ b/engine/inc/ImageHandler.h Tue Apr 27 19:26:48 2010 +0100 @@ -22,6 +22,7 @@ #include #include #include +class CPodcastModel; /** * Listener interface that can be used to listen for image loading operation @@ -42,8 +43,10 @@ * Called by CImageHandler when an image has been loaded. * @param aError Error code given by the CImageHandler or 0 (zero) if the * image was loaded successfully. + * @param image handle + * @param reference to podcast model */ - virtual void ImageOperationCompleteL(TInt aError, TUint aHandle) = 0; + virtual void ImageOperationCompleteL(TInt aError, TUint aHandle, CPodcastModel& aPodcastModel) = 0; }; // ============================================================================ @@ -65,27 +68,22 @@ public: // Constructors and destructor /** * Factory method that constructs a CImageHandler by using the NewLC method - * and then cleans the cleanup stack. - * @param aBitmap Bitmap where the image data is loaded to. - * @param aScaledBitmap Bitmap where the scaled image data is loaded to. + * and then cleans the cleanup stack. * @param aFs File server reference that is used to load the image data. - * @param aCallback Listener interface implementation that is notified + * @param Reference to podcast model * when an image has been loaded. * @return pointer to created CImageHandler-object */ - IMPORT_C static CImageHandler* NewL(RFs& aFs); + IMPORT_C static CImageHandler* NewL(RFs& aFs,CPodcastModel& aPodcastModel); /** * Factory method that constructs a CImageHandler and leaves it to the * cleanup stack. - * @param aBitmap Bitmap where the image data is loaded to. - * @param aScaledBitmap Bitmap where the scaled image data is loaded to. * @param aFs File server reference that is used to load the image data. - * @param aCallback Listener interface implementation that is notified - * when an image has been loaded. + * @param Reference to podcast model * @return pointer to created CImageHandler-object */ - IMPORT_C static CImageHandler* NewLC(RFs& aFs); + IMPORT_C static CImageHandler* NewLC(RFs& aFs,CPodcastModel& aPodcastModel); /** * Desctructor. Destroys the CImageDecoder used by the image handler. */ @@ -142,13 +140,12 @@ protected: /** * C++ default constructor. Just stores the given parameters to - * corresponding attributes. - * @param aScaledBitmap Bitmap where the scaled image data is loaded to. + * corresponding attributes. * @param aFs File server reference that is used to load the image data. - * @param aCallback Listener interface implementation that is notified + * @param Reference to podcast model * when an image has been loaded. */ - CImageHandler(RFs& aFs); + CImageHandler(RFs& aFs, CPodcastModel& aPodcastModel); /** * 2nd phase constructor. Adds this object to the active scheduler. */ @@ -182,6 +179,9 @@ /* Handle passed back to caller */ TUint iHandle; + + /** Reference to the podcast model used for callbacks to be able to notify*/ + CPodcastModel& iPodcastModel; }; #endif diff -r 9569ea080d5a -r 4d230e702aa3 engine/inc/MetaDataReaderObserver.h --- a/engine/inc/MetaDataReaderObserver.h Thu Mar 11 20:53:00 2010 +0100 +++ b/engine/inc/MetaDataReaderObserver.h Tue Apr 27 19:26:48 2010 +0100 @@ -21,7 +21,7 @@ class MMetaDataReaderObserver { public: - virtual void ReadMetaData(CShowInfo& aShowInfo) = 0; + virtual void ReadMetaDataL(CShowInfo& aShowInfo) = 0; virtual void ReadMetaDataCompleteL() = 0; }; diff -r 9569ea080d5a -r 4d230e702aa3 engine/inc/PodcastModel.h --- a/engine/inc/PodcastModel.h Thu Mar 11 20:53:00 2010 +0100 +++ b/engine/inc/PodcastModel.h Tue Apr 27 19:26:48 2010 +0100 @@ -29,14 +29,13 @@ #include "FeedInfo.h" #include "ShowInfo.h" #include "debug.h" -#include "sqlite3.h" +#include #include "ImageHandler.h" // SQLite leaks memory when sorting, so to test our own memory leaks we need to disable this //#define DONT_SORT_SQL class RCmManager; class CFeedEngine; -class CSoundEngine; class CShowEngine; class CSettingsEngine; class CCommsDatabase; @@ -60,7 +59,6 @@ IMPORT_C ~CPodcastModel(); IMPORT_C CFeedEngine& FeedEngine(); IMPORT_C CShowEngine& ShowEngine(); - IMPORT_C CSoundEngine& SoundEngine(); IMPORT_C CSettingsEngine& SettingsEngine(); IMPORT_C CConnectionEngine& ConnectionEngine(); IMPORT_C CShowInfo* PlayingPodcast(); @@ -87,13 +85,11 @@ TInt GetIapId(); sqlite3* DB(); + IMPORT_C void DropDB(); - IMPORT_C void GetAllShowsL(); - IMPORT_C void GetNewShowsL(); - IMPORT_C void GetShowsDownloadedL(); IMPORT_C void GetShowsDownloadingL(); IMPORT_C void GetShowsByFeedL(TUint aFeedUid); - IMPORT_C void MarkSelectionPlayed(); + IMPORT_C void MarkSelectionPlayedL(); TInt FindActiveShowByUid(TUint aUid); IMPORT_C TBool IsFirstStartup(); @@ -101,14 +97,15 @@ protected: CPodcastModel(); void ConstructL(); + void ResetDB(); + void OpenDBL(); // From ImageHandler - void ImageOperationCompleteL(TInt aError, TUint aHandle); + void ImageOperationCompleteL(TInt aError, TUint aHandle, CPodcastModel& aPodcastModel); private: CShowInfo* iPlayingPodcast; CFeedEngine* iFeedEngine; CShowEngine* iShowEngine; - CSoundEngine* iSoundEngine; CSettingsEngine *iSettingsEngine; CConnectionEngine* iConnectionEngine; RShowInfoArray iActiveShowList; diff -r 9569ea080d5a -r 4d230e702aa3 engine/inc/PodcastUtils.h --- a/engine/inc/PodcastUtils.h Thu Mar 11 20:53:00 2010 +0100 +++ b/engine/inc/PodcastUtils.h Tue Apr 27 19:26:48 2010 +0100 @@ -20,10 +20,25 @@ #define PODCASTUTILS_H_ #include +#include + +// Cleanup stack macro for SQLite3 +static void Cleanup_sqlite3_finalize_wrapper(TAny* handle) + { + sqlite3_finalize(static_cast(handle)); + } + +#define Cleanup_sqlite3_finalize_PushL(__handle) CleanupStack::PushL(TCleanupItem(&Cleanup_sqlite3_finalize_wrapper, __handle)) _LIT(KURLPrefix, "http://"); _LIT(KItpcPrefix, "itpc://"); -_LIT(KPcastPrefix, "pcast://"); +_LIT(KPcastPrefix, "pcast://"); + +_LIT(KVideoFormat1, ".wmv"); +_LIT(KVideoFormat2, ".avi"); +_LIT(KVideoFormat3, ".mp4"); + + class PodcastUtils { @@ -37,6 +52,7 @@ IMPORT_C static void SQLEncode(TDes &aString); IMPORT_C static void XMLEncode(TDes &aString); IMPORT_C static void RemoveAllFormatting(TDes & aString); + IMPORT_C static TBool IsVideoShow(TDesC &aUrl); }; #endif /* PODCASTUTILS_H_ */ diff -r 9569ea080d5a -r 4d230e702aa3 engine/inc/Podcatcher.pan --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/engine/inc/Podcatcher.pan Tue Apr 27 19:26:48 2010 +0100 @@ -0,0 +1,37 @@ +/* +* Copyright (c) 2010 Sebastian Brannstrom +* +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* EmbedDev AB - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#ifndef __PODCATCHER_PAN__ +#define __PODCATCHER_PAN__ + +enum TPodcatcherPanics + { + EPodcatcherPanicDB = 1, + EPodcatcherPanicAlreadyActive, + EPodcatcherPanicFeedEngineState, + EPodcatcherPanicFeedView + }; + + +inline void Panic(TPodcatcherPanics aReason) + { + _LIT(applicationName,"Podcatcher"); + User::Panic(applicationName, aReason); + } + +#endif diff -r 9569ea080d5a -r 4d230e702aa3 engine/inc/ShowEngine.h --- a/engine/inc/ShowEngine.h Thu Mar 11 20:53:00 2010 +0100 +++ b/engine/inc/ShowEngine.h Tue Apr 27 19:26:48 2010 +0100 @@ -27,7 +27,7 @@ #include "HttpClient.h" #include "ShowEngineObserver.h" #include "MetaDataReader.h" -#include "sqlite3.h" +#include class CShowEngine : public CBase, public MHttpClientObserver, public MMetaDataReaderObserver { @@ -37,8 +37,8 @@ public: IMPORT_C void AddDownloadL(CShowInfo& info); - IMPORT_C TBool RemoveDownloadL(TUint aUid); - IMPORT_C void RemoveAllDownloads(); + IMPORT_C void RemoveDownloadL(TUint aUid); + IMPORT_C void RemoveAllDownloadsL(); IMPORT_C void SuspendDownloads(); IMPORT_C void ResumeDownloadsL(); @@ -56,20 +56,21 @@ IMPORT_C void GetShowsDownloadingL(RShowInfoArray &aArray); IMPORT_C CShowInfo* DBGetShowByFileNameL(TFileName aFileName); - IMPORT_C TBool AddShowL(const CShowInfo& item); - IMPORT_C void DeletePlayedShows(RShowInfoArray &aShowInfoArray); + IMPORT_C void AddShowL(const CShowInfo& item); + IMPORT_C void DeletePlayedShowsL(RShowInfoArray &aShowInfoArray); IMPORT_C void DeleteAllShowsByFeedL(TUint aFeedUid,TBool aDeleteFiles=ETrue); IMPORT_C void DeleteShowL(TUint aShowUid, TBool aRemoveFile=ETrue); - IMPORT_C void DeleteOldShowsByFeed(TUint aFeedUid); + IMPORT_C void DeleteOldShowsByFeedL(TUint aFeedUid); IMPORT_C void AddObserver(MShowEngineObserver *observer); IMPORT_C void RemoveObserver(MShowEngineObserver *observer); IMPORT_C void NotifyShowListUpdatedL(); - IMPORT_C void UpdateShow(CShowInfo& aInfo); + IMPORT_C void UpdateShowL(CShowInfo& aInfo); IMPORT_C void GetMimeType(const TDesC& aFileName, TDes& aMimeType); + IMPORT_C void CheckForDeletedShows(TUint aFeedUid); IMPORT_C CMetaDataReader& MetaDataReader(); private: @@ -81,14 +82,14 @@ void DownloadInfo(CHttpClient* aClient, int aSize); void FileError(TUint aError); // from MetaDataReaderObserver - void ReadMetaData(CShowInfo& aShowInfo); + void ReadMetaDataL(CShowInfo& aShowInfo); void ReadMetaDataCompleteL(); private: CShowEngine(CPodcastModel& aPodcastModel); void ConstructL(); - TBool GetShowL(CShowInfo *info); + void GetShowL(CShowInfo *info); void NotifyDownloadQueueUpdatedL(); void NotifyShowDownloadUpdatedL(TInt aBytesOfCurrentDownload, TInt aBytesTotal); @@ -106,20 +107,20 @@ // DB methods CShowInfo* DBGetShowByUidL(TUint aUid); void DBFillShowInfoFromStmtL(sqlite3_stmt *st, CShowInfo* showInfo); - TBool DBAddShow(const CShowInfo& aItem); - TBool DBUpdateShow(CShowInfo& aItem); + void DBAddShowL(const CShowInfo& aItem); + void DBUpdateShowL(CShowInfo& aItem); void DBGetShowsByFeedL(RShowInfoArray& aShowArray, TUint aFeedUid); void DBGetAllShowsL(RShowInfoArray& aShowArray); void DBGetNewShowsL(RShowInfoArray& aShowArray); void DBGetDownloadedShowsL(RShowInfoArray& aShowArray); - TBool DBDeleteAllShowsByFeed(TUint aFeedUid); - void DBDeleteOldShowsByFeed(TUint aFeedUid); - TBool DBDeleteShow(TUint aUid); - void DBRemoveAllDownloads(); - void DBRemoveDownload(TUint aUid); + void DBDeleteAllShowsByFeedL(TUint aFeedUid); + void DBDeleteOldShowsByFeedL(TUint aFeedUid); + void DBDeleteShowL(TUint aUid); + void DBRemoveAllDownloadsL(); + void DBRemoveDownloadL(TUint aUid); void DBGetAllDownloadsL(RShowInfoArray& aShowArray); - TUint DBGetDownloadsCount(); - void DBAddDownload(TUint aUid); + TUint DBGetDownloadsCountL(); + void DBAddDownloadL(TUint aUid); CShowInfo* DBGetNextDownloadL(); private: diff -r 9569ea080d5a -r 4d230e702aa3 engine/inc/ShowInfo.h --- a/engine/inc/ShowInfo.h Thu Mar 11 20:53:00 2010 +0100 +++ b/engine/inc/ShowInfo.h Tue Apr 27 19:26:48 2010 +0100 @@ -42,7 +42,8 @@ enum TShowType { EAudioPodcast = 0, - EVideoPodcast + EVideoPodcast, + EOtherPodcast }; class CShowInfo: public CBase { diff -r 9569ea080d5a -r 4d230e702aa3 engine/inc/sqlite3.h --- a/engine/inc/sqlite3.h Thu Mar 11 20:53:00 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3858 +0,0 @@ -/* -** 2001 September 15 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This header file defines the interface that the SQLite library -** presents to client programs. If a C-function, structure, datatype, -** or constant definition does not appear in this file, then it is -** not a published API of SQLite, is subject to change without -** notice, and should not be referenced by programs that use SQLite. -** -** Some of the definitions that are in this file are marked as -** "experimental". Experimental interfaces are normally new -** features recently added to SQLite. We do not anticipate changes -** to experimental interfaces but reserve to make minor changes if -** experience from use "in the wild" suggest such changes are prudent. -** -** The official C-language API documentation for SQLite is derived -** from comments in this file. This file is the authoritative source -** on how SQLite interfaces are suppose to operate. -** -** The name of this file under configuration management is "sqlite.h.in". -** The makefile makes some minor changes to this file (such as inserting -** the version number) and changes its name to "sqlite3.h" as -** part of the build process. -** -** @(#) $Id: sqlite3.h 1420 2009-01-13 15:06:30Z teknolog $ -*/ -#ifndef _SQLITE3_H_ -#define _SQLITE3_H_ - -/* -** Make sure we can call this stuff from C++. -*/ -#ifdef __cplusplus -extern "C" { -#endif - -//#define EXPORT_C - -//#define /*IMPORT_C*/ - -/* -** Add the ability to override 'extern' -*/ -#ifndef SQLITE_EXTERN -# define SQLITE_EXTERN extern -#endif - -/* -** Make sure these symbols where not defined by some previous header -** file. -*/ -#ifdef SQLITE_VERSION -# undef SQLITE_VERSION -#endif -#ifdef SQLITE_VERSION_NUMBER -# undef SQLITE_VERSION_NUMBER -#endif - -/* -** CAPI3REF: Compile-Time Library Version Numbers {F10010} -** -** {F10011} The #define in the sqlite3.h header file named -** SQLITE_VERSION resolves to a string literal that identifies -** the version of the SQLite library in the format "X.Y.Z", where -** X is the major version number, Y is the minor version number and Z -** is the release number. The X.Y.Z might be followed by "alpha" or "beta". -** {END} For example "3.1.1beta". -** -** The X value is always 3 in SQLite. The X value only changes when -** backwards compatibility is broken and we intend to never break -** backwards compatibility. The Y value only changes when -** there are major feature enhancements that are forwards compatible -** but not backwards compatible. The Z value is incremented with -** each release but resets back to 0 when Y is incremented. -** -** {F10014} The SQLITE_VERSION_NUMBER #define resolves to an integer -** with the value (X*1000000 + Y*1000 + Z) where X, Y, and Z are as -** with SQLITE_VERSION. {END} For example, for version "3.1.1beta", -** SQLITE_VERSION_NUMBER is set to 3001001. To detect if they are using -** version 3.1.1 or greater at compile time, programs may use the test -** (SQLITE_VERSION_NUMBER>=3001001). -** -** See also: [sqlite3_libversion()] and [sqlite3_libversion_number()]. -*/ -#define SQLITE_VERSION "3.5.4" -#define SQLITE_VERSION_NUMBER 3005004 - -/* -** CAPI3REF: Run-Time Library Version Numbers {F10020} -** -** {F10021} The sqlite3_libversion_number() interface returns an integer -** equal to [SQLITE_VERSION_NUMBER]. {END} The value returned -** by this routine should only be different from the header values -** if the application is compiled using an sqlite3.h header from a -** different version of SQLite than library. Cautious programmers might -** include a check in their application to verify that -** sqlite3_libversion_number() always returns the value -** [SQLITE_VERSION_NUMBER]. -** -** {F10022} The sqlite3_version[] string constant contains the text of the -** [SQLITE_VERSION] string. {F10023} The sqlite3_libversion() function returns -** a pointer to the sqlite3_version[] string constant. {END} The -** sqlite3_libversion() function -** is provided for DLL users who can only access functions and not -** constants within the DLL. -*/ -const char sqlite3_version[] = SQLITE_VERSION; -/*IMPORT_C*/ const char *sqlite3_libversion(void); -/*IMPORT_C*/ int sqlite3_libversion_number(void); - - -void LogMessage(char *message); - -/* -** CAPI3REF: Test To See If The Library Is Threadsafe {F10100} -** -** {F10101} The sqlite3_threadsafe() routine returns nonzero -** if SQLite was compiled with its mutexes enabled or zero if -** SQLite was compiled with mutexes disabled. {END} If this -** routine returns false, then it is not safe for simultaneously -** running threads to both invoke SQLite interfaces. -** -** Really all this routine does is return true if SQLite was -** compiled with the -DSQLITE_THREADSAFE=1 option and false if -** compiled with -DSQLITE_THREADSAFE=0. If SQLite uses an -** application-defined mutex subsystem, malloc subsystem, collating -** sequence, VFS, SQL function, progress callback, commit hook, -** extension, or other accessories and these add-ons are not -** threadsafe, then clearly the combination will not be threadsafe -** either. Hence, this routine never reports that the library -** is guaranteed to be threadsafe, only when it is guaranteed not -** to be. -*/ -/*IMPORT_C*/ int sqlite3_threadsafe(void); - -/* -** CAPI3REF: Database Connection Handle {F12000} -** -** Each open SQLite database is represented by pointer to an instance of the -** opaque structure named "sqlite3". It is useful to think of an sqlite3 -** pointer as an object. The [sqlite3_open()], [sqlite3_open16()], and -** [sqlite3_open_v2()] interfaces are its constructors -** and [sqlite3_close()] is its destructor. There are many other interfaces -** (such as [sqlite3_prepare_v2()], [sqlite3_create_function()], and -** [sqlite3_busy_timeout()] to name but three) that are methods on this -** object. -*/ -typedef struct sqlite3 sqlite3; - - -/* -** CAPI3REF: 64-Bit Integer Types {F10200} -** -** Because there is no cross-platform way to specify such types -** SQLite includes typedefs for 64-bit signed and unsigned integers. -** {F10201} The sqlite_int64 and sqlite3_int64 types specify a -** 64-bit signed integer. {F10202} The sqlite_uint64 and -** sqlite3_uint64 types specify a 64-bit unsigned integer. {END} -** -** The sqlite3_int64 and sqlite3_uint64 are the preferred type -** definitions. The sqlite_int64 and sqlite_uint64 types are -** supported for backwards compatibility only. -*/ -#ifdef SQLITE_INT64_TYPE - typedef SQLITE_INT64_TYPE sqlite_int64; - typedef unsigned SQLITE_INT64_TYPE sqlite_uint64; -#elif defined(_MSC_VER) || defined(__BORLANDC__) - typedef __int64 sqlite_int64; - typedef unsigned __int64 sqlite_uint64; -#else - typedef long long int sqlite_int64; - typedef unsigned long long int sqlite_uint64; -#endif -typedef sqlite_int64 sqlite3_int64; -typedef sqlite_uint64 sqlite3_uint64; - -/* -** If compiling for a processor that lacks floating point support, -** substitute integer for floating-point -*/ -#ifdef SQLITE_OMIT_FLOATING_POINT -# define double sqlite3_int64 -#endif - -/* -** CAPI3REF: Closing A Database Connection {F12010} -** -** {F12011} The sqlite3_close() interfaces destroys an [sqlite3] object -** allocated by a prior call to [sqlite3_open()], [sqlite3_open16()], or -** [sqlite3_open_v2()]. {F12012} Sqlite3_close() releases all -** memory used by the connection and closes all open files. {END}. -** -** {F12013} If the database connection contains -** [sqlite3_stmt | prepared statements] that have not been finalized -** by [sqlite3_finalize()], then sqlite3_close() returns SQLITE_BUSY -** and leaves the connection open. {F12014} Giving sqlite3_close() -** a NULL pointer is a harmless no-op. {END} -** -** {U12015} Passing this routine a database connection that has already been -** closed results in undefined behavior. {U12016} If other interfaces that -** reference the same database connection are pending (either in the -** same thread or in different threads) when this routine is called, -** then the behavior is undefined and is almost certainly undesirable. -*/ -/*IMPORT_C*/ int sqlite3_close(sqlite3 *); - -/* -** The type for a callback function. -** This is legacy and deprecated. It is included for historical -** compatibility and is not documented. -*/ -typedef int (*sqlite3_callback)(void*,int,char**, char**); - -/* -** CAPI3REF: One-Step Query Execution Interface {F12100} -** -** {F12101} The sqlite3_exec() interface evaluates zero or more -** UTF-8 encoded, semicolon-separated SQL statements in the zero-terminated -** string of its second argument. {F12102} The SQL -** statements are evaluated in the context of the database connection -** specified by in the first argument. -** {F12103} SQL statements are prepared one by one using -** [sqlite3_prepare()] or the equivalent, evaluated -** using one or more calls to [sqlite3_step()], then destroyed -** using [sqlite3_finalize()]. {F12104} The return value of -** sqlite3_exec() is SQLITE_OK if all SQL statement run -** successfully. -** -** {F12105} If one or more of the SQL statements handed to -** sqlite3_exec() are queries, then -** the callback function specified by the 3rd parameter is -** invoked once for each row of the query result. {F12106} -** If the callback returns a non-zero value then the query -** is aborted, all subsequent SQL statements -** are skipped and the sqlite3_exec() function returns the [SQLITE_ABORT]. -** -** {F12107} The 4th parameter to sqlite3_exec() is an arbitrary pointer -** that is passed through to the callback function as its first parameter. -** -** {F12108} The 2nd parameter to the callback function is the number of -** columns in the query result. {F12109} The 3rd parameter to the callback -** is an array of pointers to strings holding the values for each column -** as extracted using [sqlite3_column_text()]. NULL values in the result -** set result in a NULL pointer. All other value are in their UTF-8 -** string representation. {F12117} -** The 4th parameter to the callback is an array of strings -** obtained using [sqlite3_column_name()] and holding -** the names of each column, also in UTF-8. -** -** {F12110} The callback function may be NULL, even for queries. A NULL -** callback is not an error. It just means that no callback -** will be invoked. -** -** {F12112} If an error occurs while parsing or evaluating the SQL -** then an appropriate error message is written into memory obtained -** from [sqlite3_malloc()] and *errmsg is made to point to that message -** assuming errmsg is not NULL. -** {U12113} The calling function is responsible for freeing the memory -** using [sqlite3_free()]. -** {F12116} If [sqlite3_malloc()] fails while attempting to generate -** the error message, *errmsg is set to NULL. -** {F12114} If errmsg is NULL then no attempt is made to generate an -** error message. Is the return code SQLITE_NOMEM or the original -** error code? What happens if there are multiple errors? -** Do we get code for the first error, or is the choice of reported -** error arbitrary? -** -** {F12115} The return value is is SQLITE_OK if there are no errors and -** some other [SQLITE_OK | return code] if there is an error. -** The particular return value depends on the type of error. {END} -*/ -/*IMPORT_C*/ int sqlite3_exec( - sqlite3*, /* An open database */ - const char *sql, /* SQL to be evaluted */ - int (*callback)(void*,int,char**,char**), /* Callback function */ - void *, /* 1st argument to callback */ - char **errmsg /* Error msg written here */ -); - -/* -** CAPI3REF: Result Codes {F10210} -** KEYWORDS: SQLITE_OK -** -** Many SQLite functions return an integer result code from the set shown -** above in order to indicates success or failure. -** -** {F10211} The result codes shown here are the only ones returned -** by SQLite in its default configuration. {F10212} However, the -** [sqlite3_extended_result_codes()] API can be used to set a database -** connectoin to return more detailed result codes. {END} -** -** See also: [SQLITE_IOERR_READ | extended result codes] -** -*/ -#define SQLITE_OK 0 /* Successful result */ -/* beginning-of-error-codes */ -#define SQLITE_ERROR 1 /* SQL error or missing database */ -#define SQLITE_INTERNAL 2 /* Internal logic error in SQLite */ -#define SQLITE_PERM 3 /* Access permission denied */ -#define SQLITE_ABORT 4 /* Callback routine requested an abort */ -#define SQLITE_BUSY 5 /* The database file is locked */ -#define SQLITE_LOCKED 6 /* A table in the database is locked */ -#define SQLITE_NOMEM 7 /* A malloc() failed */ -#define SQLITE_READONLY 8 /* Attempt to write a readonly database */ -#define SQLITE_INTERRUPT 9 /* Operation terminated by sqlite3_interrupt()*/ -#define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */ -#define SQLITE_CORRUPT 11 /* The database disk image is malformed */ -#define SQLITE_NOTFOUND 12 /* NOT USED. Table or record not found */ -#define SQLITE_FULL 13 /* Insertion failed because database is full */ -#define SQLITE_CANTOPEN 14 /* Unable to open the database file */ -#define SQLITE_PROTOCOL 15 /* NOT USED. Database lock protocol error */ -#define SQLITE_EMPTY 16 /* Database is empty */ -#define SQLITE_SCHEMA 17 /* The database schema changed */ -#define SQLITE_TOOBIG 18 /* String or BLOB exceeds size limit */ -#define SQLITE_CONSTRAINT 19 /* Abort due to constraint violation */ -#define SQLITE_MISMATCH 20 /* Data type mismatch */ -#define SQLITE_MISUSE 21 /* Library used incorrectly */ -#define SQLITE_NOLFS 22 /* Uses OS features not supported on host */ -#define SQLITE_AUTH 23 /* Authorization denied */ -#define SQLITE_FORMAT 24 /* Auxiliary database format error */ -#define SQLITE_RANGE 25 /* 2nd parameter to sqlite3_bind out of range */ -#define SQLITE_NOTADB 26 /* File opened that is not a database file */ -#define SQLITE_ROW 100 /* sqlite3_step() has another row ready */ -#define SQLITE_DONE 101 /* sqlite3_step() has finished executing */ -/* end-of-error-codes */ - -/* -** CAPI3REF: Extended Result Codes {F10220} -** -** In its default configuration, SQLite API routines return one of 26 integer -** [SQLITE_OK | result codes]. However, experience has shown that -** many of these result codes are too course-grained. They do not provide as -** much information about problems as programmers might like. In an effort to -** address this, newer versions of SQLite (version 3.3.8 and later) include -** support for additional result codes that provide more detailed information -** about errors. {F10221} The extended result codes are enabled or disabled -** for each database connection using the [sqlite3_extended_result_codes()] -** API. {END} -** -** Some of the available extended result codes are listed above. -** We expect the number of extended result codes will be expand -** over time. {U10422} Software that uses extended result codes should expect -** to see new result codes in future releases of SQLite. {END} -** -** {F10223} The symbolic name for an extended result code always contains -** a related primary result code as a prefix. {F10224} Primary result -** codes contain a single "_" character. {F10225} Extended result codes -** contain two or more "_" characters. {F10226} The numeric value of an -** extended result code can be converted to its -** corresponding primary result code by masking off the lower 8 bytes. {END} -** -** The SQLITE_OK result code will never be extended. It will always -** be exactly zero. -*/ -#define SQLITE_IOERR_READ (SQLITE_IOERR | (1<<8)) -#define SQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8)) -#define SQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8)) -#define SQLITE_IOERR_FSYNC (SQLITE_IOERR | (4<<8)) -#define SQLITE_IOERR_DIR_FSYNC (SQLITE_IOERR | (5<<8)) -#define SQLITE_IOERR_TRUNCATE (SQLITE_IOERR | (6<<8)) -#define SQLITE_IOERR_FSTAT (SQLITE_IOERR | (7<<8)) -#define SQLITE_IOERR_UNLOCK (SQLITE_IOERR | (8<<8)) -#define SQLITE_IOERR_RDLOCK (SQLITE_IOERR | (9<<8)) -#define SQLITE_IOERR_DELETE (SQLITE_IOERR | (10<<8)) -#define SQLITE_IOERR_BLOCKED (SQLITE_IOERR | (11<<8)) -#define SQLITE_IOERR_NOMEM (SQLITE_IOERR | (12<<8)) - -/* -** CAPI3REF: Flags For File Open Operations {F10230} -** -** {F10231} Some combination of the these bit values are used as the -** third argument to the [sqlite3_open_v2()] interface and -** as fourth argument to the xOpen method of the -** [sqlite3_vfs] object. -*/ -#define SQLITE_OPEN_READONLY 0x00000001 -#define SQLITE_OPEN_READWRITE 0x00000002 -#define SQLITE_OPEN_CREATE 0x00000004 -#define SQLITE_OPEN_DELETEONCLOSE 0x00000008 -#define SQLITE_OPEN_EXCLUSIVE 0x00000010 -#define SQLITE_OPEN_MAIN_DB 0x00000100 -#define SQLITE_OPEN_TEMP_DB 0x00000200 -#define SQLITE_OPEN_TRANSIENT_DB 0x00000400 -#define SQLITE_OPEN_MAIN_JOURNAL 0x00000800 -#define SQLITE_OPEN_TEMP_JOURNAL 0x00001000 -#define SQLITE_OPEN_SUBJOURNAL 0x00002000 -#define SQLITE_OPEN_MASTER_JOURNAL 0x00004000 - -/* -** CAPI3REF: Device Characteristics {F10240} -** -** {F10241} The xDeviceCapabilities method of the [sqlite3_io_methods] -** object returns an integer which is a vector of the these -** bit values expressing I/O characteristics of the mass storage -** device that holds the file that the [sqlite3_io_methods] -** refers to. {END} -** -** {F10242} The SQLITE_IOCAP_ATOMIC property means that all writes of -** any size are atomic. {F10243} The SQLITE_IOCAP_ATOMICnnn values -** mean that writes of blocks that are nnn bytes in size and -** are aligned to an address which is an integer multiple of -** nnn are atomic. {F10244} The SQLITE_IOCAP_SAFE_APPEND value means -** that when data is appended to a file, the data is appended -** first then the size of the file is extended, never the other -** way around. {F10245} The SQLITE_IOCAP_SEQUENTIAL property means that -** information is written to disk in the same order as calls -** to xWrite(). -*/ -#define SQLITE_IOCAP_ATOMIC 0x00000001 -#define SQLITE_IOCAP_ATOMIC512 0x00000002 -#define SQLITE_IOCAP_ATOMIC1K 0x00000004 -#define SQLITE_IOCAP_ATOMIC2K 0x00000008 -#define SQLITE_IOCAP_ATOMIC4K 0x00000010 -#define SQLITE_IOCAP_ATOMIC8K 0x00000020 -#define SQLITE_IOCAP_ATOMIC16K 0x00000040 -#define SQLITE_IOCAP_ATOMIC32K 0x00000080 -#define SQLITE_IOCAP_ATOMIC64K 0x00000100 -#define SQLITE_IOCAP_SAFE_APPEND 0x00000200 -#define SQLITE_IOCAP_SEQUENTIAL 0x00000400 - -/* -** CAPI3REF: File Locking Levels {F10250} -** -** {F10251} SQLite uses one of the following integer values as the second -** argument to calls it makes to the xLock() and xUnlock() methods -** of an [sqlite3_io_methods] object. {END} -*/ -#define SQLITE_LOCK_NONE 0 -#define SQLITE_LOCK_SHARED 1 -#define SQLITE_LOCK_RESERVED 2 -#define SQLITE_LOCK_PENDING 3 -#define SQLITE_LOCK_EXCLUSIVE 4 - -/* -** CAPI3REF: Synchronization Type Flags {F10260} -** -** {F10261} When SQLite invokes the xSync() method of an -** [sqlite3_io_methods] object it uses a combination of the -** these integer values as the second argument. -** -** {F10262} When the SQLITE_SYNC_DATAONLY flag is used, it means that the -** sync operation only needs to flush data to mass storage. Inode -** information need not be flushed. {F10263} The SQLITE_SYNC_NORMAL means -** to use normal fsync() semantics. {F10264} The SQLITE_SYNC_FULL flag means -** to use Mac OS-X style fullsync instead of fsync(). -*/ -#define SQLITE_SYNC_NORMAL 0x00002 -#define SQLITE_SYNC_FULL 0x00003 -#define SQLITE_SYNC_DATAONLY 0x00010 - - -/* -** CAPI3REF: OS Interface Open File Handle {F11110} -** -** An [sqlite3_file] object represents an open file in the OS -** interface layer. Individual OS interface implementations will -** want to subclass this object by appending additional fields -** for their own use. The pMethods entry is a pointer to an -** [sqlite3_io_methods] object that defines methods for performing -** I/O operations on the open file. -*/ -typedef struct sqlite3_file sqlite3_file; -struct sqlite3_file { - int isOpen; - //const struct sqlite3_io_methods *pMethods; /* Methods for an open file */ -}; - -/* -** CAPI3REF: OS Interface File Virtual Methods Object {F11120} -** -** Every file opened by the [sqlite3_vfs] xOpen method contains a pointer to -** an instance of the this object. This object defines the -** methods used to perform various operations against the open file. -** -** The flags argument to xSync may be one of [SQLITE_SYNC_NORMAL] or -** [SQLITE_SYNC_FULL]. The first choice is the normal fsync(). -* The second choice is an -** OS-X style fullsync. The SQLITE_SYNC_DATA flag may be ORed in to -** indicate that only the data of the file and not its inode needs to be -** synced. -** -** The integer values to xLock() and xUnlock() are one of -**
    -**
  • [SQLITE_LOCK_NONE], -**
  • [SQLITE_LOCK_SHARED], -**
  • [SQLITE_LOCK_RESERVED], -**
  • [SQLITE_LOCK_PENDING], or -**
  • [SQLITE_LOCK_EXCLUSIVE]. -**
-** xLock() increases the lock. xUnlock() decreases the lock. -** The xCheckReservedLock() method looks -** to see if any database connection, either in this -** process or in some other process, is holding an RESERVED, -** PENDING, or EXCLUSIVE lock on the file. It returns true -** if such a lock exists and false if not. -** -** The xFileControl() method is a generic interface that allows custom -** VFS implementations to directly control an open file using the -** [sqlite3_file_control()] interface. The second "op" argument -** is an integer opcode. The third -** argument is a generic pointer which is intended to be a pointer -** to a structure that may contain arguments or space in which to -** write return values. Potential uses for xFileControl() might be -** functions to enable blocking locks with timeouts, to change the -** locking strategy (for example to use dot-file locks), to inquire -** about the status of a lock, or to break stale locks. The SQLite -** core reserves opcodes less than 100 for its own use. -** A [SQLITE_FCNTL_LOCKSTATE | list of opcodes] less than 100 is available. -** Applications that define a custom xFileControl method should use opcodes -** greater than 100 to avoid conflicts. -** -** The xSectorSize() method returns the sector size of the -** device that underlies the file. The sector size is the -** minimum write that can be performed without disturbing -** other bytes in the file. The xDeviceCharacteristics() -** method returns a bit vector describing behaviors of the -** underlying device: -** -**
    -**
  • [SQLITE_IOCAP_ATOMIC] -**
  • [SQLITE_IOCAP_ATOMIC512] -**
  • [SQLITE_IOCAP_ATOMIC1K] -**
  • [SQLITE_IOCAP_ATOMIC2K] -**
  • [SQLITE_IOCAP_ATOMIC4K] -**
  • [SQLITE_IOCAP_ATOMIC8K] -**
  • [SQLITE_IOCAP_ATOMIC16K] -**
  • [SQLITE_IOCAP_ATOMIC32K] -**
  • [SQLITE_IOCAP_ATOMIC64K] -**
  • [SQLITE_IOCAP_SAFE_APPEND] -**
  • [SQLITE_IOCAP_SEQUENTIAL] -**
-** -** The SQLITE_IOCAP_ATOMIC property means that all writes of -** any size are atomic. The SQLITE_IOCAP_ATOMICnnn values -** mean that writes of blocks that are nnn bytes in size and -** are aligned to an address which is an integer multiple of -** nnn are atomic. The SQLITE_IOCAP_SAFE_APPEND value means -** that when data is appended to a file, the data is appended -** first then the size of the file is extended, never the other -** way around. The SQLITE_IOCAP_SEQUENTIAL property means that -** information is written to disk in the same order as calls -** to xWrite(). -*/ -/*typedef struct sqlite3_io_methods sqlite3_io_methods; -struct sqlite3_io_methods { - int iVersion; - int (*xClose)(sqlite3_file*); - int (*xRead)(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst); - int (*xWrite)(sqlite3_file*, const void*, int iAmt, sqlite3_int64 iOfst); - int (*xTruncate)(sqlite3_file*, sqlite3_int64 size); - int (*xSync)(sqlite3_file*, int flags); - int (*xFileSize)(sqlite3_file*, sqlite3_int64 *pSize); - int (*xLock)(sqlite3_file*, int); - int (*xUnlock)(sqlite3_file*, int); - int (*xCheckReservedLock)(sqlite3_file*); - int (*xFileControl)(sqlite3_file*, int op, void *pArg); - int (*xSectorSize)(sqlite3_file*); - int (*xDeviceCharacteristics)(sqlite3_file*); -};*/ - -/* -** CAPI3REF: Standard File Control Opcodes {F11310} -** -** These integer constants are opcodes for the xFileControl method -** of the [sqlite3_io_methods] object and to the [sqlite3_file_control()] -** interface. -** -** {F11311} The [SQLITE_FCNTL_LOCKSTATE] opcode is used for debugging. This -** opcode cases the xFileControl method to write the current state of -** the lock (one of [SQLITE_LOCK_NONE], [SQLITE_LOCK_SHARED], -** [SQLITE_LOCK_RESERVED], [SQLITE_LOCK_PENDING], or [SQLITE_LOCK_EXCLUSIVE]) -** into an integer that the pArg argument points to. {F11312} This capability -** is used during testing and only needs to be supported when SQLITE_TEST -** is defined. -*/ -#define SQLITE_FCNTL_LOCKSTATE 1 - -/* -** CAPI3REF: Mutex Handle {F17110} -** -** The mutex module within SQLite defines [sqlite3_mutex] to be an -** abstract type for a mutex object. {F17111} The SQLite core never looks -** at the internal representation of an [sqlite3_mutex]. {END} It only -** deals with pointers to the [sqlite3_mutex] object. -** -** Mutexes are created using [sqlite3_mutex_alloc()]. -*/ -typedef struct sqlite3_mutex sqlite3_mutex; - -/* -** CAPI3REF: OS Interface Object {F11140} -** -** An instance of this object defines the interface between the -** SQLite core and the underlying operating system. The "vfs" -** in the name of the object stands for "virtual file system". -** -** The iVersion field is initially 1 but may be larger for future -** versions of SQLite. Additional fields may be appended to this -** object when the iVersion value is increased. -** -** The szOsFile field is the size of the subclassed [sqlite3_file] -** structure used by this VFS. mxPathname is the maximum length of -** a pathname in this VFS. -** -** Registered vfs modules are kept on a linked list formed by -** the pNext pointer. The [sqlite3_vfs_register()] -** and [sqlite3_vfs_unregister()] interfaces manage this list -** in a thread-safe way. The [sqlite3_vfs_find()] interface -** searches the list. -** -** The pNext field is the only fields in the sqlite3_vfs -** structure that SQLite will ever modify. SQLite will only access -** or modify this field while holding a particular static mutex. -** The application should never modify anything within the sqlite3_vfs -** object once the object has been registered. -** -** The zName field holds the name of the VFS module. The name must -** be unique across all VFS modules. -** -** {F11141} SQLite will guarantee that the zFilename string passed to -** xOpen() is a full pathname as generated by xFullPathname() and -** that the string will be valid and unchanged until xClose() is -** called. {END} So the [sqlite3_file] can store a pointer to the -** filename if it needs to remember the filename for some reason. -** -** {F11142} The flags argument to xOpen() includes all bits set in -** the flags argument to [sqlite3_open_v2()]. Or if [sqlite3_open()] -** or [sqlite3_open16()] is used, then flags includes at least -** [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]. {END} -** If xOpen() opens a file read-only then it sets *pOutFlags to -** include [SQLITE_OPEN_READONLY]. Other bits in *pOutFlags may be -** set. -** -** {F11143} SQLite will also add one of the following flags to the xOpen() -** call, depending on the object being opened: -** -**
    -**
  • [SQLITE_OPEN_MAIN_DB] -**
  • [SQLITE_OPEN_MAIN_JOURNAL] -**
  • [SQLITE_OPEN_TEMP_DB] -**
  • [SQLITE_OPEN_TEMP_JOURNAL] -**
  • [SQLITE_OPEN_TRANSIENT_DB] -**
  • [SQLITE_OPEN_SUBJOURNAL] -**
  • [SQLITE_OPEN_MASTER_JOURNAL] -**
{END} -** -** The file I/O implementation can use the object type flags to -** changes the way it deals with files. For example, an application -** that does not care about crash recovery or rollback, might make -** the open of a journal file a no-op. Writes to this journal are -** also a no-op. Any attempt to read the journal return SQLITE_IOERR. -** Or the implementation might recognize the a database file will -** be doing page-aligned sector reads and writes in a random order -** and set up its I/O subsystem accordingly. -** -** {F11144} SQLite might also add one of the following flags to the xOpen -** method: -** -**
    -**
  • [SQLITE_OPEN_DELETEONCLOSE] -**
  • [SQLITE_OPEN_EXCLUSIVE] -**
-** -** {F11145} The [SQLITE_OPEN_DELETEONCLOSE] flag means the file should be -** deleted when it is closed. {F11146} The [SQLITE_OPEN_DELETEONCLOSE] -** will be set for TEMP databases, journals and for subjournals. -** {F11147} The [SQLITE_OPEN_EXCLUSIVE] flag means the file should be opened -** for exclusive access. This flag is set for all files except -** for the main database file. {END} -** -** {F11148} At least szOsFile bytes of memory is allocated by SQLite -** to hold the [sqlite3_file] structure passed as the third -** argument to xOpen. {END} The xOpen method does not have to -** allocate the structure; it should just fill it in. -** -** {F11149} The flags argument to xAccess() may be [SQLITE_ACCESS_EXISTS] -** to test for the existance of a file, -** or [SQLITE_ACCESS_READWRITE] to test to see -** if a file is readable and writable, or [SQLITE_ACCESS_READ] -** to test to see if a file is at least readable. {END} The file can be a -** directory. -** -** {F11150} SQLite will always allocate at least mxPathname+1 byte for -** the output buffers for xGetTempname and xFullPathname. {F11151} The exact -** size of the output buffer is also passed as a parameter to both -** methods. {END} If the output buffer is not large enough, SQLITE_CANTOPEN -** should be returned. As this is handled as a fatal error by SQLite, -** vfs implementations should endeavor to prevent this by setting -** mxPathname to a sufficiently large value. -** -** The xRandomness(), xSleep(), and xCurrentTime() interfaces -** are not strictly a part of the filesystem, but they are -** included in the VFS structure for completeness. -** The xRandomness() function attempts to return nBytes bytes -** of good-quality randomness into zOut. The return value is -** the actual number of bytes of randomness obtained. The -** xSleep() method cause the calling thread to sleep for at -** least the number of microseconds given. The xCurrentTime() -** method returns a Julian Day Number for the current date and -** time. -*/ -typedef struct sqlite3_vfs sqlite3_vfs; -struct sqlite3_vfs { - int iVersion; /* Structure version number */ - int szOsFile; /* Size of subclassed sqlite3_file */ - int mxPathname; /* Maximum file pathname length */ - sqlite3_vfs *pNext; /* Next registered VFS */ - const char *zName; /* Name of this virtual file system */ - void *pAppData; /* Pointer to application-specific data */ -/* int (*xOpen)(sqlite3_vfs*, const char *zName, sqlite3_file*, - int flags, int *pOutFlags); - int (*xDelete)(sqlite3_vfs*, const char *zName, int syncDir); - int (*xAccess)(sqlite3_vfs*, const char *zName, int flags); - int (*xGetTempname)(sqlite3_vfs*, int nOut, char *zOut); - int (*xFullPathname)(sqlite3_vfs*, const char *zName, int nOut, char *zOut); - void *(*xDlOpen)(sqlite3_vfs*, const char *zFilename); - void (*xDlError)(sqlite3_vfs*, int nByte, char *zErrMsg); - void *(*xDlSym)(sqlite3_vfs*,void*, const char *zSymbol); - void (*xDlClose)(sqlite3_vfs*, void*); - int (*xRandomness)(sqlite3_vfs*, int nByte, char *zOut); - int (*xSleep)(sqlite3_vfs*, int microseconds); - int (*xCurrentTime)(sqlite3_vfs*, double*);*/ - /* New fields may be appended in figure versions. The iVersion - ** value will increment whenever this happens. */ -}; - -/* -** CAPI3REF: Flags for the xAccess VFS method {F11190} -** -** {F11191} These integer constants can be used as the third parameter to -** the xAccess method of an [sqlite3_vfs] object. {END} They determine -** the kind of what kind of permissions the xAccess method is -** looking for. {F11192} With SQLITE_ACCESS_EXISTS, the xAccess method -** simply checks to see if the file exists. {F11193} With -** SQLITE_ACCESS_READWRITE, the xAccess method checks to see -** if the file is both readable and writable. {F11194} With -** SQLITE_ACCESS_READ the xAccess method -** checks to see if the file is readable. -*/ -#define SQLITE_ACCESS_EXISTS 0 -#define SQLITE_ACCESS_READWRITE 1 -#define SQLITE_ACCESS_READ 2 - -/* -** CAPI3REF: Enable Or Disable Extended Result Codes {F12200} -** -** {F12201} The sqlite3_extended_result_codes() routine enables or disables the -** [SQLITE_IOERR_READ | extended result codes] feature on a database -** connection if its 2nd parameter is -** non-zero or zero, respectively. {F12202} -** By default, SQLite API routines return one of only 26 integer -** [SQLITE_OK | result codes]. {F12203} When extended result codes -** are enabled by this routine, the repetoire of result codes can be -** much larger and can (hopefully) provide more detailed information -** about the cause of an error. -** -** {F12204} The second argument is a boolean value that turns extended result -** codes on and off. {F12205} Extended result codes are off by default for -** backwards compatibility with older versions of SQLite. -*/ -/*IMPORT_C*/ int sqlite3_extended_result_codes(sqlite3*, int onoff); - -/* -** CAPI3REF: Last Insert Rowid {F12220} -** -** {F12221} Each entry in an SQLite table has a unique 64-bit signed -** integer key called the "rowid". {F12222} The rowid is always available -** as an undeclared column named ROWID, OID, or _ROWID_ as long as those -** names are not also used by explicitly declared columns. {F12223} If -** the table has a column of type INTEGER PRIMARY KEY then that column -** is another an alias for the rowid. -** -** {F12224} This routine returns the rowid of the most recent -** successful INSERT into the database from the database connection -** shown in the first argument. {F12225} If no successful inserts -** have ever occurred on this database connection, zero is returned. -** -** {F12226} If an INSERT occurs within a trigger, then the rowid of the -** inserted row is returned by this routine as long as the trigger -** is running. {F12227} But once the trigger terminates, the value returned -** by this routine reverts to the last value inserted before the -** trigger fired. -** -** {F12228} An INSERT that fails due to a constraint violation is not a -** successful insert and does not change the value returned by this -** routine. {F12229} Thus INSERT OR FAIL, INSERT OR IGNORE, INSERT OR ROLLBACK, -** and INSERT OR ABORT make no changes to the return value of this -** routine when their insertion fails. {F12231} When INSERT OR REPLACE -** encounters a constraint violation, it does not fail. The -** INSERT continues to completion after deleting rows that caused -** the constraint problem so INSERT OR REPLACE will always change -** the return value of this interface. -** -** {UF12232} If another thread does a new insert on the same database connection -** while this routine is running and thus changes the last insert rowid, -** then the return value of this routine is undefined. -*/ -/*IMPORT_C*/ sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*); - -/* -** CAPI3REF: Count The Number Of Rows Modified {F12240} -** -** {F12241} This function returns the number of database rows that were changed -** or inserted or deleted by the most recently completed SQL statement -** on the connection specified by the first parameter. {F12242} Only -** changes that are directly specified by the INSERT, UPDATE, or -** DELETE statement are counted. Auxiliary changes caused by -** triggers are not counted. {F12243} Use the [sqlite3_total_changes()] function -** to find the total number of changes including changes caused by triggers. -** -** {F12244} Within the body of a trigger, the sqlite3_changes() interface -** can be called to find the number of -** changes in the most recently completed INSERT, UPDATE, or DELETE -** statement within the body of the same trigger. -** -** {F12245} All changes are counted, even if they are later undone by a -** ROLLBACK or ABORT. {F12246} Except, changes associated with creating and -** dropping tables are not counted. -** -** {F12247} If a callback invokes [sqlite3_exec()] or [sqlite3_step()] -** recursively, then the changes in the inner, recursive call are -** counted together with the changes in the outer call. -** -** {F12248} SQLite implements the command "DELETE FROM table" without -** a WHERE clause by dropping and recreating the table. (This is much -** faster than going through and deleting individual elements from the -** table.) Because of this optimization, the change count for -** "DELETE FROM table" will be zero regardless of the number of elements -** that were originally in the table. {F12251} To get an accurate count -** of the number of rows deleted, use -** "DELETE FROM table WHERE 1" instead. -** -** {UF12252} If another thread makes changes on the same database connection -** while this routine is running then the return value of this routine -** is undefined. -*/ -/*IMPORT_C*/ int sqlite3_changes(sqlite3*); - -/* -** CAPI3REF: Total Number Of Rows Modified {F12260} -*** -** {F12261} This function returns the number of database rows that have been -** modified by INSERT, UPDATE or DELETE statements since the database handle -** was opened. {F12262} The count includes UPDATE, INSERT and DELETE -** statements executed as part of trigger programs. {F12263} All changes -** are counted as soon as the statement that makes them is completed -** (when the statement handle is passed to [sqlite3_reset()] or -** [sqlite3_finalize()]). {END} -** -** See also the [sqlite3_change()] interface. -** -** {F12265} SQLite implements the command "DELETE FROM table" without -** a WHERE clause by dropping and recreating the table. (This is much -** faster than going -** through and deleting individual elements form the table.) Because of -** this optimization, the change count for "DELETE FROM table" will be -** zero regardless of the number of elements that were originally in the -** table. To get an accurate count of the number of rows deleted, use -** "DELETE FROM table WHERE 1" instead. -** -** {U12264} If another thread makes changes on the same database connection -** while this routine is running then the return value of this routine -** is undefined. {END} -*/ -/*IMPORT_C*/ int sqlite3_total_changes(sqlite3*); - -/* -** CAPI3REF: Interrupt A Long-Running Query {F12270} -** -** {F12271} This function causes any pending database operation to abort and -** return at its earliest opportunity. {END} This routine is typically -** called in response to a user action such as pressing "Cancel" -** or Ctrl-C where the user wants a long query operation to halt -** immediately. -** -** {F12272} It is safe to call this routine from a thread different from the -** thread that is currently running the database operation. {U12273} But it -** is not safe to call this routine with a database connection that -** is closed or might close before sqlite3_interrupt() returns. -** -** If an SQL is very nearly finished at the time when sqlite3_interrupt() -** is called, then it might not have an opportunity to be interrupted. -** It might continue to completion. -** {F12274} The SQL operation that is interrupted will return -** [SQLITE_INTERRUPT]. {F12275} If the interrupted SQL operation is an -** INSERT, UPDATE, or DELETE that is inside an explicit transaction, -** then the entire transaction will be rolled back automatically. -** {F12276} A call to sqlite3_interrupt() has no effect on SQL statements -** that are started after sqlite3_interrupt() returns. -*/ -/*IMPORT_C*/ void sqlite3_interrupt(sqlite3*); - -/* -** CAPI3REF: Determine If An SQL Statement Is Complete {F10510} -** -** These routines are useful for command-line input to determine if the -** currently entered text seems to form complete a SQL statement or -** if additional input is needed before sending the text into -** SQLite for parsing. These routines return true if the input string -** appears to be a complete SQL statement. A statement is judged to be -** complete if it ends with a semicolon and is not a fragment of a -** CREATE TRIGGER statement. These routines do not parse the SQL and -** so will not detect syntactically incorrect SQL. -** -** {F10511} These functions return true if the given input string -** ends with a semicolon optionally followed by whitespace or -** comments. {F10512} For sqlite3_complete(), -** the parameter must be a zero-terminated UTF-8 string. {F10513} For -** sqlite3_complete16(), a zero-terminated machine byte order UTF-16 string -** is required. {F10514} These routines return false if the terminal -** semicolon is within a comment, a string literal or a quoted identifier -** (in other words if the final semicolon is not really a separate token -** but part of a larger token) or if the final semicolon is -** in between the BEGIN and END keywords of a CREATE TRIGGER statement. -** {END} -*/ -/*IMPORT_C*/ int sqlite3_complete(const char *sql); -/*IMPORT_C*/ int sqlite3_complete16(const void *sql); - -/* -** CAPI3REF: Register A Callback To Handle SQLITE_BUSY Errors {F12310} -** -** {F12311} This routine identifies a callback function that might be -** invoked whenever an attempt is made to open a database table -** that another thread or process has locked. -** {F12312} If the busy callback is NULL, then [SQLITE_BUSY] -** or [SQLITE_IOERR_BLOCKED] -** is returned immediately upon encountering the lock. -** {F12313} If the busy callback is not NULL, then the -** callback will be invoked with two arguments. {F12314} The -** first argument to the handler is a copy of the void* pointer which -** is the third argument to this routine. {F12315} The second argument to -** the handler is the number of times that the busy handler has -** been invoked for this locking event. {F12316} If the -** busy callback returns 0, then no additional attempts are made to -** access the database and [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED] is returned. -** {F12317} If the callback returns non-zero, then another attempt -** is made to open the database for reading and the cycle repeats. -** -** The presence of a busy handler does not guarantee that -** it will be invoked when there is lock contention. {F12319} -** If SQLite determines that invoking the busy handler could result in -** a deadlock, it will go ahead and return [SQLITE_BUSY] or -** [SQLITE_IOERR_BLOCKED] instead of invoking the -** busy handler. {END} -** Consider a scenario where one process is holding a read lock that -** it is trying to promote to a reserved lock and -** a second process is holding a reserved lock that it is trying -** to promote to an exclusive lock. The first process cannot proceed -** because it is blocked by the second and the second process cannot -** proceed because it is blocked by the first. If both processes -** invoke the busy handlers, neither will make any progress. Therefore, -** SQLite returns [SQLITE_BUSY] for the first process, hoping that this -** will induce the first process to release its read lock and allow -** the second process to proceed. -** -** {F12321} The default busy callback is NULL. {END} -** -** {F12322} The [SQLITE_BUSY] error is converted to [SQLITE_IOERR_BLOCKED] -** when SQLite is in the middle of a large transaction where all the -** changes will not fit into the in-memory cache. {F12323} SQLite will -** already hold a RESERVED lock on the database file, but it needs -** to promote this lock to EXCLUSIVE so that it can spill cache -** pages into the database file without harm to concurrent -** readers. {F12324} If it is unable to promote the lock, then the in-memory -** cache will be left in an inconsistent state and so the error -** code is promoted from the relatively benign [SQLITE_BUSY] to -** the more severe [SQLITE_IOERR_BLOCKED]. {F12325} This error code promotion -** forces an automatic rollback of the changes. {END} See the -** -** CorruptionFollowingBusyError wiki page for a discussion of why -** this is important. -** -** {F12326} Sqlite is re-entrant, so the busy handler may start a new -** query. {END} (It is not clear why anyone would every want to do this, -** but it is allowed, in theory.) {U12327} But the busy handler may not -** close the database. Closing the database from a busy handler will delete -** data structures out from under the executing query and will -** probably result in a segmentation fault or other runtime error. {END} -** -** {F12328} There can only be a single busy handler defined for each database -** connection. Setting a new busy handler clears any previous one. -** {F12329} Note that calling [sqlite3_busy_timeout()] will also set or clear -** the busy handler. -** -** {F12331} When operating in [sqlite3_enable_shared_cache | shared cache mode], -** only a single busy handler can be defined for each database file. -** So if two database connections share a single cache, then changing -** the busy handler on one connection will also change the busy -** handler in the other connection. {F12332} The busy handler is invoked -** in the thread that was running when the lock contention occurs. -*/ -/*IMPORT_C*/ int sqlite3_busy_handler(sqlite3*, int(*)(void*,int), void*); - -/* -** CAPI3REF: Set A Busy Timeout {F12340} -** -** {F12341} This routine sets a [sqlite3_busy_handler | busy handler] -** that sleeps for a while when a -** table is locked. {F12342} The handler will sleep multiple times until -** at least "ms" milliseconds of sleeping have been done. {F12343} After -** "ms" milliseconds of sleeping, the handler returns 0 which -** causes [sqlite3_step()] to return [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED]. -** -** {F12344} Calling this routine with an argument less than or equal to zero -** turns off all busy handlers. -** -** {F12345} There can only be a single busy handler for a particular database -** connection. If another busy handler was defined -** (using [sqlite3_busy_handler()]) prior to calling -** this routine, that other busy handler is cleared. -*/ -/*IMPORT_C*/ int sqlite3_busy_timeout(sqlite3*, int ms); - -/* -** CAPI3REF: Convenience Routines For Running Queries {F12370} -** -** This next routine is a convenience wrapper around [sqlite3_exec()]. -** {F12371} Instead of invoking a user-supplied callback for each row of the -** result, this routine remembers each row of the result in memory -** obtained from [sqlite3_malloc()], then returns all of the result after the -** query has finished. {F12372} -** -** As an example, suppose the query result where this table: -** -**
-**        Name        | Age
-**        -----------------------
-**        Alice       | 43
-**        Bob         | 28
-**        Cindy       | 21
-** 
-** -** If the 3rd argument were &azResult then after the function returns -** azResult will contain the following data: -** -**
-**        azResult[0] = "Name";
-**        azResult[1] = "Age";
-**        azResult[2] = "Alice";
-**        azResult[3] = "43";
-**        azResult[4] = "Bob";
-**        azResult[5] = "28";
-**        azResult[6] = "Cindy";
-**        azResult[7] = "21";
-** 
-** -** Notice that there is an extra row of data containing the column -** headers. But the *nrow return value is still 3. *ncolumn is -** set to 2. In general, the number of values inserted into azResult -** will be ((*nrow) + 1)*(*ncolumn). -** -** {U12374} After the calling function has finished using the result, it should -** pass the result data pointer to sqlite3_free_table() in order to -** release the memory that was malloc-ed. Because of the way the -** [sqlite3_malloc()] happens, the calling function must not try to call -** [sqlite3_free()] directly. Only [sqlite3_free_table()] is able to release -** the memory properly and safely. {END} -** -** {F12373} The return value of this routine is the same as -** from [sqlite3_exec()]. -*/ -/*IMPORT_C*/ int sqlite3_get_table( - sqlite3*, /* An open database */ - const char *sql, /* SQL to be executed */ - char ***resultp, /* Result written to a char *[] that this points to */ - int *nrow, /* Number of result rows written here */ - int *ncolumn, /* Number of result columns written here */ - char **errmsg /* Error msg written here */ -); -/*IMPORT_C*/ void sqlite3_free_table(char **result); - -/* -** CAPI3REF: Formatted String Printing Functions {F17400} -** -** These routines are workalikes of the "printf()" family of functions -** from the standard C library. -** -** {F17401} The sqlite3_mprintf() and sqlite3_vmprintf() routines write their -** results into memory obtained from [sqlite3_malloc()]. -** {U17402} The strings returned by these two routines should be -** released by [sqlite3_free()]. {F17403} Both routines return a -** NULL pointer if [sqlite3_malloc()] is unable to allocate enough -** memory to hold the resulting string. -** -** {F17404} In sqlite3_snprintf() routine is similar to "snprintf()" from -** the standard C library. The result is written into the -** buffer supplied as the second parameter whose size is given by -** the first parameter. {END} Note that the order of the -** first two parameters is reversed from snprintf(). This is an -** historical accident that cannot be fixed without breaking -** backwards compatibility. {F17405} Note also that sqlite3_snprintf() -** returns a pointer to its buffer instead of the number of -** characters actually written into the buffer. {END} We admit that -** the number of characters written would be a more useful return -** value but we cannot change the implementation of sqlite3_snprintf() -** now without breaking compatibility. -** -** {F17406} As long as the buffer size is greater than zero, sqlite3_snprintf() -** guarantees that the buffer is always zero-terminated. {F17407} The first -** parameter "n" is the total size of the buffer, including space for -** the zero terminator. {END} So the longest string that can be completely -** written will be n-1 characters. -** -** These routines all implement some additional formatting -** options that are useful for constructing SQL statements. -** All of the usual printf formatting options apply. In addition, there -** is are "%q", "%Q", and "%z" options. -** -** {F17410} The %q option works like %s in that it substitutes a null-terminated -** string from the argument list. But %q also doubles every '\'' character. -** %q is designed for use inside a string literal. {END} By doubling each '\'' -** character it escapes that character and allows it to be inserted into -** the string. -** -** For example, so some string variable contains text as follows: -** -**
-**  char *zText = "It's a happy day!";
-** 
-** -** One can use this text in an SQL statement as follows: -** -**
-**  char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES('%q')", zText);
-**  sqlite3_exec(db, zSQL, 0, 0, 0);
-**  sqlite3_free(zSQL);
-** 
-** -** Because the %q format string is used, the '\'' character in zText -** is escaped and the SQL generated is as follows: -** -**
-**  INSERT INTO table1 VALUES('It''s a happy day!')
-** 
-** -** This is correct. Had we used %s instead of %q, the generated SQL -** would have looked like this: -** -**
-**  INSERT INTO table1 VALUES('It's a happy day!');
-** 
-** -** This second example is an SQL syntax error. As a general rule you -** should always use %q instead of %s when inserting text into a string -** literal. -** -** {F17411} The %Q option works like %q except it also adds single quotes around -** the outside of the total string. Or if the parameter in the argument -** list is a NULL pointer, %Q substitutes the text "NULL" (without single -** quotes) in place of the %Q option. {END} So, for example, one could say: -** -**
-**  char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES(%Q)", zText);
-**  sqlite3_exec(db, zSQL, 0, 0, 0);
-**  sqlite3_free(zSQL);
-** 
-** -** The code above will render a correct SQL statement in the zSQL -** variable even if the zText variable is a NULL pointer. -** -** {F17412} The "%z" formatting option works exactly like "%s" with the -** addition that after the string has been read and copied into -** the result, [sqlite3_free()] is called on the input string. {END} -*/ -/*IMPORT_C*/ char *sqlite3_mprintf(const char*,...); -/*IMPORT_C*/ char *sqlite3_snprintf(int,char*,const char*, ...); - -/* -** CAPI3REF: Memory Allocation Subsystem {F17300} -** -** {F17301} The SQLite core uses these three routines for all of its own -** internal memory allocation needs. {END} "Core" in the previous sentence -** does not include operating-system specific VFS implementation. The -** windows VFS uses native malloc and free for some operations. -** -** {F17302} The sqlite3_malloc() routine returns a pointer to a block -** of memory at least N bytes in length, where N is the parameter. -** {F17303} If sqlite3_malloc() is unable to obtain sufficient free -** memory, it returns a NULL pointer. {F17304} If the parameter N to -** sqlite3_malloc() is zero or negative then sqlite3_malloc() returns -** a NULL pointer. -** -** {F17305} Calling sqlite3_free() with a pointer previously returned -** by sqlite3_malloc() or sqlite3_realloc() releases that memory so -** that it might be reused. {F17306} The sqlite3_free() routine is -** a no-op if is called with a NULL pointer. Passing a NULL pointer -** to sqlite3_free() is harmless. {U17307} After being freed, memory -** should neither be read nor written. Even reading previously freed -** memory might result in a segmentation fault or other severe error. -** {U17309} Memory corruption, a segmentation fault, or other severe error -** might result if sqlite3_free() is called with a non-NULL pointer that -** was not obtained from sqlite3_malloc() or sqlite3_free(). -** -** {F17310} The sqlite3_realloc() interface attempts to resize a -** prior memory allocation to be at least N bytes, where N is the -** second parameter. The memory allocation to be resized is the first -** parameter. {F17311} If the first parameter to sqlite3_realloc() -** is a NULL pointer then its behavior is identical to calling -** sqlite3_malloc(N) where N is the second parameter to sqlite3_realloc(). -** {F17312} If the second parameter to sqlite3_realloc() is zero or -** negative then the behavior is exactly the same as calling -** sqlite3_free(P) where P is the first parameter to sqlite3_realloc(). -** {F17313} Sqlite3_realloc() returns a pointer to a memory allocation -** of at least N bytes in size or NULL if sufficient memory is unavailable. -** {F17314} If M is the size of the prior allocation, then min(N,M) bytes -** of the prior allocation are copied into the beginning of buffer returned -** by sqlite3_realloc() and the prior allocation is freed. -** {F17315} If sqlite3_realloc() returns NULL, then the prior allocation -** is not freed. -** -** {F17316} The memory returned by sqlite3_malloc() and sqlite3_realloc() -** is always aligned to at least an 8 byte boundary. {END} -** -** {F17381} The default implementation -** of the memory allocation subsystem uses the malloc(), realloc() -** and free() provided by the standard C library. {F17382} However, if -** SQLite is compiled with the following C preprocessor macro -** -**
SQLITE_MEMORY_SIZE=NNN
-** -** where NNN is an integer, then SQLite create a static -** array of at least NNN bytes in size and use that array -** for all of its dynamic memory allocation needs. {END} Additional -** memory allocator options may be added in future releases. -** -** In SQLite version 3.5.0 and 3.5.1, it was possible to define -** the SQLITE_OMIT_MEMORY_ALLOCATION which would cause the built-in -** implementation of these routines to be omitted. That capability -** is no longer provided. Only built-in memory allocators can be -** used. -** -** The windows OS interface layer calls -** the system malloc() and free() directly when converting -** filenames between the UTF-8 encoding used by SQLite -** and whatever filename encoding is used by the particular windows -** installation. Memory allocation errors are detected, but -** they are reported back as [SQLITE_CANTOPEN] or -** [SQLITE_IOERR] rather than [SQLITE_NOMEM]. -*/ -/*IMPORT_C*/ void *sqlite3_malloc(int); -/*IMPORT_C*/ void *sqlite3_realloc(void*, int); -/*IMPORT_C*/ void sqlite3_free(void*); - -/* -** CAPI3REF: Memory Allocator Statistics {F17370} -** -** In addition to the basic three allocation routines -** [sqlite3_malloc()], [sqlite3_free()], and [sqlite3_realloc()], -** the memory allocation subsystem included with the SQLite -** sources provides the interfaces shown here. -** -** {F17371} The sqlite3_memory_used() routine returns the -** number of bytes of memory currently outstanding (malloced but not freed). -** {F17372} The value returned by sqlite3_memory_used() includes -** any overhead added by SQLite, but not overhead added by the -** library malloc() that backs the sqlite3_malloc() implementation. -** {F17373} The sqlite3_memory_highwater() routines returns the -** maximum number of bytes that have been outstanding at any time -** since the highwater mark was last reset. -** {F17374} The byte count returned by sqlite3_memory_highwater() -** uses the same byte counting rules as sqlite3_memory_used(). {END} -** In other words, overhead added internally by SQLite is counted, -** but overhead from the underlying system malloc is not. -** {F17375} If the parameter to sqlite3_memory_highwater() is true, -** then the highwater mark is reset to the current value of -** sqlite3_memory_used() and the prior highwater mark (before the -** reset) is returned. {F17376} If the parameter to -** sqlite3_memory_highwater() is zero, then the highwater mark is -** unchanged. -*/ -/*IMPORT_C*/ sqlite3_int64 sqlite3_memory_used(void); -/*IMPORT_C*/ sqlite3_int64 sqlite3_memory_highwater(int resetFlag); - -/* -** CAPI3REF: Compile-Time Authorization Callbacks {F12500} -** -** {F12501} This routine registers a authorizer callback with a particular -** database connection, supplied in the first argument. {F12502} -** The authorizer callback is invoked as SQL statements are being compiled -** by [sqlite3_prepare()] or its variants [sqlite3_prepare_v2()], -** [sqlite3_prepare16()] and [sqlite3_prepare16_v2()]. {F12503} At various -** points during the compilation process, as logic is being created -** to perform various actions, the authorizer callback is invoked to -** see if those actions are allowed. The authorizer callback should -** return SQLITE_OK to allow the action, [SQLITE_IGNORE] to disallow the -** specific action but allow the SQL statement to continue to be -** compiled, or [SQLITE_DENY] to cause the entire SQL statement to be -** rejected with an error. {F12504} If the authorizer callback returns -** any value other than [SQLITE_IGNORE], [SQLITE_OK], or [SQLITE_DENY] -** then [sqlite3_prepare_v2()] or equivalent call that triggered -** the authorizer shall -** fail with an SQLITE_ERROR error code and an appropriate error message. {END} -** -** When the callback returns [SQLITE_OK], that means the operation -** requested is ok. {F12505} When the callback returns [SQLITE_DENY], the -** [sqlite3_prepare_v2()] or equivalent call that triggered the -** authorizer shall fail -** with an SQLITE_ERROR error code and an error message explaining that -** access is denied. {F12506} If the authorizer code (the 2nd parameter -** to the authorizer callback is anything other than [SQLITE_READ], then -** a return of [SQLITE_IGNORE] has the same effect as [SQLITE_DENY]. -** If the authorizer code is [SQLITE_READ] and the callback returns -** [SQLITE_IGNORE] then the prepared statement is constructed to -** insert a NULL value in place of the table column that would have -** been read if [SQLITE_OK] had been returned. {END} -** -** {F12510} The first parameter to the authorizer callback is a copy of -** the third parameter to the sqlite3_set_authorizer() interface. -** {F12511} The second parameter to the callback is an integer -** [SQLITE_COPY | action code] that specifies the particular action -** to be authorized. {END} The available action codes are -** [SQLITE_COPY | documented separately]. {F12512} The third through sixth -** parameters to the callback are zero-terminated strings that contain -** additional details about the action to be authorized. {END} -** -** An authorizer is used when preparing SQL statements from an untrusted -** source, to ensure that the SQL statements do not try to access data -** that they are not allowed to see, or that they do not try to -** execute malicious statements that damage the database. For -** example, an application may allow a user to enter arbitrary -** SQL queries for evaluation by a database. But the application does -** not want the user to be able to make arbitrary changes to the -** database. An authorizer could then be put in place while the -** user-entered SQL is being prepared that disallows everything -** except SELECT statements. -** -** {F12520} Only a single authorizer can be in place on a database connection -** at a time. Each call to sqlite3_set_authorizer overrides the -** previous call. {F12521} A NULL authorizer means that no authorization -** callback is invoked. {F12522} The default authorizer is NULL. {END} -** -** Note that the authorizer callback is invoked only during -** [sqlite3_prepare()] or its variants. {F12523} Authorization is not -** performed during statement evaluation in [sqlite3_step()]. {END} -*/ -/*IMPORT_C*/ int sqlite3_set_authorizer( - sqlite3*, - int (*xAuth)(void*,int,const char*,const char*,const char*,const char*), - void *pUserData -); - -/* -** CAPI3REF: Authorizer Return Codes {F12590} -** -** The [sqlite3_set_authorizer | authorizer callback function] must -** return either [SQLITE_OK] or one of these two constants in order -** to signal SQLite whether or not the action is permitted. See the -** [sqlite3_set_authorizer | authorizer documentation] for additional -** information. -*/ -#define SQLITE_DENY 1 /* Abort the SQL statement with an error */ -#define SQLITE_IGNORE 2 /* Don't allow access, but don't generate an error */ - -/* -** CAPI3REF: Authorizer Action Codes {F12550} -** -** The [sqlite3_set_authorizer()] interface registers a callback function -** that is invoked to authorizer certain SQL statement actions. {F12551} The -** second parameter to the callback is an integer code that specifies -** what action is being authorized. These are the integer action codes that -** the authorizer callback may be passed. {END} -** -** These action code values signify what kind of operation is to be -** authorized. {F12552} The 3rd and 4th parameters to the authorization -** callback function will be parameters or NULL depending on which of these -** codes is used as the second parameter. {F12553} The 5th parameter to the -** authorizer callback is the name of the database ("main", "temp", -** etc.) if applicable. {F12554} The 6th parameter to the authorizer callback -** is the name of the inner-most trigger or view that is responsible for -** the access attempt or NULL if this access attempt is directly from -** top-level SQL code. -*/ -/******************************************* 3rd ************ 4th ***********/ -#define SQLITE_CREATE_INDEX 1 /* Index Name Table Name */ -#define SQLITE_CREATE_TABLE 2 /* Table Name NULL */ -#define SQLITE_CREATE_TEMP_INDEX 3 /* Index Name Table Name */ -#define SQLITE_CREATE_TEMP_TABLE 4 /* Table Name NULL */ -#define SQLITE_CREATE_TEMP_TRIGGER 5 /* Trigger Name Table Name */ -#define SQLITE_CREATE_TEMP_VIEW 6 /* View Name NULL */ -#define SQLITE_CREATE_TRIGGER 7 /* Trigger Name Table Name */ -#define SQLITE_CREATE_VIEW 8 /* View Name NULL */ -#define SQLITE_DELETE 9 /* Table Name NULL */ -#define SQLITE_DROP_INDEX 10 /* Index Name Table Name */ -#define SQLITE_DROP_TABLE 11 /* Table Name NULL */ -#define SQLITE_DROP_TEMP_INDEX 12 /* Index Name Table Name */ -#define SQLITE_DROP_TEMP_TABLE 13 /* Table Name NULL */ -#define SQLITE_DROP_TEMP_TRIGGER 14 /* Trigger Name Table Name */ -#define SQLITE_DROP_TEMP_VIEW 15 /* View Name NULL */ -#define SQLITE_DROP_TRIGGER 16 /* Trigger Name Table Name */ -#define SQLITE_DROP_VIEW 17 /* View Name NULL */ -#define SQLITE_INSERT 18 /* Table Name NULL */ -#define SQLITE_PRAGMA 19 /* Pragma Name 1st arg or NULL */ -#define SQLITE_READ 20 /* Table Name Column Name */ -#define SQLITE_SELECT 21 /* NULL NULL */ -#define SQLITE_TRANSACTION 22 /* NULL NULL */ -#define SQLITE_UPDATE 23 /* Table Name Column Name */ -#define SQLITE_ATTACH 24 /* Filename NULL */ -#define SQLITE_DETACH 25 /* Database Name NULL */ -#define SQLITE_ALTER_TABLE 26 /* Database Name Table Name */ -#define SQLITE_REINDEX 27 /* Index Name NULL */ -#define SQLITE_ANALYZE 28 /* Table Name NULL */ -#define SQLITE_CREATE_VTABLE 29 /* Table Name Module Name */ -#define SQLITE_DROP_VTABLE 30 /* Table Name Module Name */ -#define SQLITE_FUNCTION 31 /* Function Name NULL */ -#define SQLITE_COPY 0 /* No longer used */ - -/* -** CAPI3REF: Tracing And Profiling Functions {F12280} -** -** These routines register callback functions that can be used for -** tracing and profiling the execution of SQL statements. -** -** {F12281} The callback function registered by sqlite3_trace() is invoked -** at the first [sqlite3_step()] for the evaluation of an SQL statement. -** {F12282} Only a single trace callback can be registered at a time. -** Each call to sqlite3_trace() overrides the previous. {F12283} A -** NULL callback for sqlite3_trace() disables tracing. {F12284} The -** first argument to the trace callback is a copy of the pointer which -** was the 3rd argument to sqlite3_trace. {F12285} The second argument -** to the trace callback is a zero-terminated UTF8 string containing -** the original text of the SQL statement as it was passed into -** [sqlite3_prepare_v2()] or the equivalent. {END} Note that the -** host parameter are not expanded in the SQL statement text. -** -** {F12287} The callback function registered by sqlite3_profile() is invoked -** as each SQL statement finishes. {F12288} The first parameter to the -** profile callback is a copy of the 3rd parameter to sqlite3_profile(). -** {F12289} The second parameter to the profile callback is a -** zero-terminated UTF-8 string that contains the complete text of -** the SQL statement as it was processed by [sqlite3_prepare_v2()] or -** the equivalent. {F12290} The third parameter to the profile -** callback is an estimate of the number of nanoseconds of -** wall-clock time required to run the SQL statement from start -** to finish. {END} -** -** The sqlite3_profile() API is currently considered experimental and -** is subject to change. -*/ -/*IMPORT_C*/ void *sqlite3_trace(sqlite3*, void(*xTrace)(void*,const char*), void*); -/*IMPORT_C*/ void *sqlite3_profile(sqlite3*, - void(*xProfile)(void*,const char*,sqlite3_uint64), void*); - -/* -** CAPI3REF: Query Progress Callbacks {F12910} -** -** {F12911} This routine configures a callback function - the -** progress callback - that is invoked periodically during long -** running calls to [sqlite3_exec()], [sqlite3_step()] and -** [sqlite3_get_table()]. {END} An example use for this -** interface is to keep a GUI updated during a large query. -** -** {F12912} The progress callback is invoked once for every N virtual -** machine opcodes, where N is the second argument to this function. -** {F12913} The progress callback itself is identified by the third -** argument to this function. {F12914} The fourth argument to this -** function is a void pointer passed to the progress callback -** function each time it is invoked. {END} -** -** {F12915} If a call to [sqlite3_exec()], [sqlite3_step()], or -** [sqlite3_get_table()] results in fewer than N opcodes being executed, -** then the progress callback is never invoked. {END} -** -** {F12916} Only a single progress callback function may be registered for each -** open database connection. Every call to sqlite3_progress_handler() -** overwrites the results of the previous call. {F12917} -** To remove the progress callback altogether, pass NULL as the third -** argument to this function. {END} -** -** {F12918} If the progress callback returns a result other than 0, then -** the current query is immediately terminated and any database changes -** rolled back. {F12919} -** The containing [sqlite3_exec()], [sqlite3_step()], or -** [sqlite3_get_table()] call returns SQLITE_INTERRUPT. {END} This feature -** can be used, for example, to implement the "Cancel" button on a -** progress dialog box in a GUI. -*/ -/*IMPORT_C*/ void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); - -/* -** CAPI3REF: Opening A New Database Connection {F12700} -** -** {F12701} These routines open an SQLite database file whose name -** is given by the filename argument. -** {F12702} The filename argument is interpreted as UTF-8 -** for [sqlite3_open()] and [sqlite3_open_v2()] and as UTF-16 -** in the native byte order for [sqlite3_open16()]. -** {F12703} An [sqlite3*] handle is returned in *ppDb, even -** if an error occurs. {F12723} (Exception: if SQLite is unable -** to allocate memory to hold the [sqlite3] object, a NULL will -** be written into *ppDb instead of a pointer to the [sqlite3] object.) -** {F12704} If the database is opened (and/or created) -** successfully, then [SQLITE_OK] is returned. {F12705} Otherwise an -** error code is returned. {F12706} The -** [sqlite3_errmsg()] or [sqlite3_errmsg16()] routines can be used to obtain -** an English language description of the error. -** -** {F12707} The default encoding for the database will be UTF-8 if -** [sqlite3_open()] or [sqlite3_open_v2()] is called and -** UTF-16 in the native byte order if [sqlite3_open16()] is used. -** -** {F12708} Whether or not an error occurs when it is opened, resources -** associated with the [sqlite3*] handle should be released by passing it -** to [sqlite3_close()] when it is no longer required. -** -** {F12709} The [sqlite3_open_v2()] interface works like [sqlite3_open()] -** except that it acccepts two additional parameters for additional control -** over the new database connection. {F12710} The flags parameter can be -** one of: -** -**
    -**
  1. [SQLITE_OPEN_READONLY] -**
  2. [SQLITE_OPEN_READWRITE] -**
  3. [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE] -**
-** -** {F12711} The first value opens the database read-only. -** {F12712} If the database does not previously exist, an error is returned. -** {F12713} The second option opens -** the database for reading and writing if possible, or reading only if -** if the file is write protected. {F12714} In either case the database -** must already exist or an error is returned. {F12715} The third option -** opens the database for reading and writing and creates it if it does -** not already exist. {F12716} -** The third options is behavior that is always used for [sqlite3_open()] -** and [sqlite3_open16()]. -** -** {F12717} If the filename is ":memory:", then an private -** in-memory database is created for the connection. {F12718} This in-memory -** database will vanish when the database connection is closed. {END} Future -** version of SQLite might make use of additional special filenames -** that begin with the ":" character. It is recommended that -** when a database filename really does begin with -** ":" that you prefix the filename with a pathname like "./" to -** avoid ambiguity. -** -** {F12719} If the filename is an empty string, then a private temporary -** on-disk database will be created. {F12720} This private database will be -** automatically deleted as soon as the database connection is closed. -** -** {F12721} The fourth parameter to sqlite3_open_v2() is the name of the -** [sqlite3_vfs] object that defines the operating system -** interface that the new database connection should use. {F12722} If the -** fourth parameter is a NULL pointer then the default [sqlite3_vfs] -** object is used. {END} -** -** Note to windows users: The encoding used for the filename argument -** of [sqlite3_open()] and [sqlite3_open_v2()] must be UTF-8, not whatever -** codepage is currently defined. Filenames containing international -** characters must be converted to UTF-8 prior to passing them into -** [sqlite3_open()] or [sqlite3_open_v2()]. -*/ -/*IMPORT_C*/ int sqlite3_open( - const char *filename, /* Database filename (UTF-8) */ - sqlite3 **ppDb /* OUT: SQLite db handle */ -); -/*IMPORT_C*/ int sqlite3_open16( - const void *filename, /* Database filename (UTF-16) */ - sqlite3 **ppDb /* OUT: SQLite db handle */ -); -/*IMPORT_C*/ int sqlite3_open_v2( - const char *filename, /* Database filename (UTF-8) */ - sqlite3 **ppDb, /* OUT: SQLite db handle */ - int flags, /* Flags */ - const char *zVfs /* Name of VFS module to use */ -); - -/* -** CAPI3REF: Error Codes And Messages {F12800} -** -** {F12801} The sqlite3_errcode() interface returns the numeric -** [SQLITE_OK | result code] or [SQLITE_IOERR_READ | extended result code] -** for the most recent failed sqlite3_* API call associated -** with [sqlite3] handle 'db'. {U12802} If a prior API call failed but the -** most recent API call succeeded, the return value from sqlite3_errcode() -** is undefined. {END} -** -** {F12803} The sqlite3_errmsg() and sqlite3_errmsg16() return English-language -** text that describes the error, as either UTF8 or UTF16 respectively. -** {F12804} Memory to hold the error message string is managed internally. -** {U12805} The -** string may be overwritten or deallocated by subsequent calls to SQLite -** interface functions. {END} -** -** {F12806} Calls to many sqlite3_* functions set the error code and -** string returned by [sqlite3_errcode()], [sqlite3_errmsg()], and -** [sqlite3_errmsg16()] overwriting the previous values. {F12807} -** Except, calls to [sqlite3_errcode()], -** [sqlite3_errmsg()], and [sqlite3_errmsg16()] themselves do not affect the -** results of future invocations. {F12808} Calls to API routines that -** do not return an error code (example: [sqlite3_data_count()]) do not -** change the error code returned by this routine. {F12809} Interfaces that -** are not associated with a specific database connection (examples: -** [sqlite3_mprintf()] or [sqlite3_enable_shared_cache()] do not change -** the return code. {END} -** -** {F12810} Assuming no other intervening sqlite3_* API calls are made, -** the error code returned by this function is associated with the same -** error as the strings returned by [sqlite3_errmsg()] and [sqlite3_errmsg16()]. -*/ -/*IMPORT_C*/ int sqlite3_errcode(sqlite3 *db); -/*IMPORT_C*/ const char *sqlite3_errmsg(sqlite3*); -/*IMPORT_C*/ const void *sqlite3_errmsg16(sqlite3*); - -/* -** CAPI3REF: SQL Statement Object {F13000} -** -** An instance of this object represent single SQL statements. This -** object is variously known as a "prepared statement" or a -** "compiled SQL statement" or simply as a "statement". -** -** The life of a statement object goes something like this: -** -**
    -**
  1. Create the object using [sqlite3_prepare_v2()] or a related -** function. -**
  2. Bind values to host parameters using -** [sqlite3_bind_blob | sqlite3_bind_* interfaces]. -**
  3. Run the SQL by calling [sqlite3_step()] one or more times. -**
  4. Reset the statement using [sqlite3_reset()] then go back -** to step 2. Do this zero or more times. -**
  5. Destroy the object using [sqlite3_finalize()]. -**
-** -** Refer to documentation on individual methods above for additional -** information. -*/ -typedef struct sqlite3_stmt sqlite3_stmt; - -/* -** CAPI3REF: Compiling An SQL Statement {F13010} -** -** To execute an SQL query, it must first be compiled into a byte-code -** program using one of these routines. -** -** {F13011} The first argument "db" is an [sqlite3 | SQLite database handle] -** obtained from a prior call to [sqlite3_open()], [sqlite3_open_v2()] -** or [sqlite3_open16()]. {F13012} -** The second argument "zSql" is the statement to be compiled, encoded -** as either UTF-8 or UTF-16. The sqlite3_prepare() and sqlite3_prepare_v2() -** interfaces uses UTF-8 and sqlite3_prepare16() and sqlite3_prepare16_v2() -** use UTF-16. {END} -** -** {F13013} If the nByte argument is less -** than zero, then zSql is read up to the first zero terminator. -** {F13014} If nByte is non-negative, then it is the maximum number of -** bytes read from zSql. When nByte is non-negative, the -** zSql string ends at either the first '\000' or '\u0000' character or -** until the nByte-th byte, whichever comes first. {END} -** -** {F13015} *pzTail is made to point to the first byte past the end of the -** first SQL statement in zSql. These routines only compiles the first -** statement in zSql, so *pzTail is left pointing to what remains -** uncompiled. {END} -** -** {F13016} *ppStmt is left pointing to a compiled -** [sqlite3_stmt | SQL statement structure] that can be -** executed using [sqlite3_step()]. Or if there is an error, *ppStmt may be -** set to NULL. {F13017} If the input text contains no SQL (if the input -** is and empty string or a comment) then *ppStmt is set to NULL. -** {U13018} The calling procedure is responsible for deleting the -** compiled SQL statement -** using [sqlite3_finalize()] after it has finished with it. -** -** {F13019} On success, [SQLITE_OK] is returned. Otherwise an -** [SQLITE_ERROR | error code] is returned. {END} -** -** The sqlite3_prepare_v2() and sqlite3_prepare16_v2() interfaces are -** recommended for all new programs. The two older interfaces are retained -** for backwards compatibility, but their use is discouraged. -** {F13020} In the "v2" interfaces, the prepared statement -** that is returned (the [sqlite3_stmt] object) contains a copy of the -** original SQL text. {END} This causes the [sqlite3_step()] interface to -** behave a differently in two ways: -** -**
    -**
  1. {F13022} -** If the database schema changes, instead of returning [SQLITE_SCHEMA] as it -** always used to do, [sqlite3_step()] will automatically recompile the SQL -** statement and try to run it again. {F12023} If the schema has changed in -** a way that makes the statement no longer valid, [sqlite3_step()] will still -** return [SQLITE_SCHEMA]. {END} But unlike the legacy behavior, -** [SQLITE_SCHEMA] is now a fatal error. {F12024} Calling -** [sqlite3_prepare_v2()] again will not make the -** error go away. {F12025} Note: use [sqlite3_errmsg()] to find the text -** of the parsing error that results in an [SQLITE_SCHEMA] return. {END} -**
  2. -** -**
  3. -** {F13030} When an error occurs, -** [sqlite3_step()] will return one of the detailed -** [SQLITE_ERROR | result codes] or -** [SQLITE_IOERR_READ | extended result codes]. {F13031} -** The legacy behavior was that [sqlite3_step()] would only return a generic -** [SQLITE_ERROR] result code and you would have to make a second call to -** [sqlite3_reset()] in order to find the underlying cause of the problem. -** {F13032} -** With the "v2" prepare interfaces, the underlying reason for the error is -** returned immediately. {END} -**
  4. -**
-*/ -/*IMPORT_C*/ int sqlite3_prepare( - sqlite3 *db, /* Database handle */ - const char *zSql, /* SQL statement, UTF-8 encoded */ - int nByte, /* Maximum length of zSql in bytes. */ - sqlite3_stmt **ppStmt, /* OUT: Statement handle */ - const char **pzTail /* OUT: Pointer to unused portion of zSql */ -); -/*IMPORT_C*/ int sqlite3_prepare_v2( - sqlite3 *db, /* Database handle */ - const char *zSql, /* SQL statement, UTF-8 encoded */ - int nByte, /* Maximum length of zSql in bytes. */ - sqlite3_stmt **ppStmt, /* OUT: Statement handle */ - const char **pzTail /* OUT: Pointer to unused portion of zSql */ -); -/*IMPORT_C*/ int sqlite3_prepare16( - sqlite3 *db, /* Database handle */ - const void *zSql, /* SQL statement, UTF-16 encoded */ - int nByte, /* Maximum length of zSql in bytes. */ - sqlite3_stmt **ppStmt, /* OUT: Statement handle */ - const void **pzTail /* OUT: Pointer to unused portion of zSql */ -); -/*IMPORT_C*/ int sqlite3_prepare16_v2( - sqlite3 *db, /* Database handle */ - const void *zSql, /* SQL statement, UTF-16 encoded */ - int nByte, /* Maximum length of zSql in bytes. */ - sqlite3_stmt **ppStmt, /* OUT: Statement handle */ - const void **pzTail /* OUT: Pointer to unused portion of zSql */ -); - -/* -** CAPIREF: Retrieving Statement SQL {F13100} -** -** {F13101} If the compiled SQL statement passed as an argument was -** compiled using either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()], -** then this function returns a pointer to a zero-terminated string -** containing a copy of the original SQL statement. {F13102} The -** pointer is valid until the statement -** is deleted using sqlite3_finalize(). -** {F13103} The string returned by sqlite3_sql() is always UTF8 even -** if a UTF16 string was originally entered using [sqlite3_prepare16_v2()] -** or the equivalent. -** -** {F13104} If the statement was compiled using either of the legacy -** interfaces [sqlite3_prepare()] or [sqlite3_prepare16()], this -** function returns NULL. -*/ -/*IMPORT_C*/ const char *sqlite3_sql(sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Dynamically Typed Value Object {F15000} -** -** {F15001} SQLite uses the sqlite3_value object to represent all values -** that are or can be stored in a database table. {END} -** SQLite uses dynamic typing for the values it stores. -** {F15002} Values stored in sqlite3_value objects can be -** be integers, floating point values, strings, BLOBs, or NULL. -*/ -typedef struct Mem sqlite3_value; - -/* -** CAPI3REF: SQL Function Context Object {F16001} -** -** The context in which an SQL function executes is stored in an -** sqlite3_context object. {F16002} A pointer to an sqlite3_context -** object is always first parameter to application-defined SQL functions. -*/ -typedef struct sqlite3_context sqlite3_context; - -/* -** CAPI3REF: Binding Values To Prepared Statements {F13500} -** -** {F13501} In the SQL strings input to [sqlite3_prepare_v2()] and its -** variants, literals may be replace by a parameter in one -** of these forms: -** -**
    -**
  • ? -**
  • ?NNN -**
  • :AAA -**
  • @AAA -**
  • $VVV -**
-** -** In the parameter forms shown above NNN is an integer literal, -** AAA is an alphanumeric identifier and VVV is a variable name according -** to the syntax rules of the TCL programming language. {END} -** The values of these parameters (also called "host parameter names") -** can be set using the sqlite3_bind_*() routines defined here. -** -** {F13502} The first argument to the sqlite3_bind_*() routines always -** is a pointer to the [sqlite3_stmt] object returned from -** [sqlite3_prepare_v2()] or its variants. {F13503} The second -** argument is the index of the parameter to be set. {F13504} The -** first parameter has an index of 1. {F13505} When the same named -** parameter is used more than once, second and subsequent -** occurrences have the same index as the first occurrence. -** {F13506} The index for named parameters can be looked up using the -** [sqlite3_bind_parameter_name()] API if desired. {F13507} The index -** for "?NNN" parameters is the value of NNN. -** {F13508} The NNN value must be between 1 and the compile-time -** parameter SQLITE_MAX_VARIABLE_NUMBER (default value: 999). {END} -** See limits.html for additional information. -** -** {F13509} The third argument is the value to bind to the parameter. {END} -** -** {F13510} In those -** routines that have a fourth argument, its value is the number of bytes -** in the parameter. To be clear: the value is the number of bytes in the -** string, not the number of characters. {F13511} The number -** of bytes does not include the zero-terminator at the end of strings. -** {F13512} -** If the fourth parameter is negative, the length of the string is -** number of bytes up to the first zero terminator. {END} -** -** {F13513} -** The fifth argument to sqlite3_bind_blob(), sqlite3_bind_text(), and -** sqlite3_bind_text16() is a destructor used to dispose of the BLOB or -** text after SQLite has finished with it. {F13514} If the fifth argument is -** the special value [SQLITE_STATIC], then the library assumes that the -** information is in static, unmanaged space and does not need to be freed. -** {F13515} If the fifth argument has the value [SQLITE_TRANSIENT], then -** SQLite makes its own private copy of the data immediately, before -** the sqlite3_bind_*() routine returns. {END} -** -** {F13520} The sqlite3_bind_zeroblob() routine binds a BLOB of length N that -** is filled with zeros. {F13521} A zeroblob uses a fixed amount of memory -** (just an integer to hold it size) while it is being processed. {END} -** Zeroblobs are intended to serve as place-holders for BLOBs whose -** content is later written using -** [sqlite3_blob_open | increment BLOB I/O] routines. {F13522} A negative -** value for the zeroblob results in a zero-length BLOB. {END} -** -** {F13530} The sqlite3_bind_*() routines must be called after -** [sqlite3_prepare_v2()] (and its variants) or [sqlite3_reset()] and -** before [sqlite3_step()]. {F13531} -** Bindings are not cleared by the [sqlite3_reset()] routine. -** {F13532} Unbound parameters are interpreted as NULL. {END} -** -** {F13540} These routines return [SQLITE_OK] on success or an error code if -** anything goes wrong. {F13541} [SQLITE_RANGE] is returned if the parameter -** index is out of range. {F13542} [SQLITE_NOMEM] is returned if malloc fails. -** {F13543} [SQLITE_MISUSE] is returned if these routines are called on a -** virtual machine that is the wrong state or which has already been finalized. -*/ -/*IMPORT_C*/ int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*)); -/*IMPORT_C*/ int sqlite3_bind_double(sqlite3_stmt*, int, double); -/*IMPORT_C*/ int sqlite3_bind_int(sqlite3_stmt*, int, int); -/*IMPORT_C*/ int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64); -/*IMPORT_C*/ int sqlite3_bind_null(sqlite3_stmt*, int); -/*IMPORT_C*/ int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*)); -/*IMPORT_C*/ int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*)); -/*IMPORT_C*/ int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*); -/*IMPORT_C*/ int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n); - -/* -** CAPI3REF: Number Of Host Parameters {F13600} -** -** {F13601} Return the largest host parameter index in the precompiled -** statement given as the argument. {F13602} When the host parameters -** are of the forms like ":AAA", "$VVV", "@AAA", or "?", -** then they are assigned sequential increasing numbers beginning -** with one, so the value returned is the number of parameters. -** {F13603} However -** if the same host parameter name is used multiple times, each occurrance -** is given the same number, so the value returned in that case is the number -** of unique host parameter names. {F13604} If host parameters of the -** form "?NNN" are used (where NNN is an integer) then there might be -** gaps in the numbering and the value returned by this interface is -** the index of the host parameter with the largest index value. {END} -** -** {U13605} The prepared statement must not be [sqlite3_finalize | finalized] -** prior to this routine returning. Otherwise the results are undefined -** and probably undesirable. -*/ -/*IMPORT_C*/ int sqlite3_bind_parameter_count(sqlite3_stmt*); - -/* -** CAPI3REF: Name Of A Host Parameter {F13620} -** -** {F13621} This routine returns a pointer to the name of the n-th -** parameter in a [sqlite3_stmt | prepared statement]. {F13622} -** Host parameters of the form ":AAA" or "@AAA" or "$VVV" have a name -** which is the string ":AAA" or "@AAA" or "$VVV". -** In other words, the initial ":" or "$" or "@" -** is included as part of the name. {F13626} -** Parameters of the form "?" or "?NNN" have no name. -** -** {F13623} The first host parameter has an index of 1, not 0. -** -** {F13624} If the value n is out of range or if the n-th parameter is -** nameless, then NULL is returned. {F13625} The returned string is -** always in the UTF-8 encoding even if the named parameter was -** originally specified as UTF-16 in [sqlite3_prepare16()] or -** [sqlite3_prepare16_v2()]. -*/ -/*IMPORT_C*/ const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int); - -/* -** CAPI3REF: Index Of A Parameter With A Given Name {F13640} -** -** {F13641} This routine returns the index of a host parameter with the -** given name. {F13642} The name must match exactly. {F13643} -** If no parameter with the given name is found, return 0. -** {F13644} Parameter names must be UTF8. -*/ -/*IMPORT_C*/ int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName); - -/* -** CAPI3REF: Reset All Bindings On A Prepared Statement {F13660} -** -** {F13661} Contrary to the intuition of many, [sqlite3_reset()] does not -** reset the [sqlite3_bind_blob | bindings] on a -** [sqlite3_stmt | prepared statement]. {F13662} Use this routine to -** reset all host parameters to NULL. -*/ -/*IMPORT_C*/ int sqlite3_clear_bindings(sqlite3_stmt*); - -/* -** CAPI3REF: Number Of Columns In A Result Set {F13710} -** -** {F13711} Return the number of columns in the result set returned by the -** [sqlite3_stmt | compiled SQL statement]. {F13712} This routine returns 0 -** if pStmt is an SQL statement that does not return data (for -** example an UPDATE). -*/ -/*IMPORT_C*/ int sqlite3_column_count(sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Column Names In A Result Set {F13720} -** -** {F13721} These routines return the name assigned to a particular column -** in the result set of a SELECT statement. {F13722} The sqlite3_column_name() -** interface returns a pointer to a zero-terminated UTF8 string -** and sqlite3_column_name16() returns a pointer to a zero-terminated -** UTF16 string. {F13723} The first parameter is the -** [sqlite3_stmt | prepared statement] that implements the SELECT statement. -** The second parameter is the column number. The left-most column is -** number 0. -** -** {F13724} The returned string pointer is valid until either the -** [sqlite3_stmt | prepared statement] is destroyed by [sqlite3_finalize()] -** or until the next call sqlite3_column_name() or sqlite3_column_name16() -** on the same column. -** -** {F13725} If sqlite3_malloc() fails during the processing of either routine -** (for example during a conversion from UTF-8 to UTF-16) then a -** NULL pointer is returned. -*/ -/*IMPORT_C*/ const char *sqlite3_column_name(sqlite3_stmt*, int N); -/*IMPORT_C*/ const void *sqlite3_column_name16(sqlite3_stmt*, int N); - -/* -** CAPI3REF: Source Of Data In A Query Result {F13740} -** -** {F13741} These routines provide a means to determine what column of what -** table in which database a result of a SELECT statement comes from. -** {F13742} The name of the database or table or column can be returned as -** either a UTF8 or UTF16 string. {F13743} The _database_ routines return -** the database name, the _table_ routines return the table name, and -** the origin_ routines return the column name. {F13744} -** The returned string is valid until -** the [sqlite3_stmt | prepared statement] is destroyed using -** [sqlite3_finalize()] or until the same information is requested -** again in a different encoding. -** -** {F13745} The names returned are the original un-aliased names of the -** database, table, and column. -** -** {F13746} The first argument to the following calls is a -** [sqlite3_stmt | compiled SQL statement]. -** {F13747} These functions return information about the Nth column returned by -** the statement, where N is the second function argument. -** -** {F13748} If the Nth column returned by the statement is an expression -** or subquery and is not a column value, then all of these functions -** return NULL. {F13749} Otherwise, they return the -** name of the attached database, table and column that query result -** column was extracted from. -** -** {F13750} As with all other SQLite APIs, those postfixed with "16" return -** UTF-16 encoded strings, the other functions return UTF-8. {END} -** -** These APIs are only available if the library was compiled with the -** SQLITE_ENABLE_COLUMN_METADATA preprocessor symbol defined. -** -** {U13751} -** If two or more threads call one or more of these routines against the same -** prepared statement and column at the same time then the results are -** undefined. -*/ -/*IMPORT_C*/ const char *sqlite3_column_database_name(sqlite3_stmt*,int); -/*IMPORT_C*/ const void *sqlite3_column_database_name16(sqlite3_stmt*,int); -/*IMPORT_C*/ const char *sqlite3_column_table_name(sqlite3_stmt*,int); -/*IMPORT_C*/ const void *sqlite3_column_table_name16(sqlite3_stmt*,int); -/*IMPORT_C*/ const char *sqlite3_column_origin_name(sqlite3_stmt*,int); -/*IMPORT_C*/ const void *sqlite3_column_origin_name16(sqlite3_stmt*,int); - -/* -** CAPI3REF: Declared Datatype Of A Query Result {F13760} -** -** The first parameter is a [sqlite3_stmt | compiled SQL statement]. -** {F13761} If this statement is a SELECT statement and the Nth column of the -** returned result set of that SELECT is a table column (not an -** expression or subquery) then the declared type of the table -** column is returned. {F13762} If the Nth column of the result set is an -** expression or subquery, then a NULL pointer is returned. -** {F13763} The returned string is always UTF-8 encoded. {END} -** For example, in the database schema: -** -** CREATE TABLE t1(c1 VARIANT); -** -** And the following statement compiled: -** -** SELECT c1 + 1, c1 FROM t1; -** -** Then this routine would return the string "VARIANT" for the second -** result column (i==1), and a NULL pointer for the first result column -** (i==0). -** -** SQLite uses dynamic run-time typing. So just because a column -** is declared to contain a particular type does not mean that the -** data stored in that column is of the declared type. SQLite is -** strongly typed, but the typing is dynamic not static. Type -** is associated with individual values, not with the containers -** used to hold those values. -*/ -/*IMPORT_C*/ const char *sqlite3_column_decltype(sqlite3_stmt *, int i); -/*IMPORT_C*/ const void *sqlite3_column_decltype16(sqlite3_stmt*,int); - -/* -** CAPI3REF: Evaluate An SQL Statement {F13200} -** -** After an [sqlite3_stmt | SQL statement] has been prepared with a call -** to either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] or to one of -** the legacy interfaces [sqlite3_prepare()] or [sqlite3_prepare16()], -** then this function must be called one or more times to evaluate the -** statement. -** -** The details of the behavior of this sqlite3_step() interface depend -** on whether the statement was prepared using the newer "v2" interface -** [sqlite3_prepare_v2()] and [sqlite3_prepare16_v2()] or the older legacy -** interface [sqlite3_prepare()] and [sqlite3_prepare16()]. The use of the -** new "v2" interface is recommended for new applications but the legacy -** interface will continue to be supported. -** -** In the lagacy interface, the return value will be either [SQLITE_BUSY], -** [SQLITE_DONE], [SQLITE_ROW], [SQLITE_ERROR], or [SQLITE_MISUSE]. -** With the "v2" interface, any of the other [SQLITE_OK | result code] -** or [SQLITE_IOERR_READ | extended result code] might be returned as -** well. -** -** [SQLITE_BUSY] means that the database engine was unable to acquire the -** database locks it needs to do its job. If the statement is a COMMIT -** or occurs outside of an explicit transaction, then you can retry the -** statement. If the statement is not a COMMIT and occurs within a -** explicit transaction then you should rollback the transaction before -** continuing. -** -** [SQLITE_DONE] means that the statement has finished executing -** successfully. sqlite3_step() should not be called again on this virtual -** machine without first calling [sqlite3_reset()] to reset the virtual -** machine back to its initial state. -** -** If the SQL statement being executed returns any data, then -** [SQLITE_ROW] is returned each time a new row of data is ready -** for processing by the caller. The values may be accessed using -** the [sqlite3_column_int | column access functions]. -** sqlite3_step() is called again to retrieve the next row of data. -** -** [SQLITE_ERROR] means that a run-time error (such as a constraint -** violation) has occurred. sqlite3_step() should not be called again on -** the VM. More information may be found by calling [sqlite3_errmsg()]. -** With the legacy interface, a more specific error code (example: -** [SQLITE_INTERRUPT], [SQLITE_SCHEMA], [SQLITE_CORRUPT], and so forth) -** can be obtained by calling [sqlite3_reset()] on the -** [sqlite3_stmt | prepared statement]. In the "v2" interface, -** the more specific error code is returned directly by sqlite3_step(). -** -** [SQLITE_MISUSE] means that the this routine was called inappropriately. -** Perhaps it was called on a [sqlite3_stmt | prepared statement] that has -** already been [sqlite3_finalize | finalized] or on one that had -** previously returned [SQLITE_ERROR] or [SQLITE_DONE]. Or it could -** be the case that the same database connection is being used by two or -** more threads at the same moment in time. -** -** Goofy Interface Alert: -** In the legacy interface, -** the sqlite3_step() API always returns a generic error code, -** [SQLITE_ERROR], following any error other than [SQLITE_BUSY] -** and [SQLITE_MISUSE]. You must call [sqlite3_reset()] or -** [sqlite3_finalize()] in order to find one of the specific -** [SQLITE_ERROR | result codes] that better describes the error. -** We admit that this is a goofy design. The problem has been fixed -** with the "v2" interface. If you prepare all of your SQL statements -** using either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] instead -** of the legacy [sqlite3_prepare()] and [sqlite3_prepare16()], then the -** more specific [SQLITE_ERROR | result codes] are returned directly -** by sqlite3_step(). The use of the "v2" interface is recommended. -*/ -/*IMPORT_C*/ int sqlite3_step(sqlite3_stmt*); - -/* -** CAPI3REF: Number of columns in a result set {F13770} -** -** Return the number of values in the current row of the result set. -** -** {F13771} After a call to [sqlite3_step()] that returns [SQLITE_ROW], -** this routine -** will return the same value as the [sqlite3_column_count()] function. -** {F13772} -** After [sqlite3_step()] has returned an [SQLITE_DONE], [SQLITE_BUSY], or -** a [SQLITE_ERROR | error code], or before [sqlite3_step()] has been -** called on the [sqlite3_stmt | prepared statement] for the first time, -** this routine returns zero. -*/ -/*IMPORT_C*/ int sqlite3_data_count(sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Fundamental Datatypes {F10265} -** -** {F10266}Every value in SQLite has one of five fundamental datatypes: -** -**
    -**
  • 64-bit signed integer -**
  • 64-bit IEEE floating point number -**
  • string -**
  • BLOB -**
  • NULL -**
{END} -** -** These constants are codes for each of those types. -** -** Note that the SQLITE_TEXT constant was also used in SQLite version 2 -** for a completely different meaning. Software that links against both -** SQLite version 2 and SQLite version 3 should use SQLITE3_TEXT not -** SQLITE_TEXT. -*/ -#define SQLITE_INTEGER 1 -#define SQLITE_FLOAT 2 -#define SQLITE_BLOB 4 -#define SQLITE_NULL 5 -#ifdef SQLITE_TEXT -# undef SQLITE_TEXT -#else -# define SQLITE_TEXT 3 -#endif -#define SQLITE3_TEXT 3 - -/* -** CAPI3REF: Results Values From A Query {F13800} -** -** These routines return information about -** a single column of the current result row of a query. In every -** case the first argument is a pointer to the -** [sqlite3_stmt | SQL statement] that is being -** evaluated (the [sqlite3_stmt*] that was returned from -** [sqlite3_prepare_v2()] or one of its variants) and -** the second argument is the index of the column for which information -** should be returned. The left-most column of the result set -** has an index of 0. -** -** If the SQL statement is not currently point to a valid row, or if the -** the column index is out of range, the result is undefined. -** These routines may only be called when the most recent call to -** [sqlite3_step()] has returned [SQLITE_ROW] and neither -** [sqlite3_reset()] nor [sqlite3_finalize()] has been call subsequently. -** If any of these routines are called after [sqlite3_reset()] or -** [sqlite3_finalize()] or after [sqlite3_step()] has returned -** something other than [SQLITE_ROW], the results are undefined. -** If [sqlite3_step()] or [sqlite3_reset()] or [sqlite3_finalize()] -** are called from a different thread while any of these routines -** are pending, then the results are undefined. -** -** The sqlite3_column_type() routine returns -** [SQLITE_INTEGER | datatype code] for the initial data type -** of the result column. The returned value is one of [SQLITE_INTEGER], -** [SQLITE_FLOAT], [SQLITE_TEXT], [SQLITE_BLOB], or [SQLITE_NULL]. The value -** returned by sqlite3_column_type() is only meaningful if no type -** conversions have occurred as described below. After a type conversion, -** the value returned by sqlite3_column_type() is undefined. Future -** versions of SQLite may change the behavior of sqlite3_column_type() -** following a type conversion. -** -** If the result is a BLOB or UTF-8 string then the sqlite3_column_bytes() -** routine returns the number of bytes in that BLOB or string. -** If the result is a UTF-16 string, then sqlite3_column_bytes() converts -** the string to UTF-8 and then returns the number of bytes. -** If the result is a numeric value then sqlite3_column_bytes() uses -** [sqlite3_snprintf()] to convert that value to a UTF-8 string and returns -** the number of bytes in that string. -** The value returned does not include the zero terminator at the end -** of the string. For clarity: the value returned is the number of -** bytes in the string, not the number of characters. -** -** Strings returned by sqlite3_column_text() and sqlite3_column_text16(), -** even zero-length strings, are always zero terminated. The return -** value from sqlite3_column_blob() for a zero-length blob is an arbitrary -** pointer, possibly even a NULL pointer. -** -** The sqlite3_column_bytes16() routine is similar to sqlite3_column_bytes() -** but leaves the result in UTF-16 instead of UTF-8. -** The zero terminator is not included in this count. -** -** These routines attempt to convert the value where appropriate. For -** example, if the internal representation is FLOAT and a text result -** is requested, [sqlite3_snprintf()] is used internally to do the conversion -** automatically. The following table details the conversions that -** are applied: -** -**
-** -**
Internal
Type
Requested
Type
Conversion -** -**
NULL INTEGER Result is 0 -**
NULL FLOAT Result is 0.0 -**
NULL TEXT Result is NULL pointer -**
NULL BLOB Result is NULL pointer -**
INTEGER FLOAT Convert from integer to float -**
INTEGER TEXT ASCII rendering of the integer -**
INTEGER BLOB Same as for INTEGER->TEXT -**
FLOAT INTEGER Convert from float to integer -**
FLOAT TEXT ASCII rendering of the float -**
FLOAT BLOB Same as FLOAT->TEXT -**
TEXT INTEGER Use atoi() -**
TEXT FLOAT Use atof() -**
TEXT BLOB No change -**
BLOB INTEGER Convert to TEXT then use atoi() -**
BLOB FLOAT Convert to TEXT then use atof() -**
BLOB TEXT Add a zero terminator if needed -**
-**
-** -** The table above makes reference to standard C library functions atoi() -** and atof(). SQLite does not really use these functions. It has its -** on equavalent internal routines. The atoi() and atof() names are -** used in the table for brevity and because they are familiar to most -** C programmers. -** -** Note that when type conversions occur, pointers returned by prior -** calls to sqlite3_column_blob(), sqlite3_column_text(), and/or -** sqlite3_column_text16() may be invalidated. -** Type conversions and pointer invalidations might occur -** in the following cases: -** -**
    -**
  • The initial content is a BLOB and sqlite3_column_text() -** or sqlite3_column_text16() is called. A zero-terminator might -** need to be added to the string.

  • -** -**
  • The initial content is UTF-8 text and sqlite3_column_bytes16() or -** sqlite3_column_text16() is called. The content must be converted -** to UTF-16.

  • -** -**
  • The initial content is UTF-16 text and sqlite3_column_bytes() or -** sqlite3_column_text() is called. The content must be converted -** to UTF-8.

  • -**
-** -** Conversions between UTF-16be and UTF-16le are always done in place and do -** not invalidate a prior pointer, though of course the content of the buffer -** that the prior pointer points to will have been modified. Other kinds -** of conversion are done in place when it is possible, but sometime it is -** not possible and in those cases prior pointers are invalidated. -** -** The safest and easiest to remember policy is to invoke these routines -** in one of the following ways: -** -**
    -**
  • sqlite3_column_text() followed by sqlite3_column_bytes()
  • -**
  • sqlite3_column_blob() followed by sqlite3_column_bytes()
  • -**
  • sqlite3_column_text16() followed by sqlite3_column_bytes16()
  • -**
-** -** In other words, you should call sqlite3_column_text(), sqlite3_column_blob(), -** or sqlite3_column_text16() first to force the result into the desired -** format, then invoke sqlite3_column_bytes() or sqlite3_column_bytes16() to -** find the size of the result. Do not mix call to sqlite3_column_text() or -** sqlite3_column_blob() with calls to sqlite3_column_bytes16(). And do not -** mix calls to sqlite3_column_text16() with calls to sqlite3_column_bytes(). -** -** The pointers returned are valid until a type conversion occurs as -** described above, or until [sqlite3_step()] or [sqlite3_reset()] or -** [sqlite3_finalize()] is called. The memory space used to hold strings -** and blobs is freed automatically. Do not pass the pointers returned -** [sqlite3_column_blob()], [sqlite3_column_text()], etc. into -** [sqlite3_free()]. -** -** If a memory allocation error occurs during the evaluation of any -** of these routines, a default value is returned. The default value -** is either the integer 0, the floating point number 0.0, or a NULL -** pointer. Subsequent calls to [sqlite3_errcode()] will return -** [SQLITE_NOMEM]. -*/ -/*IMPORT_C*/ const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); -/*IMPORT_C*/ int sqlite3_column_bytes(sqlite3_stmt*, int iCol); -/*IMPORT_C*/ int sqlite3_column_bytes16(sqlite3_stmt*, int iCol); -/*IMPORT_C*/ double sqlite3_column_double(sqlite3_stmt*, int iCol); -/*IMPORT_C*/ int sqlite3_column_int(sqlite3_stmt*, int iCol); -/*IMPORT_C*/ sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); -/*IMPORT_C*/ const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); -/*IMPORT_C*/ const void *sqlite3_column_text16(sqlite3_stmt*, int iCol); -/*IMPORT_C*/ int sqlite3_column_type(sqlite3_stmt*, int iCol); -/*IMPORT_C*/ sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol); - -/* -** CAPI3REF: Destroy A Prepared Statement Object {F13300} -** -** The sqlite3_finalize() function is called to delete a -** [sqlite3_stmt | compiled SQL statement]. If the statement was -** executed successfully, or not executed at all, then SQLITE_OK is returned. -** If execution of the statement failed then an -** [SQLITE_ERROR | error code] or [SQLITE_IOERR_READ | extended error code] -** is returned. -** -** This routine can be called at any point during the execution of the -** [sqlite3_stmt | virtual machine]. If the virtual machine has not -** completed execution when this routine is called, that is like -** encountering an error or an interrupt. (See [sqlite3_interrupt()].) -** Incomplete updates may be rolled back and transactions cancelled, -** depending on the circumstances, and the -** [SQLITE_ERROR | result code] returned will be [SQLITE_ABORT]. -*/ -/*IMPORT_C*/ int sqlite3_finalize(sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Reset A Prepared Statement Object {F13330} -** -** The sqlite3_reset() function is called to reset a -** [sqlite3_stmt | compiled SQL statement] object. -** back to its initial state, ready to be re-executed. -** Any SQL statement variables that had values bound to them using -** the [sqlite3_bind_blob | sqlite3_bind_*() API] retain their values. -** Use [sqlite3_clear_bindings()] to reset the bindings. -*/ -/*IMPORT_C*/ int sqlite3_reset(sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Create Or Redefine SQL Functions {F16100} -** -** The following two functions are used to add SQL functions or aggregates -** or to redefine the behavior of existing SQL functions or aggregates. The -** difference only between the two is that the second parameter, the -** name of the (scalar) function or aggregate, is encoded in UTF-8 for -** sqlite3_create_function() and UTF-16 for sqlite3_create_function16(). -** -** The first argument is the [sqlite3 | database handle] that holds the -** SQL function or aggregate is to be added or redefined. If a single -** program uses more than one database handle internally, then SQL -** functions or aggregates must be added individually to each database -** handle with which they will be used. -** -** The second parameter is the name of the SQL function to be created -** or redefined. -** The length of the name is limited to 255 bytes, exclusive of the -** zero-terminator. Note that the name length limit is in bytes, not -** characters. Any attempt to create a function with a longer name -** will result in an SQLITE_ERROR error. -** -** The third parameter is the number of arguments that the SQL function or -** aggregate takes. If this parameter is negative, then the SQL function or -** aggregate may take any number of arguments. -** -** The fourth parameter, eTextRep, specifies what -** [SQLITE_UTF8 | text encoding] this SQL function prefers for -** its parameters. Any SQL function implementation should be able to work -** work with UTF-8, UTF-16le, or UTF-16be. But some implementations may be -** more efficient with one encoding than another. It is allowed to -** invoke sqlite3_create_function() or sqlite3_create_function16() multiple -** times with the same function but with different values of eTextRep. -** When multiple implementations of the same function are available, SQLite -** will pick the one that involves the least amount of data conversion. -** If there is only a single implementation which does not care what -** text encoding is used, then the fourth argument should be -** [SQLITE_ANY]. -** -** The fifth parameter is an arbitrary pointer. The implementation -** of the function can gain access to this pointer using -** [sqlite3_user_data()]. -** -** The seventh, eighth and ninth parameters, xFunc, xStep and xFinal, are -** pointers to C-language functions that implement the SQL -** function or aggregate. A scalar SQL function requires an implementation of -** the xFunc callback only, NULL pointers should be passed as the xStep -** and xFinal parameters. An aggregate SQL function requires an implementation -** of xStep and xFinal and NULL should be passed for xFunc. To delete an -** existing SQL function or aggregate, pass NULL for all three function -** callback. -** -** It is permitted to register multiple implementations of the same -** functions with the same name but with either differing numbers of -** arguments or differing perferred text encodings. SQLite will use -** the implementation most closely matches the way in which the -** SQL function is used. -*/ -/*IMPORT_C*/ int sqlite3_create_function( - sqlite3 *, - const char *zFunctionName, - int nArg, - int eTextRep, - void*, - void (*xFunc)(sqlite3_context*,int,sqlite3_value**), - void (*xStep)(sqlite3_context*,int,sqlite3_value**), - void (*xFinal)(sqlite3_context*) -); -/*IMPORT_C*/ int sqlite3_create_function16( - sqlite3*, - const void *zFunctionName, - int nArg, - int eTextRep, - void*, - void (*xFunc)(sqlite3_context*,int,sqlite3_value**), - void (*xStep)(sqlite3_context*,int,sqlite3_value**), - void (*xFinal)(sqlite3_context*) -); - -/* -** CAPI3REF: Text Encodings {F10267} -** -** These constant define integer codes that represent the various -** text encodings supported by SQLite. -*/ -#define SQLITE_UTF8 1 -#define SQLITE_UTF16LE 2 -#define SQLITE_UTF16BE 3 -#define SQLITE_UTF16 4 /* Use native byte order */ -#define SQLITE_ANY 5 /* sqlite3_create_function only */ -#define SQLITE_UTF16_ALIGNED 8 /* sqlite3_create_collation only */ - -/* -** CAPI3REF: Obsolete Functions -** -** These functions are all now obsolete. In order to maintain -** backwards compatibility with older code, we continue to support -** these functions. However, new development projects should avoid -** the use of these functions. To help encourage people to avoid -** using these functions, we are not going to tell you want they do. -*/ -/*IMPORT_C*/ int sqlite3_aggregate_count(sqlite3_context*); -/*IMPORT_C*/ int sqlite3_expired(sqlite3_stmt*); -/*IMPORT_C*/ int sqlite3_transfer_bindings(sqlite3_stmt*, sqlite3_stmt*); -/*IMPORT_C*/ int sqlite3_global_recover(void); -/*IMPORT_C*/ void sqlite3_thread_cleanup(void); -/*IMPORT_C*/ int sqlite3_memory_alarm(void(*)(void*,sqlite3_int64,int),void*,sqlite3_int64); - -/* -** CAPI3REF: Obtaining SQL Function Parameter Values {F15100} -** -** The C-language implementation of SQL functions and aggregates uses -** this set of interface routines to access the parameter values on -** the function or aggregate. -** -** The xFunc (for scalar functions) or xStep (for aggregates) parameters -** to [sqlite3_create_function()] and [sqlite3_create_function16()] -** define callbacks that implement the SQL functions and aggregates. -** The 4th parameter to these callbacks is an array of pointers to -** [sqlite3_value] objects. There is one [sqlite3_value] object for -** each parameter to the SQL function. These routines are used to -** extract values from the [sqlite3_value] objects. -** -** These routines work just like the corresponding -** [sqlite3_column_blob | sqlite3_column_* routines] except that -** these routines take a single [sqlite3_value*] pointer instead -** of an [sqlite3_stmt*] pointer and an integer column number. -** -** The sqlite3_value_text16() interface extracts a UTF16 string -** in the native byte-order of the host machine. The -** sqlite3_value_text16be() and sqlite3_value_text16le() interfaces -** extract UTF16 strings as big-endian and little-endian respectively. -** -** The sqlite3_value_numeric_type() interface attempts to apply -** numeric affinity to the value. This means that an attempt is -** made to convert the value to an integer or floating point. If -** such a conversion is possible without loss of information (in other -** words if the value is a string that looks like a number) -** then the conversion is done. Otherwise no conversion occurs. The -** [SQLITE_INTEGER | datatype] after conversion is returned. -** -** Please pay particular attention to the fact that the pointer that -** is returned from [sqlite3_value_blob()], [sqlite3_value_text()], or -** [sqlite3_value_text16()] can be invalidated by a subsequent call to -** [sqlite3_value_bytes()], [sqlite3_value_bytes16()], [sqlite3_value_text()], -** or [sqlite3_value_text16()]. -** -** These routines must be called from the same thread as -** the SQL function that supplied the sqlite3_value* parameters. -** Or, if the sqlite3_value* argument comes from the [sqlite3_column_value()] -** interface, then these routines should be called from the same thread -** that ran [sqlite3_column_value()]. -** -*/ -/*IMPORT_C*/ const void *sqlite3_value_blob(sqlite3_value*); -/*IMPORT_C*/ int sqlite3_value_bytes(sqlite3_value*); -/*IMPORT_C*/ int sqlite3_value_bytes16(sqlite3_value*); -/*IMPORT_C*/ double sqlite3_value_double(sqlite3_value*); -/*IMPORT_C*/ int sqlite3_value_int(sqlite3_value*); -/*IMPORT_C*/ sqlite3_int64 sqlite3_value_int64(sqlite3_value*); -/*IMPORT_C*/ const unsigned char *sqlite3_value_text(sqlite3_value*); -/*IMPORT_C*/ const void *sqlite3_value_text16(sqlite3_value*); -/*IMPORT_C*/ const void *sqlite3_value_text16le(sqlite3_value*); -/*IMPORT_C*/ const void *sqlite3_value_text16be(sqlite3_value*); -/*IMPORT_C*/ int sqlite3_value_type(sqlite3_value*); -/*IMPORT_C*/ int sqlite3_value_numeric_type(sqlite3_value*); - -/* -** CAPI3REF: Obtain Aggregate Function Context {F16210} -** -** The implementation of aggregate SQL functions use this routine to allocate -** a structure for storing their state. -** {F16211} The first time the sqlite3_aggregate_context() routine is -** is called for a particular aggregate, SQLite allocates nBytes of memory -** zeros that memory, and returns a pointer to it. -** {F16212} On second and subsequent calls to sqlite3_aggregate_context() -** for the same aggregate function index, the same buffer is returned. {END} -** The implementation -** of the aggregate can use the returned buffer to accumulate data. -** -** {F16213} SQLite automatically frees the allocated buffer when the aggregate -** query concludes. {END} -** -** The first parameter should be a copy of the -** [sqlite3_context | SQL function context] that is the first -** parameter to the callback routine that implements the aggregate -** function. -** -** This routine must be called from the same thread in which -** the aggregate SQL function is running. -*/ -/*IMPORT_C*/ void *sqlite3_aggregate_context(sqlite3_context*, int nBytes); - -/* -** CAPI3REF: User Data For Functions {F16240} -** -** {F16241} The sqlite3_user_data() interface returns a copy of -** the pointer that was the pUserData parameter (the 5th parameter) -** of the the [sqlite3_create_function()] -** and [sqlite3_create_function16()] routines that originally -** registered the application defined function. {END} -** -** {U16243} This routine must be called from the same thread in which -** the application-defined function is running. -*/ -/*IMPORT_C*/ void *sqlite3_user_data(sqlite3_context*); - -/* -** CAPI3REF: Function Auxiliary Data {F16270} -** -** The following two functions may be used by scalar SQL functions to -** associate meta-data with argument values. If the same value is passed to -** multiple invocations of the same SQL function during query execution, under -** some circumstances the associated meta-data may be preserved. This may -** be used, for example, to add a regular-expression matching scalar -** function. The compiled version of the regular expression is stored as -** meta-data associated with the SQL value passed as the regular expression -** pattern. The compiled regular expression can be reused on multiple -** invocations of the same function so that the original pattern string -** does not need to be recompiled on each invocation. -** -** {F16271} -** The sqlite3_get_auxdata() interface returns a pointer to the meta-data -** associated by the sqlite3_set_auxdata() function with the Nth argument -** value to the application-defined function. -** {F16272} If no meta-data has been ever been set for the Nth -** argument of the function, or if the cooresponding function parameter -** has changed since the meta-data was set, then sqlite3_get_auxdata() -** returns a NULL pointer. -** -** {F16275} The sqlite3_set_auxdata() interface saves the meta-data -** pointed to by its 3rd parameter as the meta-data for the N-th -** argument of the application-defined function. {END} Subsequent -** calls to sqlite3_get_auxdata() might return this data, if it has -** not been destroyed. -** {F16277} If it is not NULL, SQLite will invoke the destructor -** function given by the 4th parameter to sqlite3_set_auxdata() on -** the meta-data when the corresponding function parameter changes -** or when the SQL statement completes, whichever comes first. {END} -** -** In practice, meta-data is preserved between function calls for -** expressions that are constant at compile time. This includes literal -** values and SQL variables. -** -** These routines must be called from the same thread in which -** the SQL function is running. -*/ -/*IMPORT_C*/ void *sqlite3_get_auxdata(sqlite3_context*, int N); -/*IMPORT_C*/ void sqlite3_set_auxdata(sqlite3_context*, int N, void*, void (*)(void*)); - - -/* -** CAPI3REF: Constants Defining Special Destructor Behavior {F10280} -** -** These are special value for the destructor that is passed in as the -** final argument to routines like [sqlite3_result_blob()]. If the destructor -** argument is SQLITE_STATIC, it means that the content pointer is constant -** and will never change. It does not need to be destroyed. The -** SQLITE_TRANSIENT value means that the content will likely change in -** the near future and that SQLite should make its own private copy of -** the content before returning. -** -** The typedef is necessary to work around problems in certain -** C++ compilers. See ticket #2191. -*/ -typedef void (*sqlite3_destructor_type)(void*); -#define SQLITE_STATIC ((sqlite3_destructor_type)0) -#define SQLITE_TRANSIENT ((sqlite3_destructor_type)-1) - -/* -** CAPI3REF: Setting The Result Of An SQL Function {F16400} -** -** These routines are used by the xFunc or xFinal callbacks that -** implement SQL functions and aggregates. See -** [sqlite3_create_function()] and [sqlite3_create_function16()] -** for additional information. -** -** These functions work very much like the -** [sqlite3_bind_blob | sqlite3_bind_*] family of functions used -** to bind values to host parameters in prepared statements. -** Refer to the -** [sqlite3_bind_blob | sqlite3_bind_* documentation] for -** additional information. -** -** {F16402} The sqlite3_result_blob() interface sets the result from -** an application defined function to be the BLOB whose content is pointed -** to by the second parameter and which is N bytes long where N is the -** third parameter. -** {F16403} The sqlite3_result_zeroblob() inerfaces set the result of -** the application defined function to be a BLOB containing all zero -** bytes and N bytes in size, where N is the value of the 2nd parameter. -** -** {F16407} The sqlite3_result_double() interface sets the result from -** an application defined function to be a floating point value specified -** by its 2nd argument. -** -** {F16409} The sqlite3_result_error() and sqlite3_result_error16() functions -** cause the implemented SQL function to throw an exception. -** {F16411} SQLite uses the string pointed to by the -** 2nd parameter of sqlite3_result_error() or sqlite3_result_error16() -** as the text of an error message. {F16412} SQLite interprets the error -** message string from sqlite3_result_error() as UTF8. {F16413} SQLite -** interprets the string from sqlite3_result_error16() as UTF16 in native -** byte order. {F16414} If the third parameter to sqlite3_result_error() -** or sqlite3_result_error16() is negative then SQLite takes as the error -** message all text up through the first zero character. -** {F16415} If the third parameter to sqlite3_result_error() or -** sqlite3_result_error16() is non-negative then SQLite takes that many -** bytes (not characters) from the 2nd parameter as the error message. -** {F16417} The sqlite3_result_error() and sqlite3_result_error16() -** routines make a copy private copy of the error message text before -** they return. {END} Hence, the calling function can deallocate or -** modify the text after they return without harm. -** -** {F16421} The sqlite3_result_toobig() interface causes SQLite -** to throw an error indicating that a string or BLOB is to long -** to represent. {F16422} The sqlite3_result_nomem() interface -** causes SQLite to throw an exception indicating that the a -** memory allocation failed. -** -** {F16431} The sqlite3_result_int() interface sets the return value -** of the application-defined function to be the 32-bit signed integer -** value given in the 2nd argument. -** {F16432} The sqlite3_result_int64() interface sets the return value -** of the application-defined function to be the 64-bit signed integer -** value given in the 2nd argument. -** -** {F16437} The sqlite3_result_null() interface sets the return value -** of the application-defined function to be NULL. -** -** {F16441} The sqlite3_result_text(), sqlite3_result_text16(), -** sqlite3_result_text16le(), and sqlite3_result_text16be() interfaces -** set the return value of the application-defined function to be -** a text string which is represented as UTF-8, UTF-16 native byte order, -** UTF-16 little endian, or UTF-16 big endian, respectively. -** {F16442} SQLite takes the text result from the application from -** the 2nd parameter of the sqlite3_result_text* interfaces. -** {F16444} If the 3rd parameter to the sqlite3_result_text* interfaces -** is negative, then SQLite takes result text from the 2nd parameter -** through the first zero character. -** {F16447} If the 3rd parameter to the sqlite3_result_text* interfaces -** is non-negative, then as many bytes (not characters) of the text -** pointed to by the 2nd parameter are taken as the application-defined -** function result. -** {F16451} If the 4th parameter to the sqlite3_result_text* interfaces -** or sqlite3_result_blob is a non-NULL pointer, then SQLite calls that -** function as the destructor on the text or blob result when it has -** finished using that result. -** {F16453} If the 4th parameter to the sqlite3_result_text* interfaces -** or sqlite3_result_blob is the special constant SQLITE_STATIC, then -** SQLite assumes that the text or blob result is constant space and -** does not copy the space or call a destructor when it has -** finished using that result. -** {F16454} If the 4th parameter to the sqlite3_result_text* interfaces -** or sqlite3_result_blob is the special constant SQLITE_TRANSIENT -** then SQLite makes a copy of the result into space obtained from -** from [sqlite3_malloc()] before it returns. -** -** {F16461} The sqlite3_result_value() interface sets the result of -** the application-defined function to be a copy the [sqlite3_value] -** object specified by the 2nd parameter. {F16463} The -** sqlite3_result_value() interface makes a copy of the [sqlite3_value] -** so that [sqlite3_value] specified in the parameter may change or -** be deallocated after sqlite3_result_value() returns without harm. -** -** {U16491} These routines are called from within the different thread -** than the one containing the application-defined function that recieved -** the [sqlite3_context] pointer, the results are undefined. -*/ -/*IMPORT_C*/ void sqlite3_result_blob(sqlite3_context*, const void*, int, void(*)(void*)); -/*IMPORT_C*/ void sqlite3_result_double(sqlite3_context*, double); -/*IMPORT_C*/ void sqlite3_result_error(sqlite3_context*, const char*, int); -/*IMPORT_C*/ void sqlite3_result_error16(sqlite3_context*, const void*, int); -/*IMPORT_C*/ void sqlite3_result_error_toobig(sqlite3_context*); -/*IMPORT_C*/ void sqlite3_result_error_nomem(sqlite3_context*); -/*IMPORT_C*/ void sqlite3_result_int(sqlite3_context*, int); -/*IMPORT_C*/ void sqlite3_result_int64(sqlite3_context*, sqlite3_int64); -/*IMPORT_C*/ void sqlite3_result_null(sqlite3_context*); -/*IMPORT_C*/ void sqlite3_result_text(sqlite3_context*, const char*, int, void(*)(void*)); -/*IMPORT_C*/ void sqlite3_result_text16(sqlite3_context*, const void*, int, void(*)(void*)); -/*IMPORT_C*/ void sqlite3_result_text16le(sqlite3_context*, const void*, int,void(*)(void*)); -/*IMPORT_C*/ void sqlite3_result_text16be(sqlite3_context*, const void*, int,void(*)(void*)); -/*IMPORT_C*/ void sqlite3_result_value(sqlite3_context*, sqlite3_value*); -/*IMPORT_C*/ void sqlite3_result_zeroblob(sqlite3_context*, int n); - -/* -** CAPI3REF: Define New Collating Sequences {F16600} -** -** {F16601} -** These functions are used to add new collation sequences to the -** [sqlite3*] handle specified as the first argument. -** -** {F16602} -** The name of the new collation sequence is specified as a UTF-8 string -** for sqlite3_create_collation() and sqlite3_create_collation_v2() -** and a UTF-16 string for sqlite3_create_collation16(). {F16603} In all cases -** the name is passed as the second function argument. -** -** {F16604} -** The third argument may be one of the constants [SQLITE_UTF8], -** [SQLITE_UTF16LE] or [SQLITE_UTF16BE], indicating that the user-supplied -** routine expects to be passed pointers to strings encoded using UTF-8, -** UTF-16 little-endian or UTF-16 big-endian respectively. {F16605} The -** third argument might also be [SQLITE_UTF16_ALIGNED] to indicate that -** the routine expects pointers to 16-bit word aligned strings -** of UTF16 in the native byte order of the host computer. -** -** {F16607} -** A pointer to the user supplied routine must be passed as the fifth -** argument. {F16609} If it is NULL, this is the same as deleting the collation -** sequence (so that SQLite cannot call it anymore). -** {F16611} Each time the application -** supplied function is invoked, it is passed a copy of the void* passed as -** the fourth argument to sqlite3_create_collation() or -** sqlite3_create_collation16() as its first parameter. -** -** {F16612} -** The remaining arguments to the application-supplied routine are two strings, -** each represented by a [length, data] pair and encoded in the encoding -** that was passed as the third argument when the collation sequence was -** registered. {END} The application defined collation routine should -** return negative, zero or positive if -** the first string is less than, equal to, or greater than the second -** string. i.e. (STRING1 - STRING2). -** -** {F16615} -** The sqlite3_create_collation_v2() works like sqlite3_create_collation() -** excapt that it takes an extra argument which is a destructor for -** the collation. {F16617} The destructor is called when the collation is -** destroyed and is passed a copy of the fourth parameter void* pointer -** of the sqlite3_create_collation_v2(). -** {F16618} Collations are destroyed when -** they are overridden by later calls to the collation creation functions -** or when the [sqlite3*] database handle is closed using [sqlite3_close()]. -*/ -/*IMPORT_C*/ int sqlite3_create_collation( - sqlite3*, - const char *zName, - int eTextRep, - void*, - int(*xCompare)(void*,int,const void*,int,const void*) -); -/*IMPORT_C*/ int sqlite3_create_collation_v2( - sqlite3*, - const char *zName, - int eTextRep, - void*, - int(*xCompare)(void*,int,const void*,int,const void*), - void(*xDestroy)(void*) -); -/*IMPORT_C*/ int sqlite3_create_collation16( - sqlite3*, - const char *zName, - int eTextRep, - void*, - int(*xCompare)(void*,int,const void*,int,const void*) -); - -/* -** CAPI3REF: Collation Needed Callbacks {F16700} -** -** {F16701} -** To avoid having to register all collation sequences before a database -** can be used, a single callback function may be registered with the -** database handle to be called whenever an undefined collation sequence is -** required. -** -** {F16702} -** If the function is registered using the sqlite3_collation_needed() API, -** then it is passed the names of undefined collation sequences as strings -** encoded in UTF-8. {F16703} If sqlite3_collation_needed16() is used, the names -** are passed as UTF-16 in machine native byte order. {F16704} A call to either -** function replaces any existing callback. -** -** {F16705} When the callback is invoked, the first argument passed is a copy -** of the second argument to sqlite3_collation_needed() or -** sqlite3_collation_needed16(). {F16706} The second argument is the database -** handle. {F16707} The third argument is one of [SQLITE_UTF8], -** [SQLITE_UTF16BE], or [SQLITE_UTF16LE], indicating the most -** desirable form of the collation sequence function required. -** {F16708} The fourth parameter is the name of the -** required collation sequence. {END} -** -** The callback function should register the desired collation using -** [sqlite3_create_collation()], [sqlite3_create_collation16()], or -** [sqlite3_create_collation_v2()]. -*/ -/*IMPORT_C*/ int sqlite3_collation_needed( - sqlite3*, - void*, - void(*)(void*,sqlite3*,int eTextRep,const char*) -); -/*IMPORT_C*/ int sqlite3_collation_needed16( - sqlite3*, - void*, - void(*)(void*,sqlite3*,int eTextRep,const void*) -); - -/* -** Specify the key for an encrypted database. This routine should be -** called right after sqlite3_open(). -** -** The code to implement this API is not available in the public release -** of SQLite. -*/ -/*IMPORT_C*/ int sqlite3_key( - sqlite3 *db, /* Database to be rekeyed */ - const void *pKey, int nKey /* The key */ -); - -/* -** Change the key on an open database. If the current database is not -** encrypted, this routine will encrypt it. If pNew==0 or nNew==0, the -** database is decrypted. -** -** The code to implement this API is not available in the public release -** of SQLite. -*/ -/*IMPORT_C*/ int sqlite3_rekey( - sqlite3 *db, /* Database to be rekeyed */ - const void *pKey, int nKey /* The new key */ -); - -/* -** CAPI3REF: Suspend Execution For A Short Time {F10530} -** -** {F10531} The sqlite3_sleep() function -** causes the current thread to suspend execution -** for at least a number of milliseconds specified in its parameter. -** -** {F10532} If the operating system does not support sleep requests with -** millisecond time resolution, then the time will be rounded up to -** the nearest second. {F10533} The number of milliseconds of sleep actually -** requested from the operating system is returned. -** -** {F10534} SQLite implements this interface by calling the xSleep() -** method of the default [sqlite3_vfs] object. {END} -*/ -/*IMPORT_C*/ int sqlite3_sleep(int); - -/* -** CAPI3REF: Name Of The Folder Holding Temporary Files {F10310} -** -** If this global variable is made to point to a string which is -** the name of a folder (a.ka. directory), then all temporary files -** created by SQLite will be placed in that directory. If this variable -** is NULL pointer, then SQLite does a search for an appropriate temporary -** file directory. -** -** It is not safe to modify this variable once a database connection -** has been opened. It is intended that this variable be set once -** as part of process initialization and before any SQLite interface -** routines have been call and remain unchanged thereafter. -*/ -SQLITE_EXTERN char *sqlite3_temp_directory; - -/* -** CAPI3REF: Test To See If The Database Is In Auto-Commit Mode {F12930} -** -** {F12931} The sqlite3_get_autocommit() interfaces returns non-zero or -** zero if the given database connection is or is not in autocommit mode, -** respectively. {F12932} Autocommit mode is on -** by default. {F12933} Autocommit mode is disabled by a BEGIN statement. -** {F12934} Autocommit mode is reenabled by a COMMIT or ROLLBACK. {END} -** -** If certain kinds of errors occur on a statement within a multi-statement -** transactions (errors including [SQLITE_FULL], [SQLITE_IOERR], -** [SQLITE_NOMEM], [SQLITE_BUSY], and [SQLITE_INTERRUPT]) then the -** transaction might be rolled back automatically. {F12935} The only way to -** find out if SQLite automatically rolled back the transaction after -** an error is to use this function. {END} -** -** {U12936} If another thread changes the autocommit status of the database -** connection while this routine is running, then the return value -** is undefined. {END} -*/ -/*IMPORT_C*/ int sqlite3_get_autocommit(sqlite3*); - -/* -** CAPI3REF: Find The Database Handle Of A Prepared Statement {F13120} -** -** {F13121} The sqlite3_db_handle interface -** returns the [sqlite3*] database handle to which a -** [sqlite3_stmt | prepared statement] belongs. -** {F13122} the database handle returned by sqlite3_db_handle -** is the same database handle that was -** the first argument to the [sqlite3_prepare_v2()] or its variants -** that was used to create the statement in the first place. -*/ -/*IMPORT_C*/ sqlite3 *sqlite3_db_handle(sqlite3_stmt*); - - -/* -** CAPI3REF: Commit And Rollback Notification Callbacks {F12950} -** -** {F12951} The sqlite3_commit_hook() interface registers a callback -** function to be invoked whenever a transaction is committed. -** {F12952} Any callback set by a previous call to sqlite3_commit_hook() -** for the same database connection is overridden. -** {F12953} The sqlite3_rollback_hook() interface registers a callback -** function to be invoked whenever a transaction is committed. -** {F12954} Any callback set by a previous call to sqlite3_commit_hook() -** for the same database connection is overridden. -** {F12956} The pArg argument is passed through -** to the callback. {F12957} If the callback on a commit hook function -** returns non-zero, then the commit is converted into a rollback. -** -** {F12958} If another function was previously registered, its -** pArg value is returned. Otherwise NULL is returned. -** -** {F12959} Registering a NULL function disables the callback. -** -** {F12961} For the purposes of this API, a transaction is said to have been -** rolled back if an explicit "ROLLBACK" statement is executed, or -** an error or constraint causes an implicit rollback to occur. -** {F12962} The rollback callback is not invoked if a transaction is -** automatically rolled back because the database connection is closed. -** {F12964} The rollback callback is not invoked if a transaction is -** rolled back because a commit callback returned non-zero. -** Check on this {END} -** -** These are experimental interfaces and are subject to change. -*/ -/*IMPORT_C*/ void *sqlite3_commit_hook(sqlite3*, int(*)(void*), void*); -/*IMPORT_C*/ void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*); - -/* -** CAPI3REF: Data Change Notification Callbacks {F12970} -** -** {F12971} The sqlite3_update_hook() interface -** registers a callback function with the database connection identified by the -** first argument to be invoked whenever a row is updated, inserted or deleted. -** {F12972} Any callback set by a previous call to this function for the same -** database connection is overridden. -** -** {F12974} The second argument is a pointer to the function to invoke when a -** row is updated, inserted or deleted. -** {F12976} The first argument to the callback is -** a copy of the third argument to sqlite3_update_hook(). -** {F12977} The second callback -** argument is one of [SQLITE_INSERT], [SQLITE_DELETE] or [SQLITE_UPDATE], -** depending on the operation that caused the callback to be invoked. -** {F12978} The third and -** fourth arguments to the callback contain pointers to the database and -** table name containing the affected row. -** {F12979} The final callback parameter is -** the rowid of the row. -** {F12981} In the case of an update, this is the rowid after -** the update takes place. -** -** {F12983} The update hook is not invoked when internal system tables are -** modified (i.e. sqlite_master and sqlite_sequence). -** -** {F12984} If another function was previously registered, its pArg value -** is returned. {F12985} Otherwise NULL is returned. -*/ -/*IMPORT_C*/ void *sqlite3_update_hook( - sqlite3*, - void(*)(void *,int ,char const *,char const *,sqlite3_int64), - void* -); - -/* -** CAPI3REF: Enable Or Disable Shared Pager Cache {F10330} -** -** {F10331} -** This routine enables or disables the sharing of the database cache -** and schema data structures between connections to the same database. -** {F10332} -** Sharing is enabled if the argument is true and disabled if the argument -** is false. -** -** {F10333} Cache sharing is enabled and disabled -** for an entire process. {END} This is a change as of SQLite version 3.5.0. -** In prior versions of SQLite, sharing was -** enabled or disabled for each thread separately. -** -** {F10334} -** The cache sharing mode set by this interface effects all subsequent -** calls to [sqlite3_open()], [sqlite3_open_v2()], and [sqlite3_open16()]. -** {F10335} Existing database connections continue use the sharing mode -** that was in effect at the time they were opened. {END} -** -** Virtual tables cannot be used with a shared cache. {F10336} When shared -** cache is enabled, the [sqlite3_create_module()] API used to register -** virtual tables will always return an error. {END} -** -** {F10337} This routine returns [SQLITE_OK] if shared cache was -** enabled or disabled successfully. {F10338} An [SQLITE_ERROR | error code] -** is returned otherwise. {END} -** -** {F10339} Shared cache is disabled by default. {END} But this might change in -** future releases of SQLite. Applications that care about shared -** cache setting should set it explicitly. -*/ -/*IMPORT_C*/ int sqlite3_enable_shared_cache(int); - -/* -** CAPI3REF: Attempt To Free Heap Memory {F17340} -** -** {F17341} The sqlite3_release_memory() interface attempts to -** free N bytes of heap memory by deallocating non-essential memory -** allocations held by the database labrary. {END} Memory used -** to cache database pages to improve performance is an example of -** non-essential memory. {F16342} sqlite3_release_memory() returns -** the number of bytes actually freed, which might be more or less -** than the amount requested. -*/ -/*IMPORT_C*/ int sqlite3_release_memory(int); - -/* -** CAPI3REF: Impose A Limit On Heap Size {F17350} -** -** {F16351} The sqlite3_soft_heap_limit() interface -** places a "soft" limit on the amount of heap memory that may be allocated -** by SQLite. {F16352} If an internal allocation is requested -** that would exceed the soft heap limit, [sqlite3_release_memory()] is -** invoked one or more times to free up some space before the allocation -** is made. {END} -** -** {F16353} The limit is called "soft", because if -** [sqlite3_release_memory()] cannot -** free sufficient memory to prevent the limit from being exceeded, -** the memory is allocated anyway and the current operation proceeds. -** -** {F16354} -** A negative or zero value for N means that there is no soft heap limit and -** [sqlite3_release_memory()] will only be called when memory is exhausted. -** {F16355} The default value for the soft heap limit is zero. -** -** SQLite makes a best effort to honor the soft heap limit. -** {F16356} But if the soft heap limit cannot honored, execution will -** continue without error or notification. {END} This is why the limit is -** called a "soft" limit. It is advisory only. -** -** Prior to SQLite version 3.5.0, this routine only constrained the memory -** allocated by a single thread - the same thread in which this routine -** runs. Beginning with SQLite version 3.5.0, the soft heap limit is -** applied to all threads. {F16357} The value specified for the soft heap limit -** is an upper bound on the total memory allocation for all threads. {END} In -** version 3.5.0 there is no mechanism for limiting the heap usage for -** individual threads. -*/ -/*IMPORT_C*/ void sqlite3_soft_heap_limit(int); - -/* -** CAPI3REF: Extract Metadata About A Column Of A Table {F12850} -** -** This routine -** returns meta-data about a specific column of a specific database -** table accessible using the connection handle passed as the first function -** argument. -** -** The column is identified by the second, third and fourth parameters to -** this function. The second parameter is either the name of the database -** (i.e. "main", "temp" or an attached database) containing the specified -** table or NULL. If it is NULL, then all attached databases are searched -** for the table using the same algorithm as the database engine uses to -** resolve unqualified table references. -** -** The third and fourth parameters to this function are the table and column -** name of the desired column, respectively. Neither of these parameters -** may be NULL. -** -** Meta information is returned by writing to the memory locations passed as -** the 5th and subsequent parameters to this function. Any of these -** arguments may be NULL, in which case the corresponding element of meta -** information is ommitted. -** -**
-** Parameter     Output Type      Description
-** -----------------------------------
-**
-**   5th         const char*      Data type
-**   6th         const char*      Name of the default collation sequence 
-**   7th         int              True if the column has a NOT NULL constraint
-**   8th         int              True if the column is part of the PRIMARY KEY
-**   9th         int              True if the column is AUTOINCREMENT
-** 
-** -** -** The memory pointed to by the character pointers returned for the -** declaration type and collation sequence is valid only until the next -** call to any sqlite API function. -** -** If the specified table is actually a view, then an error is returned. -** -** If the specified column is "rowid", "oid" or "_rowid_" and an -** INTEGER PRIMARY KEY column has been explicitly declared, then the output -** parameters are set for the explicitly declared column. If there is no -** explicitly declared IPK column, then the output parameters are set as -** follows: -** -**
-**     data type: "INTEGER"
-**     collation sequence: "BINARY"
-**     not null: 0
-**     primary key: 1
-**     auto increment: 0
-** 
-** -** This function may load one or more schemas from database files. If an -** error occurs during this process, or if the requested table or column -** cannot be found, an SQLITE error code is returned and an error message -** left in the database handle (to be retrieved using sqlite3_errmsg()). -** -** This API is only available if the library was compiled with the -** SQLITE_ENABLE_COLUMN_METADATA preprocessor symbol defined. -*/ -/*IMPORT_C*/ int sqlite3_table_column_metadata( - sqlite3 *db, /* Connection handle */ - const char *zDbName, /* Database name or NULL */ - const char *zTableName, /* Table name */ - const char *zColumnName, /* Column name */ - char const **pzDataType, /* OUTPUT: Declared data type */ - char const **pzCollSeq, /* OUTPUT: Collation sequence name */ - int *pNotNull, /* OUTPUT: True if NOT NULL constraint exists */ - int *pPrimaryKey, /* OUTPUT: True if column part of PK */ - int *pAutoinc /* OUTPUT: True if column is auto-increment */ -); - -/* -** CAPI3REF: Load An Extension {F12600} -** -** {F12601} The sqlite3_load_extension() interface -** attempts to load an SQLite extension library contained in the file -** zFile. {F12602} The entry point is zProc. {F12603} zProc may be 0 -** in which case the name of the entry point defaults -** to "sqlite3_extension_init". -** -** {F12604} The sqlite3_load_extension() interface shall -** return [SQLITE_OK] on success and [SQLITE_ERROR] if something goes wrong. -** -** {F12605} -** If an error occurs and pzErrMsg is not 0, then the -** sqlite3_load_extension() interface shall attempt to fill *pzErrMsg with -** error message text stored in memory obtained from [sqlite3_malloc()]. -** {END} The calling function should free this memory -** by calling [sqlite3_free()]. -** -** {F12606} -** Extension loading must be enabled using [sqlite3_enable_load_extension()] -** prior to calling this API or an error will be returned. -*/ -/*IMPORT_C*/ int sqlite3_load_extension( - sqlite3 *db, /* Load the extension into this database connection */ - const char *zFile, /* Name of the shared library containing extension */ - const char *zProc, /* Entry point. Derived from zFile if 0 */ - char **pzErrMsg /* Put error message here if not 0 */ -); - -/* -** CAPI3REF: Enable Or Disable Extension Loading {F12620} -** -** So as not to open security holes in older applications that are -** unprepared to deal with extension loading, and as a means of disabling -** extension loading while evaluating user-entered SQL, the following -** API is provided to turn the [sqlite3_load_extension()] mechanism on and -** off. {F12622} It is off by default. {END} See ticket #1863. -** -** {F12621} Call the sqlite3_enable_load_extension() routine -** with onoff==1 to turn extension loading on -** and call it with onoff==0 to turn it back off again. {END} -*/ -/*IMPORT_C*/ int sqlite3_enable_load_extension(sqlite3 *db, int onoff); - -/* -** CAPI3REF: Make Arrangements To Automatically Load An Extension {F12640} -** -** {F12641} This function -** registers an extension entry point that is automatically invoked -** whenever a new database connection is opened using -** [sqlite3_open()], [sqlite3_open16()], or [sqlite3_open_v2()]. {END} -** -** This API can be invoked at program startup in order to register -** one or more statically linked extensions that will be available -** to all new database connections. -** -** {F12642} Duplicate extensions are detected so calling this routine multiple -** times with the same extension is harmless. -** -** {F12643} This routine stores a pointer to the extension in an array -** that is obtained from sqlite_malloc(). {END} If you run a memory leak -** checker on your program and it reports a leak because of this -** array, then invoke [sqlite3_reset_auto_extension()] prior -** to shutdown to free the memory. -** -** {F12644} Automatic extensions apply across all threads. {END} -** -** This interface is experimental and is subject to change or -** removal in future releases of SQLite. -*/ -/*IMPORT_C*/ int sqlite3_auto_extension(void *xEntryPoint); - - -/* -** CAPI3REF: Reset Automatic Extension Loading {F12660} -** -** {F12661} This function disables all previously registered -** automatic extensions. {END} This -** routine undoes the effect of all prior [sqlite3_automatic_extension()] -** calls. -** -** {F12662} This call disabled automatic extensions in all threads. {END} -** -** This interface is experimental and is subject to change or -** removal in future releases of SQLite. -*/ -/*IMPORT_C*/ void sqlite3_reset_auto_extension(void); - - -/* -****** EXPERIMENTAL - subject to change without notice ************** -** -** The interface to the virtual-table mechanism is currently considered -** to be experimental. The interface might change in incompatible ways. -** If this is a problem for you, do not use the interface at this time. -** -** When the virtual-table mechanism stablizes, we will declare the -** interface fixed, support it indefinitely, and remove this comment. -*/ - -/* -** Structures used by the virtual table interface -*/ -typedef struct sqlite3_vtab sqlite3_vtab; -typedef struct sqlite3_index_info sqlite3_index_info; -typedef struct sqlite3_vtab_cursor sqlite3_vtab_cursor; -typedef struct sqlite3_module sqlite3_module; - -/* -** A module is a class of virtual tables. Each module is defined -** by an instance of the following structure. This structure consists -** mostly of methods for the module. -*/ -struct sqlite3_module { - int iVersion; - int (*xCreate)(sqlite3*, void *pAux, - int argc, const char *const*argv, - sqlite3_vtab **ppVTab, char**); - int (*xConnect)(sqlite3*, void *pAux, - int argc, const char *const*argv, - sqlite3_vtab **ppVTab, char**); - int (*xBestIndex)(sqlite3_vtab *pVTab, sqlite3_index_info*); - int (*xDisconnect)(sqlite3_vtab *pVTab); - int (*xDestroy)(sqlite3_vtab *pVTab); - int (*xOpen)(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor); - int (*xClose)(sqlite3_vtab_cursor*); - int (*xFilter)(sqlite3_vtab_cursor*, int idxNum, const char *idxStr, - int argc, sqlite3_value **argv); - int (*xNext)(sqlite3_vtab_cursor*); - int (*xEof)(sqlite3_vtab_cursor*); - int (*xColumn)(sqlite3_vtab_cursor*, sqlite3_context*, int); - int (*xRowid)(sqlite3_vtab_cursor*, sqlite3_int64 *pRowid); - int (*xUpdate)(sqlite3_vtab *, int, sqlite3_value **, sqlite3_int64 *); - int (*xBegin)(sqlite3_vtab *pVTab); - int (*xSync)(sqlite3_vtab *pVTab); - int (*xCommit)(sqlite3_vtab *pVTab); - int (*xRollback)(sqlite3_vtab *pVTab); - int (*xFindFunction)(sqlite3_vtab *pVtab, int nArg, const char *zName, - void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), - void **ppArg); - - int (*xRename)(sqlite3_vtab *pVtab, const char *zNew); -}; - -/* -** The sqlite3_index_info structure and its substructures is used to -** pass information into and receive the reply from the xBestIndex -** method of an sqlite3_module. The fields under **Inputs** are the -** inputs to xBestIndex and are read-only. xBestIndex inserts its -** results into the **Outputs** fields. -** -** The aConstraint[] array records WHERE clause constraints of the -** form: -** -** column OP expr -** -** Where OP is =, <, <=, >, or >=. -** The particular operator is stored -** in aConstraint[].op. The index of the column is stored in -** aConstraint[].iColumn. aConstraint[].usable is TRUE if the -** expr on the right-hand side can be evaluated (and thus the constraint -** is usable) and false if it cannot. -** -** The optimizer automatically inverts terms of the form "expr OP column" -** and makes other simplifications to the WHERE clause in an attempt to -** get as many WHERE clause terms into the form shown above as possible. -** The aConstraint[] array only reports WHERE clause terms in the correct -** form that refer to the particular virtual table being queried. -** -** Information about the ORDER BY clause is stored in aOrderBy[]. -** Each term of aOrderBy records a column of the ORDER BY clause. -** -** The xBestIndex method must fill aConstraintUsage[] with information -** about what parameters to pass to xFilter. If argvIndex>0 then -** the right-hand side of the corresponding aConstraint[] is evaluated -** and becomes the argvIndex-th entry in argv. If aConstraintUsage[].omit -** is true, then the constraint is assumed to be fully handled by the -** virtual table and is not checked again by SQLite. -** -** The idxNum and idxPtr values are recorded and passed into xFilter. -** sqlite3_free() is used to free idxPtr if needToFreeIdxPtr is true. -** -** The orderByConsumed means that output from xFilter will occur in -** the correct order to satisfy the ORDER BY clause so that no separate -** sorting step is required. -** -** The estimatedCost value is an estimate of the cost of doing the -** particular lookup. A full scan of a table with N entries should have -** a cost of N. A binary search of a table of N entries should have a -** cost of approximately log(N). -*/ -struct sqlite3_index_info { - /* Inputs */ - int nConstraint; /* Number of entries in aConstraint */ - struct sqlite3_index_constraint { - int iColumn; /* Column on left-hand side of constraint */ - unsigned char op; /* Constraint operator */ - unsigned char usable; /* True if this constraint is usable */ - int iTermOffset; /* Used internally - xBestIndex should ignore */ - } *aConstraint; /* Table of WHERE clause constraints */ - int nOrderBy; /* Number of terms in the ORDER BY clause */ - struct sqlite3_index_orderby { - int iColumn; /* Column number */ - unsigned char desc; /* True for DESC. False for ASC. */ - } *aOrderBy; /* The ORDER BY clause */ - - /* Outputs */ - struct sqlite3_index_constraint_usage { - int argvIndex; /* if >0, constraint is part of argv to xFilter */ - unsigned char omit; /* Do not code a test for this constraint */ - } *aConstraintUsage; - int idxNum; /* Number used to identify the index */ - char *idxStr; /* String, possibly obtained from sqlite3_malloc */ - int needToFreeIdxStr; /* Free idxStr using sqlite3_free() if true */ - int orderByConsumed; /* True if output is already ordered */ - double estimatedCost; /* Estimated cost of using this index */ -}; -#define SQLITE_INDEX_CONSTRAINT_EQ 2 -#define SQLITE_INDEX_CONSTRAINT_GT 4 -#define SQLITE_INDEX_CONSTRAINT_LE 8 -#define SQLITE_INDEX_CONSTRAINT_LT 16 -#define SQLITE_INDEX_CONSTRAINT_GE 32 -#define SQLITE_INDEX_CONSTRAINT_MATCH 64 - -/* -** This routine is used to register a new module name with an SQLite -** connection. Module names must be registered before creating new -** virtual tables on the module, or before using preexisting virtual -** tables of the module. -*/ -/*IMPORT_C*/ int sqlite3_create_module( - sqlite3 *db, /* SQLite connection to register module with */ - const char *zName, /* Name of the module */ - const sqlite3_module *, /* Methods for the module */ - void * /* Client data for xCreate/xConnect */ -); - -/* -** This routine is identical to the sqlite3_create_module() method above, -** except that it allows a destructor function to be specified. It is -** even more experimental than the rest of the virtual tables API. -*/ -/*IMPORT_C*/ int sqlite3_create_module_v2( - sqlite3 *db, /* SQLite connection to register module with */ - const char *zName, /* Name of the module */ - const sqlite3_module *, /* Methods for the module */ - void *, /* Client data for xCreate/xConnect */ - void(*xDestroy)(void*) /* Module destructor function */ -); - -/* -** Every module implementation uses a subclass of the following structure -** to describe a particular instance of the module. Each subclass will -** be tailored to the specific needs of the module implementation. The -** purpose of this superclass is to define certain fields that are common -** to all module implementations. -** -** Virtual tables methods can set an error message by assigning a -** string obtained from sqlite3_mprintf() to zErrMsg. The method should -** take care that any prior string is freed by a call to sqlite3_free() -** prior to assigning a new string to zErrMsg. After the error message -** is delivered up to the client application, the string will be automatically -** freed by sqlite3_free() and the zErrMsg field will be zeroed. Note -** that sqlite3_mprintf() and sqlite3_free() are used on the zErrMsg field -** since virtual tables are commonly implemented in loadable extensions which -** do not have access to sqlite3MPrintf() or sqlite3Free(). -*/ -struct sqlite3_vtab { - const sqlite3_module *pModule; /* The module for this virtual table */ - int nRef; /* Used internally */ - char *zErrMsg; /* Error message from sqlite3_mprintf() */ - /* Virtual table implementations will typically add additional fields */ -}; - -/* Every module implementation uses a subclass of the following structure -** to describe cursors that point into the virtual table and are used -** to loop through the virtual table. Cursors are created using the -** xOpen method of the module. Each module implementation will define -** the content of a cursor structure to suit its own needs. -** -** This superclass exists in order to define fields of the cursor that -** are common to all implementations. -*/ -struct sqlite3_vtab_cursor { - sqlite3_vtab *pVtab; /* Virtual table of this cursor */ - /* Virtual table implementations will typically add additional fields */ -}; - -/* -** The xCreate and xConnect methods of a module use the following API -** to declare the format (the names and datatypes of the columns) of -** the virtual tables they implement. -*/ -/*IMPORT_C*/ int sqlite3_declare_vtab(sqlite3*, const char *zCreateTable); - -/* -** Virtual tables can provide alternative implementations of functions -** using the xFindFunction method. But global versions of those functions -** must exist in order to be overloaded. -** -** This API makes sure a global version of a function with a particular -** name and number of parameters exists. If no such function exists -** before this API is called, a new function is created. The implementation -** of the new function always causes an exception to be thrown. So -** the new function is not good for anything by itself. Its only -** purpose is to be a place-holder function that can be overloaded -** by virtual tables. -** -** This API should be considered part of the virtual table interface, -** which is experimental and subject to change. -*/ -/*IMPORT_C*/ int sqlite3_overload_function(sqlite3*, const char *zFuncName, int nArg); - -/* -** The interface to the virtual-table mechanism defined above (back up -** to a comment remarkably similar to this one) is currently considered -** to be experimental. The interface might change in incompatible ways. -** If this is a problem for you, do not use the interface at this time. -** -** When the virtual-table mechanism stabilizes, we will declare the -** interface fixed, support it indefinitely, and remove this comment. -** -****** EXPERIMENTAL - subject to change without notice ************** -*/ - -/* -** CAPI3REF: A Handle To An Open BLOB {F17800} -** -** An instance of the following opaque structure is used to -** represent an blob-handle. A blob-handle is created by -** [sqlite3_blob_open()] and destroyed by [sqlite3_blob_close()]. -** The [sqlite3_blob_read()] and [sqlite3_blob_write()] interfaces -** can be used to read or write small subsections of the blob. -** The [sqlite3_blob_bytes()] interface returns the size of the -** blob in bytes. -*/ -typedef struct sqlite3_blob sqlite3_blob; - -/* -** CAPI3REF: Open A BLOB For Incremental I/O {F17810} -** -** {F17811} This interfaces opens a handle to the blob located -** in row iRow,, column zColumn, table zTable in database zDb; -** in other words, the same blob that would be selected by: -** -**
-**     SELECT zColumn FROM zDb.zTable WHERE rowid = iRow;
-** 
{END} -** -** {F17812} If the flags parameter is non-zero, the blob is opened for -** read and write access. If it is zero, the blob is opened for read -** access. {END} -** -** {F17813} On success, [SQLITE_OK] is returned and the new -** [sqlite3_blob | blob handle] is written to *ppBlob. -** {F17814} Otherwise an error code is returned and -** any value written to *ppBlob should not be used by the caller. -** {F17815} This function sets the database-handle error code and message -** accessible via [sqlite3_errcode()] and [sqlite3_errmsg()]. -** We should go through and mark all interfaces that behave this -** way with a similar statement -*/ -/*IMPORT_C*/ int sqlite3_blob_open( - sqlite3*, - const char *zDb, - const char *zTable, - const char *zColumn, - sqlite3_int64 iRow, - int flags, - sqlite3_blob **ppBlob -); - -/* -** CAPI3REF: Close A BLOB Handle {F17830} -** -** Close an open [sqlite3_blob | blob handle]. -** -** {F17831} Closing a BLOB shall cause the current transaction to commit -** if there are no other BLOBs, no pending prepared statements, and the -** database connection is in autocommit mode. -** {F17832} If any writes were made to the BLOB, they might be held in cache -** until the close operation if they will fit. {END} -** Closing the BLOB often forces the changes -** out to disk and so if any I/O errors occur, they will likely occur -** at the time when the BLOB is closed. {F17833} Any errors that occur during -** closing are reported as a non-zero return value. -** -** {F17839} The BLOB is closed unconditionally. Even if this routine returns -** an error code, the BLOB is still closed. -*/ -/*IMPORT_C*/ int sqlite3_blob_close(sqlite3_blob *); - -/* -** CAPI3REF: Return The Size Of An Open BLOB {F17805} -** -** {F16806} Return the size in bytes of the blob accessible via the open -** [sqlite3_blob | blob-handle] passed as an argument. -*/ -/*IMPORT_C*/ int sqlite3_blob_bytes(sqlite3_blob *); - -/* -** CAPI3REF: Read Data From A BLOB Incrementally {F17850} -** -** This function is used to read data from an open -** [sqlite3_blob | blob-handle] into a caller supplied buffer. -** {F17851} n bytes of data are copied into buffer -** z from the open blob, starting at offset iOffset. -** -** {F17852} If offset iOffset is less than n bytes from the end of the blob, -** [SQLITE_ERROR] is returned and no data is read. {F17853} If n is -** less than zero [SQLITE_ERROR] is returned and no data is read. -** -** {F17854} On success, SQLITE_OK is returned. Otherwise, an -** [SQLITE_ERROR | SQLite error code] or an -** [SQLITE_IOERR_READ | extended error code] is returned. -*/ -/*IMPORT_C*/ int sqlite3_blob_read(sqlite3_blob *, void *z, int n, int iOffset); - -/* -** CAPI3REF: Write Data Into A BLOB Incrementally {F17870} -** -** This function is used to write data into an open -** [sqlite3_blob | blob-handle] from a user supplied buffer. -** {F17871} n bytes of data are copied from the buffer -** pointed to by z into the open blob, starting at offset iOffset. -** -** {F17872} If the [sqlite3_blob | blob-handle] passed as the first argument -** was not opened for writing (the flags parameter to [sqlite3_blob_open()] -*** was zero), this function returns [SQLITE_READONLY]. -** -** {F17873} This function may only modify the contents of the blob; it is -** not possible to increase the size of a blob using this API. -** {F17874} If offset iOffset is less than n bytes from the end of the blob, -** [SQLITE_ERROR] is returned and no data is written. {F17875} If n is -** less than zero [SQLITE_ERROR] is returned and no data is written. -** -** {F17876} On success, SQLITE_OK is returned. Otherwise, an -** [SQLITE_ERROR | SQLite error code] or an -** [SQLITE_IOERR_READ | extended error code] is returned. -*/ -/*IMPORT_C*/ int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOffset); - -/* -** CAPI3REF: Virtual File System Objects {F11200} -** -** A virtual filesystem (VFS) is an [sqlite3_vfs] object -** that SQLite uses to interact -** with the underlying operating system. Most builds come with a -** single default VFS that is appropriate for the host computer. -** New VFSes can be registered and existing VFSes can be unregistered. -** The following interfaces are provided. -** -** {F11201} The sqlite3_vfs_find() interface returns a pointer to -** a VFS given its name. {F11202} Names are case sensitive. -** {F11203} Names are zero-terminated UTF-8 strings. -** {F11204} If there is no match, a NULL -** pointer is returned. {F11205} If zVfsName is NULL then the default -** VFS is returned. {END} -** -** {F11210} New VFSes are registered with sqlite3_vfs_register(). -** {F11211} Each new VFS becomes the default VFS if the makeDflt flag is set. -** {F11212} The same VFS can be registered multiple times without injury. -** {F11213} To make an existing VFS into the default VFS, register it again -** with the makeDflt flag set. {U11214} If two different VFSes with the -** same name are registered, the behavior is undefined. {U11215} If a -** VFS is registered with a name that is NULL or an empty string, -** then the behavior is undefined. -** -** {F11220} Unregister a VFS with the sqlite3_vfs_unregister() interface. -** {F11221} If the default VFS is unregistered, another VFS is chosen as -** the default. The choice for the new VFS is arbitrary. -*/ -/*IMPORT_C*/ sqlite3_vfs *sqlite3_vfs_find(const char *zVfsName); -/*IMPORT_C*/ int sqlite3_vfs_register(sqlite3_vfs*, int makeDflt); -/*IMPORT_C*/ int sqlite3_vfs_unregister(sqlite3_vfs*); - -/* -** CAPI3REF: Mutexes {F17000} -** -** The SQLite core uses these routines for thread -** synchronization. Though they are intended for internal -** use by SQLite, code that links against SQLite is -** permitted to use any of these routines. -** -** The SQLite source code contains multiple implementations -** of these mutex routines. An appropriate implementation -** is selected automatically at compile-time. The following -** implementations are available in the SQLite core: -** -**
    -**
  • SQLITE_MUTEX_OS2 -**
  • SQLITE_MUTEX_PTHREAD -**
  • SQLITE_MUTEX_W32 -**
  • SQLITE_MUTEX_NOOP -**
-** -** The SQLITE_MUTEX_NOOP implementation is a set of routines -** that does no real locking and is appropriate for use in -** a single-threaded application. The SQLITE_MUTEX_OS2, -** SQLITE_MUTEX_PTHREAD, and SQLITE_MUTEX_W32 implementations -** are appropriate for use on os/2, unix, and windows. -** -** If SQLite is compiled with the SQLITE_MUTEX_APPDEF preprocessor -** macro defined (with "-DSQLITE_MUTEX_APPDEF=1"), then no mutex -** implementation is included with the library. The -** mutex interface routines defined here become external -** references in the SQLite library for which implementations -** must be provided by the application. This facility allows an -** application that links against SQLite to provide its own mutex -** implementation without having to modify the SQLite core. -** -** {F17011} The sqlite3_mutex_alloc() routine allocates a new -** mutex and returns a pointer to it. {F17012} If it returns NULL -** that means that a mutex could not be allocated. {F17013} SQLite -** will unwind its stack and return an error. {F17014} The argument -** to sqlite3_mutex_alloc() is one of these integer constants: -** -**
    -**
  • SQLITE_MUTEX_FAST -**
  • SQLITE_MUTEX_RECURSIVE -**
  • SQLITE_MUTEX_STATIC_MASTER -**
  • SQLITE_MUTEX_STATIC_MEM -**
  • SQLITE_MUTEX_STATIC_MEM2 -**
  • SQLITE_MUTEX_STATIC_PRNG -**
  • SQLITE_MUTEX_STATIC_LRU -**
{END} -** -** {F17015} The first two constants cause sqlite3_mutex_alloc() to create -** a new mutex. The new mutex is recursive when SQLITE_MUTEX_RECURSIVE -** is used but not necessarily so when SQLITE_MUTEX_FAST is used. {END} -** The mutex implementation does not need to make a distinction -** between SQLITE_MUTEX_RECURSIVE and SQLITE_MUTEX_FAST if it does -** not want to. {F17016} But SQLite will only request a recursive mutex in -** cases where it really needs one. {END} If a faster non-recursive mutex -** implementation is available on the host platform, the mutex subsystem -** might return such a mutex in response to SQLITE_MUTEX_FAST. -** -** {F17017} The other allowed parameters to sqlite3_mutex_alloc() each return -** a pointer to a static preexisting mutex. {END} Four static mutexes are -** used by the current version of SQLite. Future versions of SQLite -** may add additional static mutexes. Static mutexes are for internal -** use by SQLite only. Applications that use SQLite mutexes should -** use only the dynamic mutexes returned by SQLITE_MUTEX_FAST or -** SQLITE_MUTEX_RECURSIVE. -** -** {F17018} Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST -** or SQLITE_MUTEX_RECURSIVE) is used then sqlite3_mutex_alloc() -** returns a different mutex on every call. {F17034} But for the static -** mutex types, the same mutex is returned on every call that has -** the same type number. {END} -** -** {F17019} The sqlite3_mutex_free() routine deallocates a previously -** allocated dynamic mutex. {F17020} SQLite is careful to deallocate every -** dynamic mutex that it allocates. {U17021} The dynamic mutexes must not be in -** use when they are deallocated. {U17022} Attempting to deallocate a static -** mutex results in undefined behavior. {F17023} SQLite never deallocates -** a static mutex. {END} -** -** The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt -** to enter a mutex. {F17024} If another thread is already within the mutex, -** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return -** SQLITE_BUSY. {F17025} The sqlite3_mutex_try() interface returns SQLITE_OK -** upon successful entry. {F17026} Mutexes created using -** SQLITE_MUTEX_RECURSIVE can be entered multiple times by the same thread. -** {F17027} In such cases the, -** mutex must be exited an equal number of times before another thread -** can enter. {U17028} If the same thread tries to enter any other -** kind of mutex more than once, the behavior is undefined. -** {F17029} SQLite will never exhibit -** such behavior in its own use of mutexes. {END} -** -** Some systems (ex: windows95) do not the operation implemented by -** sqlite3_mutex_try(). On those systems, sqlite3_mutex_try() will -** always return SQLITE_BUSY. {F17030} The SQLite core only ever uses -** sqlite3_mutex_try() as an optimization so this is acceptable behavior. {END} -** -** {F17031} The sqlite3_mutex_leave() routine exits a mutex that was -** previously entered by the same thread. {U17032} The behavior -** is undefined if the mutex is not currently entered by the -** calling thread or is not currently allocated. {F17033} SQLite will -** never do either. {END} -** -** See also: [sqlite3_mutex_held()] and [sqlite3_mutex_notheld()]. -*/ -/*IMPORT_C*/ sqlite3_mutex *sqlite3_mutex_alloc(int); -/*IMPORT_C*/ void sqlite3_mutex_free(sqlite3_mutex*); -/*IMPORT_C*/ void sqlite3_mutex_enter(sqlite3_mutex*); -/*IMPORT_C*/ int sqlite3_mutex_try(sqlite3_mutex*); -/*IMPORT_C*/ void sqlite3_mutex_leave(sqlite3_mutex*); - -/* -** CAPI3REF: Mutex Verifcation Routines {F17080} -** -** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routines -** are intended for use inside assert() statements. {F17081} The SQLite core -** never uses these routines except inside an assert() and applications -** are advised to follow the lead of the core. {F17082} The core only -** provides implementations for these routines when it is compiled -** with the SQLITE_DEBUG flag. {U17087} External mutex implementations -** are only required to provide these routines if SQLITE_DEBUG is -** defined and if NDEBUG is not defined. -** -** {F17083} These routines should return true if the mutex in their argument -** is held or not held, respectively, by the calling thread. {END} -** -** {X17084} The implementation is not required to provided versions of these -** routines that actually work. -** If the implementation does not provide working -** versions of these routines, it should at least provide stubs -** that always return true so that one does not get spurious -** assertion failures. {END} -** -** {F17085} If the argument to sqlite3_mutex_held() is a NULL pointer then -** the routine should return 1. {END} This seems counter-intuitive since -** clearly the mutex cannot be held if it does not exist. But the -** the reason the mutex does not exist is because the build is not -** using mutexes. And we do not want the assert() containing the -** call to sqlite3_mutex_held() to fail, so a non-zero return is -** the appropriate thing to do. {F17086} The sqlite3_mutex_notheld() -** interface should also return 1 when given a NULL pointer. -*/ -/*IMPORT_C*/ int sqlite3_mutex_held(sqlite3_mutex*); -/*IMPORT_C*/ int sqlite3_mutex_notheld(sqlite3_mutex*); - -/* -** CAPI3REF: Mutex Types {F17001} -** -** {F17002} The [sqlite3_mutex_alloc()] interface takes a single argument -** which is one of these integer constants. {END} -*/ -#define SQLITE_MUTEX_FAST 0 -#define SQLITE_MUTEX_RECURSIVE 1 -#define SQLITE_MUTEX_STATIC_MASTER 2 -#define SQLITE_MUTEX_STATIC_MEM 3 /* sqlite3_malloc() */ -#define SQLITE_MUTEX_STATIC_MEM2 4 /* sqlite3_release_memory() */ -#define SQLITE_MUTEX_STATIC_PRNG 5 /* sqlite3_random() */ -#define SQLITE_MUTEX_STATIC_LRU 6 /* lru page list */ - -/* -** CAPI3REF: Low-Level Control Of Database Files {F11300} -** -** {F11301} The [sqlite3_file_control()] interface makes a direct call to the -** xFileControl method for the [sqlite3_io_methods] object associated -** with a particular database identified by the second argument. {F11302} The -** name of the database is the name assigned to the database by the -** ATTACH SQL command that opened the -** database. {F11303} To control the main database file, use the name "main" -** or a NULL pointer. {F11304} The third and fourth parameters to this routine -** are passed directly through to the second and third parameters of -** the xFileControl method. {F11305} The return value of the xFileControl -** method becomes the return value of this routine. -** -** {F11306} If the second parameter (zDbName) does not match the name of any -** open database file, then SQLITE_ERROR is returned. {F11307} This error -** code is not remembered and will not be recalled by [sqlite3_errcode()] -** or [sqlite3_errmsg()]. {U11308} The underlying xFileControl method might -** also return SQLITE_ERROR. {U11309} There is no way to distinguish between -** an incorrect zDbName and an SQLITE_ERROR return from the underlying -** xFileControl method. {END} -** -** See also: [SQLITE_FCNTL_LOCKSTATE] -*/ -/*IMPORT_C*/ int sqlite3_file_control(sqlite3*, const char *zDbName, int op, void*); - -/*IMPORT_C*/ int sqlite3_openTest( - const char *zFilename -); - -/*IMPORT_C*/ int sqlite3_bind_double_ref(sqlite3_stmt *stmt, int iCol, double *val); - -/*IMPORT_C*/ int sqlite3_bind_int64_ref(sqlite3_stmt *stmt, int iCol, sqlite_int64 *val); - -/*IMPORT_C*/ void sqlite3_column_double_ref(sqlite3_stmt *stmt, int iCol, double *val); - -/*IMPORT_C*/ void sqlite3_column_int64_ref(sqlite3_stmt *stmt, int iCol, sqlite_int64 *val); - -/*IMPORT_C*/ unsigned int sqlite3_strlen(char *ptr); - -/* -** Undo the hack that converts floating point types to integer for -** builds on processors without floating point support. -*/ -#ifdef SQLITE_OMIT_FLOATING_POINT -# undef double -#endif - -#ifdef __cplusplus -} /* End of the 'extern "C"' block */ -#endif -#endif diff -r 9569ea080d5a -r 4d230e702aa3 engine/sqlite/group/sqlite.mmp --- a/engine/sqlite/group/sqlite.mmp Thu Mar 11 20:53:00 2010 +0100 +++ b/engine/sqlite/group/sqlite.mmp Tue Apr 27 19:26:48 2010 +0100 @@ -57,4 +57,5 @@ USERINCLUDE .. SYSTEMINCLUDE \Epoc32\include SYSTEMINCLUDE \Epoc32\include\libc +SYSTEMINCLUDE ..\inc macro OS_SYMBIAN diff -r 9569ea080d5a -r 4d230e702aa3 engine/sqlite/inc/sqlite3.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/engine/sqlite/inc/sqlite3.h Tue Apr 27 19:26:48 2010 +0100 @@ -0,0 +1,3858 @@ +/* +** 2001 September 15 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This header file defines the interface that the SQLite library +** presents to client programs. If a C-function, structure, datatype, +** or constant definition does not appear in this file, then it is +** not a published API of SQLite, is subject to change without +** notice, and should not be referenced by programs that use SQLite. +** +** Some of the definitions that are in this file are marked as +** "experimental". Experimental interfaces are normally new +** features recently added to SQLite. We do not anticipate changes +** to experimental interfaces but reserve to make minor changes if +** experience from use "in the wild" suggest such changes are prudent. +** +** The official C-language API documentation for SQLite is derived +** from comments in this file. This file is the authoritative source +** on how SQLite interfaces are suppose to operate. +** +** The name of this file under configuration management is "sqlite.h.in". +** The makefile makes some minor changes to this file (such as inserting +** the version number) and changes its name to "sqlite3.h" as +** part of the build process. +** +** @(#) $Id: sqlite3.h 1420 2009-01-13 15:06:30Z teknolog $ +*/ +#ifndef _SQLITE3_H_ +#define _SQLITE3_H_ + +/* +** Make sure we can call this stuff from C++. +*/ +#ifdef __cplusplus +extern "C" { +#endif + +//#define EXPORT_C + +//#define /*IMPORT_C*/ + +/* +** Add the ability to override 'extern' +*/ +#ifndef SQLITE_EXTERN +# define SQLITE_EXTERN extern +#endif + +/* +** Make sure these symbols where not defined by some previous header +** file. +*/ +#ifdef SQLITE_VERSION +# undef SQLITE_VERSION +#endif +#ifdef SQLITE_VERSION_NUMBER +# undef SQLITE_VERSION_NUMBER +#endif + +/* +** CAPI3REF: Compile-Time Library Version Numbers {F10010} +** +** {F10011} The #define in the sqlite3.h header file named +** SQLITE_VERSION resolves to a string literal that identifies +** the version of the SQLite library in the format "X.Y.Z", where +** X is the major version number, Y is the minor version number and Z +** is the release number. The X.Y.Z might be followed by "alpha" or "beta". +** {END} For example "3.1.1beta". +** +** The X value is always 3 in SQLite. The X value only changes when +** backwards compatibility is broken and we intend to never break +** backwards compatibility. The Y value only changes when +** there are major feature enhancements that are forwards compatible +** but not backwards compatible. The Z value is incremented with +** each release but resets back to 0 when Y is incremented. +** +** {F10014} The SQLITE_VERSION_NUMBER #define resolves to an integer +** with the value (X*1000000 + Y*1000 + Z) where X, Y, and Z are as +** with SQLITE_VERSION. {END} For example, for version "3.1.1beta", +** SQLITE_VERSION_NUMBER is set to 3001001. To detect if they are using +** version 3.1.1 or greater at compile time, programs may use the test +** (SQLITE_VERSION_NUMBER>=3001001). +** +** See also: [sqlite3_libversion()] and [sqlite3_libversion_number()]. +*/ +#define SQLITE_VERSION "3.5.4" +#define SQLITE_VERSION_NUMBER 3005004 + +/* +** CAPI3REF: Run-Time Library Version Numbers {F10020} +** +** {F10021} The sqlite3_libversion_number() interface returns an integer +** equal to [SQLITE_VERSION_NUMBER]. {END} The value returned +** by this routine should only be different from the header values +** if the application is compiled using an sqlite3.h header from a +** different version of SQLite than library. Cautious programmers might +** include a check in their application to verify that +** sqlite3_libversion_number() always returns the value +** [SQLITE_VERSION_NUMBER]. +** +** {F10022} The sqlite3_version[] string constant contains the text of the +** [SQLITE_VERSION] string. {F10023} The sqlite3_libversion() function returns +** a pointer to the sqlite3_version[] string constant. {END} The +** sqlite3_libversion() function +** is provided for DLL users who can only access functions and not +** constants within the DLL. +*/ +const char sqlite3_version[] = SQLITE_VERSION; +/*IMPORT_C*/ const char *sqlite3_libversion(void); +/*IMPORT_C*/ int sqlite3_libversion_number(void); + + +void LogMessage(char *message); + +/* +** CAPI3REF: Test To See If The Library Is Threadsafe {F10100} +** +** {F10101} The sqlite3_threadsafe() routine returns nonzero +** if SQLite was compiled with its mutexes enabled or zero if +** SQLite was compiled with mutexes disabled. {END} If this +** routine returns false, then it is not safe for simultaneously +** running threads to both invoke SQLite interfaces. +** +** Really all this routine does is return true if SQLite was +** compiled with the -DSQLITE_THREADSAFE=1 option and false if +** compiled with -DSQLITE_THREADSAFE=0. If SQLite uses an +** application-defined mutex subsystem, malloc subsystem, collating +** sequence, VFS, SQL function, progress callback, commit hook, +** extension, or other accessories and these add-ons are not +** threadsafe, then clearly the combination will not be threadsafe +** either. Hence, this routine never reports that the library +** is guaranteed to be threadsafe, only when it is guaranteed not +** to be. +*/ +/*IMPORT_C*/ int sqlite3_threadsafe(void); + +/* +** CAPI3REF: Database Connection Handle {F12000} +** +** Each open SQLite database is represented by pointer to an instance of the +** opaque structure named "sqlite3". It is useful to think of an sqlite3 +** pointer as an object. The [sqlite3_open()], [sqlite3_open16()], and +** [sqlite3_open_v2()] interfaces are its constructors +** and [sqlite3_close()] is its destructor. There are many other interfaces +** (such as [sqlite3_prepare_v2()], [sqlite3_create_function()], and +** [sqlite3_busy_timeout()] to name but three) that are methods on this +** object. +*/ +typedef struct sqlite3 sqlite3; + + +/* +** CAPI3REF: 64-Bit Integer Types {F10200} +** +** Because there is no cross-platform way to specify such types +** SQLite includes typedefs for 64-bit signed and unsigned integers. +** {F10201} The sqlite_int64 and sqlite3_int64 types specify a +** 64-bit signed integer. {F10202} The sqlite_uint64 and +** sqlite3_uint64 types specify a 64-bit unsigned integer. {END} +** +** The sqlite3_int64 and sqlite3_uint64 are the preferred type +** definitions. The sqlite_int64 and sqlite_uint64 types are +** supported for backwards compatibility only. +*/ +#ifdef SQLITE_INT64_TYPE + typedef SQLITE_INT64_TYPE sqlite_int64; + typedef unsigned SQLITE_INT64_TYPE sqlite_uint64; +#elif defined(_MSC_VER) || defined(__BORLANDC__) + typedef __int64 sqlite_int64; + typedef unsigned __int64 sqlite_uint64; +#else + typedef long long int sqlite_int64; + typedef unsigned long long int sqlite_uint64; +#endif +typedef sqlite_int64 sqlite3_int64; +typedef sqlite_uint64 sqlite3_uint64; + +/* +** If compiling for a processor that lacks floating point support, +** substitute integer for floating-point +*/ +#ifdef SQLITE_OMIT_FLOATING_POINT +# define double sqlite3_int64 +#endif + +/* +** CAPI3REF: Closing A Database Connection {F12010} +** +** {F12011} The sqlite3_close() interfaces destroys an [sqlite3] object +** allocated by a prior call to [sqlite3_open()], [sqlite3_open16()], or +** [sqlite3_open_v2()]. {F12012} Sqlite3_close() releases all +** memory used by the connection and closes all open files. {END}. +** +** {F12013} If the database connection contains +** [sqlite3_stmt | prepared statements] that have not been finalized +** by [sqlite3_finalize()], then sqlite3_close() returns SQLITE_BUSY +** and leaves the connection open. {F12014} Giving sqlite3_close() +** a NULL pointer is a harmless no-op. {END} +** +** {U12015} Passing this routine a database connection that has already been +** closed results in undefined behavior. {U12016} If other interfaces that +** reference the same database connection are pending (either in the +** same thread or in different threads) when this routine is called, +** then the behavior is undefined and is almost certainly undesirable. +*/ +/*IMPORT_C*/ int sqlite3_close(sqlite3 *); + +/* +** The type for a callback function. +** This is legacy and deprecated. It is included for historical +** compatibility and is not documented. +*/ +typedef int (*sqlite3_callback)(void*,int,char**, char**); + +/* +** CAPI3REF: One-Step Query Execution Interface {F12100} +** +** {F12101} The sqlite3_exec() interface evaluates zero or more +** UTF-8 encoded, semicolon-separated SQL statements in the zero-terminated +** string of its second argument. {F12102} The SQL +** statements are evaluated in the context of the database connection +** specified by in the first argument. +** {F12103} SQL statements are prepared one by one using +** [sqlite3_prepare()] or the equivalent, evaluated +** using one or more calls to [sqlite3_step()], then destroyed +** using [sqlite3_finalize()]. {F12104} The return value of +** sqlite3_exec() is SQLITE_OK if all SQL statement run +** successfully. +** +** {F12105} If one or more of the SQL statements handed to +** sqlite3_exec() are queries, then +** the callback function specified by the 3rd parameter is +** invoked once for each row of the query result. {F12106} +** If the callback returns a non-zero value then the query +** is aborted, all subsequent SQL statements +** are skipped and the sqlite3_exec() function returns the [SQLITE_ABORT]. +** +** {F12107} The 4th parameter to sqlite3_exec() is an arbitrary pointer +** that is passed through to the callback function as its first parameter. +** +** {F12108} The 2nd parameter to the callback function is the number of +** columns in the query result. {F12109} The 3rd parameter to the callback +** is an array of pointers to strings holding the values for each column +** as extracted using [sqlite3_column_text()]. NULL values in the result +** set result in a NULL pointer. All other value are in their UTF-8 +** string representation. {F12117} +** The 4th parameter to the callback is an array of strings +** obtained using [sqlite3_column_name()] and holding +** the names of each column, also in UTF-8. +** +** {F12110} The callback function may be NULL, even for queries. A NULL +** callback is not an error. It just means that no callback +** will be invoked. +** +** {F12112} If an error occurs while parsing or evaluating the SQL +** then an appropriate error message is written into memory obtained +** from [sqlite3_malloc()] and *errmsg is made to point to that message +** assuming errmsg is not NULL. +** {U12113} The calling function is responsible for freeing the memory +** using [sqlite3_free()]. +** {F12116} If [sqlite3_malloc()] fails while attempting to generate +** the error message, *errmsg is set to NULL. +** {F12114} If errmsg is NULL then no attempt is made to generate an +** error message. Is the return code SQLITE_NOMEM or the original +** error code? What happens if there are multiple errors? +** Do we get code for the first error, or is the choice of reported +** error arbitrary? +** +** {F12115} The return value is is SQLITE_OK if there are no errors and +** some other [SQLITE_OK | return code] if there is an error. +** The particular return value depends on the type of error. {END} +*/ +/*IMPORT_C*/ int sqlite3_exec( + sqlite3*, /* An open database */ + const char *sql, /* SQL to be evaluted */ + int (*callback)(void*,int,char**,char**), /* Callback function */ + void *, /* 1st argument to callback */ + char **errmsg /* Error msg written here */ +); + +/* +** CAPI3REF: Result Codes {F10210} +** KEYWORDS: SQLITE_OK +** +** Many SQLite functions return an integer result code from the set shown +** above in order to indicates success or failure. +** +** {F10211} The result codes shown here are the only ones returned +** by SQLite in its default configuration. {F10212} However, the +** [sqlite3_extended_result_codes()] API can be used to set a database +** connectoin to return more detailed result codes. {END} +** +** See also: [SQLITE_IOERR_READ | extended result codes] +** +*/ +#define SQLITE_OK 0 /* Successful result */ +/* beginning-of-error-codes */ +#define SQLITE_ERROR 1 /* SQL error or missing database */ +#define SQLITE_INTERNAL 2 /* Internal logic error in SQLite */ +#define SQLITE_PERM 3 /* Access permission denied */ +#define SQLITE_ABORT 4 /* Callback routine requested an abort */ +#define SQLITE_BUSY 5 /* The database file is locked */ +#define SQLITE_LOCKED 6 /* A table in the database is locked */ +#define SQLITE_NOMEM 7 /* A malloc() failed */ +#define SQLITE_READONLY 8 /* Attempt to write a readonly database */ +#define SQLITE_INTERRUPT 9 /* Operation terminated by sqlite3_interrupt()*/ +#define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */ +#define SQLITE_CORRUPT 11 /* The database disk image is malformed */ +#define SQLITE_NOTFOUND 12 /* NOT USED. Table or record not found */ +#define SQLITE_FULL 13 /* Insertion failed because database is full */ +#define SQLITE_CANTOPEN 14 /* Unable to open the database file */ +#define SQLITE_PROTOCOL 15 /* NOT USED. Database lock protocol error */ +#define SQLITE_EMPTY 16 /* Database is empty */ +#define SQLITE_SCHEMA 17 /* The database schema changed */ +#define SQLITE_TOOBIG 18 /* String or BLOB exceeds size limit */ +#define SQLITE_CONSTRAINT 19 /* Abort due to constraint violation */ +#define SQLITE_MISMATCH 20 /* Data type mismatch */ +#define SQLITE_MISUSE 21 /* Library used incorrectly */ +#define SQLITE_NOLFS 22 /* Uses OS features not supported on host */ +#define SQLITE_AUTH 23 /* Authorization denied */ +#define SQLITE_FORMAT 24 /* Auxiliary database format error */ +#define SQLITE_RANGE 25 /* 2nd parameter to sqlite3_bind out of range */ +#define SQLITE_NOTADB 26 /* File opened that is not a database file */ +#define SQLITE_ROW 100 /* sqlite3_step() has another row ready */ +#define SQLITE_DONE 101 /* sqlite3_step() has finished executing */ +/* end-of-error-codes */ + +/* +** CAPI3REF: Extended Result Codes {F10220} +** +** In its default configuration, SQLite API routines return one of 26 integer +** [SQLITE_OK | result codes]. However, experience has shown that +** many of these result codes are too course-grained. They do not provide as +** much information about problems as programmers might like. In an effort to +** address this, newer versions of SQLite (version 3.3.8 and later) include +** support for additional result codes that provide more detailed information +** about errors. {F10221} The extended result codes are enabled or disabled +** for each database connection using the [sqlite3_extended_result_codes()] +** API. {END} +** +** Some of the available extended result codes are listed above. +** We expect the number of extended result codes will be expand +** over time. {U10422} Software that uses extended result codes should expect +** to see new result codes in future releases of SQLite. {END} +** +** {F10223} The symbolic name for an extended result code always contains +** a related primary result code as a prefix. {F10224} Primary result +** codes contain a single "_" character. {F10225} Extended result codes +** contain two or more "_" characters. {F10226} The numeric value of an +** extended result code can be converted to its +** corresponding primary result code by masking off the lower 8 bytes. {END} +** +** The SQLITE_OK result code will never be extended. It will always +** be exactly zero. +*/ +#define SQLITE_IOERR_READ (SQLITE_IOERR | (1<<8)) +#define SQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8)) +#define SQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8)) +#define SQLITE_IOERR_FSYNC (SQLITE_IOERR | (4<<8)) +#define SQLITE_IOERR_DIR_FSYNC (SQLITE_IOERR | (5<<8)) +#define SQLITE_IOERR_TRUNCATE (SQLITE_IOERR | (6<<8)) +#define SQLITE_IOERR_FSTAT (SQLITE_IOERR | (7<<8)) +#define SQLITE_IOERR_UNLOCK (SQLITE_IOERR | (8<<8)) +#define SQLITE_IOERR_RDLOCK (SQLITE_IOERR | (9<<8)) +#define SQLITE_IOERR_DELETE (SQLITE_IOERR | (10<<8)) +#define SQLITE_IOERR_BLOCKED (SQLITE_IOERR | (11<<8)) +#define SQLITE_IOERR_NOMEM (SQLITE_IOERR | (12<<8)) + +/* +** CAPI3REF: Flags For File Open Operations {F10230} +** +** {F10231} Some combination of the these bit values are used as the +** third argument to the [sqlite3_open_v2()] interface and +** as fourth argument to the xOpen method of the +** [sqlite3_vfs] object. +*/ +#define SQLITE_OPEN_READONLY 0x00000001 +#define SQLITE_OPEN_READWRITE 0x00000002 +#define SQLITE_OPEN_CREATE 0x00000004 +#define SQLITE_OPEN_DELETEONCLOSE 0x00000008 +#define SQLITE_OPEN_EXCLUSIVE 0x00000010 +#define SQLITE_OPEN_MAIN_DB 0x00000100 +#define SQLITE_OPEN_TEMP_DB 0x00000200 +#define SQLITE_OPEN_TRANSIENT_DB 0x00000400 +#define SQLITE_OPEN_MAIN_JOURNAL 0x00000800 +#define SQLITE_OPEN_TEMP_JOURNAL 0x00001000 +#define SQLITE_OPEN_SUBJOURNAL 0x00002000 +#define SQLITE_OPEN_MASTER_JOURNAL 0x00004000 + +/* +** CAPI3REF: Device Characteristics {F10240} +** +** {F10241} The xDeviceCapabilities method of the [sqlite3_io_methods] +** object returns an integer which is a vector of the these +** bit values expressing I/O characteristics of the mass storage +** device that holds the file that the [sqlite3_io_methods] +** refers to. {END} +** +** {F10242} The SQLITE_IOCAP_ATOMIC property means that all writes of +** any size are atomic. {F10243} The SQLITE_IOCAP_ATOMICnnn values +** mean that writes of blocks that are nnn bytes in size and +** are aligned to an address which is an integer multiple of +** nnn are atomic. {F10244} The SQLITE_IOCAP_SAFE_APPEND value means +** that when data is appended to a file, the data is appended +** first then the size of the file is extended, never the other +** way around. {F10245} The SQLITE_IOCAP_SEQUENTIAL property means that +** information is written to disk in the same order as calls +** to xWrite(). +*/ +#define SQLITE_IOCAP_ATOMIC 0x00000001 +#define SQLITE_IOCAP_ATOMIC512 0x00000002 +#define SQLITE_IOCAP_ATOMIC1K 0x00000004 +#define SQLITE_IOCAP_ATOMIC2K 0x00000008 +#define SQLITE_IOCAP_ATOMIC4K 0x00000010 +#define SQLITE_IOCAP_ATOMIC8K 0x00000020 +#define SQLITE_IOCAP_ATOMIC16K 0x00000040 +#define SQLITE_IOCAP_ATOMIC32K 0x00000080 +#define SQLITE_IOCAP_ATOMIC64K 0x00000100 +#define SQLITE_IOCAP_SAFE_APPEND 0x00000200 +#define SQLITE_IOCAP_SEQUENTIAL 0x00000400 + +/* +** CAPI3REF: File Locking Levels {F10250} +** +** {F10251} SQLite uses one of the following integer values as the second +** argument to calls it makes to the xLock() and xUnlock() methods +** of an [sqlite3_io_methods] object. {END} +*/ +#define SQLITE_LOCK_NONE 0 +#define SQLITE_LOCK_SHARED 1 +#define SQLITE_LOCK_RESERVED 2 +#define SQLITE_LOCK_PENDING 3 +#define SQLITE_LOCK_EXCLUSIVE 4 + +/* +** CAPI3REF: Synchronization Type Flags {F10260} +** +** {F10261} When SQLite invokes the xSync() method of an +** [sqlite3_io_methods] object it uses a combination of the +** these integer values as the second argument. +** +** {F10262} When the SQLITE_SYNC_DATAONLY flag is used, it means that the +** sync operation only needs to flush data to mass storage. Inode +** information need not be flushed. {F10263} The SQLITE_SYNC_NORMAL means +** to use normal fsync() semantics. {F10264} The SQLITE_SYNC_FULL flag means +** to use Mac OS-X style fullsync instead of fsync(). +*/ +#define SQLITE_SYNC_NORMAL 0x00002 +#define SQLITE_SYNC_FULL 0x00003 +#define SQLITE_SYNC_DATAONLY 0x00010 + + +/* +** CAPI3REF: OS Interface Open File Handle {F11110} +** +** An [sqlite3_file] object represents an open file in the OS +** interface layer. Individual OS interface implementations will +** want to subclass this object by appending additional fields +** for their own use. The pMethods entry is a pointer to an +** [sqlite3_io_methods] object that defines methods for performing +** I/O operations on the open file. +*/ +typedef struct sqlite3_file sqlite3_file; +struct sqlite3_file { + int isOpen; + //const struct sqlite3_io_methods *pMethods; /* Methods for an open file */ +}; + +/* +** CAPI3REF: OS Interface File Virtual Methods Object {F11120} +** +** Every file opened by the [sqlite3_vfs] xOpen method contains a pointer to +** an instance of the this object. This object defines the +** methods used to perform various operations against the open file. +** +** The flags argument to xSync may be one of [SQLITE_SYNC_NORMAL] or +** [SQLITE_SYNC_FULL]. The first choice is the normal fsync(). +* The second choice is an +** OS-X style fullsync. The SQLITE_SYNC_DATA flag may be ORed in to +** indicate that only the data of the file and not its inode needs to be +** synced. +** +** The integer values to xLock() and xUnlock() are one of +**
    +**
  • [SQLITE_LOCK_NONE], +**
  • [SQLITE_LOCK_SHARED], +**
  • [SQLITE_LOCK_RESERVED], +**
  • [SQLITE_LOCK_PENDING], or +**
  • [SQLITE_LOCK_EXCLUSIVE]. +**
+** xLock() increases the lock. xUnlock() decreases the lock. +** The xCheckReservedLock() method looks +** to see if any database connection, either in this +** process or in some other process, is holding an RESERVED, +** PENDING, or EXCLUSIVE lock on the file. It returns true +** if such a lock exists and false if not. +** +** The xFileControl() method is a generic interface that allows custom +** VFS implementations to directly control an open file using the +** [sqlite3_file_control()] interface. The second "op" argument +** is an integer opcode. The third +** argument is a generic pointer which is intended to be a pointer +** to a structure that may contain arguments or space in which to +** write return values. Potential uses for xFileControl() might be +** functions to enable blocking locks with timeouts, to change the +** locking strategy (for example to use dot-file locks), to inquire +** about the status of a lock, or to break stale locks. The SQLite +** core reserves opcodes less than 100 for its own use. +** A [SQLITE_FCNTL_LOCKSTATE | list of opcodes] less than 100 is available. +** Applications that define a custom xFileControl method should use opcodes +** greater than 100 to avoid conflicts. +** +** The xSectorSize() method returns the sector size of the +** device that underlies the file. The sector size is the +** minimum write that can be performed without disturbing +** other bytes in the file. The xDeviceCharacteristics() +** method returns a bit vector describing behaviors of the +** underlying device: +** +**
    +**
  • [SQLITE_IOCAP_ATOMIC] +**
  • [SQLITE_IOCAP_ATOMIC512] +**
  • [SQLITE_IOCAP_ATOMIC1K] +**
  • [SQLITE_IOCAP_ATOMIC2K] +**
  • [SQLITE_IOCAP_ATOMIC4K] +**
  • [SQLITE_IOCAP_ATOMIC8K] +**
  • [SQLITE_IOCAP_ATOMIC16K] +**
  • [SQLITE_IOCAP_ATOMIC32K] +**
  • [SQLITE_IOCAP_ATOMIC64K] +**
  • [SQLITE_IOCAP_SAFE_APPEND] +**
  • [SQLITE_IOCAP_SEQUENTIAL] +**
+** +** The SQLITE_IOCAP_ATOMIC property means that all writes of +** any size are atomic. The SQLITE_IOCAP_ATOMICnnn values +** mean that writes of blocks that are nnn bytes in size and +** are aligned to an address which is an integer multiple of +** nnn are atomic. The SQLITE_IOCAP_SAFE_APPEND value means +** that when data is appended to a file, the data is appended +** first then the size of the file is extended, never the other +** way around. The SQLITE_IOCAP_SEQUENTIAL property means that +** information is written to disk in the same order as calls +** to xWrite(). +*/ +/*typedef struct sqlite3_io_methods sqlite3_io_methods; +struct sqlite3_io_methods { + int iVersion; + int (*xClose)(sqlite3_file*); + int (*xRead)(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst); + int (*xWrite)(sqlite3_file*, const void*, int iAmt, sqlite3_int64 iOfst); + int (*xTruncate)(sqlite3_file*, sqlite3_int64 size); + int (*xSync)(sqlite3_file*, int flags); + int (*xFileSize)(sqlite3_file*, sqlite3_int64 *pSize); + int (*xLock)(sqlite3_file*, int); + int (*xUnlock)(sqlite3_file*, int); + int (*xCheckReservedLock)(sqlite3_file*); + int (*xFileControl)(sqlite3_file*, int op, void *pArg); + int (*xSectorSize)(sqlite3_file*); + int (*xDeviceCharacteristics)(sqlite3_file*); +};*/ + +/* +** CAPI3REF: Standard File Control Opcodes {F11310} +** +** These integer constants are opcodes for the xFileControl method +** of the [sqlite3_io_methods] object and to the [sqlite3_file_control()] +** interface. +** +** {F11311} The [SQLITE_FCNTL_LOCKSTATE] opcode is used for debugging. This +** opcode cases the xFileControl method to write the current state of +** the lock (one of [SQLITE_LOCK_NONE], [SQLITE_LOCK_SHARED], +** [SQLITE_LOCK_RESERVED], [SQLITE_LOCK_PENDING], or [SQLITE_LOCK_EXCLUSIVE]) +** into an integer that the pArg argument points to. {F11312} This capability +** is used during testing and only needs to be supported when SQLITE_TEST +** is defined. +*/ +#define SQLITE_FCNTL_LOCKSTATE 1 + +/* +** CAPI3REF: Mutex Handle {F17110} +** +** The mutex module within SQLite defines [sqlite3_mutex] to be an +** abstract type for a mutex object. {F17111} The SQLite core never looks +** at the internal representation of an [sqlite3_mutex]. {END} It only +** deals with pointers to the [sqlite3_mutex] object. +** +** Mutexes are created using [sqlite3_mutex_alloc()]. +*/ +typedef struct sqlite3_mutex sqlite3_mutex; + +/* +** CAPI3REF: OS Interface Object {F11140} +** +** An instance of this object defines the interface between the +** SQLite core and the underlying operating system. The "vfs" +** in the name of the object stands for "virtual file system". +** +** The iVersion field is initially 1 but may be larger for future +** versions of SQLite. Additional fields may be appended to this +** object when the iVersion value is increased. +** +** The szOsFile field is the size of the subclassed [sqlite3_file] +** structure used by this VFS. mxPathname is the maximum length of +** a pathname in this VFS. +** +** Registered vfs modules are kept on a linked list formed by +** the pNext pointer. The [sqlite3_vfs_register()] +** and [sqlite3_vfs_unregister()] interfaces manage this list +** in a thread-safe way. The [sqlite3_vfs_find()] interface +** searches the list. +** +** The pNext field is the only fields in the sqlite3_vfs +** structure that SQLite will ever modify. SQLite will only access +** or modify this field while holding a particular static mutex. +** The application should never modify anything within the sqlite3_vfs +** object once the object has been registered. +** +** The zName field holds the name of the VFS module. The name must +** be unique across all VFS modules. +** +** {F11141} SQLite will guarantee that the zFilename string passed to +** xOpen() is a full pathname as generated by xFullPathname() and +** that the string will be valid and unchanged until xClose() is +** called. {END} So the [sqlite3_file] can store a pointer to the +** filename if it needs to remember the filename for some reason. +** +** {F11142} The flags argument to xOpen() includes all bits set in +** the flags argument to [sqlite3_open_v2()]. Or if [sqlite3_open()] +** or [sqlite3_open16()] is used, then flags includes at least +** [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]. {END} +** If xOpen() opens a file read-only then it sets *pOutFlags to +** include [SQLITE_OPEN_READONLY]. Other bits in *pOutFlags may be +** set. +** +** {F11143} SQLite will also add one of the following flags to the xOpen() +** call, depending on the object being opened: +** +**
    +**
  • [SQLITE_OPEN_MAIN_DB] +**
  • [SQLITE_OPEN_MAIN_JOURNAL] +**
  • [SQLITE_OPEN_TEMP_DB] +**
  • [SQLITE_OPEN_TEMP_JOURNAL] +**
  • [SQLITE_OPEN_TRANSIENT_DB] +**
  • [SQLITE_OPEN_SUBJOURNAL] +**
  • [SQLITE_OPEN_MASTER_JOURNAL] +**
{END} +** +** The file I/O implementation can use the object type flags to +** changes the way it deals with files. For example, an application +** that does not care about crash recovery or rollback, might make +** the open of a journal file a no-op. Writes to this journal are +** also a no-op. Any attempt to read the journal return SQLITE_IOERR. +** Or the implementation might recognize the a database file will +** be doing page-aligned sector reads and writes in a random order +** and set up its I/O subsystem accordingly. +** +** {F11144} SQLite might also add one of the following flags to the xOpen +** method: +** +**
    +**
  • [SQLITE_OPEN_DELETEONCLOSE] +**
  • [SQLITE_OPEN_EXCLUSIVE] +**
+** +** {F11145} The [SQLITE_OPEN_DELETEONCLOSE] flag means the file should be +** deleted when it is closed. {F11146} The [SQLITE_OPEN_DELETEONCLOSE] +** will be set for TEMP databases, journals and for subjournals. +** {F11147} The [SQLITE_OPEN_EXCLUSIVE] flag means the file should be opened +** for exclusive access. This flag is set for all files except +** for the main database file. {END} +** +** {F11148} At least szOsFile bytes of memory is allocated by SQLite +** to hold the [sqlite3_file] structure passed as the third +** argument to xOpen. {END} The xOpen method does not have to +** allocate the structure; it should just fill it in. +** +** {F11149} The flags argument to xAccess() may be [SQLITE_ACCESS_EXISTS] +** to test for the existance of a file, +** or [SQLITE_ACCESS_READWRITE] to test to see +** if a file is readable and writable, or [SQLITE_ACCESS_READ] +** to test to see if a file is at least readable. {END} The file can be a +** directory. +** +** {F11150} SQLite will always allocate at least mxPathname+1 byte for +** the output buffers for xGetTempname and xFullPathname. {F11151} The exact +** size of the output buffer is also passed as a parameter to both +** methods. {END} If the output buffer is not large enough, SQLITE_CANTOPEN +** should be returned. As this is handled as a fatal error by SQLite, +** vfs implementations should endeavor to prevent this by setting +** mxPathname to a sufficiently large value. +** +** The xRandomness(), xSleep(), and xCurrentTime() interfaces +** are not strictly a part of the filesystem, but they are +** included in the VFS structure for completeness. +** The xRandomness() function attempts to return nBytes bytes +** of good-quality randomness into zOut. The return value is +** the actual number of bytes of randomness obtained. The +** xSleep() method cause the calling thread to sleep for at +** least the number of microseconds given. The xCurrentTime() +** method returns a Julian Day Number for the current date and +** time. +*/ +typedef struct sqlite3_vfs sqlite3_vfs; +struct sqlite3_vfs { + int iVersion; /* Structure version number */ + int szOsFile; /* Size of subclassed sqlite3_file */ + int mxPathname; /* Maximum file pathname length */ + sqlite3_vfs *pNext; /* Next registered VFS */ + const char *zName; /* Name of this virtual file system */ + void *pAppData; /* Pointer to application-specific data */ +/* int (*xOpen)(sqlite3_vfs*, const char *zName, sqlite3_file*, + int flags, int *pOutFlags); + int (*xDelete)(sqlite3_vfs*, const char *zName, int syncDir); + int (*xAccess)(sqlite3_vfs*, const char *zName, int flags); + int (*xGetTempname)(sqlite3_vfs*, int nOut, char *zOut); + int (*xFullPathname)(sqlite3_vfs*, const char *zName, int nOut, char *zOut); + void *(*xDlOpen)(sqlite3_vfs*, const char *zFilename); + void (*xDlError)(sqlite3_vfs*, int nByte, char *zErrMsg); + void *(*xDlSym)(sqlite3_vfs*,void*, const char *zSymbol); + void (*xDlClose)(sqlite3_vfs*, void*); + int (*xRandomness)(sqlite3_vfs*, int nByte, char *zOut); + int (*xSleep)(sqlite3_vfs*, int microseconds); + int (*xCurrentTime)(sqlite3_vfs*, double*);*/ + /* New fields may be appended in figure versions. The iVersion + ** value will increment whenever this happens. */ +}; + +/* +** CAPI3REF: Flags for the xAccess VFS method {F11190} +** +** {F11191} These integer constants can be used as the third parameter to +** the xAccess method of an [sqlite3_vfs] object. {END} They determine +** the kind of what kind of permissions the xAccess method is +** looking for. {F11192} With SQLITE_ACCESS_EXISTS, the xAccess method +** simply checks to see if the file exists. {F11193} With +** SQLITE_ACCESS_READWRITE, the xAccess method checks to see +** if the file is both readable and writable. {F11194} With +** SQLITE_ACCESS_READ the xAccess method +** checks to see if the file is readable. +*/ +#define SQLITE_ACCESS_EXISTS 0 +#define SQLITE_ACCESS_READWRITE 1 +#define SQLITE_ACCESS_READ 2 + +/* +** CAPI3REF: Enable Or Disable Extended Result Codes {F12200} +** +** {F12201} The sqlite3_extended_result_codes() routine enables or disables the +** [SQLITE_IOERR_READ | extended result codes] feature on a database +** connection if its 2nd parameter is +** non-zero or zero, respectively. {F12202} +** By default, SQLite API routines return one of only 26 integer +** [SQLITE_OK | result codes]. {F12203} When extended result codes +** are enabled by this routine, the repetoire of result codes can be +** much larger and can (hopefully) provide more detailed information +** about the cause of an error. +** +** {F12204} The second argument is a boolean value that turns extended result +** codes on and off. {F12205} Extended result codes are off by default for +** backwards compatibility with older versions of SQLite. +*/ +/*IMPORT_C*/ int sqlite3_extended_result_codes(sqlite3*, int onoff); + +/* +** CAPI3REF: Last Insert Rowid {F12220} +** +** {F12221} Each entry in an SQLite table has a unique 64-bit signed +** integer key called the "rowid". {F12222} The rowid is always available +** as an undeclared column named ROWID, OID, or _ROWID_ as long as those +** names are not also used by explicitly declared columns. {F12223} If +** the table has a column of type INTEGER PRIMARY KEY then that column +** is another an alias for the rowid. +** +** {F12224} This routine returns the rowid of the most recent +** successful INSERT into the database from the database connection +** shown in the first argument. {F12225} If no successful inserts +** have ever occurred on this database connection, zero is returned. +** +** {F12226} If an INSERT occurs within a trigger, then the rowid of the +** inserted row is returned by this routine as long as the trigger +** is running. {F12227} But once the trigger terminates, the value returned +** by this routine reverts to the last value inserted before the +** trigger fired. +** +** {F12228} An INSERT that fails due to a constraint violation is not a +** successful insert and does not change the value returned by this +** routine. {F12229} Thus INSERT OR FAIL, INSERT OR IGNORE, INSERT OR ROLLBACK, +** and INSERT OR ABORT make no changes to the return value of this +** routine when their insertion fails. {F12231} When INSERT OR REPLACE +** encounters a constraint violation, it does not fail. The +** INSERT continues to completion after deleting rows that caused +** the constraint problem so INSERT OR REPLACE will always change +** the return value of this interface. +** +** {UF12232} If another thread does a new insert on the same database connection +** while this routine is running and thus changes the last insert rowid, +** then the return value of this routine is undefined. +*/ +/*IMPORT_C*/ sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*); + +/* +** CAPI3REF: Count The Number Of Rows Modified {F12240} +** +** {F12241} This function returns the number of database rows that were changed +** or inserted or deleted by the most recently completed SQL statement +** on the connection specified by the first parameter. {F12242} Only +** changes that are directly specified by the INSERT, UPDATE, or +** DELETE statement are counted. Auxiliary changes caused by +** triggers are not counted. {F12243} Use the [sqlite3_total_changes()] function +** to find the total number of changes including changes caused by triggers. +** +** {F12244} Within the body of a trigger, the sqlite3_changes() interface +** can be called to find the number of +** changes in the most recently completed INSERT, UPDATE, or DELETE +** statement within the body of the same trigger. +** +** {F12245} All changes are counted, even if they are later undone by a +** ROLLBACK or ABORT. {F12246} Except, changes associated with creating and +** dropping tables are not counted. +** +** {F12247} If a callback invokes [sqlite3_exec()] or [sqlite3_step()] +** recursively, then the changes in the inner, recursive call are +** counted together with the changes in the outer call. +** +** {F12248} SQLite implements the command "DELETE FROM table" without +** a WHERE clause by dropping and recreating the table. (This is much +** faster than going through and deleting individual elements from the +** table.) Because of this optimization, the change count for +** "DELETE FROM table" will be zero regardless of the number of elements +** that were originally in the table. {F12251} To get an accurate count +** of the number of rows deleted, use +** "DELETE FROM table WHERE 1" instead. +** +** {UF12252} If another thread makes changes on the same database connection +** while this routine is running then the return value of this routine +** is undefined. +*/ +/*IMPORT_C*/ int sqlite3_changes(sqlite3*); + +/* +** CAPI3REF: Total Number Of Rows Modified {F12260} +*** +** {F12261} This function returns the number of database rows that have been +** modified by INSERT, UPDATE or DELETE statements since the database handle +** was opened. {F12262} The count includes UPDATE, INSERT and DELETE +** statements executed as part of trigger programs. {F12263} All changes +** are counted as soon as the statement that makes them is completed +** (when the statement handle is passed to [sqlite3_reset()] or +** [sqlite3_finalize()]). {END} +** +** See also the [sqlite3_change()] interface. +** +** {F12265} SQLite implements the command "DELETE FROM table" without +** a WHERE clause by dropping and recreating the table. (This is much +** faster than going +** through and deleting individual elements form the table.) Because of +** this optimization, the change count for "DELETE FROM table" will be +** zero regardless of the number of elements that were originally in the +** table. To get an accurate count of the number of rows deleted, use +** "DELETE FROM table WHERE 1" instead. +** +** {U12264} If another thread makes changes on the same database connection +** while this routine is running then the return value of this routine +** is undefined. {END} +*/ +/*IMPORT_C*/ int sqlite3_total_changes(sqlite3*); + +/* +** CAPI3REF: Interrupt A Long-Running Query {F12270} +** +** {F12271} This function causes any pending database operation to abort and +** return at its earliest opportunity. {END} This routine is typically +** called in response to a user action such as pressing "Cancel" +** or Ctrl-C where the user wants a long query operation to halt +** immediately. +** +** {F12272} It is safe to call this routine from a thread different from the +** thread that is currently running the database operation. {U12273} But it +** is not safe to call this routine with a database connection that +** is closed or might close before sqlite3_interrupt() returns. +** +** If an SQL is very nearly finished at the time when sqlite3_interrupt() +** is called, then it might not have an opportunity to be interrupted. +** It might continue to completion. +** {F12274} The SQL operation that is interrupted will return +** [SQLITE_INTERRUPT]. {F12275} If the interrupted SQL operation is an +** INSERT, UPDATE, or DELETE that is inside an explicit transaction, +** then the entire transaction will be rolled back automatically. +** {F12276} A call to sqlite3_interrupt() has no effect on SQL statements +** that are started after sqlite3_interrupt() returns. +*/ +/*IMPORT_C*/ void sqlite3_interrupt(sqlite3*); + +/* +** CAPI3REF: Determine If An SQL Statement Is Complete {F10510} +** +** These routines are useful for command-line input to determine if the +** currently entered text seems to form complete a SQL statement or +** if additional input is needed before sending the text into +** SQLite for parsing. These routines return true if the input string +** appears to be a complete SQL statement. A statement is judged to be +** complete if it ends with a semicolon and is not a fragment of a +** CREATE TRIGGER statement. These routines do not parse the SQL and +** so will not detect syntactically incorrect SQL. +** +** {F10511} These functions return true if the given input string +** ends with a semicolon optionally followed by whitespace or +** comments. {F10512} For sqlite3_complete(), +** the parameter must be a zero-terminated UTF-8 string. {F10513} For +** sqlite3_complete16(), a zero-terminated machine byte order UTF-16 string +** is required. {F10514} These routines return false if the terminal +** semicolon is within a comment, a string literal or a quoted identifier +** (in other words if the final semicolon is not really a separate token +** but part of a larger token) or if the final semicolon is +** in between the BEGIN and END keywords of a CREATE TRIGGER statement. +** {END} +*/ +/*IMPORT_C*/ int sqlite3_complete(const char *sql); +/*IMPORT_C*/ int sqlite3_complete16(const void *sql); + +/* +** CAPI3REF: Register A Callback To Handle SQLITE_BUSY Errors {F12310} +** +** {F12311} This routine identifies a callback function that might be +** invoked whenever an attempt is made to open a database table +** that another thread or process has locked. +** {F12312} If the busy callback is NULL, then [SQLITE_BUSY] +** or [SQLITE_IOERR_BLOCKED] +** is returned immediately upon encountering the lock. +** {F12313} If the busy callback is not NULL, then the +** callback will be invoked with two arguments. {F12314} The +** first argument to the handler is a copy of the void* pointer which +** is the third argument to this routine. {F12315} The second argument to +** the handler is the number of times that the busy handler has +** been invoked for this locking event. {F12316} If the +** busy callback returns 0, then no additional attempts are made to +** access the database and [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED] is returned. +** {F12317} If the callback returns non-zero, then another attempt +** is made to open the database for reading and the cycle repeats. +** +** The presence of a busy handler does not guarantee that +** it will be invoked when there is lock contention. {F12319} +** If SQLite determines that invoking the busy handler could result in +** a deadlock, it will go ahead and return [SQLITE_BUSY] or +** [SQLITE_IOERR_BLOCKED] instead of invoking the +** busy handler. {END} +** Consider a scenario where one process is holding a read lock that +** it is trying to promote to a reserved lock and +** a second process is holding a reserved lock that it is trying +** to promote to an exclusive lock. The first process cannot proceed +** because it is blocked by the second and the second process cannot +** proceed because it is blocked by the first. If both processes +** invoke the busy handlers, neither will make any progress. Therefore, +** SQLite returns [SQLITE_BUSY] for the first process, hoping that this +** will induce the first process to release its read lock and allow +** the second process to proceed. +** +** {F12321} The default busy callback is NULL. {END} +** +** {F12322} The [SQLITE_BUSY] error is converted to [SQLITE_IOERR_BLOCKED] +** when SQLite is in the middle of a large transaction where all the +** changes will not fit into the in-memory cache. {F12323} SQLite will +** already hold a RESERVED lock on the database file, but it needs +** to promote this lock to EXCLUSIVE so that it can spill cache +** pages into the database file without harm to concurrent +** readers. {F12324} If it is unable to promote the lock, then the in-memory +** cache will be left in an inconsistent state and so the error +** code is promoted from the relatively benign [SQLITE_BUSY] to +** the more severe [SQLITE_IOERR_BLOCKED]. {F12325} This error code promotion +** forces an automatic rollback of the changes. {END} See the +** +** CorruptionFollowingBusyError wiki page for a discussion of why +** this is important. +** +** {F12326} Sqlite is re-entrant, so the busy handler may start a new +** query. {END} (It is not clear why anyone would every want to do this, +** but it is allowed, in theory.) {U12327} But the busy handler may not +** close the database. Closing the database from a busy handler will delete +** data structures out from under the executing query and will +** probably result in a segmentation fault or other runtime error. {END} +** +** {F12328} There can only be a single busy handler defined for each database +** connection. Setting a new busy handler clears any previous one. +** {F12329} Note that calling [sqlite3_busy_timeout()] will also set or clear +** the busy handler. +** +** {F12331} When operating in [sqlite3_enable_shared_cache | shared cache mode], +** only a single busy handler can be defined for each database file. +** So if two database connections share a single cache, then changing +** the busy handler on one connection will also change the busy +** handler in the other connection. {F12332} The busy handler is invoked +** in the thread that was running when the lock contention occurs. +*/ +/*IMPORT_C*/ int sqlite3_busy_handler(sqlite3*, int(*)(void*,int), void*); + +/* +** CAPI3REF: Set A Busy Timeout {F12340} +** +** {F12341} This routine sets a [sqlite3_busy_handler | busy handler] +** that sleeps for a while when a +** table is locked. {F12342} The handler will sleep multiple times until +** at least "ms" milliseconds of sleeping have been done. {F12343} After +** "ms" milliseconds of sleeping, the handler returns 0 which +** causes [sqlite3_step()] to return [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED]. +** +** {F12344} Calling this routine with an argument less than or equal to zero +** turns off all busy handlers. +** +** {F12345} There can only be a single busy handler for a particular database +** connection. If another busy handler was defined +** (using [sqlite3_busy_handler()]) prior to calling +** this routine, that other busy handler is cleared. +*/ +/*IMPORT_C*/ int sqlite3_busy_timeout(sqlite3*, int ms); + +/* +** CAPI3REF: Convenience Routines For Running Queries {F12370} +** +** This next routine is a convenience wrapper around [sqlite3_exec()]. +** {F12371} Instead of invoking a user-supplied callback for each row of the +** result, this routine remembers each row of the result in memory +** obtained from [sqlite3_malloc()], then returns all of the result after the +** query has finished. {F12372} +** +** As an example, suppose the query result where this table: +** +**
+**        Name        | Age
+**        -----------------------
+**        Alice       | 43
+**        Bob         | 28
+**        Cindy       | 21
+** 
+** +** If the 3rd argument were &azResult then after the function returns +** azResult will contain the following data: +** +**
+**        azResult[0] = "Name";
+**        azResult[1] = "Age";
+**        azResult[2] = "Alice";
+**        azResult[3] = "43";
+**        azResult[4] = "Bob";
+**        azResult[5] = "28";
+**        azResult[6] = "Cindy";
+**        azResult[7] = "21";
+** 
+** +** Notice that there is an extra row of data containing the column +** headers. But the *nrow return value is still 3. *ncolumn is +** set to 2. In general, the number of values inserted into azResult +** will be ((*nrow) + 1)*(*ncolumn). +** +** {U12374} After the calling function has finished using the result, it should +** pass the result data pointer to sqlite3_free_table() in order to +** release the memory that was malloc-ed. Because of the way the +** [sqlite3_malloc()] happens, the calling function must not try to call +** [sqlite3_free()] directly. Only [sqlite3_free_table()] is able to release +** the memory properly and safely. {END} +** +** {F12373} The return value of this routine is the same as +** from [sqlite3_exec()]. +*/ +/*IMPORT_C*/ int sqlite3_get_table( + sqlite3*, /* An open database */ + const char *sql, /* SQL to be executed */ + char ***resultp, /* Result written to a char *[] that this points to */ + int *nrow, /* Number of result rows written here */ + int *ncolumn, /* Number of result columns written here */ + char **errmsg /* Error msg written here */ +); +/*IMPORT_C*/ void sqlite3_free_table(char **result); + +/* +** CAPI3REF: Formatted String Printing Functions {F17400} +** +** These routines are workalikes of the "printf()" family of functions +** from the standard C library. +** +** {F17401} The sqlite3_mprintf() and sqlite3_vmprintf() routines write their +** results into memory obtained from [sqlite3_malloc()]. +** {U17402} The strings returned by these two routines should be +** released by [sqlite3_free()]. {F17403} Both routines return a +** NULL pointer if [sqlite3_malloc()] is unable to allocate enough +** memory to hold the resulting string. +** +** {F17404} In sqlite3_snprintf() routine is similar to "snprintf()" from +** the standard C library. The result is written into the +** buffer supplied as the second parameter whose size is given by +** the first parameter. {END} Note that the order of the +** first two parameters is reversed from snprintf(). This is an +** historical accident that cannot be fixed without breaking +** backwards compatibility. {F17405} Note also that sqlite3_snprintf() +** returns a pointer to its buffer instead of the number of +** characters actually written into the buffer. {END} We admit that +** the number of characters written would be a more useful return +** value but we cannot change the implementation of sqlite3_snprintf() +** now without breaking compatibility. +** +** {F17406} As long as the buffer size is greater than zero, sqlite3_snprintf() +** guarantees that the buffer is always zero-terminated. {F17407} The first +** parameter "n" is the total size of the buffer, including space for +** the zero terminator. {END} So the longest string that can be completely +** written will be n-1 characters. +** +** These routines all implement some additional formatting +** options that are useful for constructing SQL statements. +** All of the usual printf formatting options apply. In addition, there +** is are "%q", "%Q", and "%z" options. +** +** {F17410} The %q option works like %s in that it substitutes a null-terminated +** string from the argument list. But %q also doubles every '\'' character. +** %q is designed for use inside a string literal. {END} By doubling each '\'' +** character it escapes that character and allows it to be inserted into +** the string. +** +** For example, so some string variable contains text as follows: +** +**
+**  char *zText = "It's a happy day!";
+** 
+** +** One can use this text in an SQL statement as follows: +** +**
+**  char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES('%q')", zText);
+**  sqlite3_exec(db, zSQL, 0, 0, 0);
+**  sqlite3_free(zSQL);
+** 
+** +** Because the %q format string is used, the '\'' character in zText +** is escaped and the SQL generated is as follows: +** +**
+**  INSERT INTO table1 VALUES('It''s a happy day!')
+** 
+** +** This is correct. Had we used %s instead of %q, the generated SQL +** would have looked like this: +** +**
+**  INSERT INTO table1 VALUES('It's a happy day!');
+** 
+** +** This second example is an SQL syntax error. As a general rule you +** should always use %q instead of %s when inserting text into a string +** literal. +** +** {F17411} The %Q option works like %q except it also adds single quotes around +** the outside of the total string. Or if the parameter in the argument +** list is a NULL pointer, %Q substitutes the text "NULL" (without single +** quotes) in place of the %Q option. {END} So, for example, one could say: +** +**
+**  char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES(%Q)", zText);
+**  sqlite3_exec(db, zSQL, 0, 0, 0);
+**  sqlite3_free(zSQL);
+** 
+** +** The code above will render a correct SQL statement in the zSQL +** variable even if the zText variable is a NULL pointer. +** +** {F17412} The "%z" formatting option works exactly like "%s" with the +** addition that after the string has been read and copied into +** the result, [sqlite3_free()] is called on the input string. {END} +*/ +/*IMPORT_C*/ char *sqlite3_mprintf(const char*,...); +/*IMPORT_C*/ char *sqlite3_snprintf(int,char*,const char*, ...); + +/* +** CAPI3REF: Memory Allocation Subsystem {F17300} +** +** {F17301} The SQLite core uses these three routines for all of its own +** internal memory allocation needs. {END} "Core" in the previous sentence +** does not include operating-system specific VFS implementation. The +** windows VFS uses native malloc and free for some operations. +** +** {F17302} The sqlite3_malloc() routine returns a pointer to a block +** of memory at least N bytes in length, where N is the parameter. +** {F17303} If sqlite3_malloc() is unable to obtain sufficient free +** memory, it returns a NULL pointer. {F17304} If the parameter N to +** sqlite3_malloc() is zero or negative then sqlite3_malloc() returns +** a NULL pointer. +** +** {F17305} Calling sqlite3_free() with a pointer previously returned +** by sqlite3_malloc() or sqlite3_realloc() releases that memory so +** that it might be reused. {F17306} The sqlite3_free() routine is +** a no-op if is called with a NULL pointer. Passing a NULL pointer +** to sqlite3_free() is harmless. {U17307} After being freed, memory +** should neither be read nor written. Even reading previously freed +** memory might result in a segmentation fault or other severe error. +** {U17309} Memory corruption, a segmentation fault, or other severe error +** might result if sqlite3_free() is called with a non-NULL pointer that +** was not obtained from sqlite3_malloc() or sqlite3_free(). +** +** {F17310} The sqlite3_realloc() interface attempts to resize a +** prior memory allocation to be at least N bytes, where N is the +** second parameter. The memory allocation to be resized is the first +** parameter. {F17311} If the first parameter to sqlite3_realloc() +** is a NULL pointer then its behavior is identical to calling +** sqlite3_malloc(N) where N is the second parameter to sqlite3_realloc(). +** {F17312} If the second parameter to sqlite3_realloc() is zero or +** negative then the behavior is exactly the same as calling +** sqlite3_free(P) where P is the first parameter to sqlite3_realloc(). +** {F17313} Sqlite3_realloc() returns a pointer to a memory allocation +** of at least N bytes in size or NULL if sufficient memory is unavailable. +** {F17314} If M is the size of the prior allocation, then min(N,M) bytes +** of the prior allocation are copied into the beginning of buffer returned +** by sqlite3_realloc() and the prior allocation is freed. +** {F17315} If sqlite3_realloc() returns NULL, then the prior allocation +** is not freed. +** +** {F17316} The memory returned by sqlite3_malloc() and sqlite3_realloc() +** is always aligned to at least an 8 byte boundary. {END} +** +** {F17381} The default implementation +** of the memory allocation subsystem uses the malloc(), realloc() +** and free() provided by the standard C library. {F17382} However, if +** SQLite is compiled with the following C preprocessor macro +** +**
SQLITE_MEMORY_SIZE=NNN
+** +** where NNN is an integer, then SQLite create a static +** array of at least NNN bytes in size and use that array +** for all of its dynamic memory allocation needs. {END} Additional +** memory allocator options may be added in future releases. +** +** In SQLite version 3.5.0 and 3.5.1, it was possible to define +** the SQLITE_OMIT_MEMORY_ALLOCATION which would cause the built-in +** implementation of these routines to be omitted. That capability +** is no longer provided. Only built-in memory allocators can be +** used. +** +** The windows OS interface layer calls +** the system malloc() and free() directly when converting +** filenames between the UTF-8 encoding used by SQLite +** and whatever filename encoding is used by the particular windows +** installation. Memory allocation errors are detected, but +** they are reported back as [SQLITE_CANTOPEN] or +** [SQLITE_IOERR] rather than [SQLITE_NOMEM]. +*/ +/*IMPORT_C*/ void *sqlite3_malloc(int); +/*IMPORT_C*/ void *sqlite3_realloc(void*, int); +/*IMPORT_C*/ void sqlite3_free(void*); + +/* +** CAPI3REF: Memory Allocator Statistics {F17370} +** +** In addition to the basic three allocation routines +** [sqlite3_malloc()], [sqlite3_free()], and [sqlite3_realloc()], +** the memory allocation subsystem included with the SQLite +** sources provides the interfaces shown here. +** +** {F17371} The sqlite3_memory_used() routine returns the +** number of bytes of memory currently outstanding (malloced but not freed). +** {F17372} The value returned by sqlite3_memory_used() includes +** any overhead added by SQLite, but not overhead added by the +** library malloc() that backs the sqlite3_malloc() implementation. +** {F17373} The sqlite3_memory_highwater() routines returns the +** maximum number of bytes that have been outstanding at any time +** since the highwater mark was last reset. +** {F17374} The byte count returned by sqlite3_memory_highwater() +** uses the same byte counting rules as sqlite3_memory_used(). {END} +** In other words, overhead added internally by SQLite is counted, +** but overhead from the underlying system malloc is not. +** {F17375} If the parameter to sqlite3_memory_highwater() is true, +** then the highwater mark is reset to the current value of +** sqlite3_memory_used() and the prior highwater mark (before the +** reset) is returned. {F17376} If the parameter to +** sqlite3_memory_highwater() is zero, then the highwater mark is +** unchanged. +*/ +/*IMPORT_C*/ sqlite3_int64 sqlite3_memory_used(void); +/*IMPORT_C*/ sqlite3_int64 sqlite3_memory_highwater(int resetFlag); + +/* +** CAPI3REF: Compile-Time Authorization Callbacks {F12500} +** +** {F12501} This routine registers a authorizer callback with a particular +** database connection, supplied in the first argument. {F12502} +** The authorizer callback is invoked as SQL statements are being compiled +** by [sqlite3_prepare()] or its variants [sqlite3_prepare_v2()], +** [sqlite3_prepare16()] and [sqlite3_prepare16_v2()]. {F12503} At various +** points during the compilation process, as logic is being created +** to perform various actions, the authorizer callback is invoked to +** see if those actions are allowed. The authorizer callback should +** return SQLITE_OK to allow the action, [SQLITE_IGNORE] to disallow the +** specific action but allow the SQL statement to continue to be +** compiled, or [SQLITE_DENY] to cause the entire SQL statement to be +** rejected with an error. {F12504} If the authorizer callback returns +** any value other than [SQLITE_IGNORE], [SQLITE_OK], or [SQLITE_DENY] +** then [sqlite3_prepare_v2()] or equivalent call that triggered +** the authorizer shall +** fail with an SQLITE_ERROR error code and an appropriate error message. {END} +** +** When the callback returns [SQLITE_OK], that means the operation +** requested is ok. {F12505} When the callback returns [SQLITE_DENY], the +** [sqlite3_prepare_v2()] or equivalent call that triggered the +** authorizer shall fail +** with an SQLITE_ERROR error code and an error message explaining that +** access is denied. {F12506} If the authorizer code (the 2nd parameter +** to the authorizer callback is anything other than [SQLITE_READ], then +** a return of [SQLITE_IGNORE] has the same effect as [SQLITE_DENY]. +** If the authorizer code is [SQLITE_READ] and the callback returns +** [SQLITE_IGNORE] then the prepared statement is constructed to +** insert a NULL value in place of the table column that would have +** been read if [SQLITE_OK] had been returned. {END} +** +** {F12510} The first parameter to the authorizer callback is a copy of +** the third parameter to the sqlite3_set_authorizer() interface. +** {F12511} The second parameter to the callback is an integer +** [SQLITE_COPY | action code] that specifies the particular action +** to be authorized. {END} The available action codes are +** [SQLITE_COPY | documented separately]. {F12512} The third through sixth +** parameters to the callback are zero-terminated strings that contain +** additional details about the action to be authorized. {END} +** +** An authorizer is used when preparing SQL statements from an untrusted +** source, to ensure that the SQL statements do not try to access data +** that they are not allowed to see, or that they do not try to +** execute malicious statements that damage the database. For +** example, an application may allow a user to enter arbitrary +** SQL queries for evaluation by a database. But the application does +** not want the user to be able to make arbitrary changes to the +** database. An authorizer could then be put in place while the +** user-entered SQL is being prepared that disallows everything +** except SELECT statements. +** +** {F12520} Only a single authorizer can be in place on a database connection +** at a time. Each call to sqlite3_set_authorizer overrides the +** previous call. {F12521} A NULL authorizer means that no authorization +** callback is invoked. {F12522} The default authorizer is NULL. {END} +** +** Note that the authorizer callback is invoked only during +** [sqlite3_prepare()] or its variants. {F12523} Authorization is not +** performed during statement evaluation in [sqlite3_step()]. {END} +*/ +/*IMPORT_C*/ int sqlite3_set_authorizer( + sqlite3*, + int (*xAuth)(void*,int,const char*,const char*,const char*,const char*), + void *pUserData +); + +/* +** CAPI3REF: Authorizer Return Codes {F12590} +** +** The [sqlite3_set_authorizer | authorizer callback function] must +** return either [SQLITE_OK] or one of these two constants in order +** to signal SQLite whether or not the action is permitted. See the +** [sqlite3_set_authorizer | authorizer documentation] for additional +** information. +*/ +#define SQLITE_DENY 1 /* Abort the SQL statement with an error */ +#define SQLITE_IGNORE 2 /* Don't allow access, but don't generate an error */ + +/* +** CAPI3REF: Authorizer Action Codes {F12550} +** +** The [sqlite3_set_authorizer()] interface registers a callback function +** that is invoked to authorizer certain SQL statement actions. {F12551} The +** second parameter to the callback is an integer code that specifies +** what action is being authorized. These are the integer action codes that +** the authorizer callback may be passed. {END} +** +** These action code values signify what kind of operation is to be +** authorized. {F12552} The 3rd and 4th parameters to the authorization +** callback function will be parameters or NULL depending on which of these +** codes is used as the second parameter. {F12553} The 5th parameter to the +** authorizer callback is the name of the database ("main", "temp", +** etc.) if applicable. {F12554} The 6th parameter to the authorizer callback +** is the name of the inner-most trigger or view that is responsible for +** the access attempt or NULL if this access attempt is directly from +** top-level SQL code. +*/ +/******************************************* 3rd ************ 4th ***********/ +#define SQLITE_CREATE_INDEX 1 /* Index Name Table Name */ +#define SQLITE_CREATE_TABLE 2 /* Table Name NULL */ +#define SQLITE_CREATE_TEMP_INDEX 3 /* Index Name Table Name */ +#define SQLITE_CREATE_TEMP_TABLE 4 /* Table Name NULL */ +#define SQLITE_CREATE_TEMP_TRIGGER 5 /* Trigger Name Table Name */ +#define SQLITE_CREATE_TEMP_VIEW 6 /* View Name NULL */ +#define SQLITE_CREATE_TRIGGER 7 /* Trigger Name Table Name */ +#define SQLITE_CREATE_VIEW 8 /* View Name NULL */ +#define SQLITE_DELETE 9 /* Table Name NULL */ +#define SQLITE_DROP_INDEX 10 /* Index Name Table Name */ +#define SQLITE_DROP_TABLE 11 /* Table Name NULL */ +#define SQLITE_DROP_TEMP_INDEX 12 /* Index Name Table Name */ +#define SQLITE_DROP_TEMP_TABLE 13 /* Table Name NULL */ +#define SQLITE_DROP_TEMP_TRIGGER 14 /* Trigger Name Table Name */ +#define SQLITE_DROP_TEMP_VIEW 15 /* View Name NULL */ +#define SQLITE_DROP_TRIGGER 16 /* Trigger Name Table Name */ +#define SQLITE_DROP_VIEW 17 /* View Name NULL */ +#define SQLITE_INSERT 18 /* Table Name NULL */ +#define SQLITE_PRAGMA 19 /* Pragma Name 1st arg or NULL */ +#define SQLITE_READ 20 /* Table Name Column Name */ +#define SQLITE_SELECT 21 /* NULL NULL */ +#define SQLITE_TRANSACTION 22 /* NULL NULL */ +#define SQLITE_UPDATE 23 /* Table Name Column Name */ +#define SQLITE_ATTACH 24 /* Filename NULL */ +#define SQLITE_DETACH 25 /* Database Name NULL */ +#define SQLITE_ALTER_TABLE 26 /* Database Name Table Name */ +#define SQLITE_REINDEX 27 /* Index Name NULL */ +#define SQLITE_ANALYZE 28 /* Table Name NULL */ +#define SQLITE_CREATE_VTABLE 29 /* Table Name Module Name */ +#define SQLITE_DROP_VTABLE 30 /* Table Name Module Name */ +#define SQLITE_FUNCTION 31 /* Function Name NULL */ +#define SQLITE_COPY 0 /* No longer used */ + +/* +** CAPI3REF: Tracing And Profiling Functions {F12280} +** +** These routines register callback functions that can be used for +** tracing and profiling the execution of SQL statements. +** +** {F12281} The callback function registered by sqlite3_trace() is invoked +** at the first [sqlite3_step()] for the evaluation of an SQL statement. +** {F12282} Only a single trace callback can be registered at a time. +** Each call to sqlite3_trace() overrides the previous. {F12283} A +** NULL callback for sqlite3_trace() disables tracing. {F12284} The +** first argument to the trace callback is a copy of the pointer which +** was the 3rd argument to sqlite3_trace. {F12285} The second argument +** to the trace callback is a zero-terminated UTF8 string containing +** the original text of the SQL statement as it was passed into +** [sqlite3_prepare_v2()] or the equivalent. {END} Note that the +** host parameter are not expanded in the SQL statement text. +** +** {F12287} The callback function registered by sqlite3_profile() is invoked +** as each SQL statement finishes. {F12288} The first parameter to the +** profile callback is a copy of the 3rd parameter to sqlite3_profile(). +** {F12289} The second parameter to the profile callback is a +** zero-terminated UTF-8 string that contains the complete text of +** the SQL statement as it was processed by [sqlite3_prepare_v2()] or +** the equivalent. {F12290} The third parameter to the profile +** callback is an estimate of the number of nanoseconds of +** wall-clock time required to run the SQL statement from start +** to finish. {END} +** +** The sqlite3_profile() API is currently considered experimental and +** is subject to change. +*/ +/*IMPORT_C*/ void *sqlite3_trace(sqlite3*, void(*xTrace)(void*,const char*), void*); +/*IMPORT_C*/ void *sqlite3_profile(sqlite3*, + void(*xProfile)(void*,const char*,sqlite3_uint64), void*); + +/* +** CAPI3REF: Query Progress Callbacks {F12910} +** +** {F12911} This routine configures a callback function - the +** progress callback - that is invoked periodically during long +** running calls to [sqlite3_exec()], [sqlite3_step()] and +** [sqlite3_get_table()]. {END} An example use for this +** interface is to keep a GUI updated during a large query. +** +** {F12912} The progress callback is invoked once for every N virtual +** machine opcodes, where N is the second argument to this function. +** {F12913} The progress callback itself is identified by the third +** argument to this function. {F12914} The fourth argument to this +** function is a void pointer passed to the progress callback +** function each time it is invoked. {END} +** +** {F12915} If a call to [sqlite3_exec()], [sqlite3_step()], or +** [sqlite3_get_table()] results in fewer than N opcodes being executed, +** then the progress callback is never invoked. {END} +** +** {F12916} Only a single progress callback function may be registered for each +** open database connection. Every call to sqlite3_progress_handler() +** overwrites the results of the previous call. {F12917} +** To remove the progress callback altogether, pass NULL as the third +** argument to this function. {END} +** +** {F12918} If the progress callback returns a result other than 0, then +** the current query is immediately terminated and any database changes +** rolled back. {F12919} +** The containing [sqlite3_exec()], [sqlite3_step()], or +** [sqlite3_get_table()] call returns SQLITE_INTERRUPT. {END} This feature +** can be used, for example, to implement the "Cancel" button on a +** progress dialog box in a GUI. +*/ +/*IMPORT_C*/ void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); + +/* +** CAPI3REF: Opening A New Database Connection {F12700} +** +** {F12701} These routines open an SQLite database file whose name +** is given by the filename argument. +** {F12702} The filename argument is interpreted as UTF-8 +** for [sqlite3_open()] and [sqlite3_open_v2()] and as UTF-16 +** in the native byte order for [sqlite3_open16()]. +** {F12703} An [sqlite3*] handle is returned in *ppDb, even +** if an error occurs. {F12723} (Exception: if SQLite is unable +** to allocate memory to hold the [sqlite3] object, a NULL will +** be written into *ppDb instead of a pointer to the [sqlite3] object.) +** {F12704} If the database is opened (and/or created) +** successfully, then [SQLITE_OK] is returned. {F12705} Otherwise an +** error code is returned. {F12706} The +** [sqlite3_errmsg()] or [sqlite3_errmsg16()] routines can be used to obtain +** an English language description of the error. +** +** {F12707} The default encoding for the database will be UTF-8 if +** [sqlite3_open()] or [sqlite3_open_v2()] is called and +** UTF-16 in the native byte order if [sqlite3_open16()] is used. +** +** {F12708} Whether or not an error occurs when it is opened, resources +** associated with the [sqlite3*] handle should be released by passing it +** to [sqlite3_close()] when it is no longer required. +** +** {F12709} The [sqlite3_open_v2()] interface works like [sqlite3_open()] +** except that it acccepts two additional parameters for additional control +** over the new database connection. {F12710} The flags parameter can be +** one of: +** +**
    +**
  1. [SQLITE_OPEN_READONLY] +**
  2. [SQLITE_OPEN_READWRITE] +**
  3. [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE] +**
+** +** {F12711} The first value opens the database read-only. +** {F12712} If the database does not previously exist, an error is returned. +** {F12713} The second option opens +** the database for reading and writing if possible, or reading only if +** if the file is write protected. {F12714} In either case the database +** must already exist or an error is returned. {F12715} The third option +** opens the database for reading and writing and creates it if it does +** not already exist. {F12716} +** The third options is behavior that is always used for [sqlite3_open()] +** and [sqlite3_open16()]. +** +** {F12717} If the filename is ":memory:", then an private +** in-memory database is created for the connection. {F12718} This in-memory +** database will vanish when the database connection is closed. {END} Future +** version of SQLite might make use of additional special filenames +** that begin with the ":" character. It is recommended that +** when a database filename really does begin with +** ":" that you prefix the filename with a pathname like "./" to +** avoid ambiguity. +** +** {F12719} If the filename is an empty string, then a private temporary +** on-disk database will be created. {F12720} This private database will be +** automatically deleted as soon as the database connection is closed. +** +** {F12721} The fourth parameter to sqlite3_open_v2() is the name of the +** [sqlite3_vfs] object that defines the operating system +** interface that the new database connection should use. {F12722} If the +** fourth parameter is a NULL pointer then the default [sqlite3_vfs] +** object is used. {END} +** +** Note to windows users: The encoding used for the filename argument +** of [sqlite3_open()] and [sqlite3_open_v2()] must be UTF-8, not whatever +** codepage is currently defined. Filenames containing international +** characters must be converted to UTF-8 prior to passing them into +** [sqlite3_open()] or [sqlite3_open_v2()]. +*/ +/*IMPORT_C*/ int sqlite3_open( + const char *filename, /* Database filename (UTF-8) */ + sqlite3 **ppDb /* OUT: SQLite db handle */ +); +/*IMPORT_C*/ int sqlite3_open16( + const void *filename, /* Database filename (UTF-16) */ + sqlite3 **ppDb /* OUT: SQLite db handle */ +); +/*IMPORT_C*/ int sqlite3_open_v2( + const char *filename, /* Database filename (UTF-8) */ + sqlite3 **ppDb, /* OUT: SQLite db handle */ + int flags, /* Flags */ + const char *zVfs /* Name of VFS module to use */ +); + +/* +** CAPI3REF: Error Codes And Messages {F12800} +** +** {F12801} The sqlite3_errcode() interface returns the numeric +** [SQLITE_OK | result code] or [SQLITE_IOERR_READ | extended result code] +** for the most recent failed sqlite3_* API call associated +** with [sqlite3] handle 'db'. {U12802} If a prior API call failed but the +** most recent API call succeeded, the return value from sqlite3_errcode() +** is undefined. {END} +** +** {F12803} The sqlite3_errmsg() and sqlite3_errmsg16() return English-language +** text that describes the error, as either UTF8 or UTF16 respectively. +** {F12804} Memory to hold the error message string is managed internally. +** {U12805} The +** string may be overwritten or deallocated by subsequent calls to SQLite +** interface functions. {END} +** +** {F12806} Calls to many sqlite3_* functions set the error code and +** string returned by [sqlite3_errcode()], [sqlite3_errmsg()], and +** [sqlite3_errmsg16()] overwriting the previous values. {F12807} +** Except, calls to [sqlite3_errcode()], +** [sqlite3_errmsg()], and [sqlite3_errmsg16()] themselves do not affect the +** results of future invocations. {F12808} Calls to API routines that +** do not return an error code (example: [sqlite3_data_count()]) do not +** change the error code returned by this routine. {F12809} Interfaces that +** are not associated with a specific database connection (examples: +** [sqlite3_mprintf()] or [sqlite3_enable_shared_cache()] do not change +** the return code. {END} +** +** {F12810} Assuming no other intervening sqlite3_* API calls are made, +** the error code returned by this function is associated with the same +** error as the strings returned by [sqlite3_errmsg()] and [sqlite3_errmsg16()]. +*/ +/*IMPORT_C*/ int sqlite3_errcode(sqlite3 *db); +/*IMPORT_C*/ const char *sqlite3_errmsg(sqlite3*); +/*IMPORT_C*/ const void *sqlite3_errmsg16(sqlite3*); + +/* +** CAPI3REF: SQL Statement Object {F13000} +** +** An instance of this object represent single SQL statements. This +** object is variously known as a "prepared statement" or a +** "compiled SQL statement" or simply as a "statement". +** +** The life of a statement object goes something like this: +** +**
    +**
  1. Create the object using [sqlite3_prepare_v2()] or a related +** function. +**
  2. Bind values to host parameters using +** [sqlite3_bind_blob | sqlite3_bind_* interfaces]. +**
  3. Run the SQL by calling [sqlite3_step()] one or more times. +**
  4. Reset the statement using [sqlite3_reset()] then go back +** to step 2. Do this zero or more times. +**
  5. Destroy the object using [sqlite3_finalize()]. +**
+** +** Refer to documentation on individual methods above for additional +** information. +*/ +typedef struct sqlite3_stmt sqlite3_stmt; + +/* +** CAPI3REF: Compiling An SQL Statement {F13010} +** +** To execute an SQL query, it must first be compiled into a byte-code +** program using one of these routines. +** +** {F13011} The first argument "db" is an [sqlite3 | SQLite database handle] +** obtained from a prior call to [sqlite3_open()], [sqlite3_open_v2()] +** or [sqlite3_open16()]. {F13012} +** The second argument "zSql" is the statement to be compiled, encoded +** as either UTF-8 or UTF-16. The sqlite3_prepare() and sqlite3_prepare_v2() +** interfaces uses UTF-8 and sqlite3_prepare16() and sqlite3_prepare16_v2() +** use UTF-16. {END} +** +** {F13013} If the nByte argument is less +** than zero, then zSql is read up to the first zero terminator. +** {F13014} If nByte is non-negative, then it is the maximum number of +** bytes read from zSql. When nByte is non-negative, the +** zSql string ends at either the first '\000' or '\u0000' character or +** until the nByte-th byte, whichever comes first. {END} +** +** {F13015} *pzTail is made to point to the first byte past the end of the +** first SQL statement in zSql. These routines only compiles the first +** statement in zSql, so *pzTail is left pointing to what remains +** uncompiled. {END} +** +** {F13016} *ppStmt is left pointing to a compiled +** [sqlite3_stmt | SQL statement structure] that can be +** executed using [sqlite3_step()]. Or if there is an error, *ppStmt may be +** set to NULL. {F13017} If the input text contains no SQL (if the input +** is and empty string or a comment) then *ppStmt is set to NULL. +** {U13018} The calling procedure is responsible for deleting the +** compiled SQL statement +** using [sqlite3_finalize()] after it has finished with it. +** +** {F13019} On success, [SQLITE_OK] is returned. Otherwise an +** [SQLITE_ERROR | error code] is returned. {END} +** +** The sqlite3_prepare_v2() and sqlite3_prepare16_v2() interfaces are +** recommended for all new programs. The two older interfaces are retained +** for backwards compatibility, but their use is discouraged. +** {F13020} In the "v2" interfaces, the prepared statement +** that is returned (the [sqlite3_stmt] object) contains a copy of the +** original SQL text. {END} This causes the [sqlite3_step()] interface to +** behave a differently in two ways: +** +**
    +**
  1. {F13022} +** If the database schema changes, instead of returning [SQLITE_SCHEMA] as it +** always used to do, [sqlite3_step()] will automatically recompile the SQL +** statement and try to run it again. {F12023} If the schema has changed in +** a way that makes the statement no longer valid, [sqlite3_step()] will still +** return [SQLITE_SCHEMA]. {END} But unlike the legacy behavior, +** [SQLITE_SCHEMA] is now a fatal error. {F12024} Calling +** [sqlite3_prepare_v2()] again will not make the +** error go away. {F12025} Note: use [sqlite3_errmsg()] to find the text +** of the parsing error that results in an [SQLITE_SCHEMA] return. {END} +**
  2. +** +**
  3. +** {F13030} When an error occurs, +** [sqlite3_step()] will return one of the detailed +** [SQLITE_ERROR | result codes] or +** [SQLITE_IOERR_READ | extended result codes]. {F13031} +** The legacy behavior was that [sqlite3_step()] would only return a generic +** [SQLITE_ERROR] result code and you would have to make a second call to +** [sqlite3_reset()] in order to find the underlying cause of the problem. +** {F13032} +** With the "v2" prepare interfaces, the underlying reason for the error is +** returned immediately. {END} +**
  4. +**
+*/ +/*IMPORT_C*/ int sqlite3_prepare( + sqlite3 *db, /* Database handle */ + const char *zSql, /* SQL statement, UTF-8 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const char **pzTail /* OUT: Pointer to unused portion of zSql */ +); +/*IMPORT_C*/ int sqlite3_prepare_v2( + sqlite3 *db, /* Database handle */ + const char *zSql, /* SQL statement, UTF-8 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const char **pzTail /* OUT: Pointer to unused portion of zSql */ +); +/*IMPORT_C*/ int sqlite3_prepare16( + sqlite3 *db, /* Database handle */ + const void *zSql, /* SQL statement, UTF-16 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const void **pzTail /* OUT: Pointer to unused portion of zSql */ +); +/*IMPORT_C*/ int sqlite3_prepare16_v2( + sqlite3 *db, /* Database handle */ + const void *zSql, /* SQL statement, UTF-16 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const void **pzTail /* OUT: Pointer to unused portion of zSql */ +); + +/* +** CAPIREF: Retrieving Statement SQL {F13100} +** +** {F13101} If the compiled SQL statement passed as an argument was +** compiled using either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()], +** then this function returns a pointer to a zero-terminated string +** containing a copy of the original SQL statement. {F13102} The +** pointer is valid until the statement +** is deleted using sqlite3_finalize(). +** {F13103} The string returned by sqlite3_sql() is always UTF8 even +** if a UTF16 string was originally entered using [sqlite3_prepare16_v2()] +** or the equivalent. +** +** {F13104} If the statement was compiled using either of the legacy +** interfaces [sqlite3_prepare()] or [sqlite3_prepare16()], this +** function returns NULL. +*/ +/*IMPORT_C*/ const char *sqlite3_sql(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Dynamically Typed Value Object {F15000} +** +** {F15001} SQLite uses the sqlite3_value object to represent all values +** that are or can be stored in a database table. {END} +** SQLite uses dynamic typing for the values it stores. +** {F15002} Values stored in sqlite3_value objects can be +** be integers, floating point values, strings, BLOBs, or NULL. +*/ +typedef struct Mem sqlite3_value; + +/* +** CAPI3REF: SQL Function Context Object {F16001} +** +** The context in which an SQL function executes is stored in an +** sqlite3_context object. {F16002} A pointer to an sqlite3_context +** object is always first parameter to application-defined SQL functions. +*/ +typedef struct sqlite3_context sqlite3_context; + +/* +** CAPI3REF: Binding Values To Prepared Statements {F13500} +** +** {F13501} In the SQL strings input to [sqlite3_prepare_v2()] and its +** variants, literals may be replace by a parameter in one +** of these forms: +** +**
    +**
  • ? +**
  • ?NNN +**
  • :AAA +**
  • @AAA +**
  • $VVV +**
+** +** In the parameter forms shown above NNN is an integer literal, +** AAA is an alphanumeric identifier and VVV is a variable name according +** to the syntax rules of the TCL programming language. {END} +** The values of these parameters (also called "host parameter names") +** can be set using the sqlite3_bind_*() routines defined here. +** +** {F13502} The first argument to the sqlite3_bind_*() routines always +** is a pointer to the [sqlite3_stmt] object returned from +** [sqlite3_prepare_v2()] or its variants. {F13503} The second +** argument is the index of the parameter to be set. {F13504} The +** first parameter has an index of 1. {F13505} When the same named +** parameter is used more than once, second and subsequent +** occurrences have the same index as the first occurrence. +** {F13506} The index for named parameters can be looked up using the +** [sqlite3_bind_parameter_name()] API if desired. {F13507} The index +** for "?NNN" parameters is the value of NNN. +** {F13508} The NNN value must be between 1 and the compile-time +** parameter SQLITE_MAX_VARIABLE_NUMBER (default value: 999). {END} +** See limits.html for additional information. +** +** {F13509} The third argument is the value to bind to the parameter. {END} +** +** {F13510} In those +** routines that have a fourth argument, its value is the number of bytes +** in the parameter. To be clear: the value is the number of bytes in the +** string, not the number of characters. {F13511} The number +** of bytes does not include the zero-terminator at the end of strings. +** {F13512} +** If the fourth parameter is negative, the length of the string is +** number of bytes up to the first zero terminator. {END} +** +** {F13513} +** The fifth argument to sqlite3_bind_blob(), sqlite3_bind_text(), and +** sqlite3_bind_text16() is a destructor used to dispose of the BLOB or +** text after SQLite has finished with it. {F13514} If the fifth argument is +** the special value [SQLITE_STATIC], then the library assumes that the +** information is in static, unmanaged space and does not need to be freed. +** {F13515} If the fifth argument has the value [SQLITE_TRANSIENT], then +** SQLite makes its own private copy of the data immediately, before +** the sqlite3_bind_*() routine returns. {END} +** +** {F13520} The sqlite3_bind_zeroblob() routine binds a BLOB of length N that +** is filled with zeros. {F13521} A zeroblob uses a fixed amount of memory +** (just an integer to hold it size) while it is being processed. {END} +** Zeroblobs are intended to serve as place-holders for BLOBs whose +** content is later written using +** [sqlite3_blob_open | increment BLOB I/O] routines. {F13522} A negative +** value for the zeroblob results in a zero-length BLOB. {END} +** +** {F13530} The sqlite3_bind_*() routines must be called after +** [sqlite3_prepare_v2()] (and its variants) or [sqlite3_reset()] and +** before [sqlite3_step()]. {F13531} +** Bindings are not cleared by the [sqlite3_reset()] routine. +** {F13532} Unbound parameters are interpreted as NULL. {END} +** +** {F13540} These routines return [SQLITE_OK] on success or an error code if +** anything goes wrong. {F13541} [SQLITE_RANGE] is returned if the parameter +** index is out of range. {F13542} [SQLITE_NOMEM] is returned if malloc fails. +** {F13543} [SQLITE_MISUSE] is returned if these routines are called on a +** virtual machine that is the wrong state or which has already been finalized. +*/ +/*IMPORT_C*/ int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*)); +/*IMPORT_C*/ int sqlite3_bind_double(sqlite3_stmt*, int, double); +/*IMPORT_C*/ int sqlite3_bind_int(sqlite3_stmt*, int, int); +/*IMPORT_C*/ int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64); +/*IMPORT_C*/ int sqlite3_bind_null(sqlite3_stmt*, int); +/*IMPORT_C*/ int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*)); +/*IMPORT_C*/ int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*)); +/*IMPORT_C*/ int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*); +/*IMPORT_C*/ int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n); + +/* +** CAPI3REF: Number Of Host Parameters {F13600} +** +** {F13601} Return the largest host parameter index in the precompiled +** statement given as the argument. {F13602} When the host parameters +** are of the forms like ":AAA", "$VVV", "@AAA", or "?", +** then they are assigned sequential increasing numbers beginning +** with one, so the value returned is the number of parameters. +** {F13603} However +** if the same host parameter name is used multiple times, each occurrance +** is given the same number, so the value returned in that case is the number +** of unique host parameter names. {F13604} If host parameters of the +** form "?NNN" are used (where NNN is an integer) then there might be +** gaps in the numbering and the value returned by this interface is +** the index of the host parameter with the largest index value. {END} +** +** {U13605} The prepared statement must not be [sqlite3_finalize | finalized] +** prior to this routine returning. Otherwise the results are undefined +** and probably undesirable. +*/ +/*IMPORT_C*/ int sqlite3_bind_parameter_count(sqlite3_stmt*); + +/* +** CAPI3REF: Name Of A Host Parameter {F13620} +** +** {F13621} This routine returns a pointer to the name of the n-th +** parameter in a [sqlite3_stmt | prepared statement]. {F13622} +** Host parameters of the form ":AAA" or "@AAA" or "$VVV" have a name +** which is the string ":AAA" or "@AAA" or "$VVV". +** In other words, the initial ":" or "$" or "@" +** is included as part of the name. {F13626} +** Parameters of the form "?" or "?NNN" have no name. +** +** {F13623} The first host parameter has an index of 1, not 0. +** +** {F13624} If the value n is out of range or if the n-th parameter is +** nameless, then NULL is returned. {F13625} The returned string is +** always in the UTF-8 encoding even if the named parameter was +** originally specified as UTF-16 in [sqlite3_prepare16()] or +** [sqlite3_prepare16_v2()]. +*/ +/*IMPORT_C*/ const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int); + +/* +** CAPI3REF: Index Of A Parameter With A Given Name {F13640} +** +** {F13641} This routine returns the index of a host parameter with the +** given name. {F13642} The name must match exactly. {F13643} +** If no parameter with the given name is found, return 0. +** {F13644} Parameter names must be UTF8. +*/ +/*IMPORT_C*/ int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName); + +/* +** CAPI3REF: Reset All Bindings On A Prepared Statement {F13660} +** +** {F13661} Contrary to the intuition of many, [sqlite3_reset()] does not +** reset the [sqlite3_bind_blob | bindings] on a +** [sqlite3_stmt | prepared statement]. {F13662} Use this routine to +** reset all host parameters to NULL. +*/ +/*IMPORT_C*/ int sqlite3_clear_bindings(sqlite3_stmt*); + +/* +** CAPI3REF: Number Of Columns In A Result Set {F13710} +** +** {F13711} Return the number of columns in the result set returned by the +** [sqlite3_stmt | compiled SQL statement]. {F13712} This routine returns 0 +** if pStmt is an SQL statement that does not return data (for +** example an UPDATE). +*/ +/*IMPORT_C*/ int sqlite3_column_count(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Column Names In A Result Set {F13720} +** +** {F13721} These routines return the name assigned to a particular column +** in the result set of a SELECT statement. {F13722} The sqlite3_column_name() +** interface returns a pointer to a zero-terminated UTF8 string +** and sqlite3_column_name16() returns a pointer to a zero-terminated +** UTF16 string. {F13723} The first parameter is the +** [sqlite3_stmt | prepared statement] that implements the SELECT statement. +** The second parameter is the column number. The left-most column is +** number 0. +** +** {F13724} The returned string pointer is valid until either the +** [sqlite3_stmt | prepared statement] is destroyed by [sqlite3_finalize()] +** or until the next call sqlite3_column_name() or sqlite3_column_name16() +** on the same column. +** +** {F13725} If sqlite3_malloc() fails during the processing of either routine +** (for example during a conversion from UTF-8 to UTF-16) then a +** NULL pointer is returned. +*/ +/*IMPORT_C*/ const char *sqlite3_column_name(sqlite3_stmt*, int N); +/*IMPORT_C*/ const void *sqlite3_column_name16(sqlite3_stmt*, int N); + +/* +** CAPI3REF: Source Of Data In A Query Result {F13740} +** +** {F13741} These routines provide a means to determine what column of what +** table in which database a result of a SELECT statement comes from. +** {F13742} The name of the database or table or column can be returned as +** either a UTF8 or UTF16 string. {F13743} The _database_ routines return +** the database name, the _table_ routines return the table name, and +** the origin_ routines return the column name. {F13744} +** The returned string is valid until +** the [sqlite3_stmt | prepared statement] is destroyed using +** [sqlite3_finalize()] or until the same information is requested +** again in a different encoding. +** +** {F13745} The names returned are the original un-aliased names of the +** database, table, and column. +** +** {F13746} The first argument to the following calls is a +** [sqlite3_stmt | compiled SQL statement]. +** {F13747} These functions return information about the Nth column returned by +** the statement, where N is the second function argument. +** +** {F13748} If the Nth column returned by the statement is an expression +** or subquery and is not a column value, then all of these functions +** return NULL. {F13749} Otherwise, they return the +** name of the attached database, table and column that query result +** column was extracted from. +** +** {F13750} As with all other SQLite APIs, those postfixed with "16" return +** UTF-16 encoded strings, the other functions return UTF-8. {END} +** +** These APIs are only available if the library was compiled with the +** SQLITE_ENABLE_COLUMN_METADATA preprocessor symbol defined. +** +** {U13751} +** If two or more threads call one or more of these routines against the same +** prepared statement and column at the same time then the results are +** undefined. +*/ +/*IMPORT_C*/ const char *sqlite3_column_database_name(sqlite3_stmt*,int); +/*IMPORT_C*/ const void *sqlite3_column_database_name16(sqlite3_stmt*,int); +/*IMPORT_C*/ const char *sqlite3_column_table_name(sqlite3_stmt*,int); +/*IMPORT_C*/ const void *sqlite3_column_table_name16(sqlite3_stmt*,int); +/*IMPORT_C*/ const char *sqlite3_column_origin_name(sqlite3_stmt*,int); +/*IMPORT_C*/ const void *sqlite3_column_origin_name16(sqlite3_stmt*,int); + +/* +** CAPI3REF: Declared Datatype Of A Query Result {F13760} +** +** The first parameter is a [sqlite3_stmt | compiled SQL statement]. +** {F13761} If this statement is a SELECT statement and the Nth column of the +** returned result set of that SELECT is a table column (not an +** expression or subquery) then the declared type of the table +** column is returned. {F13762} If the Nth column of the result set is an +** expression or subquery, then a NULL pointer is returned. +** {F13763} The returned string is always UTF-8 encoded. {END} +** For example, in the database schema: +** +** CREATE TABLE t1(c1 VARIANT); +** +** And the following statement compiled: +** +** SELECT c1 + 1, c1 FROM t1; +** +** Then this routine would return the string "VARIANT" for the second +** result column (i==1), and a NULL pointer for the first result column +** (i==0). +** +** SQLite uses dynamic run-time typing. So just because a column +** is declared to contain a particular type does not mean that the +** data stored in that column is of the declared type. SQLite is +** strongly typed, but the typing is dynamic not static. Type +** is associated with individual values, not with the containers +** used to hold those values. +*/ +/*IMPORT_C*/ const char *sqlite3_column_decltype(sqlite3_stmt *, int i); +/*IMPORT_C*/ const void *sqlite3_column_decltype16(sqlite3_stmt*,int); + +/* +** CAPI3REF: Evaluate An SQL Statement {F13200} +** +** After an [sqlite3_stmt | SQL statement] has been prepared with a call +** to either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] or to one of +** the legacy interfaces [sqlite3_prepare()] or [sqlite3_prepare16()], +** then this function must be called one or more times to evaluate the +** statement. +** +** The details of the behavior of this sqlite3_step() interface depend +** on whether the statement was prepared using the newer "v2" interface +** [sqlite3_prepare_v2()] and [sqlite3_prepare16_v2()] or the older legacy +** interface [sqlite3_prepare()] and [sqlite3_prepare16()]. The use of the +** new "v2" interface is recommended for new applications but the legacy +** interface will continue to be supported. +** +** In the lagacy interface, the return value will be either [SQLITE_BUSY], +** [SQLITE_DONE], [SQLITE_ROW], [SQLITE_ERROR], or [SQLITE_MISUSE]. +** With the "v2" interface, any of the other [SQLITE_OK | result code] +** or [SQLITE_IOERR_READ | extended result code] might be returned as +** well. +** +** [SQLITE_BUSY] means that the database engine was unable to acquire the +** database locks it needs to do its job. If the statement is a COMMIT +** or occurs outside of an explicit transaction, then you can retry the +** statement. If the statement is not a COMMIT and occurs within a +** explicit transaction then you should rollback the transaction before +** continuing. +** +** [SQLITE_DONE] means that the statement has finished executing +** successfully. sqlite3_step() should not be called again on this virtual +** machine without first calling [sqlite3_reset()] to reset the virtual +** machine back to its initial state. +** +** If the SQL statement being executed returns any data, then +** [SQLITE_ROW] is returned each time a new row of data is ready +** for processing by the caller. The values may be accessed using +** the [sqlite3_column_int | column access functions]. +** sqlite3_step() is called again to retrieve the next row of data. +** +** [SQLITE_ERROR] means that a run-time error (such as a constraint +** violation) has occurred. sqlite3_step() should not be called again on +** the VM. More information may be found by calling [sqlite3_errmsg()]. +** With the legacy interface, a more specific error code (example: +** [SQLITE_INTERRUPT], [SQLITE_SCHEMA], [SQLITE_CORRUPT], and so forth) +** can be obtained by calling [sqlite3_reset()] on the +** [sqlite3_stmt | prepared statement]. In the "v2" interface, +** the more specific error code is returned directly by sqlite3_step(). +** +** [SQLITE_MISUSE] means that the this routine was called inappropriately. +** Perhaps it was called on a [sqlite3_stmt | prepared statement] that has +** already been [sqlite3_finalize | finalized] or on one that had +** previously returned [SQLITE_ERROR] or [SQLITE_DONE]. Or it could +** be the case that the same database connection is being used by two or +** more threads at the same moment in time. +** +** Goofy Interface Alert: +** In the legacy interface, +** the sqlite3_step() API always returns a generic error code, +** [SQLITE_ERROR], following any error other than [SQLITE_BUSY] +** and [SQLITE_MISUSE]. You must call [sqlite3_reset()] or +** [sqlite3_finalize()] in order to find one of the specific +** [SQLITE_ERROR | result codes] that better describes the error. +** We admit that this is a goofy design. The problem has been fixed +** with the "v2" interface. If you prepare all of your SQL statements +** using either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] instead +** of the legacy [sqlite3_prepare()] and [sqlite3_prepare16()], then the +** more specific [SQLITE_ERROR | result codes] are returned directly +** by sqlite3_step(). The use of the "v2" interface is recommended. +*/ +/*IMPORT_C*/ int sqlite3_step(sqlite3_stmt*); + +/* +** CAPI3REF: Number of columns in a result set {F13770} +** +** Return the number of values in the current row of the result set. +** +** {F13771} After a call to [sqlite3_step()] that returns [SQLITE_ROW], +** this routine +** will return the same value as the [sqlite3_column_count()] function. +** {F13772} +** After [sqlite3_step()] has returned an [SQLITE_DONE], [SQLITE_BUSY], or +** a [SQLITE_ERROR | error code], or before [sqlite3_step()] has been +** called on the [sqlite3_stmt | prepared statement] for the first time, +** this routine returns zero. +*/ +/*IMPORT_C*/ int sqlite3_data_count(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Fundamental Datatypes {F10265} +** +** {F10266}Every value in SQLite has one of five fundamental datatypes: +** +**
    +**
  • 64-bit signed integer +**
  • 64-bit IEEE floating point number +**
  • string +**
  • BLOB +**
  • NULL +**
{END} +** +** These constants are codes for each of those types. +** +** Note that the SQLITE_TEXT constant was also used in SQLite version 2 +** for a completely different meaning. Software that links against both +** SQLite version 2 and SQLite version 3 should use SQLITE3_TEXT not +** SQLITE_TEXT. +*/ +#define SQLITE_INTEGER 1 +#define SQLITE_FLOAT 2 +#define SQLITE_BLOB 4 +#define SQLITE_NULL 5 +#ifdef SQLITE_TEXT +# undef SQLITE_TEXT +#else +# define SQLITE_TEXT 3 +#endif +#define SQLITE3_TEXT 3 + +/* +** CAPI3REF: Results Values From A Query {F13800} +** +** These routines return information about +** a single column of the current result row of a query. In every +** case the first argument is a pointer to the +** [sqlite3_stmt | SQL statement] that is being +** evaluated (the [sqlite3_stmt*] that was returned from +** [sqlite3_prepare_v2()] or one of its variants) and +** the second argument is the index of the column for which information +** should be returned. The left-most column of the result set +** has an index of 0. +** +** If the SQL statement is not currently point to a valid row, or if the +** the column index is out of range, the result is undefined. +** These routines may only be called when the most recent call to +** [sqlite3_step()] has returned [SQLITE_ROW] and neither +** [sqlite3_reset()] nor [sqlite3_finalize()] has been call subsequently. +** If any of these routines are called after [sqlite3_reset()] or +** [sqlite3_finalize()] or after [sqlite3_step()] has returned +** something other than [SQLITE_ROW], the results are undefined. +** If [sqlite3_step()] or [sqlite3_reset()] or [sqlite3_finalize()] +** are called from a different thread while any of these routines +** are pending, then the results are undefined. +** +** The sqlite3_column_type() routine returns +** [SQLITE_INTEGER | datatype code] for the initial data type +** of the result column. The returned value is one of [SQLITE_INTEGER], +** [SQLITE_FLOAT], [SQLITE_TEXT], [SQLITE_BLOB], or [SQLITE_NULL]. The value +** returned by sqlite3_column_type() is only meaningful if no type +** conversions have occurred as described below. After a type conversion, +** the value returned by sqlite3_column_type() is undefined. Future +** versions of SQLite may change the behavior of sqlite3_column_type() +** following a type conversion. +** +** If the result is a BLOB or UTF-8 string then the sqlite3_column_bytes() +** routine returns the number of bytes in that BLOB or string. +** If the result is a UTF-16 string, then sqlite3_column_bytes() converts +** the string to UTF-8 and then returns the number of bytes. +** If the result is a numeric value then sqlite3_column_bytes() uses +** [sqlite3_snprintf()] to convert that value to a UTF-8 string and returns +** the number of bytes in that string. +** The value returned does not include the zero terminator at the end +** of the string. For clarity: the value returned is the number of +** bytes in the string, not the number of characters. +** +** Strings returned by sqlite3_column_text() and sqlite3_column_text16(), +** even zero-length strings, are always zero terminated. The return +** value from sqlite3_column_blob() for a zero-length blob is an arbitrary +** pointer, possibly even a NULL pointer. +** +** The sqlite3_column_bytes16() routine is similar to sqlite3_column_bytes() +** but leaves the result in UTF-16 instead of UTF-8. +** The zero terminator is not included in this count. +** +** These routines attempt to convert the value where appropriate. For +** example, if the internal representation is FLOAT and a text result +** is requested, [sqlite3_snprintf()] is used internally to do the conversion +** automatically. The following table details the conversions that +** are applied: +** +**
+** +**
Internal
Type
Requested
Type
Conversion +** +**
NULL INTEGER Result is 0 +**
NULL FLOAT Result is 0.0 +**
NULL TEXT Result is NULL pointer +**
NULL BLOB Result is NULL pointer +**
INTEGER FLOAT Convert from integer to float +**
INTEGER TEXT ASCII rendering of the integer +**
INTEGER BLOB Same as for INTEGER->TEXT +**
FLOAT INTEGER Convert from float to integer +**
FLOAT TEXT ASCII rendering of the float +**
FLOAT BLOB Same as FLOAT->TEXT +**
TEXT INTEGER Use atoi() +**
TEXT FLOAT Use atof() +**
TEXT BLOB No change +**
BLOB INTEGER Convert to TEXT then use atoi() +**
BLOB FLOAT Convert to TEXT then use atof() +**
BLOB TEXT Add a zero terminator if needed +**
+**
+** +** The table above makes reference to standard C library functions atoi() +** and atof(). SQLite does not really use these functions. It has its +** on equavalent internal routines. The atoi() and atof() names are +** used in the table for brevity and because they are familiar to most +** C programmers. +** +** Note that when type conversions occur, pointers returned by prior +** calls to sqlite3_column_blob(), sqlite3_column_text(), and/or +** sqlite3_column_text16() may be invalidated. +** Type conversions and pointer invalidations might occur +** in the following cases: +** +**
    +**
  • The initial content is a BLOB and sqlite3_column_text() +** or sqlite3_column_text16() is called. A zero-terminator might +** need to be added to the string.

  • +** +**
  • The initial content is UTF-8 text and sqlite3_column_bytes16() or +** sqlite3_column_text16() is called. The content must be converted +** to UTF-16.

  • +** +**
  • The initial content is UTF-16 text and sqlite3_column_bytes() or +** sqlite3_column_text() is called. The content must be converted +** to UTF-8.

  • +**
+** +** Conversions between UTF-16be and UTF-16le are always done in place and do +** not invalidate a prior pointer, though of course the content of the buffer +** that the prior pointer points to will have been modified. Other kinds +** of conversion are done in place when it is possible, but sometime it is +** not possible and in those cases prior pointers are invalidated. +** +** The safest and easiest to remember policy is to invoke these routines +** in one of the following ways: +** +**
    +**
  • sqlite3_column_text() followed by sqlite3_column_bytes()
  • +**
  • sqlite3_column_blob() followed by sqlite3_column_bytes()
  • +**
  • sqlite3_column_text16() followed by sqlite3_column_bytes16()
  • +**
+** +** In other words, you should call sqlite3_column_text(), sqlite3_column_blob(), +** or sqlite3_column_text16() first to force the result into the desired +** format, then invoke sqlite3_column_bytes() or sqlite3_column_bytes16() to +** find the size of the result. Do not mix call to sqlite3_column_text() or +** sqlite3_column_blob() with calls to sqlite3_column_bytes16(). And do not +** mix calls to sqlite3_column_text16() with calls to sqlite3_column_bytes(). +** +** The pointers returned are valid until a type conversion occurs as +** described above, or until [sqlite3_step()] or [sqlite3_reset()] or +** [sqlite3_finalize()] is called. The memory space used to hold strings +** and blobs is freed automatically. Do not pass the pointers returned +** [sqlite3_column_blob()], [sqlite3_column_text()], etc. into +** [sqlite3_free()]. +** +** If a memory allocation error occurs during the evaluation of any +** of these routines, a default value is returned. The default value +** is either the integer 0, the floating point number 0.0, or a NULL +** pointer. Subsequent calls to [sqlite3_errcode()] will return +** [SQLITE_NOMEM]. +*/ +/*IMPORT_C*/ const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); +/*IMPORT_C*/ int sqlite3_column_bytes(sqlite3_stmt*, int iCol); +/*IMPORT_C*/ int sqlite3_column_bytes16(sqlite3_stmt*, int iCol); +/*IMPORT_C*/ double sqlite3_column_double(sqlite3_stmt*, int iCol); +/*IMPORT_C*/ int sqlite3_column_int(sqlite3_stmt*, int iCol); +/*IMPORT_C*/ sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); +/*IMPORT_C*/ const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); +/*IMPORT_C*/ const void *sqlite3_column_text16(sqlite3_stmt*, int iCol); +/*IMPORT_C*/ int sqlite3_column_type(sqlite3_stmt*, int iCol); +/*IMPORT_C*/ sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol); + +/* +** CAPI3REF: Destroy A Prepared Statement Object {F13300} +** +** The sqlite3_finalize() function is called to delete a +** [sqlite3_stmt | compiled SQL statement]. If the statement was +** executed successfully, or not executed at all, then SQLITE_OK is returned. +** If execution of the statement failed then an +** [SQLITE_ERROR | error code] or [SQLITE_IOERR_READ | extended error code] +** is returned. +** +** This routine can be called at any point during the execution of the +** [sqlite3_stmt | virtual machine]. If the virtual machine has not +** completed execution when this routine is called, that is like +** encountering an error or an interrupt. (See [sqlite3_interrupt()].) +** Incomplete updates may be rolled back and transactions cancelled, +** depending on the circumstances, and the +** [SQLITE_ERROR | result code] returned will be [SQLITE_ABORT]. +*/ +/*IMPORT_C*/ int sqlite3_finalize(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Reset A Prepared Statement Object {F13330} +** +** The sqlite3_reset() function is called to reset a +** [sqlite3_stmt | compiled SQL statement] object. +** back to its initial state, ready to be re-executed. +** Any SQL statement variables that had values bound to them using +** the [sqlite3_bind_blob | sqlite3_bind_*() API] retain their values. +** Use [sqlite3_clear_bindings()] to reset the bindings. +*/ +/*IMPORT_C*/ int sqlite3_reset(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Create Or Redefine SQL Functions {F16100} +** +** The following two functions are used to add SQL functions or aggregates +** or to redefine the behavior of existing SQL functions or aggregates. The +** difference only between the two is that the second parameter, the +** name of the (scalar) function or aggregate, is encoded in UTF-8 for +** sqlite3_create_function() and UTF-16 for sqlite3_create_function16(). +** +** The first argument is the [sqlite3 | database handle] that holds the +** SQL function or aggregate is to be added or redefined. If a single +** program uses more than one database handle internally, then SQL +** functions or aggregates must be added individually to each database +** handle with which they will be used. +** +** The second parameter is the name of the SQL function to be created +** or redefined. +** The length of the name is limited to 255 bytes, exclusive of the +** zero-terminator. Note that the name length limit is in bytes, not +** characters. Any attempt to create a function with a longer name +** will result in an SQLITE_ERROR error. +** +** The third parameter is the number of arguments that the SQL function or +** aggregate takes. If this parameter is negative, then the SQL function or +** aggregate may take any number of arguments. +** +** The fourth parameter, eTextRep, specifies what +** [SQLITE_UTF8 | text encoding] this SQL function prefers for +** its parameters. Any SQL function implementation should be able to work +** work with UTF-8, UTF-16le, or UTF-16be. But some implementations may be +** more efficient with one encoding than another. It is allowed to +** invoke sqlite3_create_function() or sqlite3_create_function16() multiple +** times with the same function but with different values of eTextRep. +** When multiple implementations of the same function are available, SQLite +** will pick the one that involves the least amount of data conversion. +** If there is only a single implementation which does not care what +** text encoding is used, then the fourth argument should be +** [SQLITE_ANY]. +** +** The fifth parameter is an arbitrary pointer. The implementation +** of the function can gain access to this pointer using +** [sqlite3_user_data()]. +** +** The seventh, eighth and ninth parameters, xFunc, xStep and xFinal, are +** pointers to C-language functions that implement the SQL +** function or aggregate. A scalar SQL function requires an implementation of +** the xFunc callback only, NULL pointers should be passed as the xStep +** and xFinal parameters. An aggregate SQL function requires an implementation +** of xStep and xFinal and NULL should be passed for xFunc. To delete an +** existing SQL function or aggregate, pass NULL for all three function +** callback. +** +** It is permitted to register multiple implementations of the same +** functions with the same name but with either differing numbers of +** arguments or differing perferred text encodings. SQLite will use +** the implementation most closely matches the way in which the +** SQL function is used. +*/ +/*IMPORT_C*/ int sqlite3_create_function( + sqlite3 *, + const char *zFunctionName, + int nArg, + int eTextRep, + void*, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*) +); +/*IMPORT_C*/ int sqlite3_create_function16( + sqlite3*, + const void *zFunctionName, + int nArg, + int eTextRep, + void*, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*) +); + +/* +** CAPI3REF: Text Encodings {F10267} +** +** These constant define integer codes that represent the various +** text encodings supported by SQLite. +*/ +#define SQLITE_UTF8 1 +#define SQLITE_UTF16LE 2 +#define SQLITE_UTF16BE 3 +#define SQLITE_UTF16 4 /* Use native byte order */ +#define SQLITE_ANY 5 /* sqlite3_create_function only */ +#define SQLITE_UTF16_ALIGNED 8 /* sqlite3_create_collation only */ + +/* +** CAPI3REF: Obsolete Functions +** +** These functions are all now obsolete. In order to maintain +** backwards compatibility with older code, we continue to support +** these functions. However, new development projects should avoid +** the use of these functions. To help encourage people to avoid +** using these functions, we are not going to tell you want they do. +*/ +/*IMPORT_C*/ int sqlite3_aggregate_count(sqlite3_context*); +/*IMPORT_C*/ int sqlite3_expired(sqlite3_stmt*); +/*IMPORT_C*/ int sqlite3_transfer_bindings(sqlite3_stmt*, sqlite3_stmt*); +/*IMPORT_C*/ int sqlite3_global_recover(void); +/*IMPORT_C*/ void sqlite3_thread_cleanup(void); +/*IMPORT_C*/ int sqlite3_memory_alarm(void(*)(void*,sqlite3_int64,int),void*,sqlite3_int64); + +/* +** CAPI3REF: Obtaining SQL Function Parameter Values {F15100} +** +** The C-language implementation of SQL functions and aggregates uses +** this set of interface routines to access the parameter values on +** the function or aggregate. +** +** The xFunc (for scalar functions) or xStep (for aggregates) parameters +** to [sqlite3_create_function()] and [sqlite3_create_function16()] +** define callbacks that implement the SQL functions and aggregates. +** The 4th parameter to these callbacks is an array of pointers to +** [sqlite3_value] objects. There is one [sqlite3_value] object for +** each parameter to the SQL function. These routines are used to +** extract values from the [sqlite3_value] objects. +** +** These routines work just like the corresponding +** [sqlite3_column_blob | sqlite3_column_* routines] except that +** these routines take a single [sqlite3_value*] pointer instead +** of an [sqlite3_stmt*] pointer and an integer column number. +** +** The sqlite3_value_text16() interface extracts a UTF16 string +** in the native byte-order of the host machine. The +** sqlite3_value_text16be() and sqlite3_value_text16le() interfaces +** extract UTF16 strings as big-endian and little-endian respectively. +** +** The sqlite3_value_numeric_type() interface attempts to apply +** numeric affinity to the value. This means that an attempt is +** made to convert the value to an integer or floating point. If +** such a conversion is possible without loss of information (in other +** words if the value is a string that looks like a number) +** then the conversion is done. Otherwise no conversion occurs. The +** [SQLITE_INTEGER | datatype] after conversion is returned. +** +** Please pay particular attention to the fact that the pointer that +** is returned from [sqlite3_value_blob()], [sqlite3_value_text()], or +** [sqlite3_value_text16()] can be invalidated by a subsequent call to +** [sqlite3_value_bytes()], [sqlite3_value_bytes16()], [sqlite3_value_text()], +** or [sqlite3_value_text16()]. +** +** These routines must be called from the same thread as +** the SQL function that supplied the sqlite3_value* parameters. +** Or, if the sqlite3_value* argument comes from the [sqlite3_column_value()] +** interface, then these routines should be called from the same thread +** that ran [sqlite3_column_value()]. +** +*/ +/*IMPORT_C*/ const void *sqlite3_value_blob(sqlite3_value*); +/*IMPORT_C*/ int sqlite3_value_bytes(sqlite3_value*); +/*IMPORT_C*/ int sqlite3_value_bytes16(sqlite3_value*); +/*IMPORT_C*/ double sqlite3_value_double(sqlite3_value*); +/*IMPORT_C*/ int sqlite3_value_int(sqlite3_value*); +/*IMPORT_C*/ sqlite3_int64 sqlite3_value_int64(sqlite3_value*); +/*IMPORT_C*/ const unsigned char *sqlite3_value_text(sqlite3_value*); +/*IMPORT_C*/ const void *sqlite3_value_text16(sqlite3_value*); +/*IMPORT_C*/ const void *sqlite3_value_text16le(sqlite3_value*); +/*IMPORT_C*/ const void *sqlite3_value_text16be(sqlite3_value*); +/*IMPORT_C*/ int sqlite3_value_type(sqlite3_value*); +/*IMPORT_C*/ int sqlite3_value_numeric_type(sqlite3_value*); + +/* +** CAPI3REF: Obtain Aggregate Function Context {F16210} +** +** The implementation of aggregate SQL functions use this routine to allocate +** a structure for storing their state. +** {F16211} The first time the sqlite3_aggregate_context() routine is +** is called for a particular aggregate, SQLite allocates nBytes of memory +** zeros that memory, and returns a pointer to it. +** {F16212} On second and subsequent calls to sqlite3_aggregate_context() +** for the same aggregate function index, the same buffer is returned. {END} +** The implementation +** of the aggregate can use the returned buffer to accumulate data. +** +** {F16213} SQLite automatically frees the allocated buffer when the aggregate +** query concludes. {END} +** +** The first parameter should be a copy of the +** [sqlite3_context | SQL function context] that is the first +** parameter to the callback routine that implements the aggregate +** function. +** +** This routine must be called from the same thread in which +** the aggregate SQL function is running. +*/ +/*IMPORT_C*/ void *sqlite3_aggregate_context(sqlite3_context*, int nBytes); + +/* +** CAPI3REF: User Data For Functions {F16240} +** +** {F16241} The sqlite3_user_data() interface returns a copy of +** the pointer that was the pUserData parameter (the 5th parameter) +** of the the [sqlite3_create_function()] +** and [sqlite3_create_function16()] routines that originally +** registered the application defined function. {END} +** +** {U16243} This routine must be called from the same thread in which +** the application-defined function is running. +*/ +/*IMPORT_C*/ void *sqlite3_user_data(sqlite3_context*); + +/* +** CAPI3REF: Function Auxiliary Data {F16270} +** +** The following two functions may be used by scalar SQL functions to +** associate meta-data with argument values. If the same value is passed to +** multiple invocations of the same SQL function during query execution, under +** some circumstances the associated meta-data may be preserved. This may +** be used, for example, to add a regular-expression matching scalar +** function. The compiled version of the regular expression is stored as +** meta-data associated with the SQL value passed as the regular expression +** pattern. The compiled regular expression can be reused on multiple +** invocations of the same function so that the original pattern string +** does not need to be recompiled on each invocation. +** +** {F16271} +** The sqlite3_get_auxdata() interface returns a pointer to the meta-data +** associated by the sqlite3_set_auxdata() function with the Nth argument +** value to the application-defined function. +** {F16272} If no meta-data has been ever been set for the Nth +** argument of the function, or if the cooresponding function parameter +** has changed since the meta-data was set, then sqlite3_get_auxdata() +** returns a NULL pointer. +** +** {F16275} The sqlite3_set_auxdata() interface saves the meta-data +** pointed to by its 3rd parameter as the meta-data for the N-th +** argument of the application-defined function. {END} Subsequent +** calls to sqlite3_get_auxdata() might return this data, if it has +** not been destroyed. +** {F16277} If it is not NULL, SQLite will invoke the destructor +** function given by the 4th parameter to sqlite3_set_auxdata() on +** the meta-data when the corresponding function parameter changes +** or when the SQL statement completes, whichever comes first. {END} +** +** In practice, meta-data is preserved between function calls for +** expressions that are constant at compile time. This includes literal +** values and SQL variables. +** +** These routines must be called from the same thread in which +** the SQL function is running. +*/ +/*IMPORT_C*/ void *sqlite3_get_auxdata(sqlite3_context*, int N); +/*IMPORT_C*/ void sqlite3_set_auxdata(sqlite3_context*, int N, void*, void (*)(void*)); + + +/* +** CAPI3REF: Constants Defining Special Destructor Behavior {F10280} +** +** These are special value for the destructor that is passed in as the +** final argument to routines like [sqlite3_result_blob()]. If the destructor +** argument is SQLITE_STATIC, it means that the content pointer is constant +** and will never change. It does not need to be destroyed. The +** SQLITE_TRANSIENT value means that the content will likely change in +** the near future and that SQLite should make its own private copy of +** the content before returning. +** +** The typedef is necessary to work around problems in certain +** C++ compilers. See ticket #2191. +*/ +typedef void (*sqlite3_destructor_type)(void*); +#define SQLITE_STATIC ((sqlite3_destructor_type)0) +#define SQLITE_TRANSIENT ((sqlite3_destructor_type)-1) + +/* +** CAPI3REF: Setting The Result Of An SQL Function {F16400} +** +** These routines are used by the xFunc or xFinal callbacks that +** implement SQL functions and aggregates. See +** [sqlite3_create_function()] and [sqlite3_create_function16()] +** for additional information. +** +** These functions work very much like the +** [sqlite3_bind_blob | sqlite3_bind_*] family of functions used +** to bind values to host parameters in prepared statements. +** Refer to the +** [sqlite3_bind_blob | sqlite3_bind_* documentation] for +** additional information. +** +** {F16402} The sqlite3_result_blob() interface sets the result from +** an application defined function to be the BLOB whose content is pointed +** to by the second parameter and which is N bytes long where N is the +** third parameter. +** {F16403} The sqlite3_result_zeroblob() inerfaces set the result of +** the application defined function to be a BLOB containing all zero +** bytes and N bytes in size, where N is the value of the 2nd parameter. +** +** {F16407} The sqlite3_result_double() interface sets the result from +** an application defined function to be a floating point value specified +** by its 2nd argument. +** +** {F16409} The sqlite3_result_error() and sqlite3_result_error16() functions +** cause the implemented SQL function to throw an exception. +** {F16411} SQLite uses the string pointed to by the +** 2nd parameter of sqlite3_result_error() or sqlite3_result_error16() +** as the text of an error message. {F16412} SQLite interprets the error +** message string from sqlite3_result_error() as UTF8. {F16413} SQLite +** interprets the string from sqlite3_result_error16() as UTF16 in native +** byte order. {F16414} If the third parameter to sqlite3_result_error() +** or sqlite3_result_error16() is negative then SQLite takes as the error +** message all text up through the first zero character. +** {F16415} If the third parameter to sqlite3_result_error() or +** sqlite3_result_error16() is non-negative then SQLite takes that many +** bytes (not characters) from the 2nd parameter as the error message. +** {F16417} The sqlite3_result_error() and sqlite3_result_error16() +** routines make a copy private copy of the error message text before +** they return. {END} Hence, the calling function can deallocate or +** modify the text after they return without harm. +** +** {F16421} The sqlite3_result_toobig() interface causes SQLite +** to throw an error indicating that a string or BLOB is to long +** to represent. {F16422} The sqlite3_result_nomem() interface +** causes SQLite to throw an exception indicating that the a +** memory allocation failed. +** +** {F16431} The sqlite3_result_int() interface sets the return value +** of the application-defined function to be the 32-bit signed integer +** value given in the 2nd argument. +** {F16432} The sqlite3_result_int64() interface sets the return value +** of the application-defined function to be the 64-bit signed integer +** value given in the 2nd argument. +** +** {F16437} The sqlite3_result_null() interface sets the return value +** of the application-defined function to be NULL. +** +** {F16441} The sqlite3_result_text(), sqlite3_result_text16(), +** sqlite3_result_text16le(), and sqlite3_result_text16be() interfaces +** set the return value of the application-defined function to be +** a text string which is represented as UTF-8, UTF-16 native byte order, +** UTF-16 little endian, or UTF-16 big endian, respectively. +** {F16442} SQLite takes the text result from the application from +** the 2nd parameter of the sqlite3_result_text* interfaces. +** {F16444} If the 3rd parameter to the sqlite3_result_text* interfaces +** is negative, then SQLite takes result text from the 2nd parameter +** through the first zero character. +** {F16447} If the 3rd parameter to the sqlite3_result_text* interfaces +** is non-negative, then as many bytes (not characters) of the text +** pointed to by the 2nd parameter are taken as the application-defined +** function result. +** {F16451} If the 4th parameter to the sqlite3_result_text* interfaces +** or sqlite3_result_blob is a non-NULL pointer, then SQLite calls that +** function as the destructor on the text or blob result when it has +** finished using that result. +** {F16453} If the 4th parameter to the sqlite3_result_text* interfaces +** or sqlite3_result_blob is the special constant SQLITE_STATIC, then +** SQLite assumes that the text or blob result is constant space and +** does not copy the space or call a destructor when it has +** finished using that result. +** {F16454} If the 4th parameter to the sqlite3_result_text* interfaces +** or sqlite3_result_blob is the special constant SQLITE_TRANSIENT +** then SQLite makes a copy of the result into space obtained from +** from [sqlite3_malloc()] before it returns. +** +** {F16461} The sqlite3_result_value() interface sets the result of +** the application-defined function to be a copy the [sqlite3_value] +** object specified by the 2nd parameter. {F16463} The +** sqlite3_result_value() interface makes a copy of the [sqlite3_value] +** so that [sqlite3_value] specified in the parameter may change or +** be deallocated after sqlite3_result_value() returns without harm. +** +** {U16491} These routines are called from within the different thread +** than the one containing the application-defined function that recieved +** the [sqlite3_context] pointer, the results are undefined. +*/ +/*IMPORT_C*/ void sqlite3_result_blob(sqlite3_context*, const void*, int, void(*)(void*)); +/*IMPORT_C*/ void sqlite3_result_double(sqlite3_context*, double); +/*IMPORT_C*/ void sqlite3_result_error(sqlite3_context*, const char*, int); +/*IMPORT_C*/ void sqlite3_result_error16(sqlite3_context*, const void*, int); +/*IMPORT_C*/ void sqlite3_result_error_toobig(sqlite3_context*); +/*IMPORT_C*/ void sqlite3_result_error_nomem(sqlite3_context*); +/*IMPORT_C*/ void sqlite3_result_int(sqlite3_context*, int); +/*IMPORT_C*/ void sqlite3_result_int64(sqlite3_context*, sqlite3_int64); +/*IMPORT_C*/ void sqlite3_result_null(sqlite3_context*); +/*IMPORT_C*/ void sqlite3_result_text(sqlite3_context*, const char*, int, void(*)(void*)); +/*IMPORT_C*/ void sqlite3_result_text16(sqlite3_context*, const void*, int, void(*)(void*)); +/*IMPORT_C*/ void sqlite3_result_text16le(sqlite3_context*, const void*, int,void(*)(void*)); +/*IMPORT_C*/ void sqlite3_result_text16be(sqlite3_context*, const void*, int,void(*)(void*)); +/*IMPORT_C*/ void sqlite3_result_value(sqlite3_context*, sqlite3_value*); +/*IMPORT_C*/ void sqlite3_result_zeroblob(sqlite3_context*, int n); + +/* +** CAPI3REF: Define New Collating Sequences {F16600} +** +** {F16601} +** These functions are used to add new collation sequences to the +** [sqlite3*] handle specified as the first argument. +** +** {F16602} +** The name of the new collation sequence is specified as a UTF-8 string +** for sqlite3_create_collation() and sqlite3_create_collation_v2() +** and a UTF-16 string for sqlite3_create_collation16(). {F16603} In all cases +** the name is passed as the second function argument. +** +** {F16604} +** The third argument may be one of the constants [SQLITE_UTF8], +** [SQLITE_UTF16LE] or [SQLITE_UTF16BE], indicating that the user-supplied +** routine expects to be passed pointers to strings encoded using UTF-8, +** UTF-16 little-endian or UTF-16 big-endian respectively. {F16605} The +** third argument might also be [SQLITE_UTF16_ALIGNED] to indicate that +** the routine expects pointers to 16-bit word aligned strings +** of UTF16 in the native byte order of the host computer. +** +** {F16607} +** A pointer to the user supplied routine must be passed as the fifth +** argument. {F16609} If it is NULL, this is the same as deleting the collation +** sequence (so that SQLite cannot call it anymore). +** {F16611} Each time the application +** supplied function is invoked, it is passed a copy of the void* passed as +** the fourth argument to sqlite3_create_collation() or +** sqlite3_create_collation16() as its first parameter. +** +** {F16612} +** The remaining arguments to the application-supplied routine are two strings, +** each represented by a [length, data] pair and encoded in the encoding +** that was passed as the third argument when the collation sequence was +** registered. {END} The application defined collation routine should +** return negative, zero or positive if +** the first string is less than, equal to, or greater than the second +** string. i.e. (STRING1 - STRING2). +** +** {F16615} +** The sqlite3_create_collation_v2() works like sqlite3_create_collation() +** excapt that it takes an extra argument which is a destructor for +** the collation. {F16617} The destructor is called when the collation is +** destroyed and is passed a copy of the fourth parameter void* pointer +** of the sqlite3_create_collation_v2(). +** {F16618} Collations are destroyed when +** they are overridden by later calls to the collation creation functions +** or when the [sqlite3*] database handle is closed using [sqlite3_close()]. +*/ +/*IMPORT_C*/ int sqlite3_create_collation( + sqlite3*, + const char *zName, + int eTextRep, + void*, + int(*xCompare)(void*,int,const void*,int,const void*) +); +/*IMPORT_C*/ int sqlite3_create_collation_v2( + sqlite3*, + const char *zName, + int eTextRep, + void*, + int(*xCompare)(void*,int,const void*,int,const void*), + void(*xDestroy)(void*) +); +/*IMPORT_C*/ int sqlite3_create_collation16( + sqlite3*, + const char *zName, + int eTextRep, + void*, + int(*xCompare)(void*,int,const void*,int,const void*) +); + +/* +** CAPI3REF: Collation Needed Callbacks {F16700} +** +** {F16701} +** To avoid having to register all collation sequences before a database +** can be used, a single callback function may be registered with the +** database handle to be called whenever an undefined collation sequence is +** required. +** +** {F16702} +** If the function is registered using the sqlite3_collation_needed() API, +** then it is passed the names of undefined collation sequences as strings +** encoded in UTF-8. {F16703} If sqlite3_collation_needed16() is used, the names +** are passed as UTF-16 in machine native byte order. {F16704} A call to either +** function replaces any existing callback. +** +** {F16705} When the callback is invoked, the first argument passed is a copy +** of the second argument to sqlite3_collation_needed() or +** sqlite3_collation_needed16(). {F16706} The second argument is the database +** handle. {F16707} The third argument is one of [SQLITE_UTF8], +** [SQLITE_UTF16BE], or [SQLITE_UTF16LE], indicating the most +** desirable form of the collation sequence function required. +** {F16708} The fourth parameter is the name of the +** required collation sequence. {END} +** +** The callback function should register the desired collation using +** [sqlite3_create_collation()], [sqlite3_create_collation16()], or +** [sqlite3_create_collation_v2()]. +*/ +/*IMPORT_C*/ int sqlite3_collation_needed( + sqlite3*, + void*, + void(*)(void*,sqlite3*,int eTextRep,const char*) +); +/*IMPORT_C*/ int sqlite3_collation_needed16( + sqlite3*, + void*, + void(*)(void*,sqlite3*,int eTextRep,const void*) +); + +/* +** Specify the key for an encrypted database. This routine should be +** called right after sqlite3_open(). +** +** The code to implement this API is not available in the public release +** of SQLite. +*/ +/*IMPORT_C*/ int sqlite3_key( + sqlite3 *db, /* Database to be rekeyed */ + const void *pKey, int nKey /* The key */ +); + +/* +** Change the key on an open database. If the current database is not +** encrypted, this routine will encrypt it. If pNew==0 or nNew==0, the +** database is decrypted. +** +** The code to implement this API is not available in the public release +** of SQLite. +*/ +/*IMPORT_C*/ int sqlite3_rekey( + sqlite3 *db, /* Database to be rekeyed */ + const void *pKey, int nKey /* The new key */ +); + +/* +** CAPI3REF: Suspend Execution For A Short Time {F10530} +** +** {F10531} The sqlite3_sleep() function +** causes the current thread to suspend execution +** for at least a number of milliseconds specified in its parameter. +** +** {F10532} If the operating system does not support sleep requests with +** millisecond time resolution, then the time will be rounded up to +** the nearest second. {F10533} The number of milliseconds of sleep actually +** requested from the operating system is returned. +** +** {F10534} SQLite implements this interface by calling the xSleep() +** method of the default [sqlite3_vfs] object. {END} +*/ +/*IMPORT_C*/ int sqlite3_sleep(int); + +/* +** CAPI3REF: Name Of The Folder Holding Temporary Files {F10310} +** +** If this global variable is made to point to a string which is +** the name of a folder (a.ka. directory), then all temporary files +** created by SQLite will be placed in that directory. If this variable +** is NULL pointer, then SQLite does a search for an appropriate temporary +** file directory. +** +** It is not safe to modify this variable once a database connection +** has been opened. It is intended that this variable be set once +** as part of process initialization and before any SQLite interface +** routines have been call and remain unchanged thereafter. +*/ +SQLITE_EXTERN char *sqlite3_temp_directory; + +/* +** CAPI3REF: Test To See If The Database Is In Auto-Commit Mode {F12930} +** +** {F12931} The sqlite3_get_autocommit() interfaces returns non-zero or +** zero if the given database connection is or is not in autocommit mode, +** respectively. {F12932} Autocommit mode is on +** by default. {F12933} Autocommit mode is disabled by a BEGIN statement. +** {F12934} Autocommit mode is reenabled by a COMMIT or ROLLBACK. {END} +** +** If certain kinds of errors occur on a statement within a multi-statement +** transactions (errors including [SQLITE_FULL], [SQLITE_IOERR], +** [SQLITE_NOMEM], [SQLITE_BUSY], and [SQLITE_INTERRUPT]) then the +** transaction might be rolled back automatically. {F12935} The only way to +** find out if SQLite automatically rolled back the transaction after +** an error is to use this function. {END} +** +** {U12936} If another thread changes the autocommit status of the database +** connection while this routine is running, then the return value +** is undefined. {END} +*/ +/*IMPORT_C*/ int sqlite3_get_autocommit(sqlite3*); + +/* +** CAPI3REF: Find The Database Handle Of A Prepared Statement {F13120} +** +** {F13121} The sqlite3_db_handle interface +** returns the [sqlite3*] database handle to which a +** [sqlite3_stmt | prepared statement] belongs. +** {F13122} the database handle returned by sqlite3_db_handle +** is the same database handle that was +** the first argument to the [sqlite3_prepare_v2()] or its variants +** that was used to create the statement in the first place. +*/ +/*IMPORT_C*/ sqlite3 *sqlite3_db_handle(sqlite3_stmt*); + + +/* +** CAPI3REF: Commit And Rollback Notification Callbacks {F12950} +** +** {F12951} The sqlite3_commit_hook() interface registers a callback +** function to be invoked whenever a transaction is committed. +** {F12952} Any callback set by a previous call to sqlite3_commit_hook() +** for the same database connection is overridden. +** {F12953} The sqlite3_rollback_hook() interface registers a callback +** function to be invoked whenever a transaction is committed. +** {F12954} Any callback set by a previous call to sqlite3_commit_hook() +** for the same database connection is overridden. +** {F12956} The pArg argument is passed through +** to the callback. {F12957} If the callback on a commit hook function +** returns non-zero, then the commit is converted into a rollback. +** +** {F12958} If another function was previously registered, its +** pArg value is returned. Otherwise NULL is returned. +** +** {F12959} Registering a NULL function disables the callback. +** +** {F12961} For the purposes of this API, a transaction is said to have been +** rolled back if an explicit "ROLLBACK" statement is executed, or +** an error or constraint causes an implicit rollback to occur. +** {F12962} The rollback callback is not invoked if a transaction is +** automatically rolled back because the database connection is closed. +** {F12964} The rollback callback is not invoked if a transaction is +** rolled back because a commit callback returned non-zero. +** Check on this {END} +** +** These are experimental interfaces and are subject to change. +*/ +/*IMPORT_C*/ void *sqlite3_commit_hook(sqlite3*, int(*)(void*), void*); +/*IMPORT_C*/ void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*); + +/* +** CAPI3REF: Data Change Notification Callbacks {F12970} +** +** {F12971} The sqlite3_update_hook() interface +** registers a callback function with the database connection identified by the +** first argument to be invoked whenever a row is updated, inserted or deleted. +** {F12972} Any callback set by a previous call to this function for the same +** database connection is overridden. +** +** {F12974} The second argument is a pointer to the function to invoke when a +** row is updated, inserted or deleted. +** {F12976} The first argument to the callback is +** a copy of the third argument to sqlite3_update_hook(). +** {F12977} The second callback +** argument is one of [SQLITE_INSERT], [SQLITE_DELETE] or [SQLITE_UPDATE], +** depending on the operation that caused the callback to be invoked. +** {F12978} The third and +** fourth arguments to the callback contain pointers to the database and +** table name containing the affected row. +** {F12979} The final callback parameter is +** the rowid of the row. +** {F12981} In the case of an update, this is the rowid after +** the update takes place. +** +** {F12983} The update hook is not invoked when internal system tables are +** modified (i.e. sqlite_master and sqlite_sequence). +** +** {F12984} If another function was previously registered, its pArg value +** is returned. {F12985} Otherwise NULL is returned. +*/ +/*IMPORT_C*/ void *sqlite3_update_hook( + sqlite3*, + void(*)(void *,int ,char const *,char const *,sqlite3_int64), + void* +); + +/* +** CAPI3REF: Enable Or Disable Shared Pager Cache {F10330} +** +** {F10331} +** This routine enables or disables the sharing of the database cache +** and schema data structures between connections to the same database. +** {F10332} +** Sharing is enabled if the argument is true and disabled if the argument +** is false. +** +** {F10333} Cache sharing is enabled and disabled +** for an entire process. {END} This is a change as of SQLite version 3.5.0. +** In prior versions of SQLite, sharing was +** enabled or disabled for each thread separately. +** +** {F10334} +** The cache sharing mode set by this interface effects all subsequent +** calls to [sqlite3_open()], [sqlite3_open_v2()], and [sqlite3_open16()]. +** {F10335} Existing database connections continue use the sharing mode +** that was in effect at the time they were opened. {END} +** +** Virtual tables cannot be used with a shared cache. {F10336} When shared +** cache is enabled, the [sqlite3_create_module()] API used to register +** virtual tables will always return an error. {END} +** +** {F10337} This routine returns [SQLITE_OK] if shared cache was +** enabled or disabled successfully. {F10338} An [SQLITE_ERROR | error code] +** is returned otherwise. {END} +** +** {F10339} Shared cache is disabled by default. {END} But this might change in +** future releases of SQLite. Applications that care about shared +** cache setting should set it explicitly. +*/ +/*IMPORT_C*/ int sqlite3_enable_shared_cache(int); + +/* +** CAPI3REF: Attempt To Free Heap Memory {F17340} +** +** {F17341} The sqlite3_release_memory() interface attempts to +** free N bytes of heap memory by deallocating non-essential memory +** allocations held by the database labrary. {END} Memory used +** to cache database pages to improve performance is an example of +** non-essential memory. {F16342} sqlite3_release_memory() returns +** the number of bytes actually freed, which might be more or less +** than the amount requested. +*/ +/*IMPORT_C*/ int sqlite3_release_memory(int); + +/* +** CAPI3REF: Impose A Limit On Heap Size {F17350} +** +** {F16351} The sqlite3_soft_heap_limit() interface +** places a "soft" limit on the amount of heap memory that may be allocated +** by SQLite. {F16352} If an internal allocation is requested +** that would exceed the soft heap limit, [sqlite3_release_memory()] is +** invoked one or more times to free up some space before the allocation +** is made. {END} +** +** {F16353} The limit is called "soft", because if +** [sqlite3_release_memory()] cannot +** free sufficient memory to prevent the limit from being exceeded, +** the memory is allocated anyway and the current operation proceeds. +** +** {F16354} +** A negative or zero value for N means that there is no soft heap limit and +** [sqlite3_release_memory()] will only be called when memory is exhausted. +** {F16355} The default value for the soft heap limit is zero. +** +** SQLite makes a best effort to honor the soft heap limit. +** {F16356} But if the soft heap limit cannot honored, execution will +** continue without error or notification. {END} This is why the limit is +** called a "soft" limit. It is advisory only. +** +** Prior to SQLite version 3.5.0, this routine only constrained the memory +** allocated by a single thread - the same thread in which this routine +** runs. Beginning with SQLite version 3.5.0, the soft heap limit is +** applied to all threads. {F16357} The value specified for the soft heap limit +** is an upper bound on the total memory allocation for all threads. {END} In +** version 3.5.0 there is no mechanism for limiting the heap usage for +** individual threads. +*/ +/*IMPORT_C*/ void sqlite3_soft_heap_limit(int); + +/* +** CAPI3REF: Extract Metadata About A Column Of A Table {F12850} +** +** This routine +** returns meta-data about a specific column of a specific database +** table accessible using the connection handle passed as the first function +** argument. +** +** The column is identified by the second, third and fourth parameters to +** this function. The second parameter is either the name of the database +** (i.e. "main", "temp" or an attached database) containing the specified +** table or NULL. If it is NULL, then all attached databases are searched +** for the table using the same algorithm as the database engine uses to +** resolve unqualified table references. +** +** The third and fourth parameters to this function are the table and column +** name of the desired column, respectively. Neither of these parameters +** may be NULL. +** +** Meta information is returned by writing to the memory locations passed as +** the 5th and subsequent parameters to this function. Any of these +** arguments may be NULL, in which case the corresponding element of meta +** information is ommitted. +** +**
+** Parameter     Output Type      Description
+** -----------------------------------
+**
+**   5th         const char*      Data type
+**   6th         const char*      Name of the default collation sequence 
+**   7th         int              True if the column has a NOT NULL constraint
+**   8th         int              True if the column is part of the PRIMARY KEY
+**   9th         int              True if the column is AUTOINCREMENT
+** 
+** +** +** The memory pointed to by the character pointers returned for the +** declaration type and collation sequence is valid only until the next +** call to any sqlite API function. +** +** If the specified table is actually a view, then an error is returned. +** +** If the specified column is "rowid", "oid" or "_rowid_" and an +** INTEGER PRIMARY KEY column has been explicitly declared, then the output +** parameters are set for the explicitly declared column. If there is no +** explicitly declared IPK column, then the output parameters are set as +** follows: +** +**
+**     data type: "INTEGER"
+**     collation sequence: "BINARY"
+**     not null: 0
+**     primary key: 1
+**     auto increment: 0
+** 
+** +** This function may load one or more schemas from database files. If an +** error occurs during this process, or if the requested table or column +** cannot be found, an SQLITE error code is returned and an error message +** left in the database handle (to be retrieved using sqlite3_errmsg()). +** +** This API is only available if the library was compiled with the +** SQLITE_ENABLE_COLUMN_METADATA preprocessor symbol defined. +*/ +/*IMPORT_C*/ int sqlite3_table_column_metadata( + sqlite3 *db, /* Connection handle */ + const char *zDbName, /* Database name or NULL */ + const char *zTableName, /* Table name */ + const char *zColumnName, /* Column name */ + char const **pzDataType, /* OUTPUT: Declared data type */ + char const **pzCollSeq, /* OUTPUT: Collation sequence name */ + int *pNotNull, /* OUTPUT: True if NOT NULL constraint exists */ + int *pPrimaryKey, /* OUTPUT: True if column part of PK */ + int *pAutoinc /* OUTPUT: True if column is auto-increment */ +); + +/* +** CAPI3REF: Load An Extension {F12600} +** +** {F12601} The sqlite3_load_extension() interface +** attempts to load an SQLite extension library contained in the file +** zFile. {F12602} The entry point is zProc. {F12603} zProc may be 0 +** in which case the name of the entry point defaults +** to "sqlite3_extension_init". +** +** {F12604} The sqlite3_load_extension() interface shall +** return [SQLITE_OK] on success and [SQLITE_ERROR] if something goes wrong. +** +** {F12605} +** If an error occurs and pzErrMsg is not 0, then the +** sqlite3_load_extension() interface shall attempt to fill *pzErrMsg with +** error message text stored in memory obtained from [sqlite3_malloc()]. +** {END} The calling function should free this memory +** by calling [sqlite3_free()]. +** +** {F12606} +** Extension loading must be enabled using [sqlite3_enable_load_extension()] +** prior to calling this API or an error will be returned. +*/ +/*IMPORT_C*/ int sqlite3_load_extension( + sqlite3 *db, /* Load the extension into this database connection */ + const char *zFile, /* Name of the shared library containing extension */ + const char *zProc, /* Entry point. Derived from zFile if 0 */ + char **pzErrMsg /* Put error message here if not 0 */ +); + +/* +** CAPI3REF: Enable Or Disable Extension Loading {F12620} +** +** So as not to open security holes in older applications that are +** unprepared to deal with extension loading, and as a means of disabling +** extension loading while evaluating user-entered SQL, the following +** API is provided to turn the [sqlite3_load_extension()] mechanism on and +** off. {F12622} It is off by default. {END} See ticket #1863. +** +** {F12621} Call the sqlite3_enable_load_extension() routine +** with onoff==1 to turn extension loading on +** and call it with onoff==0 to turn it back off again. {END} +*/ +/*IMPORT_C*/ int sqlite3_enable_load_extension(sqlite3 *db, int onoff); + +/* +** CAPI3REF: Make Arrangements To Automatically Load An Extension {F12640} +** +** {F12641} This function +** registers an extension entry point that is automatically invoked +** whenever a new database connection is opened using +** [sqlite3_open()], [sqlite3_open16()], or [sqlite3_open_v2()]. {END} +** +** This API can be invoked at program startup in order to register +** one or more statically linked extensions that will be available +** to all new database connections. +** +** {F12642} Duplicate extensions are detected so calling this routine multiple +** times with the same extension is harmless. +** +** {F12643} This routine stores a pointer to the extension in an array +** that is obtained from sqlite_malloc(). {END} If you run a memory leak +** checker on your program and it reports a leak because of this +** array, then invoke [sqlite3_reset_auto_extension()] prior +** to shutdown to free the memory. +** +** {F12644} Automatic extensions apply across all threads. {END} +** +** This interface is experimental and is subject to change or +** removal in future releases of SQLite. +*/ +/*IMPORT_C*/ int sqlite3_auto_extension(void *xEntryPoint); + + +/* +** CAPI3REF: Reset Automatic Extension Loading {F12660} +** +** {F12661} This function disables all previously registered +** automatic extensions. {END} This +** routine undoes the effect of all prior [sqlite3_automatic_extension()] +** calls. +** +** {F12662} This call disabled automatic extensions in all threads. {END} +** +** This interface is experimental and is subject to change or +** removal in future releases of SQLite. +*/ +/*IMPORT_C*/ void sqlite3_reset_auto_extension(void); + + +/* +****** EXPERIMENTAL - subject to change without notice ************** +** +** The interface to the virtual-table mechanism is currently considered +** to be experimental. The interface might change in incompatible ways. +** If this is a problem for you, do not use the interface at this time. +** +** When the virtual-table mechanism stablizes, we will declare the +** interface fixed, support it indefinitely, and remove this comment. +*/ + +/* +** Structures used by the virtual table interface +*/ +typedef struct sqlite3_vtab sqlite3_vtab; +typedef struct sqlite3_index_info sqlite3_index_info; +typedef struct sqlite3_vtab_cursor sqlite3_vtab_cursor; +typedef struct sqlite3_module sqlite3_module; + +/* +** A module is a class of virtual tables. Each module is defined +** by an instance of the following structure. This structure consists +** mostly of methods for the module. +*/ +struct sqlite3_module { + int iVersion; + int (*xCreate)(sqlite3*, void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVTab, char**); + int (*xConnect)(sqlite3*, void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVTab, char**); + int (*xBestIndex)(sqlite3_vtab *pVTab, sqlite3_index_info*); + int (*xDisconnect)(sqlite3_vtab *pVTab); + int (*xDestroy)(sqlite3_vtab *pVTab); + int (*xOpen)(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor); + int (*xClose)(sqlite3_vtab_cursor*); + int (*xFilter)(sqlite3_vtab_cursor*, int idxNum, const char *idxStr, + int argc, sqlite3_value **argv); + int (*xNext)(sqlite3_vtab_cursor*); + int (*xEof)(sqlite3_vtab_cursor*); + int (*xColumn)(sqlite3_vtab_cursor*, sqlite3_context*, int); + int (*xRowid)(sqlite3_vtab_cursor*, sqlite3_int64 *pRowid); + int (*xUpdate)(sqlite3_vtab *, int, sqlite3_value **, sqlite3_int64 *); + int (*xBegin)(sqlite3_vtab *pVTab); + int (*xSync)(sqlite3_vtab *pVTab); + int (*xCommit)(sqlite3_vtab *pVTab); + int (*xRollback)(sqlite3_vtab *pVTab); + int (*xFindFunction)(sqlite3_vtab *pVtab, int nArg, const char *zName, + void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), + void **ppArg); + + int (*xRename)(sqlite3_vtab *pVtab, const char *zNew); +}; + +/* +** The sqlite3_index_info structure and its substructures is used to +** pass information into and receive the reply from the xBestIndex +** method of an sqlite3_module. The fields under **Inputs** are the +** inputs to xBestIndex and are read-only. xBestIndex inserts its +** results into the **Outputs** fields. +** +** The aConstraint[] array records WHERE clause constraints of the +** form: +** +** column OP expr +** +** Where OP is =, <, <=, >, or >=. +** The particular operator is stored +** in aConstraint[].op. The index of the column is stored in +** aConstraint[].iColumn. aConstraint[].usable is TRUE if the +** expr on the right-hand side can be evaluated (and thus the constraint +** is usable) and false if it cannot. +** +** The optimizer automatically inverts terms of the form "expr OP column" +** and makes other simplifications to the WHERE clause in an attempt to +** get as many WHERE clause terms into the form shown above as possible. +** The aConstraint[] array only reports WHERE clause terms in the correct +** form that refer to the particular virtual table being queried. +** +** Information about the ORDER BY clause is stored in aOrderBy[]. +** Each term of aOrderBy records a column of the ORDER BY clause. +** +** The xBestIndex method must fill aConstraintUsage[] with information +** about what parameters to pass to xFilter. If argvIndex>0 then +** the right-hand side of the corresponding aConstraint[] is evaluated +** and becomes the argvIndex-th entry in argv. If aConstraintUsage[].omit +** is true, then the constraint is assumed to be fully handled by the +** virtual table and is not checked again by SQLite. +** +** The idxNum and idxPtr values are recorded and passed into xFilter. +** sqlite3_free() is used to free idxPtr if needToFreeIdxPtr is true. +** +** The orderByConsumed means that output from xFilter will occur in +** the correct order to satisfy the ORDER BY clause so that no separate +** sorting step is required. +** +** The estimatedCost value is an estimate of the cost of doing the +** particular lookup. A full scan of a table with N entries should have +** a cost of N. A binary search of a table of N entries should have a +** cost of approximately log(N). +*/ +struct sqlite3_index_info { + /* Inputs */ + int nConstraint; /* Number of entries in aConstraint */ + struct sqlite3_index_constraint { + int iColumn; /* Column on left-hand side of constraint */ + unsigned char op; /* Constraint operator */ + unsigned char usable; /* True if this constraint is usable */ + int iTermOffset; /* Used internally - xBestIndex should ignore */ + } *aConstraint; /* Table of WHERE clause constraints */ + int nOrderBy; /* Number of terms in the ORDER BY clause */ + struct sqlite3_index_orderby { + int iColumn; /* Column number */ + unsigned char desc; /* True for DESC. False for ASC. */ + } *aOrderBy; /* The ORDER BY clause */ + + /* Outputs */ + struct sqlite3_index_constraint_usage { + int argvIndex; /* if >0, constraint is part of argv to xFilter */ + unsigned char omit; /* Do not code a test for this constraint */ + } *aConstraintUsage; + int idxNum; /* Number used to identify the index */ + char *idxStr; /* String, possibly obtained from sqlite3_malloc */ + int needToFreeIdxStr; /* Free idxStr using sqlite3_free() if true */ + int orderByConsumed; /* True if output is already ordered */ + double estimatedCost; /* Estimated cost of using this index */ +}; +#define SQLITE_INDEX_CONSTRAINT_EQ 2 +#define SQLITE_INDEX_CONSTRAINT_GT 4 +#define SQLITE_INDEX_CONSTRAINT_LE 8 +#define SQLITE_INDEX_CONSTRAINT_LT 16 +#define SQLITE_INDEX_CONSTRAINT_GE 32 +#define SQLITE_INDEX_CONSTRAINT_MATCH 64 + +/* +** This routine is used to register a new module name with an SQLite +** connection. Module names must be registered before creating new +** virtual tables on the module, or before using preexisting virtual +** tables of the module. +*/ +/*IMPORT_C*/ int sqlite3_create_module( + sqlite3 *db, /* SQLite connection to register module with */ + const char *zName, /* Name of the module */ + const sqlite3_module *, /* Methods for the module */ + void * /* Client data for xCreate/xConnect */ +); + +/* +** This routine is identical to the sqlite3_create_module() method above, +** except that it allows a destructor function to be specified. It is +** even more experimental than the rest of the virtual tables API. +*/ +/*IMPORT_C*/ int sqlite3_create_module_v2( + sqlite3 *db, /* SQLite connection to register module with */ + const char *zName, /* Name of the module */ + const sqlite3_module *, /* Methods for the module */ + void *, /* Client data for xCreate/xConnect */ + void(*xDestroy)(void*) /* Module destructor function */ +); + +/* +** Every module implementation uses a subclass of the following structure +** to describe a particular instance of the module. Each subclass will +** be tailored to the specific needs of the module implementation. The +** purpose of this superclass is to define certain fields that are common +** to all module implementations. +** +** Virtual tables methods can set an error message by assigning a +** string obtained from sqlite3_mprintf() to zErrMsg. The method should +** take care that any prior string is freed by a call to sqlite3_free() +** prior to assigning a new string to zErrMsg. After the error message +** is delivered up to the client application, the string will be automatically +** freed by sqlite3_free() and the zErrMsg field will be zeroed. Note +** that sqlite3_mprintf() and sqlite3_free() are used on the zErrMsg field +** since virtual tables are commonly implemented in loadable extensions which +** do not have access to sqlite3MPrintf() or sqlite3Free(). +*/ +struct sqlite3_vtab { + const sqlite3_module *pModule; /* The module for this virtual table */ + int nRef; /* Used internally */ + char *zErrMsg; /* Error message from sqlite3_mprintf() */ + /* Virtual table implementations will typically add additional fields */ +}; + +/* Every module implementation uses a subclass of the following structure +** to describe cursors that point into the virtual table and are used +** to loop through the virtual table. Cursors are created using the +** xOpen method of the module. Each module implementation will define +** the content of a cursor structure to suit its own needs. +** +** This superclass exists in order to define fields of the cursor that +** are common to all implementations. +*/ +struct sqlite3_vtab_cursor { + sqlite3_vtab *pVtab; /* Virtual table of this cursor */ + /* Virtual table implementations will typically add additional fields */ +}; + +/* +** The xCreate and xConnect methods of a module use the following API +** to declare the format (the names and datatypes of the columns) of +** the virtual tables they implement. +*/ +/*IMPORT_C*/ int sqlite3_declare_vtab(sqlite3*, const char *zCreateTable); + +/* +** Virtual tables can provide alternative implementations of functions +** using the xFindFunction method. But global versions of those functions +** must exist in order to be overloaded. +** +** This API makes sure a global version of a function with a particular +** name and number of parameters exists. If no such function exists +** before this API is called, a new function is created. The implementation +** of the new function always causes an exception to be thrown. So +** the new function is not good for anything by itself. Its only +** purpose is to be a place-holder function that can be overloaded +** by virtual tables. +** +** This API should be considered part of the virtual table interface, +** which is experimental and subject to change. +*/ +/*IMPORT_C*/ int sqlite3_overload_function(sqlite3*, const char *zFuncName, int nArg); + +/* +** The interface to the virtual-table mechanism defined above (back up +** to a comment remarkably similar to this one) is currently considered +** to be experimental. The interface might change in incompatible ways. +** If this is a problem for you, do not use the interface at this time. +** +** When the virtual-table mechanism stabilizes, we will declare the +** interface fixed, support it indefinitely, and remove this comment. +** +****** EXPERIMENTAL - subject to change without notice ************** +*/ + +/* +** CAPI3REF: A Handle To An Open BLOB {F17800} +** +** An instance of the following opaque structure is used to +** represent an blob-handle. A blob-handle is created by +** [sqlite3_blob_open()] and destroyed by [sqlite3_blob_close()]. +** The [sqlite3_blob_read()] and [sqlite3_blob_write()] interfaces +** can be used to read or write small subsections of the blob. +** The [sqlite3_blob_bytes()] interface returns the size of the +** blob in bytes. +*/ +typedef struct sqlite3_blob sqlite3_blob; + +/* +** CAPI3REF: Open A BLOB For Incremental I/O {F17810} +** +** {F17811} This interfaces opens a handle to the blob located +** in row iRow,, column zColumn, table zTable in database zDb; +** in other words, the same blob that would be selected by: +** +**
+**     SELECT zColumn FROM zDb.zTable WHERE rowid = iRow;
+** 
{END} +** +** {F17812} If the flags parameter is non-zero, the blob is opened for +** read and write access. If it is zero, the blob is opened for read +** access. {END} +** +** {F17813} On success, [SQLITE_OK] is returned and the new +** [sqlite3_blob | blob handle] is written to *ppBlob. +** {F17814} Otherwise an error code is returned and +** any value written to *ppBlob should not be used by the caller. +** {F17815} This function sets the database-handle error code and message +** accessible via [sqlite3_errcode()] and [sqlite3_errmsg()]. +** We should go through and mark all interfaces that behave this +** way with a similar statement +*/ +/*IMPORT_C*/ int sqlite3_blob_open( + sqlite3*, + const char *zDb, + const char *zTable, + const char *zColumn, + sqlite3_int64 iRow, + int flags, + sqlite3_blob **ppBlob +); + +/* +** CAPI3REF: Close A BLOB Handle {F17830} +** +** Close an open [sqlite3_blob | blob handle]. +** +** {F17831} Closing a BLOB shall cause the current transaction to commit +** if there are no other BLOBs, no pending prepared statements, and the +** database connection is in autocommit mode. +** {F17832} If any writes were made to the BLOB, they might be held in cache +** until the close operation if they will fit. {END} +** Closing the BLOB often forces the changes +** out to disk and so if any I/O errors occur, they will likely occur +** at the time when the BLOB is closed. {F17833} Any errors that occur during +** closing are reported as a non-zero return value. +** +** {F17839} The BLOB is closed unconditionally. Even if this routine returns +** an error code, the BLOB is still closed. +*/ +/*IMPORT_C*/ int sqlite3_blob_close(sqlite3_blob *); + +/* +** CAPI3REF: Return The Size Of An Open BLOB {F17805} +** +** {F16806} Return the size in bytes of the blob accessible via the open +** [sqlite3_blob | blob-handle] passed as an argument. +*/ +/*IMPORT_C*/ int sqlite3_blob_bytes(sqlite3_blob *); + +/* +** CAPI3REF: Read Data From A BLOB Incrementally {F17850} +** +** This function is used to read data from an open +** [sqlite3_blob | blob-handle] into a caller supplied buffer. +** {F17851} n bytes of data are copied into buffer +** z from the open blob, starting at offset iOffset. +** +** {F17852} If offset iOffset is less than n bytes from the end of the blob, +** [SQLITE_ERROR] is returned and no data is read. {F17853} If n is +** less than zero [SQLITE_ERROR] is returned and no data is read. +** +** {F17854} On success, SQLITE_OK is returned. Otherwise, an +** [SQLITE_ERROR | SQLite error code] or an +** [SQLITE_IOERR_READ | extended error code] is returned. +*/ +/*IMPORT_C*/ int sqlite3_blob_read(sqlite3_blob *, void *z, int n, int iOffset); + +/* +** CAPI3REF: Write Data Into A BLOB Incrementally {F17870} +** +** This function is used to write data into an open +** [sqlite3_blob | blob-handle] from a user supplied buffer. +** {F17871} n bytes of data are copied from the buffer +** pointed to by z into the open blob, starting at offset iOffset. +** +** {F17872} If the [sqlite3_blob | blob-handle] passed as the first argument +** was not opened for writing (the flags parameter to [sqlite3_blob_open()] +*** was zero), this function returns [SQLITE_READONLY]. +** +** {F17873} This function may only modify the contents of the blob; it is +** not possible to increase the size of a blob using this API. +** {F17874} If offset iOffset is less than n bytes from the end of the blob, +** [SQLITE_ERROR] is returned and no data is written. {F17875} If n is +** less than zero [SQLITE_ERROR] is returned and no data is written. +** +** {F17876} On success, SQLITE_OK is returned. Otherwise, an +** [SQLITE_ERROR | SQLite error code] or an +** [SQLITE_IOERR_READ | extended error code] is returned. +*/ +/*IMPORT_C*/ int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOffset); + +/* +** CAPI3REF: Virtual File System Objects {F11200} +** +** A virtual filesystem (VFS) is an [sqlite3_vfs] object +** that SQLite uses to interact +** with the underlying operating system. Most builds come with a +** single default VFS that is appropriate for the host computer. +** New VFSes can be registered and existing VFSes can be unregistered. +** The following interfaces are provided. +** +** {F11201} The sqlite3_vfs_find() interface returns a pointer to +** a VFS given its name. {F11202} Names are case sensitive. +** {F11203} Names are zero-terminated UTF-8 strings. +** {F11204} If there is no match, a NULL +** pointer is returned. {F11205} If zVfsName is NULL then the default +** VFS is returned. {END} +** +** {F11210} New VFSes are registered with sqlite3_vfs_register(). +** {F11211} Each new VFS becomes the default VFS if the makeDflt flag is set. +** {F11212} The same VFS can be registered multiple times without injury. +** {F11213} To make an existing VFS into the default VFS, register it again +** with the makeDflt flag set. {U11214} If two different VFSes with the +** same name are registered, the behavior is undefined. {U11215} If a +** VFS is registered with a name that is NULL or an empty string, +** then the behavior is undefined. +** +** {F11220} Unregister a VFS with the sqlite3_vfs_unregister() interface. +** {F11221} If the default VFS is unregistered, another VFS is chosen as +** the default. The choice for the new VFS is arbitrary. +*/ +/*IMPORT_C*/ sqlite3_vfs *sqlite3_vfs_find(const char *zVfsName); +/*IMPORT_C*/ int sqlite3_vfs_register(sqlite3_vfs*, int makeDflt); +/*IMPORT_C*/ int sqlite3_vfs_unregister(sqlite3_vfs*); + +/* +** CAPI3REF: Mutexes {F17000} +** +** The SQLite core uses these routines for thread +** synchronization. Though they are intended for internal +** use by SQLite, code that links against SQLite is +** permitted to use any of these routines. +** +** The SQLite source code contains multiple implementations +** of these mutex routines. An appropriate implementation +** is selected automatically at compile-time. The following +** implementations are available in the SQLite core: +** +**
    +**
  • SQLITE_MUTEX_OS2 +**
  • SQLITE_MUTEX_PTHREAD +**
  • SQLITE_MUTEX_W32 +**
  • SQLITE_MUTEX_NOOP +**
+** +** The SQLITE_MUTEX_NOOP implementation is a set of routines +** that does no real locking and is appropriate for use in +** a single-threaded application. The SQLITE_MUTEX_OS2, +** SQLITE_MUTEX_PTHREAD, and SQLITE_MUTEX_W32 implementations +** are appropriate for use on os/2, unix, and windows. +** +** If SQLite is compiled with the SQLITE_MUTEX_APPDEF preprocessor +** macro defined (with "-DSQLITE_MUTEX_APPDEF=1"), then no mutex +** implementation is included with the library. The +** mutex interface routines defined here become external +** references in the SQLite library for which implementations +** must be provided by the application. This facility allows an +** application that links against SQLite to provide its own mutex +** implementation without having to modify the SQLite core. +** +** {F17011} The sqlite3_mutex_alloc() routine allocates a new +** mutex and returns a pointer to it. {F17012} If it returns NULL +** that means that a mutex could not be allocated. {F17013} SQLite +** will unwind its stack and return an error. {F17014} The argument +** to sqlite3_mutex_alloc() is one of these integer constants: +** +**
    +**
  • SQLITE_MUTEX_FAST +**
  • SQLITE_MUTEX_RECURSIVE +**
  • SQLITE_MUTEX_STATIC_MASTER +**
  • SQLITE_MUTEX_STATIC_MEM +**
  • SQLITE_MUTEX_STATIC_MEM2 +**
  • SQLITE_MUTEX_STATIC_PRNG +**
  • SQLITE_MUTEX_STATIC_LRU +**
{END} +** +** {F17015} The first two constants cause sqlite3_mutex_alloc() to create +** a new mutex. The new mutex is recursive when SQLITE_MUTEX_RECURSIVE +** is used but not necessarily so when SQLITE_MUTEX_FAST is used. {END} +** The mutex implementation does not need to make a distinction +** between SQLITE_MUTEX_RECURSIVE and SQLITE_MUTEX_FAST if it does +** not want to. {F17016} But SQLite will only request a recursive mutex in +** cases where it really needs one. {END} If a faster non-recursive mutex +** implementation is available on the host platform, the mutex subsystem +** might return such a mutex in response to SQLITE_MUTEX_FAST. +** +** {F17017} The other allowed parameters to sqlite3_mutex_alloc() each return +** a pointer to a static preexisting mutex. {END} Four static mutexes are +** used by the current version of SQLite. Future versions of SQLite +** may add additional static mutexes. Static mutexes are for internal +** use by SQLite only. Applications that use SQLite mutexes should +** use only the dynamic mutexes returned by SQLITE_MUTEX_FAST or +** SQLITE_MUTEX_RECURSIVE. +** +** {F17018} Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST +** or SQLITE_MUTEX_RECURSIVE) is used then sqlite3_mutex_alloc() +** returns a different mutex on every call. {F17034} But for the static +** mutex types, the same mutex is returned on every call that has +** the same type number. {END} +** +** {F17019} The sqlite3_mutex_free() routine deallocates a previously +** allocated dynamic mutex. {F17020} SQLite is careful to deallocate every +** dynamic mutex that it allocates. {U17021} The dynamic mutexes must not be in +** use when they are deallocated. {U17022} Attempting to deallocate a static +** mutex results in undefined behavior. {F17023} SQLite never deallocates +** a static mutex. {END} +** +** The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt +** to enter a mutex. {F17024} If another thread is already within the mutex, +** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return +** SQLITE_BUSY. {F17025} The sqlite3_mutex_try() interface returns SQLITE_OK +** upon successful entry. {F17026} Mutexes created using +** SQLITE_MUTEX_RECURSIVE can be entered multiple times by the same thread. +** {F17027} In such cases the, +** mutex must be exited an equal number of times before another thread +** can enter. {U17028} If the same thread tries to enter any other +** kind of mutex more than once, the behavior is undefined. +** {F17029} SQLite will never exhibit +** such behavior in its own use of mutexes. {END} +** +** Some systems (ex: windows95) do not the operation implemented by +** sqlite3_mutex_try(). On those systems, sqlite3_mutex_try() will +** always return SQLITE_BUSY. {F17030} The SQLite core only ever uses +** sqlite3_mutex_try() as an optimization so this is acceptable behavior. {END} +** +** {F17031} The sqlite3_mutex_leave() routine exits a mutex that was +** previously entered by the same thread. {U17032} The behavior +** is undefined if the mutex is not currently entered by the +** calling thread or is not currently allocated. {F17033} SQLite will +** never do either. {END} +** +** See also: [sqlite3_mutex_held()] and [sqlite3_mutex_notheld()]. +*/ +/*IMPORT_C*/ sqlite3_mutex *sqlite3_mutex_alloc(int); +/*IMPORT_C*/ void sqlite3_mutex_free(sqlite3_mutex*); +/*IMPORT_C*/ void sqlite3_mutex_enter(sqlite3_mutex*); +/*IMPORT_C*/ int sqlite3_mutex_try(sqlite3_mutex*); +/*IMPORT_C*/ void sqlite3_mutex_leave(sqlite3_mutex*); + +/* +** CAPI3REF: Mutex Verifcation Routines {F17080} +** +** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routines +** are intended for use inside assert() statements. {F17081} The SQLite core +** never uses these routines except inside an assert() and applications +** are advised to follow the lead of the core. {F17082} The core only +** provides implementations for these routines when it is compiled +** with the SQLITE_DEBUG flag. {U17087} External mutex implementations +** are only required to provide these routines if SQLITE_DEBUG is +** defined and if NDEBUG is not defined. +** +** {F17083} These routines should return true if the mutex in their argument +** is held or not held, respectively, by the calling thread. {END} +** +** {X17084} The implementation is not required to provided versions of these +** routines that actually work. +** If the implementation does not provide working +** versions of these routines, it should at least provide stubs +** that always return true so that one does not get spurious +** assertion failures. {END} +** +** {F17085} If the argument to sqlite3_mutex_held() is a NULL pointer then +** the routine should return 1. {END} This seems counter-intuitive since +** clearly the mutex cannot be held if it does not exist. But the +** the reason the mutex does not exist is because the build is not +** using mutexes. And we do not want the assert() containing the +** call to sqlite3_mutex_held() to fail, so a non-zero return is +** the appropriate thing to do. {F17086} The sqlite3_mutex_notheld() +** interface should also return 1 when given a NULL pointer. +*/ +/*IMPORT_C*/ int sqlite3_mutex_held(sqlite3_mutex*); +/*IMPORT_C*/ int sqlite3_mutex_notheld(sqlite3_mutex*); + +/* +** CAPI3REF: Mutex Types {F17001} +** +** {F17002} The [sqlite3_mutex_alloc()] interface takes a single argument +** which is one of these integer constants. {END} +*/ +#define SQLITE_MUTEX_FAST 0 +#define SQLITE_MUTEX_RECURSIVE 1 +#define SQLITE_MUTEX_STATIC_MASTER 2 +#define SQLITE_MUTEX_STATIC_MEM 3 /* sqlite3_malloc() */ +#define SQLITE_MUTEX_STATIC_MEM2 4 /* sqlite3_release_memory() */ +#define SQLITE_MUTEX_STATIC_PRNG 5 /* sqlite3_random() */ +#define SQLITE_MUTEX_STATIC_LRU 6 /* lru page list */ + +/* +** CAPI3REF: Low-Level Control Of Database Files {F11300} +** +** {F11301} The [sqlite3_file_control()] interface makes a direct call to the +** xFileControl method for the [sqlite3_io_methods] object associated +** with a particular database identified by the second argument. {F11302} The +** name of the database is the name assigned to the database by the +** ATTACH SQL command that opened the +** database. {F11303} To control the main database file, use the name "main" +** or a NULL pointer. {F11304} The third and fourth parameters to this routine +** are passed directly through to the second and third parameters of +** the xFileControl method. {F11305} The return value of the xFileControl +** method becomes the return value of this routine. +** +** {F11306} If the second parameter (zDbName) does not match the name of any +** open database file, then SQLITE_ERROR is returned. {F11307} This error +** code is not remembered and will not be recalled by [sqlite3_errcode()] +** or [sqlite3_errmsg()]. {U11308} The underlying xFileControl method might +** also return SQLITE_ERROR. {U11309} There is no way to distinguish between +** an incorrect zDbName and an SQLITE_ERROR return from the underlying +** xFileControl method. {END} +** +** See also: [SQLITE_FCNTL_LOCKSTATE] +*/ +/*IMPORT_C*/ int sqlite3_file_control(sqlite3*, const char *zDbName, int op, void*); + +/*IMPORT_C*/ int sqlite3_openTest( + const char *zFilename +); + +/*IMPORT_C*/ int sqlite3_bind_double_ref(sqlite3_stmt *stmt, int iCol, double *val); + +/*IMPORT_C*/ int sqlite3_bind_int64_ref(sqlite3_stmt *stmt, int iCol, sqlite_int64 *val); + +/*IMPORT_C*/ void sqlite3_column_double_ref(sqlite3_stmt *stmt, int iCol, double *val); + +/*IMPORT_C*/ void sqlite3_column_int64_ref(sqlite3_stmt *stmt, int iCol, sqlite_int64 *val); + +/*IMPORT_C*/ unsigned int sqlite3_strlen(char *ptr); + +/* +** Undo the hack that converts floating point types to integer for +** builds on processors without floating point support. +*/ +#ifdef SQLITE_OMIT_FLOATING_POINT +# undef double +#endif + +#ifdef __cplusplus +} /* End of the 'extern "C"' block */ +#endif +#endif diff -r 9569ea080d5a -r 4d230e702aa3 engine/src/ConnectionEngine.cpp --- a/engine/src/ConnectionEngine.cpp Thu Mar 11 20:53:00 2010 +0100 +++ b/engine/src/ConnectionEngine.cpp Tue Apr 27 19:26:48 2010 +0100 @@ -64,7 +64,7 @@ } iConnectionState = iStatus.Int() == KErrNone?CConnectionEngine::EConnected:CConnectionEngine::ENotConnected; - ReportConnection( iStatus.Int() ); + ReportConnectionL( iStatus.Int() ); } void CConnectionEngine::DoCancel() @@ -272,7 +272,7 @@ } -void CConnectionEngine::ReportConnection(TInt aError) +void CConnectionEngine::ReportConnectionL(TInt aError) { TInt noObservers = iObserverArray.Count(); while(noObservers) diff -r 9569ea080d5a -r 4d230e702aa3 engine/src/FeedEngine.cpp --- a/engine/src/FeedEngine.cpp Thu Mar 11 20:53:00 2010 +0100 +++ b/engine/src/FeedEngine.cpp Tue Apr 27 19:26:48 2010 +0100 @@ -26,15 +26,9 @@ #include "OpmlParser.h" #include "PodcastUtils.h" #include +#include "Podcatcher.pan" -// Cleanup stack macro for SQLite3 -// TODO Move this to some common place. -static void Cleanup_sqlite3_finalize_wrapper(TAny* handle) - { - sqlite3_finalize(static_cast(handle)); - } -#define Cleanup_sqlite3_finalize_PushL(__handle) CleanupStack::PushL(TCleanupItem(&Cleanup_sqlite3_finalize_wrapper, __handle)) - +_LIT(KFeedParseStorePath, "feeds\\"); CFeedEngine* CFeedEngine::NewL(CPodcastModel& aPodcastModel) { @@ -52,27 +46,41 @@ iFeedClient = CHttpClient::NewL(iPodcastModel, *this); iFeedTimer.ConstructL(); - RunFeedTimer(); + TInt err = KErrNone; + TInt feedCount = 0; - if (DBGetFeedCount() > 0) + TRAP(err, feedCount = DBGetFeedCountL()); + if (err == KErrNone && feedCount > 0) { DP("Loading feeds from DB"); - DBLoadFeedsL(); - } + TRAP(err, DBLoadFeedsL()); + } + - if (iPodcastModel.IsFirstStartup()) { + if (err != KErrNone || iPodcastModel.IsFirstStartup()) { TFileName defaultFile = iPodcastModel.SettingsEngine().DefaultFeedsFileName(); DP1("Loading default feeds from %S", &defaultFile); if (BaflUtils::FileExists(iPodcastModel.FsSession(), defaultFile)) { ImportFeedsL(defaultFile); } - } + } + + // clean out feeds temp directory + TFileName feedTempPath; + feedTempPath.Copy (iPodcastModel.SettingsEngine().PrivatePath ()); + feedTempPath.Append(KFeedParseStorePath); + feedTempPath.Append(_L("*")); + + BaflUtils::EnsurePathExistsL(iPodcastModel.FsSession(), feedTempPath); + BaflUtils::DeleteFile(iPodcastModel.FsSession(),feedTempPath); TFileName importFile = iPodcastModel.SettingsEngine().ImportFeedsFileName(); if (BaflUtils::FileExists(iPodcastModel.FsSession(), importFile)) { DP("Importing feeds"); - ImportFeedsL(importFile); + TRAP_IGNORE(ImportFeedsL(importFile)); } + + RunFeedTimer(); } CFeedEngine::CFeedEngine(CPodcastModel& aPodcastModel) @@ -148,7 +156,7 @@ TInt cnt = iSortedFeeds.Count(); for (int i=0;iUid()); } UpdateNextFeedL(); @@ -168,20 +176,31 @@ { DP1("UpdateNextFeed. %d feeds left to update", iFeedsUpdating.Count()); + // reset active feed, will be set again in UpdateFeedL if needed + iActiveFeed = NULL; + if (iFeedsUpdating.Count() > 0) { - CFeedInfo *info = iFeedsUpdating[0]; + CFeedInfo *info = GetFeedInfoByUid(iFeedsUpdating[0]); iFeedsUpdating.Remove(0); - TBool result = EFalse; - //DP2("** UpdateNextFeed: %S, ID: %u", &(info->Url()), info->Uid()); - TRAPD(error, result = UpdateFeedL(info->Uid())); - if (error != KErrNone || !result) + if (info == NULL) + { + UpdateNextFeedL(); + } + else { - DP("Error while updating all feeds"); - for (TInt i=0;iUrl()), info->Uid()); + TRAPD(error, result = UpdateFeedL(info->Uid())); + + if (error != KErrNone || !result) { - TRAP_IGNORE(iObservers[i]->FeedUpdateAllCompleteL(iAutoUpdatedInitiator?MFeedEngineObserver::EFeedAutoUpdate:MFeedEngineObserver::EFeedManualUpdate)); + DP("Error while updating all feeds"); + for (TInt i=0;iFeedUpdateAllCompleteL(iAutoUpdatedInitiator?MFeedEngineObserver::EFeedAutoUpdate:MFeedEngineObserver::EFeedManualUpdate)); + } } } } @@ -198,31 +217,42 @@ EXPORT_C TBool CFeedEngine::UpdateFeedL(TUint aFeedUid) { DP("FeedEngine::UpdateFeedL BEGIN"); + + if (iActiveFeed) + { + User::Leave(KErrInUse); + } + iActiveFeed = GetFeedInfoByUid(aFeedUid); - iCatchupCounter = 0; + iCancelRequested = EFalse; if (iActiveFeed->LastUpdated() == 0) { iCatchupMode = ETrue; + iCatchupCounter = 0; } iActiveFeed->SetLastError(KErrNone); - DBUpdateFeed(*iActiveFeed); + DBUpdateFeedL(*iActiveFeed); iUpdatingFeedFileName.Copy (iPodcastModel.SettingsEngine().PrivatePath ()); + iUpdatingFeedFileName.Append(KFeedParseStorePath); + BaflUtils::EnsurePathExistsL(iPodcastModel.FsSession(), iUpdatingFeedFileName); + _LIT(KFileNameFormat, "%lu.xml"); iUpdatingFeedFileName.AppendFormat(KFileNameFormat, aFeedUid); + iClientState = EUpdatingFeed; + + for (TInt i=0;iFeedDownloadStartedL(iAutoUpdatedInitiator?MFeedEngineObserver::EFeedAutoUpdate:MFeedEngineObserver::EFeedManualUpdate, iActiveFeed->Uid())); + } + if(iFeedClient->GetL(iActiveFeed->Url(), iUpdatingFeedFileName, iPodcastModel.SettingsEngine().SpecificIAP())) { - iClientState = EUpdatingFeed; - for (TInt i=0;iFeedDownloadStartedL(iAutoUpdatedInitiator?MFeedEngineObserver::EFeedAutoUpdate:MFeedEngineObserver::EFeedManualUpdate, iActiveFeed->Uid())); - } - DP("FeedEngine::UpdateFeedL END, return ETrue"); return ETrue; } @@ -250,9 +280,10 @@ } } - TBool isShowAdded = iPodcastModel.ShowEngine().AddShowL(aItem); + TRAPD(err, iPodcastModel.ShowEngine().AddShowL(aItem)); - if (aItem.PlayState() == ENeverPlayed && isShowAdded && iPodcastModel.SettingsEngine().DownloadAutomatically()) + if (err == KErrNone && aItem.PlayState() == ENeverPlayed && + iPodcastModel.SettingsEngine().DownloadAutomatically()) { iPodcastModel.ShowEngine().AddDownloadL(aItem); } @@ -277,7 +308,7 @@ // complete file path is base dir + rel path filePath.Append(relPath); - aFeedInfo->SetImageFileNameL(filePath); + aFeedInfo->SetImageFileNameL(filePath, NULL); if(iFeedClient->GetL(aFeedInfo->ImageUrl(), filePath, ETrue)) { @@ -309,15 +340,17 @@ return ETrue; } -TBool CFeedEngine::DBAddFeedL(const CFeedInfo& aItem) +void CFeedEngine::DBAddFeedL(const CFeedInfo& aItem) { DP2("CFeedEngine::DBAddFeed, title=%S, URL=%S", &aItem.Title(), &aItem.Url()); - CFeedInfo *info = DBGetFeedInfoByUidL(aItem.Uid()); - if (info) { - DP("Feed already exists!"); + CFeedInfo *info; + + TRAPD(err, info = DBGetFeedInfoByUidL(aItem.Uid())); + + if (err == KErrNone && info) { delete info; - return EFalse; + User::Leave(KErrAlreadyExists); } HBufC* titleBuf = HBufC::NewLC(KMaxLineLength); @@ -341,34 +374,38 @@ sqlite3_stmt *st; - //DP1("SQL statement length=%d", iSqlBuffer.Length()); int rc = sqlite3_prepare16_v2(&iDB, (const void*)iSqlBuffer.PtrZ() , -1, &st, (const void**) NULL); if (rc==SQLITE_OK) { + Cleanup_sqlite3_finalize_PushL(st); rc = sqlite3_step(st); - if (rc == SQLITE_DONE) + if (rc != SQLITE_DONE) { - sqlite3_finalize(st); - return ETrue; + User::Leave(KErrCorrupt); } - else { - sqlite3_finalize(st); + CleanupStack::PopAndDestroy(); // st } - } - - return EFalse; + else + { + User::Leave(KErrCorrupt); + } } EXPORT_C void CFeedEngine::RemoveFeedL(TUint aUid) { + if (iActiveFeed && iActiveFeed->Uid() == aUid) + { + User::Leave(KErrInUse); + } + for (int i=0;iUid() == aUid) { iPodcastModel.ShowEngine().DeleteAllShowsByFeedL(aUid); - + CFeedInfo* feedToRemove = iSortedFeeds[i]; //delete the image file if it exists @@ -391,15 +428,13 @@ DP("Removed feed from array"); // now remove it from DB - DBRemoveFeed(aUid); - - return; + DBRemoveFeedL(aUid); } } } -TBool CFeedEngine::DBRemoveFeed(TUint aUid) +void CFeedEngine::DBRemoveFeedL(TUint aUid) { DP("CFeedEngine::DBRemoveFeed"); _LIT(KSqlStatement, "delete from feeds where uid=%u"); @@ -411,23 +446,23 @@ if (rc==SQLITE_OK) { + Cleanup_sqlite3_finalize_PushL(st); rc = sqlite3_step(st); - sqlite3_finalize(st); - if (rc == SQLITE_DONE) + if (rc != SQLITE_DONE) { - DP("Feed removed from DB"); - return ETrue; + User::Leave(KErrNotFound); } - else - { - DP("Error when removing feed from DB"); - } + + CleanupStack::PopAndDestroy(); //st } - return EFalse; + else + { + User::Leave(KErrCorrupt); + } } -TBool CFeedEngine::DBUpdateFeed(const CFeedInfo &aItem) +void CFeedEngine::DBUpdateFeedL(const CFeedInfo &aItem) { DP2("CFeedEngine::DBUpdateFeed, title=%S, URL=%S", &aItem.Title(), &aItem.Url()); @@ -452,25 +487,23 @@ sqlite3_stmt *st; - //DP1("SQL statement length=%d", iSqlBuffer.Length()); int rc = sqlite3_prepare16_v2(&iDB, (const void*)iSqlBuffer.PtrZ() , -1, &st, (const void**) NULL); if (rc==SQLITE_OK) { + Cleanup_sqlite3_finalize_PushL(st); rc = sqlite3_step(st); - sqlite3_finalize(st); - if (rc == SQLITE_DONE) + if (rc != SQLITE_DONE) { - return ETrue; + User::Leave(KErrNotFound); } + CleanupStack::PopAndDestroy(); //st } else { - DP1("SQLite rc=%d", rc); + User::Leave(KErrCorrupt); } - - return EFalse; } void CFeedEngine::ParsingCompleteL(CFeedInfo *item) @@ -510,21 +543,8 @@ switch(iClientState) { - default: - if(iActiveFeed != NULL) - { - TTime time; - time.HomeTime(); - iActiveFeed->SetLastUpdated(time); - iActiveFeed->SetLastError(aError); - NotifyFeedUpdateComplete(aError); - } - break; case EUpdatingFeed: { - // Parse the feed. We need to trap this call since it could leave and then - // the whole update chain will be broken - // change client state iClientState = EIdle; switch (aError) { @@ -545,7 +565,10 @@ iActiveFeed->SetLastUpdated(time); if( aError == KErrNone) - { + { + // Parse the feed. We need to trap this call since it could leave and then + // the whole update chain will be broken + // change client state TRAPD(parserErr, iParser->ParseFeedL(iUpdatingFeedFileName, iActiveFeed, iPodcastModel.SettingsEngine().MaxListItems())); if(parserErr) @@ -556,7 +579,7 @@ } else { - iPodcastModel.ShowEngine().DeleteOldShowsByFeed(iActiveFeed->Uid()); + iPodcastModel.ShowEngine().DeleteOldShowsByFeedL(iActiveFeed->Uid()); } // delete the downloaded XML file as it is no longer needed @@ -582,13 +605,18 @@ } } } + else + { + // even if it fails, this will allow us to move on + iClientState = EIdle; + } } iCancelRequested = EFalse; }break; } - - NotifyFeedUpdateComplete(aError); - + DBUpdateFeedL(*iActiveFeed); + NotifyFeedUpdateComplete(iActiveFeed->Uid(), aError); + // we will wait until the image has been downloaded to start the next feed update. if (iClientState == EIdle) { @@ -599,8 +627,16 @@ { // change client state to not updating iClientState = EIdle; - - NotifyFeedUpdateComplete(aError); + if(aError == KErrNone) + { + // now the image has been downloaded, so we set it again in the FeedInfo to start + // converting it + HBufC *fileNameCopy = iActiveFeed->ImageFileName().AllocLC(); + TRAP_IGNORE(iActiveFeed->SetImageFileNameL(*fileNameCopy, &iPodcastModel)); + CleanupStack::PopAndDestroy(fileNameCopy); + } + DBUpdateFeedL(*iActiveFeed); + NotifyFeedUpdateComplete(iActiveFeed->Uid(), aError); UpdateNextFeedL(); }break; case ESearching: @@ -620,22 +656,27 @@ } else { - NotifyOpmlParsingComplete(aError, 0); + NotifyOpmlParsingCompleteL(aError, 0); } BaflUtils::DeleteFile(iPodcastModel.FsSession(), iSearchResultsFileName); }break; + case EIdle: + UpdateNextFeedL(); + break; + default: + Panic(EPodcatcherPanicFeedEngineState); + break; } DP("CFeedEngine::CompleteL END"); } -void CFeedEngine::NotifyFeedUpdateComplete(TInt aError) +void CFeedEngine::NotifyFeedUpdateComplete(TInt aFeedUid, TInt aError) { - DP("CFeedEngine::NotifyFeedUpdateComplete"); - DBUpdateFeed(*iActiveFeed); + DP("CFeedEngine::NotifyFeedUpdateComplete"); for (TInt i=0;iFeedDownloadFinishedL(iAutoUpdatedInitiator?MFeedEngineObserver::EFeedAutoUpdate:MFeedEngineObserver::EFeedManualUpdate, iActiveFeed->Uid(), aError)); + TRAP_IGNORE(iObservers[i]->FeedDownloadFinishedL(MFeedEngineObserver::EFeedAutoUpdate, aFeedUid, aError)); } } @@ -772,49 +813,13 @@ return a.Title().CompareF(b.Title()); } -EXPORT_C void CFeedEngine::GetDownloadedStats(TUint &aNumShows, TUint &aNumUnplayed) +EXPORT_C void CFeedEngine::GetStatsByFeedL(TUint aFeedUid, TUint &aNumShows, TUint &aNumUnplayed) { - DP("CFeedEngine::GetDownloadedStats"); - _LIT(KSqlStatement, "select count(*) from shows where downloadstate=%u"); - iSqlBuffer.Format(KSqlStatement, EDownloaded); - - sqlite3_stmt *st; - - int rc = sqlite3_prepare16_v2(&iDB, (const void*)iSqlBuffer.PtrZ() , -1, &st, (const void**) NULL); - - if( rc==SQLITE_OK ){ - rc = sqlite3_step(st); - - if (rc == SQLITE_ROW) { - aNumShows = sqlite3_column_int(st, 0); - } - } - - sqlite3_finalize(st); - - _LIT(KSqlStatement2, "select count(*) from shows where downloadstate=%u and playstate=%u"); - iSqlBuffer.Format(KSqlStatement2, EDownloaded, ENeverPlayed); - - rc = sqlite3_prepare16_v2(&iDB, (const void*)iSqlBuffer.PtrZ() , -1, &st, (const void**) NULL); - - if( rc==SQLITE_OK ){ - rc = sqlite3_step(st); - - if (rc == SQLITE_ROW) { - aNumUnplayed = sqlite3_column_int(st, 0); - } - } - - sqlite3_finalize(st); + //DP1("CFeedEngine::GetStatsByFeed, aFeedUid=%u", aFeedUid); + DBGetStatsByFeedL(aFeedUid, aNumShows, aNumUnplayed); } -EXPORT_C void CFeedEngine::GetStatsByFeed(TUint aFeedUid, TUint &aNumShows, TUint &aNumUnplayed) - { - //DP1("CFeedEngine::GetStatsByFeed, aFeedUid=%u", aFeedUid); - DBGetStatsByFeed(aFeedUid, aNumShows, aNumUnplayed); - } - -void CFeedEngine::DBGetStatsByFeed(TUint aFeedUid, TUint &aNumShows, TUint &aNumUnplayed) +void CFeedEngine::DBGetStatsByFeedL(TUint aFeedUid, TUint &aNumShows, TUint &aNumUnplayed) { //DP1("CFeedEngine::DBGetStatsByFeed, feedUid=%u", aFeedUid); _LIT(KSqlStatement, "select count(*) from shows where feeduid=%u"); @@ -824,50 +829,77 @@ int rc = sqlite3_prepare16_v2(&iDB, (const void*)iSqlBuffer.PtrZ() , -1, &st, (const void**) NULL); - if( rc==SQLITE_OK ){ + if( rc==SQLITE_OK) + { + Cleanup_sqlite3_finalize_PushL(st); rc = sqlite3_step(st); - if (rc == SQLITE_ROW) { + if (rc == SQLITE_ROW) + { aNumShows = sqlite3_column_int(st, 0); - } - } + } + else + { + User::Leave(KErrNotFound); + } + CleanupStack::PopAndDestroy(); // st + } + else + { + User::Leave(KErrCorrupt); + } - sqlite3_finalize(st); - _LIT(KSqlStatement2, "select count(*) from shows where feeduid=%u and playstate=0"); iSqlBuffer.Format(KSqlStatement2, aFeedUid); rc = sqlite3_prepare16_v2(&iDB, (const void*)iSqlBuffer.PtrZ() , -1, &st, (const void**) NULL); - if( rc==SQLITE_OK ){ + if(rc==SQLITE_OK) + { + Cleanup_sqlite3_finalize_PushL(st); rc = sqlite3_step(st); - if (rc == SQLITE_ROW) { + if (rc == SQLITE_ROW) + { aNumUnplayed = sqlite3_column_int(st, 0); - } + } + else + { + User::Leave(KErrNotFound); + } + CleanupStack::PopAndDestroy(); // st } - - sqlite3_finalize(st); } -TUint CFeedEngine::DBGetFeedCount() +TUint CFeedEngine::DBGetFeedCountL() { - DP("DBGetFeedCount BEGIN"); - sqlite3_stmt *st; - int rc = sqlite3_prepare_v2(&iDB,"select count(*) from feeds" , -1, &st, (const char**) NULL); - TUint size = 0; + DP("DBGetFeedCount BEGIN"); + sqlite3_stmt *st; + int rc = sqlite3_prepare_v2(&iDB,"select count(*) from feeds" , -1, &st, (const char**) NULL); + TUint size = 0; - if( rc==SQLITE_OK ){ - rc = sqlite3_step(st); - - if (rc == SQLITE_ROW) { + if( rc==SQLITE_OK ) + { + Cleanup_sqlite3_finalize_PushL(st); + rc = sqlite3_step(st); + + if (rc == SQLITE_ROW) + { size = sqlite3_column_int(st, 0); - } - } - - sqlite3_finalize(st); - DP1("DBGetFeedCount END=%d", size); - return size; + } + else + { + User::Leave(KErrCorrupt); + } + CleanupStack::PopAndDestroy(); // st + } + else + { + User::Leave(KErrCorrupt); + } + + DP1("DBGetFeedCount END=%d", size); + return size; } void CFeedEngine::DBLoadFeedsL() @@ -876,7 +908,7 @@ iSortedFeeds.Reset(); CFeedInfo *feedInfo = NULL; - _LIT(KSqlStatement, "select url, title, description, imageurl, imagefile, link, built, lastupdated, uid, feedtype, customtitle from feeds"); + _LIT(KSqlStatement, "select url, title, description, imageurl, imagefile, link, built, lastupdated, uid, feedtype, customtitle, lasterror from feeds"); iSqlBuffer.Format(KSqlStatement); sqlite3_stmt *st; @@ -884,11 +916,13 @@ TLinearOrder sortOrder( CFeedEngine::CompareFeedsByTitle); int rc = sqlite3_prepare16_v2(&iDB, (const void*)iSqlBuffer.PtrZ() , -1, &st, (const void**) NULL); - Cleanup_sqlite3_finalize_PushL(st); - if (rc==SQLITE_OK) { + if (rc==SQLITE_OK) + { + Cleanup_sqlite3_finalize_PushL(st); rc = sqlite3_step(st); - while(rc == SQLITE_ROW) { + while(rc == SQLITE_ROW) + { feedInfo = CFeedInfo::NewLC(); const void *urlz = sqlite3_column_text16(st, 0); @@ -909,8 +943,11 @@ const void *imagefilez = sqlite3_column_text16(st, 4); TPtrC16 imagefile((const TUint16*)imagefilez); - feedInfo->SetImageFileNameL(imagefile); - + if (imagefile.Length() > 0) + { + feedInfo->SetImageFileNameL(imagefile, &iPodcastModel); + } + const void *linkz = sqlite3_column_text16(st, 5); TPtrC16 link((const TUint16*)linkz); feedInfo->SetDescriptionL(link); @@ -924,11 +961,12 @@ feedInfo->SetLastUpdated(lastupdatedtime); sqlite3_int64 customtitle = sqlite3_column_int64(st, 10); - if (customtitle) { + if (customtitle) + { feedInfo->SetCustomTitle(); - } + } - TInt lasterror = sqlite3_column_int(st, 11); + sqlite3_int64 lasterror = sqlite3_column_int(st, 11); feedInfo->SetLastError(lasterror); TLinearOrder sortOrder( CFeedEngine::CompareFeedsByTitle); @@ -938,10 +976,13 @@ CleanupStack::Pop(feedInfo); rc = sqlite3_step(st); + } + CleanupStack::PopAndDestroy();//st } - } - - CleanupStack::PopAndDestroy();//st + else + { + User::Leave(KErrCorrupt); + } DP("DBLoadFeeds END"); } @@ -954,15 +995,15 @@ iSqlBuffer.Format(KSqlStatement, aFeedUid); sqlite3_stmt *st; - - //DP1("SQL statement length=%d", iSqlBuffer.Length()); - + int rc = sqlite3_prepare16_v2(&iDB, (const void*)iSqlBuffer.PtrZ() , -1, &st, (const void**) NULL); - if (rc==SQLITE_OK) { + if (rc==SQLITE_OK) + { Cleanup_sqlite3_finalize_PushL(st); rc = sqlite3_step(st); - if (rc == SQLITE_ROW) { + if (rc == SQLITE_ROW) + { feedInfo = CFeedInfo::NewLC(); const void *urlz = sqlite3_column_text16(st, 0); @@ -1006,16 +1047,29 @@ feedInfo->SetLastError(lasterror); CleanupStack::Pop(feedInfo); - } + } + else + { + User::Leave(KErrNotFound); + } CleanupStack::PopAndDestroy();//st - } + } + else + { + User::Leave(KErrNotFound); + } return feedInfo; } -EXPORT_C void CFeedEngine::UpdateFeed(CFeedInfo *aItem) +EXPORT_C void CFeedEngine::UpdateFeedInfoL(CFeedInfo *aItem) { - DBUpdateFeed(*aItem); + if (iActiveFeed && iActiveFeed->Uid() == aItem->Uid()) + { + User::Leave(KErrInUse); + } + + DBUpdateFeedL(*aItem); } EXPORT_C void CFeedEngine::SearchForFeedL(TDesC& aSearchString) @@ -1071,12 +1125,12 @@ } -EXPORT_C void CFeedEngine::OpmlParsingComplete(TInt aError, TUint aNumFeedsAdded) +EXPORT_C void CFeedEngine::OpmlParsingCompleteL(TInt aError, TUint aNumFeedsAdded) { - NotifyOpmlParsingComplete(aError, aNumFeedsAdded); + NotifyOpmlParsingCompleteL(aError, aNumFeedsAdded); } -void CFeedEngine::NotifyOpmlParsingComplete(TInt aError, TUint aNumFeedsAdded) +void CFeedEngine::NotifyOpmlParsingCompleteL(TInt aError, TUint aNumFeedsAdded) { for (TInt i=0;i #include +#include +#include +_LIT(KMbmExtension, ".mbm"); EXPORT_C CFeedInfo* CFeedInfo::NewL() { @@ -47,22 +52,24 @@ copy->SetLinkL(Link()); copy->SetBuildDate(BuildDate()); copy->SetLastUpdated(LastUpdated()); - copy->SetImageFileNameL(ImageFileName()); - copy->iFeedIcon->Duplicate(iFeedIcon->Handle()); + if (iFeedIcon) { + copy->SetFeedIcon(iFeedIcon); + } + copy->SetImageFileNameL(ImageFileName(), NULL); if(CustomTitle()) { copy->SetCustomTitle(); } copy->SetLastError(LastError()); - copy->SetFeedIconIndex(FeedIconIndex()); + CleanupStack::Pop(copy); return copy; } + CFeedInfo::CFeedInfo() { iCustomTitle = EFalse; - iFeedIconIndex = -1; } EXPORT_C CFeedInfo::~CFeedInfo() @@ -78,7 +85,7 @@ void CFeedInfo::ConstructL() { - iFeedIcon = new (ELeave) CFbsBitmap; + //iFeedIcon = new (ELeave) CFbsBitmap; } EXPORT_C const TDesC& CFeedInfo::Url() const @@ -189,15 +196,39 @@ return iImageFileName ? *iImageFileName : KNullDesC(); } -EXPORT_C void CFeedInfo::SetImageFileNameL(const TDesC& aFileName) +EXPORT_C void CFeedInfo::SetImageFileNameL(const TDesC& aFileName, CPodcastModel* aPodcastModel) { + DP1("CFeedInfo::SetImageFileNameL BEGIN, aFileName=%S", &aFileName); + TFileName cacheFileName; + if (iImageFileName) { delete iImageFileName; iImageFileName = NULL; } - iImageFileName = aFileName.AllocL(); + + iImageFileName = aFileName.AllocL(); + TParsePtrC parser(*iImageFileName); + cacheFileName = parser.DriveAndPath(); + cacheFileName.Append(parser.Name()); + cacheFileName.Append(KMbmExtension()); + + if (iFeedIcon) { + delete iFeedIcon; } + + if( BaflUtils::FileExists(CEikonEnv::Static()->FsSession(), cacheFileName) ) + { + iFeedIcon = CEikonEnv::Static()->CreateBitmapL(cacheFileName, 0); + } + else if(aPodcastModel && BaflUtils::FileExists(CEikonEnv::Static()->FsSession(), ImageFileName() )) + { + // If this fails, no reason to worry + iFeedIcon = new CFbsBitmap(); + TRAP_IGNORE(aPodcastModel->ImageHandler().LoadFileAndScaleL(FeedIcon(), ImageFileName(), TSize(64,56), *this, Uid())); + } + DP("CFeedInfo::SetImageFileNameL END"); + } EXPORT_C TBool CFeedInfo::CustomTitle() const { @@ -226,20 +257,25 @@ EXPORT_C void CFeedInfo::SetFeedIcon(CFbsBitmap* aBitmapToClone) { + if (iFeedIcon) + { + delete iFeedIcon; + } + iFeedIcon->Duplicate(aBitmapToClone->Handle()); } -void CFeedInfo::ImageOperationCompleteL(TInt /*aError*/, TUint /*aHandle*/) - { +void CFeedInfo::ImageOperationCompleteL(TInt aError, TUint /*aHandle*/, CPodcastModel& aPodcastModel) + { + if (aError == KErrNone && iImageFileName && iFeedIcon) + { + TFileName cacheFileName; + TParsePtrC parser(*iImageFileName); + cacheFileName = parser.DriveAndPath(); + cacheFileName.Append(parser.Name()); + cacheFileName.Append(KMbmExtension()); + iFeedIcon->Save(cacheFileName); + aPodcastModel.FeedEngine().NotifyFeedUpdateComplete(this->iUid, KErrNone); + } } - -EXPORT_C TInt CFeedInfo::FeedIconIndex() const - { - return iFeedIconIndex; - } - -EXPORT_C void CFeedInfo::SetFeedIconIndex(TInt aIndex) - { - iFeedIconIndex = aIndex; - } diff -r 9569ea080d5a -r 4d230e702aa3 engine/src/FeedParser.cpp --- a/engine/src/FeedParser.cpp Thu Mar 11 20:53:00 2010 +0100 +++ b/engine/src/FeedParser.cpp Tue Apr 27 19:26:48 2010 +0100 @@ -25,6 +25,7 @@ #include #include #include "debug.h" +#include "podcastutils.h" using namespace Xml; const TInt KMaxParseBuffer = 1024; @@ -176,6 +177,10 @@ HBufC* val16 = HBufC::NewLC(KMaxParseBuffer); val16->Des().Copy(attr.Value().DesC()); iActiveShow->SetUrlL(*val16); + + if (PodcastUtils::IsVideoShow(*val16)) { + iActiveShow->SetShowType(EVideoPodcast); + } CleanupStack::PopAndDestroy(val16); // length=... } else if (attr16.Compare(KTagLength) == 0) { @@ -369,6 +374,10 @@ case EStateItemLink: if (iActiveShow->Url().Length() == 0) { iActiveShow->SetUrlL(iBuffer); + + if (PodcastUtils::IsVideoShow(iBuffer)) { + iActiveShow->SetShowType(EVideoPodcast); + } } iFeedState = EStateItem; break; diff -r 9569ea080d5a -r 4d230e702aa3 engine/src/HttpClient.cpp --- a/engine/src/HttpClient.cpp Thu Mar 11 20:53:00 2010 +0100 +++ b/engine/src/HttpClient.cpp Tue Apr 27 19:26:48 2010 +0100 @@ -14,6 +14,7 @@ #include "HttpClient.h" #include "connectionengine.h" #include "settingsengine.h" +#include "Podcatcher.pan" const TInt KTempBufferSize = 100; @@ -159,7 +160,7 @@ if (iResumeEnabled && iPodcastModel.FsSession().Entry(iCurrentFileName, entry) == KErrNone) { DP1("Found file, with size=%d", entry.iSize); // file exists, so we should probably resume - rangeText.Format(_L8("bytes=%d-"), entry.iSize-KByteOverlap); + rangeText.Format(_L8("bytes=%d-"), (entry.iSize-KByteOverlap > 0 ? entry.iSize-KByteOverlap : 0)); iHandler->SetSaveFileName(iCurrentFileName, ETrue); } else { // otherwise just make sure the directory exists @@ -192,7 +193,7 @@ TBool CHttpClient::GetL(const TDesC& aUrl, const TDesC& aFileName, TBool aSilent) { DP("CHttpClient::Get START"); DP2("Getting '%S' to '%S'", &aUrl, &aFileName); - __ASSERT_DEBUG((iIsActive==EFalse), User::Panic(_L("Already active"), -2)); + __ASSERT_DEBUG((iIsActive==EFalse), Panic(EPodcatcherPanicAlreadyActive)); iCurrentURL.Copy(aUrl); TInt urlError = iUriParser.Parse(iCurrentURL); diff -r 9569ea080d5a -r 4d230e702aa3 engine/src/HttpEventHandler.cpp --- a/engine/src/HttpEventHandler.cpp Thu Mar 11 20:53:00 2010 +0100 +++ b/engine/src/HttpEventHandler.cpp Tue Apr 27 19:26:48 2010 +0100 @@ -19,7 +19,6 @@ // HttpEventHandler.cpp #include #include - #include "HttpEventHandler.h" #include "bautils.h" #include "Httpclient.h" @@ -67,10 +66,7 @@ // going to be a response body to save. RHTTPResponse resp = aTransaction.Response(); iLastStatusCode = resp.StatusCode(); - RStringF statusStr = resp.StatusText(); - TBuf<32> statusStr16; - statusStr16.Copy(statusStr.DesC()); - DP2("Status: %d (%S)", iLastStatusCode, &statusStr16); + DP1("Status: %d", iLastStatusCode); // Dump the headers if we're being verbose //DumpRespHeadersL(aTransaction); @@ -105,10 +101,12 @@ { iFileServ.Parse(iFileName, iParsedFileName); TInt valid = iFileServ.IsValidName(iFileName); + if (!valid) { DP("The specified filename is not valid!."); iSavingResponseBody = EFalse; + iHttpClient->ClientRequestCompleteL(KErrBadName); } else { @@ -116,21 +114,28 @@ TInt err = iRespBodyFile.Open(iFileServ, iParsedFileName.FullName(),EFileWrite); if (err) { - DP("There was an error opening file"); + DP2("There was an error opening file '%S', err=%d", &iParsedFileName.FullName(), err); iSavingResponseBody = EFalse; + iHttpClient->ClientRequestCompleteL(KErrInUse); User::Leave(err); - } else { + } + else + { int pos = -KByteOverlap; - if((err=iRespBodyFile.Seek(ESeekEnd, pos)) != KErrNone) { + if((err=iRespBodyFile.Seek(ESeekEnd, pos)) != KErrNone) + { DP("Failed to set position!"); + iHttpClient->ClientRequestCompleteL(KErrWrite); User::Leave(err); + } + iBytesDownloaded = (pos > 0) ? pos : 0; + iBytesTotal += iBytesDownloaded; + DP1("Total bytes is now %u", iBytesTotal); + DP1("Seeking end: %d", pos); } - iBytesDownloaded = (pos > 0) ? pos : 0; - iBytesTotal += iBytesDownloaded; - DP1("Total bytes is now %u", iBytesTotal); - DP1("Seeking end: %d", pos); - } - } else { + } + else + { TInt err = iRespBodyFile.Replace(iFileServ, iParsedFileName.FullName(), EFileWrite); @@ -160,10 +165,10 @@ iRespBody->GetNextDataPart(bodyData); iBytesDownloaded += bodyData.Length(); TInt error = iRespBodyFile.Write(bodyData); - + // on writing error we close connection if (error != KErrNone) { - //aTransaction.Close(); + iRespBodyFile.Close(); iCallbacks.FileError(error); iHttpClient->ClientRequestCompleteL(error); return; @@ -224,10 +229,11 @@ } } -TInt CHttpEventHandler::MHFRunError(TInt aError, RHTTPTransaction /*aTransaction*/, const THTTPEvent& /*aEvent*/) +TInt CHttpEventHandler::MHFRunError(TInt aError, RHTTPTransaction aTransaction, const THTTPEvent& /*aEvent*/) { DP1("MHFRunError fired with error code %d", aError); - + aTransaction.Close(); + TRAP_IGNORE(iHttpClient->ClientRequestCompleteL(aError)); return KErrNone; } diff -r 9569ea080d5a -r 4d230e702aa3 engine/src/ImageHandler.cpp --- a/engine/src/ImageHandler.cpp Thu Mar 11 20:53:00 2010 +0100 +++ b/engine/src/ImageHandler.cpp Tue Apr 27 19:26:48 2010 +0100 @@ -31,12 +31,13 @@ // might leave. // ----------------------------------------------------------------------------- // -CImageHandler::CImageHandler( RFs& aFs ) +CImageHandler::CImageHandler( RFs& aFs, CPodcastModel& aPodcastModel ) : CActive(CActive::EPriorityStandard) , iDecoder(NULL) , iScaler(NULL) , iFs(aFs) , iSize(0,0) + , iPodcastModel(aPodcastModel) { } @@ -56,9 +57,9 @@ // Two-phased constructor. // ----------------------------------------------------------------------------- // -EXPORT_C CImageHandler* CImageHandler::NewL(RFs& aFs) +EXPORT_C CImageHandler* CImageHandler::NewL(RFs& aFs, CPodcastModel& aPodcastModel) { - CImageHandler* self = NewLC(aFs); + CImageHandler* self = NewLC(aFs, aPodcastModel); CleanupStack::Pop(); return self; } @@ -68,9 +69,9 @@ // Two-phased constructor. // ----------------------------------------------------------------------------- // -EXPORT_C CImageHandler* CImageHandler::NewLC(RFs& aFs) +EXPORT_C CImageHandler* CImageHandler::NewLC(RFs& aFs, CPodcastModel& aPodcastModel) { - CImageHandler* self = new (ELeave) CImageHandler(aFs); + CImageHandler* self = new (ELeave) CImageHandler(aFs, aPodcastModel); CleanupStack::PushL( self ); self->ConstructL(); @@ -202,7 +203,7 @@ else { // Invoke callback. - iCallback->ImageOperationCompleteL(iStatus.Int(), iHandle); + iCallback->ImageOperationCompleteL(iStatus.Int(), iHandle, iPodcastModel); if(iCallbackQue.Count()) { TInt loaderror = KErrNotFound; diff -r 9569ea080d5a -r 4d230e702aa3 engine/src/MetaDataReader.cpp --- a/engine/src/MetaDataReader.cpp Thu Mar 11 20:53:00 2010 +0100 +++ b/engine/src/MetaDataReader.cpp Tue Apr 27 19:26:48 2010 +0100 @@ -148,7 +148,7 @@ buf = NULL; } - iObserver.ReadMetaData(*iShow); + TRAP_IGNORE(iObserver.ReadMetaDataL(*iShow)); iPlayer->Stop(); iShow = NULL; TRAP_IGNORE(ParseNextShowL()); diff -r 9569ea080d5a -r 4d230e702aa3 engine/src/OpmlParser.cpp --- a/engine/src/OpmlParser.cpp Thu Mar 11 20:53:00 2010 +0100 +++ b/engine/src/OpmlParser.cpp Tue Apr 27 19:26:48 2010 +0100 @@ -73,7 +73,7 @@ void COpmlParser::OnEndDocumentL(TInt aErrorCode) { - iFeedEngine.OpmlParsingComplete(aErrorCode, iNumFeedsAdded); + iFeedEngine.OpmlParsingCompleteL(aErrorCode, iNumFeedsAdded); //DP("OnEndDocumentL()"); } @@ -96,7 +96,15 @@ if(str.CompareF(KTagOutline) == 0) { iOpmlState = EStateOpmlOutline; } - break; + + // there are two variations on OPML, where the tags sit either + // directly below , or inside a collective + // by checking if the has arguments, we can support both + // by falling through to the nextstate + if (aAttributes.Count() == 0) + { + break; + } case EStateOpmlOutline: // SetLinkL(*val16); hasUrl = ETrue; - // text=... + // title=... } else if (attr16.Compare(KTagTitle) == 0) { newFeed->SetTitleL(*val16); - newFeed->SetCustomTitle(); hasTitle = ETrue; // description= } else if (attr16.Compare(KTagDescription) == 0) { newFeed->SetDescriptionL(*val16); + // text= } else if (attr16.Compare(KTagText) == 0) { if (!hasTitle) { newFeed->SetTitleL(*val16); - newFeed->SetCustomTitle(); hasTitle = ETrue; } } @@ -148,11 +155,20 @@ newFeed->SetTitleL(newFeed->Url()); } + // if the title is the same as the URL, it is hardly a custom + // title, so let's replace it on update + if (newFeed->Title().Length() && + newFeed->Url().Length() && + newFeed->Title().Compare(newFeed->Url()) != 0) { + newFeed->SetCustomTitle(); + } + if (iSearching) { iFeedEngine.AddSearchResultL(newFeed); CleanupStack::Pop(newFeed); } else { - if(iFeedEngine.AddFeedL(*newFeed)) + TRAPD(err, iFeedEngine.AddFeedL(*newFeed)) + if (err == KErrNone) { iNumFeedsAdded++; } @@ -229,7 +245,7 @@ void COpmlParser::OnError(TInt aErrorCode) { DP1("COpmlParser::OnError %d", aErrorCode); - iFeedEngine.OpmlParsingComplete(aErrorCode, iNumFeedsAdded); + TRAP_IGNORE(iFeedEngine.OpmlParsingCompleteL(aErrorCode, iNumFeedsAdded)); } TAny* COpmlParser::GetExtendedInterface(const TInt32 /*aUid*/) diff -r 9569ea080d5a -r 4d230e702aa3 engine/src/PodcastModel.cpp --- a/engine/src/PodcastModel.cpp Thu Mar 11 20:53:00 2010 +0100 +++ b/engine/src/PodcastModel.cpp Tue Apr 27 19:26:48 2010 +0100 @@ -19,10 +19,11 @@ #include #include "PodcastModel.h" #include "FeedEngine.h" -#include "SoundEngine.h" #include "SettingsEngine.h" #include "ShowEngine.h" #include "connectionengine.h" +#include "podcastutils.h" +#include "Podcatcher.pan" #include #include @@ -45,7 +46,6 @@ { delete iFeedEngine; - delete iSoundEngine; delete iSettingsEngine; delete iShowEngine; @@ -78,7 +78,7 @@ iIapNameArray = new (ELeave) CDesCArrayFlat(KDefaultGranu); iSNAPNameArray = new (ELeave) CDesCArrayFlat(KDefaultGranu); iCmManager.OpenL(); - iImageHandler = CImageHandler::NewL(FsSession()); + iImageHandler = CImageHandler::NewL(FsSession(), *this); UpdateIAPListL(); UpdateSNAPListL(); @@ -86,10 +86,24 @@ iSettingsEngine = CSettingsEngine::NewL(*this); iConnectionEngine = CConnectionEngine::NewL(*this); + TRAPD(err, OpenDBL()); + + if (err != KErrNone) + { + ResetDB(); + + TRAP(err, OpenDBL()); + + if (err != KErrNone) + { + Panic(EPodcatcherPanicDB); + } + + } + iFeedEngine = CFeedEngine::NewL(*this); iShowEngine = CShowEngine::NewL(*this); - iSoundEngine = CSoundEngine::NewL(*this); DP("CPodcastModel::ConstructL END"); } @@ -199,11 +213,6 @@ return *iShowEngine; } -EXPORT_C CSoundEngine& CPodcastModel::SoundEngine() -{ - return *iSoundEngine; -} - EXPORT_C CSettingsEngine& CPodcastModel::SettingsEngine() { return *iSettingsEngine; @@ -216,40 +225,8 @@ EXPORT_C void CPodcastModel::PlayPausePodcastL(CShowInfo* aPodcast, TBool aPlayOnInit) { - - // special treatment if this podcast is already active - if (iPlayingPodcast->Uid() == aPodcast->Uid() && SoundEngine().State() > ESoundEngineOpening ) { - if (aPodcast->PlayState() == EPlaying) { - SoundEngine().Pause(); - aPodcast->SetPosition(iSoundEngine->Position()); - aPodcast->SetPlayState(EPlayed); - aPodcast->SetPlayState(EPlayed); - } else { - iSoundEngine->Play(); - } - } else { - // switching file, so save position - iSoundEngine->Pause(); - if (iPlayingPodcast != NULL) { - iPlayingPodcast->SetPosition(iSoundEngine->Position()); - } - - iSoundEngine->Stop(EFalse); - - // we play video podcasts through the external player - if(aPodcast != NULL && aPodcast->ShowType() != EVideoPodcast) { - DP1("Starting: %S", &(aPodcast->FileName())); - TRAPD( error, iSoundEngine->OpenFileL(aPodcast->FileName(), aPlayOnInit) ); - if (error != KErrNone) { - DP1("Error: %d", error); - } else { - iSoundEngine->SetPosition(aPodcast->Position().Int64() / 1000000); - } - } - - iPlayingPodcast = aPodcast; + // TODO: interact with MPX } -} EXPORT_C CFeedInfo* CPodcastModel::ActiveFeedInfo() { @@ -277,33 +254,105 @@ } } +EXPORT_C void CPodcastModel::DropDB() + { + if (iDB != NULL) + { + sqlite3_close(iDB); + iDB = NULL; + } + + TFileName dbFileName; + dbFileName.Copy(iSettingsEngine->PrivatePath()); + dbFileName.Append(KDBFileName); + + // remove the old DB file + if (BaflUtils::FileExists(iFsSession, dbFileName)) + { + BaflUtils::DeleteFile(iFsSession, dbFileName); + } + } + +void CPodcastModel::ResetDB() + { + DP("CPodcastModel::ResetDB BEGIN"); + + DropDB(); + + TFileName dbFileName; + dbFileName.Copy(iSettingsEngine->PrivatePath()); + dbFileName.Append(KDBFileName); + + // remove the old DB file + if (BaflUtils::FileExists(iFsSession, dbFileName)) + { + BaflUtils::DeleteFile(iFsSession, dbFileName); + } + + // copy template to new DB + TFileName dbTemplate; + dbTemplate.Copy(iSettingsEngine->PrivatePath()); + dbTemplate.Append(KDBTemplateFileName); + + BaflUtils::CopyFile(iFsSession, dbTemplate,dbFileName); + iIsFirstStartup = ETrue; + DP("CPodcastModel::ResetDB END"); + } + + +void CPodcastModel::OpenDBL() + { + DP("CPodcastModel::OpenDBL BEGIN"); + + if (iDB != NULL) + { + sqlite3_close(iDB); + iDB = NULL; + } + + TFileName dbFileName; + dbFileName.Copy(iSettingsEngine->PrivatePath()); + dbFileName.Append(KDBFileName); + + if (!BaflUtils::FileExists(iFsSession, dbFileName)) + { + User::Leave(KErrNotFound); + } + + if (iDB == NULL) { + // open DB + TBuf8 filename8; + filename8.Copy(dbFileName); + int rc = sqlite3_open((const char*) filename8.PtrZ(), &iDB); + if(rc != SQLITE_OK){ + User::Leave(KErrCorrupt); + } + + // do a test query + sqlite3_stmt *st; + rc = sqlite3_prepare_v2(iDB,"select count(*) from feeds" , -1, &st, (const char**) NULL); + if( rc==SQLITE_OK ) + { + Cleanup_sqlite3_finalize_PushL(st); + rc = sqlite3_step(st); + + if (rc != SQLITE_ROW) + { + User::Leave(KErrCorrupt); + } + CleanupStack::PopAndDestroy(); // st + } + else + { + User::Leave(KErrCorrupt); + } + } + + DP("CPodcastModel::OpenDBL END"); + } + sqlite3* CPodcastModel::DB() { - if (iDB == NULL) { - TFileName dbFileName; - iFsSession.PrivatePath(dbFileName); - dbFileName.Append(KDBFileName); - DP1("DB is at %S", &dbFileName); - - if (!BaflUtils::FileExists(iFsSession, dbFileName)) { - TFileName dbTemplate; - iFsSession.PrivatePath(dbTemplate); - dbTemplate.Append(KDBTemplateFileName); - DP1("No DB found, copying template from %S", &dbTemplate); - BaflUtils::CopyFile(iFsSession, dbTemplate,dbFileName); - iIsFirstStartup = ETrue; - } - - TBuf8 filename8; - filename8.Copy(dbFileName); - int rc = rc = sqlite3_open((const char*) filename8.PtrZ(), &iDB); - if( rc != SQLITE_OK){ - DP("Error loading DB"); - User::Panic(_L("Podcatcher"), 10); - } - - - } return iDB; } @@ -369,7 +418,6 @@ CleanupStack::PopAndDestroy(table); } - TInt CPodcastModel::GetIapId() { _LIT(KSetting, "IAP\\Id"); @@ -378,24 +426,6 @@ return iapId; } -EXPORT_C void CPodcastModel::GetAllShowsL() - { - iActiveShowList.ResetAndDestroy(); - iShowEngine->GetAllShowsL(iActiveShowList); - } - -EXPORT_C void CPodcastModel::GetNewShowsL() - { - iActiveShowList.ResetAndDestroy(); - iShowEngine->GetNewShowsL(iActiveShowList); - } - -EXPORT_C void CPodcastModel::GetShowsDownloadedL() - { - iActiveShowList.ResetAndDestroy(); - iShowEngine->GetShowsDownloadedL(iActiveShowList); - } - EXPORT_C void CPodcastModel::GetShowsDownloadingL() { iActiveShowList.ResetAndDestroy(); @@ -405,15 +435,16 @@ EXPORT_C void CPodcastModel::GetShowsByFeedL(TUint aFeedUid) { iActiveShowList.ResetAndDestroy(); + iShowEngine->CheckForDeletedShows(aFeedUid); iShowEngine->GetShowsByFeedL(iActiveShowList, aFeedUid); } -EXPORT_C void CPodcastModel::MarkSelectionPlayed() +EXPORT_C void CPodcastModel::MarkSelectionPlayedL() { for (int i=0;iPlayState() != EPlayed) { iActiveShowList[i]->SetPlayState(EPlayed); - iShowEngine->UpdateShow(*iActiveShowList[i]); + iShowEngine->UpdateShowL(*iActiveShowList[i]); } } } @@ -435,7 +466,7 @@ } -void CPodcastModel::ImageOperationCompleteL(TInt /*aError*/, TUint /*aHandle*/) +void CPodcastModel::ImageOperationCompleteL(TInt /*aError*/, TUint /*aHandle*/, CPodcastModel& /*aPodcastModel*/) { } diff -r 9569ea080d5a -r 4d230e702aa3 engine/src/PodcastUtils.cpp --- a/engine/src/PodcastUtils.cpp Thu Mar 11 20:53:00 2010 +0100 +++ b/engine/src/PodcastUtils.cpp Tue Apr 27 19:26:48 2010 +0100 @@ -306,3 +306,15 @@ ReplaceString(aString, _L(">"), _L(">")); ReplaceString(aString, _L("&"), _L("&")); } + +EXPORT_C TBool PodcastUtils::IsVideoShow(TDesC &aUrl) + { + if (aUrl.Find(KVideoFormat1) != KErrNotFound || + aUrl.Find(KVideoFormat2) != KErrNotFound || + aUrl.Find(KVideoFormat3) != KErrNotFound) + { + return ETrue; + } + + return EFalse; + } diff -r 9569ea080d5a -r 4d230e702aa3 engine/src/SettingsEngine.cpp --- a/engine/src/SettingsEngine.cpp Thu Mar 11 20:53:00 2010 +0100 +++ b/engine/src/SettingsEngine.cpp Tue Apr 27 19:26:48 2010 +0100 @@ -19,7 +19,6 @@ #include #include #include "SettingsEngine.h" -#include "SoundEngine.h" #include "FeedEngine.h" #include "ShowEngine.h" @@ -224,6 +223,7 @@ { TFileName privatePath; iPodcastModel.FsSession().PrivatePath(privatePath); + TRAP_IGNORE(BaflUtils::EnsurePathExistsL(iPodcastModel.FsSession(), privatePath)); return privatePath; } diff -r 9569ea080d5a -r 4d230e702aa3 engine/src/ShowEngine.cpp --- a/engine/src/ShowEngine.cpp Thu Mar 11 20:53:00 2010 +0100 +++ b/engine/src/ShowEngine.cpp Tue Apr 27 19:26:48 2010 +0100 @@ -24,7 +24,6 @@ #include "SettingsEngine.h" #include #include -#include "SoundEngine.h" #include "debug.h" #include "PodcastUtils.h" @@ -35,15 +34,6 @@ const TUint KMaxDownloadErrors = 3; const TInt KMimeBufLength = 100; -// Cleanup stack macro for SQLite3 -// TODO Move this to some common place. -static void Cleanup_sqlite3_finalize_wrapper(TAny* handle) - { - sqlite3_finalize(static_cast(handle)); - } -#define Cleanup_sqlite3_finalize_PushL(__handle) CleanupStack::PushL(TCleanupItem(&Cleanup_sqlite3_finalize_wrapper, __handle)) - - CShowEngine::CShowEngine(CPodcastModel& aPodcastModel) : iPodcastModel(aPodcastModel), iDB(*aPodcastModel.DB()) @@ -115,22 +105,21 @@ DP("CShowEngine::ResumeDownloadsL END"); } -EXPORT_C void CShowEngine::RemoveAllDownloads() +EXPORT_C void CShowEngine::RemoveAllDownloadsL() { if (!iPodcastModel.SettingsEngine().DownloadSuspended()) { SuspendDownloads(); } - DBRemoveAllDownloads(); + DBRemoveAllDownloadsL(); NotifyDownloadQueueUpdatedL(); } -EXPORT_C TBool CShowEngine::RemoveDownloadL(TUint aUid) +EXPORT_C void CShowEngine::RemoveDownloadL(TUint aUid) { - DP("CShowEngine::RemoveDownload\t Trying to remove download"); + DP("CShowEngine::RemoveDownloadL BEGIN"); - TBool retVal = EFalse; TBool resumeAfterRemove = EFalse; // if trying to remove the present download, we first stop it if (!iPodcastModel.SettingsEngine().DownloadSuspended() && iShowDownloading != NULL @@ -138,6 +127,10 @@ { DP("CShowEngine::RemoveDownload\t This is the active download, we suspend downloading"); SuspendDownloads(); + + // partial downloads should be removed + BaflUtils::DeleteFile(iPodcastModel.FsSession(), iShowDownloading->FileName()); + resumeAfterRemove = ETrue; } @@ -145,28 +138,24 @@ if (info != NULL) { info->SetDownloadState(ENotDownloaded); - DBUpdateShow(*info); + DBUpdateShowL(*info); delete info; } - DBRemoveDownload(aUid); + + DBRemoveDownloadL(aUid); - // partial downloads should be removed - if (iShowDownloading) + if (resumeAfterRemove) { - BaflUtils::DeleteFile(iPodcastModel.FsSession(), iShowDownloading->FileName()); + ResumeDownloadsL(); } - - NotifyShowDownloadUpdatedL(-1, -1); - NotifyDownloadQueueUpdatedL(); - - if (resumeAfterRemove) { - ResumeDownloadsL(); - } + else + { + NotifyShowDownloadUpdatedL(-1, -1); + NotifyDownloadQueueUpdatedL(); + } DownloadNextShowL(); - retVal = ETrue; - - return retVal; + DP("CShowEngine::RemoveDownloadL END"); } void CShowEngine::Connected(CHttpClient* /*aClient*/) @@ -195,16 +184,11 @@ } } -TBool CShowEngine::GetShowL(CShowInfo *info) +void CShowEngine::GetShowL(CShowInfo *info) { CFeedInfo *feedInfo = iPodcastModel.FeedEngine().GetFeedInfoByUid( info->FeedUid()); - if (feedInfo == NULL) - { - DP("Feed not found for this show!"); - return EFalse; - } - + TFileName filePath; filePath.Copy(iPodcastModel.SettingsEngine().BaseDir()); @@ -221,23 +205,22 @@ filePath.Append(relPath); info->SetFileNameL(filePath); - return iShowClient->GetL(info->Url(), filePath); + User::LeaveIfError(iShowClient->GetL(info->Url(), filePath)); } -EXPORT_C TBool CShowEngine::AddShowL(const CShowInfo& aItem) +EXPORT_C void CShowEngine::AddShowL(const CShowInfo& aItem) { DP1("CShowEngine::AddShowL, title=%S", &aItem.Title()); CShowInfo *showInfo = DBGetShowByUidL(aItem.Uid()); if (showInfo == NULL) { - DBAddShow(aItem); - return ETrue; + DBAddShowL(aItem); } else { delete showInfo; - return EFalse; + User::Leave(KErrAlreadyExists); } } @@ -271,7 +254,7 @@ { if (iShowDownloading != NULL) { - DP1("CShowEngine::Complete\tDownload of file: %S is complete", &iShowDownloading->FileName()); + DP2("CShowEngine::CompleteL file=%S, aError=%d", &iShowDownloading->FileName(), aError); if(aError != KErrCouldNotConnect) { if(aError == KErrDisconnected && iPodcastModel.SettingsEngine().DownloadSuspended()) @@ -299,8 +282,8 @@ } iShowDownloading->SetDownloadState(EDownloaded); - DBUpdateShow(*iShowDownloading); - DBRemoveDownload(iShowDownloading->Uid()); + DBUpdateShowL(*iShowDownloading); + DBRemoveDownloadL(iShowDownloading->Uid()); AddShowToMpxCollection(*iShowDownloading); NotifyShowFinishedL(aError); iDownloadErrors = 0; @@ -313,21 +296,29 @@ if(aError >= HTTPStatus::EBadRequest && aError <= HTTPStatus::EBadRequest+200) { iShowDownloading->SetDownloadState(EFailedDownload); - DBUpdateShow(*iShowDownloading); - DBRemoveDownload(iShowDownloading->Uid()); + DBUpdateShowL(*iShowDownloading); + DBRemoveDownloadL(iShowDownloading->Uid()); NotifyShowFinishedL(aError); delete iShowDownloading; iShowDownloading = NULL; } + else if (aError == KErrDiskFull) + { + // stop downloading immediately if disk is full + iShowDownloading->SetDownloadState(EQueued); + DBUpdateShowL(*iShowDownloading); + iDownloadErrors = KMaxDownloadErrors; + } else // other kind of error, missing network etc, reque this show { iShowDownloading->SetDownloadState(EQueued); - DBUpdateShow(*iShowDownloading); + DBUpdateShowL(*iShowDownloading); } + NotifyDownloadQueueUpdatedL(); iDownloadErrors++; - if (iDownloadErrors > KMaxDownloadErrors) + if (iDownloadErrors >= KMaxDownloadErrors) { DP("Too many downloading errors, suspending downloads"); iPodcastModel.SettingsEngine().SetDownloadSuspended(ETrue); @@ -343,7 +334,7 @@ if(iShowDownloading) { iShowDownloading->SetDownloadState(EQueued); - DBUpdateShow(*iShowDownloading); + DBUpdateShowL(*iShowDownloading); } iPodcastModel.SettingsEngine().SetDownloadSuspended(ETrue); NotifyShowFinishedL(aError); @@ -475,6 +466,10 @@ } CleanupStack::PopAndDestroy();//st } + else + { + User::Leave(KErrCorrupt); + } // delete downloads that don't have a show @@ -485,8 +480,13 @@ if (rc == SQLITE_OK) { + Cleanup_sqlite3_finalize_PushL(st); rc = sqlite3_step(st); - sqlite3_finalize(st); + CleanupStack::PopAndDestroy(); // st + } + else + { + User::Leave(KErrCorrupt); } } @@ -520,8 +520,16 @@ DBFillShowInfoFromStmtL(st, showInfo); CleanupStack::Pop(showInfo); } + else + { + User::Leave(KErrUnknown); + } CleanupStack::PopAndDestroy();//st } + else + { + User::Leave(KErrCorrupt); + } return showInfo; } @@ -556,10 +564,14 @@ } CleanupStack::PopAndDestroy();//st } + else + { + User::Leave(KErrCorrupt); + } DP("CShowEngine::DBGetShowsByFeed END"); } -TUint CShowEngine::DBGetDownloadsCount() +TUint CShowEngine::DBGetDownloadsCountL() { DP("CShowEngine::DBGetDownloadsCount"); @@ -574,13 +586,23 @@ if (rc == SQLITE_OK) { + Cleanup_sqlite3_finalize_PushL(st); rc = sqlite3_step(st); if (rc == SQLITE_ROW) { count = sqlite3_column_int(st, 0); } - sqlite3_finalize(st); + else + { + User::Leave(KErrUnknown); + } + + CleanupStack::PopAndDestroy(); //st + } + else + { + User::Leave(KErrCorrupt); } return count; } @@ -615,6 +637,10 @@ } CleanupStack::PopAndDestroy();//st } + else + { + User::Leave(KErrCorrupt); + } } void CShowEngine::DBGetNewShowsL(RShowInfoArray& aShowArray) @@ -642,9 +668,13 @@ } CleanupStack::PopAndDestroy();//st } + else + { + User::Leave(KErrCorrupt); + } } -void CShowEngine::DBDeleteOldShowsByFeed(TUint aFeedUid) +void CShowEngine::DBDeleteOldShowsByFeedL(TUint aFeedUid) { DP("CShowEngine::DBDeleteOldShows"); @@ -667,6 +697,10 @@ rc = sqlite3_step(st); sqlite3_finalize(st); } + else + { + User::Leave(KErrCorrupt); + } _LIT(KSqlStatement2, "delete from downloads where uid not in (select downloads.uid from shows, downloads where shows.uid=downloads.uid)"); iSqlBuffer.Format(KSqlStatement2); @@ -678,6 +712,10 @@ rc = sqlite3_step(st); sqlite3_finalize(st); } + else + { + User::Leave(KErrCorrupt); + } } void CShowEngine::DBFillShowInfoFromStmtL(sqlite3_stmt *st, CShowInfo* showInfo) @@ -734,7 +772,7 @@ showInfo->SetLastError(lasterror); } -TBool CShowEngine::DBAddShow(const CShowInfo& aItem) +void CShowEngine::DBAddShowL(const CShowInfo& aItem) { DP2("CShowEngine::DBAddShow, title=%S, URL=%S", &aItem.Title(), &aItem.Url()); @@ -764,28 +802,24 @@ int rc = sqlite3_prepare16_v2(&iDB, (const void*) iSqlBuffer.PtrZ(), -1, &st, (const void**) NULL); + if (rc == SQLITE_OK) { + Cleanup_sqlite3_finalize_PushL(st); rc = sqlite3_step(st); - if (rc == SQLITE_DONE) + if (rc != SQLITE_DONE) { - sqlite3_finalize(st); - return ETrue; + User::Leave(KErrAlreadyExists); } - else - { - sqlite3_finalize(st); - } + CleanupStack::PopAndDestroy(); // st } else { - DP1("SQLite rc=%d", rc); + User::Leave(KErrCorrupt); } - - return EFalse; } -void CShowEngine::DBAddDownload(TUint aUid) +void CShowEngine::DBAddDownloadL(TUint aUid) { DP1("CShowEngine::DBAddDownload, aUid=%u", aUid); @@ -798,13 +832,21 @@ if (rc == SQLITE_OK) { + Cleanup_sqlite3_finalize_PushL(st); rc = sqlite3_step(st); + if (rc != SQLITE_DONE) + { + User::Leave(KErrUnknown); + } + CleanupStack::PopAndDestroy(); // st } - - sqlite3_finalize(st); + else + { + User::Leave(KErrCorrupt); + } } -TBool CShowEngine::DBUpdateShow(CShowInfo& aItem) +void CShowEngine::DBUpdateShowL(CShowInfo& aItem) { DP1("CShowEngine::DBUpdateShow, title='%S'", &aItem.Title()); @@ -837,27 +879,22 @@ if (rc == SQLITE_OK) { - rc = sqlite3_step(st); + Cleanup_sqlite3_finalize_PushL(st); + rc = sqlite3_step(st); - if (rc == SQLITE_DONE) + if (rc != SQLITE_DONE) { - sqlite3_finalize(st); - return ETrue; + User::Leave(KErrUnknown); } - else - { - sqlite3_finalize(st); - } + CleanupStack::PopAndDestroy(); // st } else { - DP1("SQLite rc=%d", rc); + User::Leave(KErrCorrupt); } - - return EFalse; } -TBool CShowEngine::DBDeleteShow(TUint aUid) +void CShowEngine::DBDeleteShowL(TUint aUid) { DP("CShowEngine::DBDeleteShow"); @@ -866,33 +903,27 @@ sqlite3_stmt *st; - //DP1("SQL: %S", &iSqlBuffer.Left(KSqlDPLen)); int rc = sqlite3_prepare16_v2(&iDB, (const void*) iSqlBuffer.PtrZ(), -1, &st, (const void**) NULL); if (rc == SQLITE_OK) { + Cleanup_sqlite3_finalize_PushL(st); rc = sqlite3_step(st); - if (rc == SQLITE_DONE) + if (rc != SQLITE_DONE) { - sqlite3_finalize(st); - return ETrue; + User::Leave(KErrUnknown); } - else - { - sqlite3_finalize(st); - } + CleanupStack::PopAndDestroy(); // st } else { - DP1("SQLite rc=%d", rc); + User::Leave(KErrCorrupt); } - - return EFalse; } -TBool CShowEngine::DBDeleteAllShowsByFeed(TUint aFeedUid) +void CShowEngine::DBDeleteAllShowsByFeedL(TUint aFeedUid) { DP("CShowEngine::DBDeleteAllShowsByFeed"); @@ -901,33 +932,27 @@ sqlite3_stmt *st; - //DP1("SQL: %S", &iSqlBuffer.Left(KSqlDPLen)); int rc = sqlite3_prepare16_v2(&iDB, (const void*) iSqlBuffer.PtrZ(), -1, &st, (const void**) NULL); if (rc == SQLITE_OK) { + Cleanup_sqlite3_finalize_PushL(st); rc = sqlite3_step(st); - if (rc == SQLITE_DONE) + if (rc != SQLITE_DONE) { - sqlite3_finalize(st); - return ETrue; + User::Leave(KErrUnknown); } - else - { - sqlite3_finalize(st); - } + CleanupStack::PopAndDestroy(); // st } else { - DP1("SQLite rc=%d", rc); + User::Leave(KErrCorrupt); } - - return EFalse; } -void CShowEngine::DBRemoveAllDownloads() +void CShowEngine::DBRemoveAllDownloadsL() { DP("CShowEngine::DBRemoveAllDownloads"); @@ -944,6 +969,10 @@ rc = sqlite3_step(st); sqlite3_finalize(st); } + else + { + User::Leave(KErrCorrupt); + } _LIT(KSqlStatement2, "update shows set downloadstate=0 where downloadstate=1"); iSqlBuffer.Format(KSqlStatement2); @@ -953,13 +982,22 @@ if (rc == SQLITE_OK) { + Cleanup_sqlite3_finalize_PushL(st); rc = sqlite3_step(st); - sqlite3_finalize(st); + if (rc != SQLITE_DONE) + { + User::Leave(KErrUnknown); + } + CleanupStack::PopAndDestroy(); // st + } + else + { + User::Leave(KErrCorrupt); } } -void CShowEngine::DBRemoveDownload(TUint aUid) +void CShowEngine::DBRemoveDownloadL(TUint aUid) { DP("CShowEngine::DBRemoveDownload"); @@ -973,8 +1011,17 @@ if (rc == SQLITE_OK) { + Cleanup_sqlite3_finalize_PushL(st); rc = sqlite3_step(st); - sqlite3_finalize(st); + if (rc != SQLITE_DONE) + { + User::Leave(KErrUnknown); + } + CleanupStack::PopAndDestroy(); // st + } + else + { + User::Leave(KErrCorrupt); } } @@ -1058,21 +1105,16 @@ } } -EXPORT_C void CShowEngine::DeletePlayedShows(RShowInfoArray &aShowInfoArray) +EXPORT_C void CShowEngine::DeletePlayedShowsL(RShowInfoArray &aShowInfoArray) { for (TInt i = 0; i < aShowInfoArray.Count(); i++) { if (aShowInfoArray[i]->PlayState() == EPlayed && aShowInfoArray[i]->FileName().Length() > 0) { - if (CompareShowsByUid(*(iPodcastModel.PlayingPodcast()), *(aShowInfoArray[i])) - && iPodcastModel.SoundEngine().State() != ESoundEngineNotInitialized) - { - iPodcastModel.SoundEngine().Stop(); - } BaflUtils::DeleteFile(iPodcastModel.FsSession(), aShowInfoArray[i]->FileName()); aShowInfoArray[i]->SetDownloadState(ENotDownloaded); - DBUpdateShow(*aShowInfoArray[i]); + DBUpdateShowL(*aShowInfoArray[i]); } } } @@ -1086,6 +1128,13 @@ for (TInt i = count - 1; i >= 0; i--) { + if (iShowDownloading && iShowDownloading->Uid() == array[i]->Uid()) + { + // trying to delete the active download + RemoveDownloadL(iShowDownloading->Uid()); + } + + // delete downloaded file if (array[i]->FileName().Length() > 0) { if (aDeleteFiles) @@ -1095,12 +1144,20 @@ } } array.ResetAndDestroy(); - DBDeleteAllShowsByFeed(aFeedUid); + + // delete all shows from DB + DBDeleteAllShowsByFeedL(aFeedUid); + + // this will clear out deleted shows from the download queue + DBGetAllDownloadsL(array); + array.ResetAndDestroy(); + + NotifyDownloadQueueUpdatedL(); } -EXPORT_C void CShowEngine::DeleteOldShowsByFeed(TUint aFeedUid) +EXPORT_C void CShowEngine::DeleteOldShowsByFeedL(TUint aFeedUid) { - DBDeleteOldShowsByFeed(aFeedUid); + DBDeleteOldShowsByFeedL(aFeedUid); } EXPORT_C void CShowEngine::DeleteShowL(TUint aShowUid, TBool aRemoveFile) @@ -1116,7 +1173,7 @@ } info->SetDownloadState(ENotDownloaded); - DBUpdateShow(*info); + DBUpdateShowL(*info); delete info; } } @@ -1153,14 +1210,17 @@ EXPORT_C TInt CShowEngine::GetNumDownloadingShows() { - return (const TInt) DBGetDownloadsCount(); + TUint count = 0; + TRAP_IGNORE(count = DBGetDownloadsCountL()); + + return (const TInt) count; } EXPORT_C void CShowEngine::AddDownloadL(CShowInfo& aInfo) { aInfo.SetDownloadState(EQueued); - DBUpdateShow(aInfo); - DBAddDownload(aInfo.Uid()); + DBUpdateShowL(aInfo); + DBAddDownloadL(aInfo.Uid()); DownloadNextShowL(); } @@ -1168,7 +1228,7 @@ { DP("CShowEngine::DownloadNextShowL BEGIN"); // Check if we have anything in the download queue - const TInt count = DBGetDownloadsCount(); + const TInt count = DBGetDownloadsCountL(); DP("CShowEngine::DownloadNextShow\tTrying to start new download");DP1("CShowEngine::DownloadNextShow\tShows in download queue %d", count); if (count > 0) @@ -1189,41 +1249,41 @@ } else { - - // Start the download + if (iShowDownloading) { + delete iShowDownloading; + } - CShowInfo *info = DBGetNextDownloadL(); + // Start the download + iShowDownloading = DBGetNextDownloadL(); - while(info != NULL) + while(iShowDownloading != NULL) { - TBool getOk = EFalse; - DP1("CShowEngine::DownloadNextShow\tDownloading: %S", &(info->Title())); - info->SetDownloadState(EDownloading); - info->SetLastError(KErrNone); - DBUpdateShow(*info); - iShowDownloading = info; + DP1("CShowEngine::DownloadNextShow\tDownloading: %S", &(iShowDownloading->Title())); + iShowDownloading->SetDownloadState(EDownloading); + iShowDownloading->SetLastError(KErrNone); + DBUpdateShowL(*iShowDownloading); // Inform the observers // important to do this after we change download state NotifyDownloadQueueUpdatedL(); - TRAPD(error,getOk = GetShowL(info)); - if (error != KErrNone || !getOk) - { - info->SetDownloadState(EFailedDownload); - DBRemoveDownload(info->Uid()); - DBUpdateShow(*info); - info = DBGetNextDownloadL(); - - if(info == NULL) - { - iPodcastModel.SettingsEngine().SetDownloadSuspended(ETrue); - iShowDownloading = NULL; - } - } - else + TRAPD(error,GetShowL(iShowDownloading)); + if (error == KErrNone) { break; } + else + { + iShowDownloading->SetDownloadState(EFailedDownload); + DBRemoveDownloadL(iShowDownloading->Uid()); + DBUpdateShowL(*iShowDownloading); + CleanupStack::PopAndDestroy(iShowDownloading); + + iShowDownloading = DBGetNextDownloadL(); + if(iShowDownloading == NULL) + { + iPodcastModel.SettingsEngine().SetDownloadSuspended(ETrue); + } + } } } } @@ -1241,7 +1301,7 @@ const TInt count = iObservers.Count(); for (TInt i = 0; i < count; i++) { - iObservers[i]->DownloadQueueUpdatedL(1, DBGetDownloadsCount() - 1); + iObservers[i]->DownloadQueueUpdatedL(1, DBGetDownloadsCountL() - 1); } } @@ -1271,10 +1331,10 @@ } } -void CShowEngine::ReadMetaData(CShowInfo& aShowInfo) +void CShowEngine::ReadMetaDataL(CShowInfo& aShowInfo) { //DP1("Read %S", &(aShowInfo->Title())); - DBUpdateShow(aShowInfo); + DBUpdateShowL(aShowInfo); } void CShowEngine::ReadMetaDataCompleteL() @@ -1283,9 +1343,9 @@ MetaDataReader().SetIgnoreTrackNo(EFalse); } -EXPORT_C void CShowEngine::UpdateShow(CShowInfo& aInfo) +EXPORT_C void CShowEngine::UpdateShowL(CShowInfo& aInfo) { - DBUpdateShow(aInfo); + DBUpdateShowL(aInfo); } EXPORT_C CMetaDataReader& CShowEngine::MetaDataReader() @@ -1295,7 +1355,35 @@ void CShowEngine::FileError(TUint /*aError*/) { - //TODO: Error dialog - //StopDownloads(); iDownloadErrors = KMaxDownloadErrors; } + +EXPORT_C void CShowEngine::CheckForDeletedShows(TUint aFeedUid) + { + RShowInfoArray shows; + + TRAPD(err, DBGetShowsByFeedL(shows, aFeedUid)); + + if (err != KErrNone) + { + // probably a catastrophic error, but it doesn't + // matter for this method + return; + } + + for (int i=0;iDownloadState() == EDownloaded && shows[i]->FileName() != KNullDesC) + { + if(!BaflUtils::FileExists(iPodcastModel.FsSession(),shows[i]->FileName())) + { + // file doesn't exist anymore, assume it was deleted from outside + DP1("Show %S does not exist on disk, flagging as non downloaded", &shows[i]->FileName()); + shows[i]->SetDownloadState(ENotDownloaded); + shows[i]->SetPlayState(EPlayed); + TRAP_IGNORE(DBUpdateShowL(*shows[i])); + } + } + } + } + diff -r 9569ea080d5a -r 4d230e702aa3 engine/src/ShowInfo.cpp --- a/engine/src/ShowInfo.cpp Thu Mar 11 20:53:00 2010 +0100 +++ b/engine/src/ShowInfo.cpp Tue Apr 27 19:26:48 2010 +0100 @@ -217,10 +217,22 @@ EXPORT_C CShowInfo::CShowInfo(CShowInfo *aInfo) { + if (iTitle) + delete iTitle; iTitle = aInfo->Title().Alloc(); + + if(iUrl) + delete iUrl; iUrl = aInfo->Url().Alloc(); + + if (iDescription) + delete iDescription; iDescription = aInfo->Description().Alloc(); + + if (iFileName) + delete iFileName; iFileName = aInfo->FileName().Alloc(); + iPosition = aInfo->Position(); iPlayTime = aInfo->PlayTime(); iPlayState = aInfo->PlayState(); diff -r 9569ea080d5a -r 4d230e702aa3 group/bld.inf --- a/group/bld.inf Thu Mar 11 20:53:00 2010 +0100 +++ b/group/bld.inf Tue Apr 27 19:26:48 2010 +0100 @@ -33,6 +33,7 @@ ..\application\group\Podcast.mmp PRJ_EXPORTS +..\engine\config\podcatcher.sqlite \epoc32\winscw\c\private\A0009D00\podcatcher.sqlite.template ..\engine\config\defaultfeeds.xml \epoc32\winscw\c\private\A0009D00\defaultfeeds.xml ..\engine\config\testfeeds.xml \epoc32\winscw\c\data\testfeeds.xml ..\application\help\podcatcher.hlp \epoc32\winscw\c\resource\help\podcatcher.hlp diff -r 9569ea080d5a -r 4d230e702aa3 test.txt --- a/test.txt Thu Mar 11 20:53:00 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2 +0,0 @@ -Test file -Lars Was HERE!! \ No newline at end of file