# HG changeset patch # User teknolog # Date 1272538532 -3600 # Node ID 70749e2f572d55912e61b0698c1330d3e9d560f5 # Parent 3d36a7fc21318846499e660ad0375757eaceea44# Parent 3c0683f9f72ca03a7f6979e055cd1e271fcb748c merge diff -r 3c0683f9f72c -r 70749e2f572d application/data/PodcastClient_english.rls --- a/application/data/PodcastClient_english.rls Wed Mar 10 10:50:53 2010 +0000 +++ b/application/data/PodcastClient_english.rls Thu Apr 29 11:55:32 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 3c0683f9f72c -r 70749e2f572d application/data/PodcastFeedView.ra --- a/application/data/PodcastFeedView.ra Wed Mar 10 10:50:53 2010 +0000 +++ b/application/data/PodcastFeedView.ra Thu Apr 29 11:55:32 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 3c0683f9f72c -r 70749e2f572d application/data/PodcastQueueView.ra --- a/application/data/PodcastQueueView.ra Wed Mar 10 10:50:53 2010 +0000 +++ b/application/data/PodcastQueueView.ra Thu Apr 29 11:55:32 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 3c0683f9f72c -r 70749e2f572d application/data/PodcastSettingsView.ra --- a/application/data/PodcastSettingsView.ra Wed Mar 10 10:50:53 2010 +0000 +++ b/application/data/PodcastSettingsView.ra Thu Apr 29 11:55:32 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 3c0683f9f72c -r 70749e2f572d application/data/PodcastShowsView.ra --- a/application/data/PodcastShowsView.ra Wed Mar 10 10:50:53 2010 +0000 +++ b/application/data/PodcastShowsView.ra Thu Apr 29 11:55:32 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 3c0683f9f72c -r 70749e2f572d application/data/PodcastStrings.ra --- a/application/data/PodcastStrings.ra Wed Mar 10 10:50:53 2010 +0000 +++ b/application/data/PodcastStrings.ra Thu Apr 29 11:55:32 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 3c0683f9f72c -r 70749e2f572d application/data/images/Audio.svg --- a/application/data/images/Audio.svg Wed Mar 10 10:50:53 2010 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff -r 3c0683f9f72c -r 70749e2f572d application/data/images/Audio_downloaded.svg --- a/application/data/images/Audio_downloaded.svg Wed Mar 10 10:50:53 2010 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 3c0683f9f72c -r 70749e2f572d application/data/images/Audio_downloaded_new.svg --- a/application/data/images/Audio_downloaded_new.svg Wed Mar 10 10:50:53 2010 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 3c0683f9f72c -r 70749e2f572d application/data/images/Audio_downloading.svg --- a/application/data/images/Audio_downloading.svg Wed Mar 10 10:50:53 2010 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,86 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 3c0683f9f72c -r 70749e2f572d application/data/images/Audio_failed.svg --- a/application/data/images/Audio_failed.svg Wed Mar 10 10:50:53 2010 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 3c0683f9f72c -r 70749e2f572d application/data/images/Audio_new.svg --- a/application/data/images/Audio_new.svg Wed Mar 10 10:50:53 2010 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 3c0683f9f72c -r 70749e2f572d application/data/images/Audio_queued.svg --- a/application/data/images/Audio_queued.svg Wed Mar 10 10:50:53 2010 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,94 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 3c0683f9f72c -r 70749e2f572d application/data/images/Audio_suspended.svg --- a/application/data/images/Audio_suspended.svg Wed Mar 10 10:50:53 2010 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,75 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 3c0683f9f72c -r 70749e2f572d application/data/images/Feed.svg --- a/application/data/images/Feed.svg Wed Mar 10 10:50:53 2010 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1574 +0,0 @@ - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - - - eJzsvWmTHbmRIPgL4j/kfpCZZLvMjsAZ0I6t2buyVzvUYSqpW21tY2VUFVXiDJOsZbG6R/vr1284 -4r0kk+TrQ5rMIJNJTzwPhwNw+AXHT/6333z1bPft2z++fBZv55vpJz85vHv54v3bdz+/IejNL16/ -/vGH9+8Q9NPf/uxmSbczNNr9Yv1aGv7Dy3c/vHr75uf0K/rlHX76p1+9+OPLl29e3Ox+eP3i/mc3 -P/0Z/OZ3r96/fgm/+83bb7958f6bP7989/Wrb96++eHrGL7/n1/f/eJXu+df3b549TMlA/AeX7yH -TyzL383h78K8zDdz+3kq2ODFm3958cMPr/4//HWJawTY/u2Pb7599ea7/dv/+fObZwv+iRH+wK/+ -71e/ffnD+Pv5trbYUsafcqKfYqCf8F/4XYbPHd9+8+P9yzfvf/Pu7Tcvf/jh8Pb123c//Pzm8JcX -b25++eI7+M2Lm396+fr123+92b9+8c3/mIA3+eu7V69fAhvuX7y/WYgpu18s4ev9j69ef/urH+// -+BIYFEtFcPyaUP7+B8AFaPFnBNevf3EPkK9evn8P9MILkbGHX/7Tfz3AaLy9p3YAvJlvl5sF/v3p -b3a/+t2vf3WC17WbAzLwf6ffwv/mW+iYbxGW7JuEghjwH9dkaBHh87dtwBErN/jt3+89Z4gkbPjP -v3353SuaNzCG/+1n0tN3b7+/f/Huf/zAzWKAP/yb3728//41jDQNzFJu882S8Zv+JK2Aqzx0ca03 -z0KJ8OvYyk1o1qaP18t/efXyX39+86u3b17yoOzevf+Kp0tK88zf+Te//fH1y3e/f/PqPVBWENR4 -VH759tuXr6G9ff7u9YvvftBOLv07N/jdi3ffvXwP8+zt6x/f05pY9Q0w6s9f/OUlTp2FX/Dr71++ -+d3bfyAan9V4W0rJN2WRf4HDZb0pEUZ3pVfApFxykzfzW2nkGT0iQ1T6DphaP/kNzJ9fv3v13as3 -PxcK69d//+7Vt31O1XCz8jfqxO3q/jb9y9RCx9+/f/lGqIe5fPilm5vz7S+/gjee3nx7eHuP3P8B -FyPMgDcwOV6//Y5/Zz/Tb+DjP37P1NP/v4aB+s27V28Q5/Qr+s369W9e/wi/+vt3b3/8/hdv/vR2 -+ikLpd+9e/ENNLv59R//+8tv3oNwEUD/6asfX71/CaLk+599ENFvXr948+LdDcHhwwx8/upf4Dcv -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 -3xsMe32PDG57v/EM3DK+HGblo5zyfw/e9iQ= - - - diff -r 3c0683f9f72c -r 70749e2f572d application/data/images/new/Audio.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/application/data/images/new/Audio.svg Thu Apr 29 11:55:32 2010 +0100 @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff -r 3c0683f9f72c -r 70749e2f572d application/data/images/new/Audio_downloaded.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/application/data/images/new/Audio_downloaded.svg Thu Apr 29 11:55:32 2010 +0100 @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 3c0683f9f72c -r 70749e2f572d application/data/images/new/Audio_downloaded_new.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/application/data/images/new/Audio_downloaded_new.svg Thu Apr 29 11:55:32 2010 +0100 @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 3c0683f9f72c -r 70749e2f572d application/data/images/new/Audio_downloading.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/application/data/images/new/Audio_downloading.svg Thu Apr 29 11:55:32 2010 +0100 @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 3c0683f9f72c -r 70749e2f572d application/data/images/new/Audio_failed.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/application/data/images/new/Audio_failed.svg Thu Apr 29 11:55:32 2010 +0100 @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 3c0683f9f72c -r 70749e2f572d application/data/images/new/Audio_new.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/application/data/images/new/Audio_new.svg Thu Apr 29 11:55:32 2010 +0100 @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 3c0683f9f72c -r 70749e2f572d application/data/images/new/Audio_queued.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/application/data/images/new/Audio_queued.svg Thu Apr 29 11:55:32 2010 +0100 @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 3c0683f9f72c -r 70749e2f572d application/data/images/new/Audio_suspended.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/application/data/images/new/Audio_suspended.svg Thu Apr 29 11:55:32 2010 +0100 @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 3c0683f9f72c -r 70749e2f572d application/data/images/new/Feed.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/application/data/images/new/Feed.svg Thu Apr 29 11:55:32 2010 +0100 @@ -0,0 +1,1574 @@ + + + + + + + + + + +]> + + + + + + + + + + + + + + + + + + + eJzsvWmTHbmRIPgL4j/kfpCZZLvMjsAZ0I6t2buyVzvUYSqpW21tY2VUFVXiDJOsZbG6R/vr1284 +4r0kk+TrQ5rMIJNJTzwPhwNw+AXHT/6333z1bPft2z++fBZv55vpJz85vHv54v3bdz+/IejNL16/ +/vGH9+8Q9NPf/uxmSbczNNr9Yv1aGv7Dy3c/vHr75uf0K/rlHX76p1+9+OPLl29e3Ox+eP3i/mc3 +P/0Z/OZ3r96/fgm/+83bb7958f6bP7989/Wrb96++eHrGL7/n1/f/eJXu+df3b549TMlA/AeX7yH +TyzL383h78K8zDdz+3kq2ODFm3958cMPr/4//HWJawTY/u2Pb7599ea7/dv/+fObZwv+iRH+wK/+ +71e/ffnD+Pv5trbYUsafcqKfYqCf8F/4XYbPHd9+8+P9yzfvf/Pu7Tcvf/jh8Pb123c//Pzm8JcX +b25++eI7+M2Lm396+fr123+92b9+8c3/mIA3+eu7V69fAhvuX7y/WYgpu18s4ev9j69ef/urH+// ++BIYFEtFcPyaUP7+B8AFaPFnBNevf3EPkK9evn8P9MILkbGHX/7Tfz3AaLy9p3YAvJlvl5sF/v3p +b3a/+t2vf3WC17WbAzLwf6ffwv/mW+iYbxGW7JuEghjwH9dkaBHh87dtwBErN/jt3+89Z4gkbPjP +v3353SuaNzCG/+1n0tN3b7+/f/Huf/zAzWKAP/yb3728//41jDQNzFJu882S8Zv+JK2Aqzx0ca03 +z0KJ8OvYyk1o1qaP18t/efXyX39+86u3b17yoOzevf+Kp0tK88zf+Te//fH1y3e/f/PqPVBWENR4 +VH759tuXr6G9ff7u9YvvftBOLv07N/jdi3ffvXwP8+zt6x/f05pY9Q0w6s9f/OUlTp2FX/Dr71++ ++d3bfyAan9V4W0rJN2WRf4HDZb0pEUZ3pVfApFxykzfzW2nkGT0iQ1T6DphaP/kNzJ9fv3v13as3 +PxcK69d//+7Vt31O1XCz8jfqxO3q/jb9y9RCx9+/f/lGqIe5fPilm5vz7S+/gjee3nx7eHuP3P8B +FyPMgDcwOV6//Y5/Zz/Tb+DjP37P1NP/v4aB+s27V28Q5/Qr+s369W9e/wi/+vt3b3/8/hdv/vR2 ++ikLpd+9e/ENNLv59R//+8tv3oNwEUD/6asfX71/CaLk+599ENFvXr948+LdDcHhwwx8/upf4Dcv +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 +3xsMe32PDG57v/EM3DK+HGblo5zyfw/e9iQ= + + + diff -r 3c0683f9f72c -r 70749e2f572d application/data/images/new/Video.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/application/data/images/new/Video.svg Thu Apr 29 11:55:32 2010 +0100 @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 3c0683f9f72c -r 70749e2f572d 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 Thu Apr 29 11:55:32 2010 +0100 @@ -0,0 +1,193 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 3c0683f9f72c -r 70749e2f572d 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 Thu Apr 29 11:55:32 2010 +0100 @@ -0,0 +1,230 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 3c0683f9f72c -r 70749e2f572d 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 Thu Apr 29 11:55:32 2010 +0100 @@ -0,0 +1,169 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 3c0683f9f72c -r 70749e2f572d 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 Thu Apr 29 11:55:32 2010 +0100 @@ -0,0 +1,182 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 3c0683f9f72c -r 70749e2f572d 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 Thu Apr 29 11:55:32 2010 +0100 @@ -0,0 +1,193 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 3c0683f9f72c -r 70749e2f572d 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 Thu Apr 29 11:55:32 2010 +0100 @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 3c0683f9f72c -r 70749e2f572d 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 Thu Apr 29 11:55:32 2010 +0100 @@ -0,0 +1,167 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 3c0683f9f72c -r 70749e2f572d application/group/Podcast.mmp --- a/application/group/Podcast.mmp Wed Mar 10 10:50:53 2010 +0000 +++ b/application/group/Podcast.mmp Thu Apr 29 11:55:32 2010 +0100 @@ -16,6 +16,8 @@ * */ +MACRO SYMBIAN1_UI + TARGET Podcast.exe TARGETTYPE exe UID 0x100039CE 0xA0009D00 @@ -31,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 @@ -83,6 +91,7 @@ LIBRARY bitmaptransforms.lib #else LIBRARY PodCastEngine.lib +LIBRARY sqlite3.lib #endif LIBRARY euser.lib LIBRARY apparc.lib @@ -112,4 +121,3 @@ LIBRARY ws32.lib LIBRARY hlplch.lib LIBRARY bitgdi.lib - diff -r 3c0683f9f72c -r 70749e2f572d application/group/icons.mk --- a/application/group/icons.mk Wed Mar 10 10:50:53 2010 +0000 +++ b/application/group/icons.mk Thu Apr 29 11:55:32 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 3c0683f9f72c -r 70749e2f572d application/inc/Podcast.hrh --- a/application/inc/Podcast.hrh Wed Mar 10 10:50:53 2010 +0000 +++ b/application/inc/Podcast.hrh Thu Apr 29 11:55:32 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 3c0683f9f72c -r 70749e2f572d application/inc/PodcastAppui.h --- a/application/inc/PodcastAppui.h Wed Mar 10 10:50:53 2010 +0000 +++ b/application/inc/PodcastAppui.h Thu Apr 29 11:55:32 2010 +0100 @@ -120,7 +120,8 @@ void TabRightL(); void NaviSetTextL(TInt aResourceId); void NaviShowTabGroupL(); - + void GetErrorTextL(TDes &aErrorMessage, TInt aErrorCode); + private: // From MEikMenuObserver void DynInitMenuPaneL(TInt aResourceId,CEikMenuPane* aMenuPane); diff -r 3c0683f9f72c -r 70749e2f572d application/inc/PodcastFeedView.h --- a/application/inc/PodcastFeedView.h Wed Mar 10 10:50:53 2010 +0000 +++ b/application/inc/PodcastFeedView.h Thu Apr 29 11:55:32 2010 +0100 @@ -41,7 +41,8 @@ void UpdateItemL(TInt aIndex); 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 3c0683f9f72c -r 70749e2f572d application/inc/PodcastListView.h --- a/application/inc/PodcastListView.h Wed Mar 10 10:50:53 2010 +0000 +++ b/application/inc/PodcastListView.h Thu Apr 29 11:55:32 2010 +0100 @@ -87,7 +87,8 @@ public: ~CPodcastListView(); virtual void UpdateToolbar(TBool aVisible=ETrue) = 0; - + TBool IsVisible(); + protected: void ConstructL(); CPodcastListView(); diff -r 3c0683f9f72c -r 70749e2f572d application/inc/PodcastQueueView.h --- a/application/inc/PodcastQueueView.h Wed Mar 10 10:50:53 2010 +0000 +++ b/application/inc/PodcastQueueView.h Thu Apr 29 11:55:32 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 3c0683f9f72c -r 70749e2f572d application/inc/PodcastShowsView.h --- a/application/inc/PodcastShowsView.h Wed Mar 10 10:50:53 2010 +0000 +++ b/application/inc/PodcastShowsView.h Thu Apr 29 11:55:32 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 3c0683f9f72c -r 70749e2f572d application/sis/podcatcher_udeb.sis Binary file application/sis/podcatcher_udeb.sis has changed diff -r 3c0683f9f72c -r 70749e2f572d application/sis/podcatcher_udeb_signed.sis Binary file application/sis/podcatcher_udeb_signed.sis has changed diff -r 3c0683f9f72c -r 70749e2f572d application/sis/podcatcher_urel.sis Binary file application/sis/podcatcher_urel.sis has changed diff -r 3c0683f9f72c -r 70749e2f572d application/sis/podcatcher_urel_signed.sis Binary file application/sis/podcatcher_urel_signed.sis has changed diff -r 3c0683f9f72c -r 70749e2f572d application/src/PodcastAppui.cpp --- a/application/src/PodcastAppui.cpp Wed Mar 10 10:50:53 2010 +0000 +++ b/application/src/PodcastAppui.cpp Thu Apr 29 11:55:32 2010 +0100 @@ -29,7 +29,7 @@ #include "debug.h" #include "..\help\podcatcher.hlp.hrh" #include "PodcastApp.h" - +#include #include #include @@ -43,11 +43,7 @@ void CPodcastAppUi::ConstructL() { DP("CPodcastAppUi::ConstructL() BEGIN"); -#ifndef SYMBIAN1_UI BaseConstructL(CAknAppUi::EAknEnableSkin); -#else - BaseConstructL(CAknAppUi::EAknEnableSkin | EAknSingleClickCompatible); -#endif iPodcastModel->ConnectionEngine().AddObserver(this); @@ -131,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: @@ -152,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); @@ -217,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) { @@ -312,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 3c0683f9f72c -r 70749e2f572d application/src/PodcastFeedView.cpp --- a/application/src/PodcastFeedView.cpp Wed Mar 10 10:50:53 2010 +0000 +++ b/application/src/PodcastFeedView.cpp Thu Apr 29 11:55:32 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; @@ -90,8 +90,11 @@ SetEmptyTextL(R_PODCAST_NO_FEEDS); // Load svg.-image and mask with a single call - AknIconUtils::CreateIconL(bitmap, mask, iEikonEnv->EikAppUi()->Application()->BitmapStoreName(), - EMbmPodcastFeed, EMbmPodcastFeed_mask); + AknIconUtils::CreateIconL(bitmap, + mask, + iEikonEnv->EikAppUi()->Application()->BitmapStoreName(), + EMbmPodcastFeed, + EMbmPodcastFeed_mask); /*bitmap = iEikonEnv->CreateBitmapL(KAsterisk,EMbmPodcastFeed_40x40); * */ @@ -102,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 @@ -125,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(); @@ -172,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; } } @@ -209,18 +203,12 @@ switch(aEventType) { - case EEventPenDownOnItem: - DP("PEN DOWN"); - break; - #ifndef SYMBIAN1_UI case EEventItemClicked: - DP("SINGLE TAP"); #endif case EEventEnterKeyPressed: case EEventItemDoubleClicked: case EEventItemActioned: - DP("DOUBLE TAP"); { const RFeedInfoArray* sortedItems = NULL; TInt index = iListContainer->Listbox()->CurrentItemIndex(); @@ -228,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()); @@ -340,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); @@ -372,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(iPodcastModel.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 ) @@ -631,7 +613,6 @@ { 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()); @@ -709,7 +690,7 @@ { info->SetTitleL(title); info->SetCustomTitle(); - iPodcastModel.FeedEngine().UpdateFeedL(info); + iPodcastModel.FeedEngine().UpdateFeedInfoL(info); UpdateListboxItemsL(); } } @@ -756,114 +737,72 @@ 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); - ShowErrorMessageL(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); - ShowOkMessageL(message); - } - else - { - TBuf message; - iEikonEnv->ReadResourceL(message, R_EXPORT_FEED_FAILURE); - ShowErrorMessageL(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::CheckResumeDownloadL() @@ -897,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) @@ -961,17 +905,13 @@ 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->SetLongTapDetectedL(ETrue); const TInt KListboxDefaultHeight = 19; // for some reason it returns 19 for an empty listbox in S^1 @@ -985,3 +925,8 @@ } DP("CPodcastListView::HandleLongTapEventL END"); } + +TBool CPodcastFeedView::ViewingShows() + { + return iViewingShows; + } diff -r 3c0683f9f72c -r 70749e2f572d application/src/PodcastFeedViewUpdater.cpp --- a/application/src/PodcastFeedViewUpdater.cpp Wed Mar 10 10:50:53 2010 +0000 +++ b/application/src/PodcastFeedViewUpdater.cpp Thu Apr 29 11:55:32 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 3c0683f9f72c -r 70749e2f572d application/src/PodcastListView.cpp --- a/application/src/PodcastListView.cpp Wed Mar 10 10:50:53 2010 +0000 +++ b/application/src/PodcastListView.cpp Thu Apr 29 11:55:32 2010 +0100 @@ -29,6 +29,7 @@ #include #include #include +#include const TInt KDefaultGran = 5; @@ -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() { @@ -375,16 +384,17 @@ void CPodcastListView::HandleLongTapEventL( const TPoint& aPenEventLocation, const TPoint& /* aPenEventScreenLocation */) { DP("CPodcastListView::HandleLongTapEventL BEGIN"); - 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( iListContainer->Listbox()->Model()->NumberOfItems()) - KListboxDefaultHeight; if(iStylusPopupMenu && aPenEventLocation.iY < lbHeight) { + iListContainer->SetLongTapDetectedL(ETrue); iStylusPopupMenu->ShowMenu(); iStylusPopupMenu->SetPosition(aPenEventLocation); } + DP("CPodcastListView::HandleLongTapEventL END"); } diff -r 3c0683f9f72c -r 70749e2f572d application/src/PodcastQueueView.cpp --- a/application/src/PodcastQueueView.cpp Wed Mar 10 10:50:53 2010 +0000 +++ b/application/src/PodcastQueueView.cpp Thu Apr 29 11:55:32 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); - ShowErrorMessageL(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()) @@ -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 3c0683f9f72c -r 70749e2f572d application/src/PodcastSearchView.cpp --- a/application/src/PodcastSearchView.cpp Wed Mar 10 10:50:53 2010 +0000 +++ b/application/src/PodcastSearchView.cpp Thu Apr 29 11:55:32 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()); } @@ -154,9 +148,6 @@ DP("CPodcastSearchView::HandleListBoxEventL BEGIN"); switch(aEventType) { -#ifndef SYMBIAN1_UI - case EEventItemClicked: -#endif case EEventEnterKeyPressed: case EEventItemDoubleClicked: case EEventItemActioned: @@ -254,7 +245,6 @@ { 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()); @@ -280,8 +270,7 @@ void CPodcastSearchView::OpmlParsingComplete(TInt /*aError*/, TUint /*aNumFeedsImported*/) { DP("CPodcastSearchView::OpmlParsingComplete BEGIN"); - UpdateListboxItemsL(); - UpdateToolbar(); + DP("CPodcastSearchView::OpmlParsingComplete END"); } diff -r 3c0683f9f72c -r 70749e2f572d application/src/PodcastSettingsView.cpp --- a/application/src/PodcastSettingsView.cpp Wed Mar 10 10:50:53 2010 +0000 +++ b/application/src/PodcastSettingsView.cpp Thu Apr 29 11:55:32 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 3c0683f9f72c -r 70749e2f572d application/src/PodcastShowsView.cpp --- a/application/src/PodcastShowsView.cpp Wed Mar 10 10:50:53 2010 +0000 +++ b/application/src/PodcastShowsView.cpp Thu Apr 29 11:55:32 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(); } @@ -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) @@ -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(); @@ -855,7 +846,6 @@ } else { - titlePane->SetPicture(NULL, NULL); titlePane->SetTextToDefaultL(); } diff -r 3c0683f9f72c -r 70749e2f572d engine/BWINS/podcastengineu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/engine/BWINS/podcastengineu.def Thu Apr 29 11:55:32 2010 +0100 @@ -0,0 +1,164 @@ +EXPORTS + ??0CShowInfo@@QAE@PAV0@@Z @ 1 NONAME ; CShowInfo::CShowInfo(class CShowInfo *) + ??1CFeedInfo@@UAE@XZ @ 2 NONAME ; CFeedInfo::~CFeedInfo(void) + ??1CImageHandler@@UAE@XZ @ 3 NONAME ; CImageHandler::~CImageHandler(void) + ??1CPodcastModel@@UAE@XZ @ 4 NONAME ; CPodcastModel::~CPodcastModel(void) + ??1CShowEngine@@UAE@XZ @ 5 NONAME ; CShowEngine::~CShowEngine(void) + ??1CShowInfo@@UAE@XZ @ 6 NONAME ; CShowInfo::~CShowInfo(void) + ?ActiveClientUid@CFeedEngine@@QAEIXZ @ 7 NONAME ; unsigned int CFeedEngine::ActiveClientUid(void) + ?ActiveFeedInfo@CPodcastModel@@QAEPAVCFeedInfo@@XZ @ 8 NONAME ; class CFeedInfo * CPodcastModel::ActiveFeedInfo(void) + ?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@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@@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) + ?CleanHtmlL@PodcastUtils@@SAXAAVTDes16@@@Z @ 20 NONAME ; void PodcastUtils::CleanHtmlL(class TDes16 &) + ?ClientState@CFeedEngine@@QAE?AW4TClientState@@XZ @ 21 NONAME ; enum TClientState CFeedEngine::ClientState(void) + ?ConnectionEngine@CPodcastModel@@QAEAAVCConnectionEngine@@XZ @ 22 NONAME ; class CConnectionEngine & CPodcastModel::ConnectionEngine(void) + ?CopyL@CFeedInfo@@QBEPAV1@XZ @ 23 NONAME ; class CFeedInfo * CFeedInfo::CopyL(void) const + ?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) + ?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 + ?DownloadAutomatically@CSettingsEngine@@QAEHXZ @ 32 NONAME ; int CSettingsEngine::DownloadAutomatically(void) + ?DownloadState@CShowInfo@@QBE?AW4TDownloadState@@XZ @ 33 NONAME ; enum TDownloadState CShowInfo::DownloadState(void) const + ?DownloadSuspended@CSettingsEngine@@QAEHXZ @ 34 NONAME ; int CSettingsEngine::DownloadSuspended(void) + ?EnsureProperPathName@PodcastUtils@@SAXAAV?$TBuf@$0BAA@@@@Z @ 35 NONAME ; void PodcastUtils::EnsureProperPathName(class TBuf<256> &) + ?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 + ?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 3c0683f9f72c -r 70749e2f572d engine/eabi/podcastengineu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/engine/eabi/podcastengineu.def Thu Apr 29 11:55:32 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 3c0683f9f72c -r 70749e2f572d engine/group/engine.mmp --- a/engine/group/engine.mmp Wed Mar 10 10:50:53 2010 +0000 +++ b/engine/group/engine.mmp Thu Apr 29 11:55:32 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 3c0683f9f72c -r 70749e2f572d engine/inc/ConnectionEngine.h --- a/engine/inc/ConnectionEngine.h Wed Mar 10 10:50:53 2010 +0000 +++ b/engine/inc/ConnectionEngine.h Thu Apr 29 11:55:32 2010 +0100 @@ -24,7 +24,7 @@ #include #include #include -#include +#include // Using connection manager settings UI #include @@ -67,7 +67,7 @@ void StartL(TConnectionType aConnectionType); RConnection& Connection(); TConnectionState ConnectionState(); - void AddObserver(MConnectionObserver* aObserver); + IMPORT_C void AddObserver(MConnectionObserver* aObserver); RSocketServ& SockServ(); private: // Methods CConnectionEngine(CPodcastModel& aPodcastModel); diff -r 3c0683f9f72c -r 70749e2f572d engine/inc/FeedEngine.h --- a/engine/inc/FeedEngine.h Wed Mar 10 10:50:53 2010 +0000 +++ b/engine/inc/FeedEngine.h Thu Apr 29 11:55:32 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 UpdateFeedL(CFeedInfo *aItem); + IMPORT_C void UpdateFeedInfoL(CFeedInfo *aItem); /** * Returns the current internal state of the feed engine4 */ @@ -95,6 +94,7 @@ IMPORT_C const RFeedInfoArray& GetSearchResults(); 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 NotifyFeedUpdateCompleteL(TInt aError); 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 DBUpdateFeedL(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 3c0683f9f72c -r 70749e2f572d engine/inc/FeedInfo.h --- a/engine/inc/FeedInfo.h Wed Mar 10 10:50:53 2010 +0000 +++ b/engine/inc/FeedInfo.h Thu Apr 29 11:55:32 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 3c0683f9f72c -r 70749e2f572d engine/inc/ImageHandler.h --- a/engine/inc/ImageHandler.h Wed Mar 10 10:50:53 2010 +0000 +++ b/engine/inc/ImageHandler.h Thu Apr 29 11:55:32 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 3c0683f9f72c -r 70749e2f572d engine/inc/PodcastModel.h --- a/engine/inc/PodcastModel.h Wed Mar 10 10:50:53 2010 +0000 +++ b/engine/inc/PodcastModel.h Thu Apr 29 11:55:32 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,10 +85,8 @@ 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 MarkSelectionPlayedL(); @@ -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 3c0683f9f72c -r 70749e2f572d engine/inc/PodcastUtils.h --- a/engine/inc/PodcastUtils.h Wed Mar 10 10:50:53 2010 +0000 +++ b/engine/inc/PodcastUtils.h Thu Apr 29 11:55:32 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 3c0683f9f72c -r 70749e2f572d engine/inc/Podcatcher.pan --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/engine/inc/Podcatcher.pan Thu Apr 29 11:55:32 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 3c0683f9f72c -r 70749e2f572d engine/inc/ShowEngine.h --- a/engine/inc/ShowEngine.h Wed Mar 10 10:50:53 2010 +0000 +++ b/engine/inc/ShowEngine.h Thu Apr 29 11:55:32 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,7 +37,7 @@ public: IMPORT_C void AddDownloadL(CShowInfo& info); - IMPORT_C TBool RemoveDownloadL(TUint aUid); + IMPORT_C void RemoveDownloadL(TUint aUid); IMPORT_C void RemoveAllDownloadsL(); IMPORT_C void SuspendDownloads(); @@ -56,11 +56,11 @@ IMPORT_C void GetShowsDownloadingL(RShowInfoArray &aArray); IMPORT_C CShowInfo* DBGetShowByFileNameL(TFileName aFileName); - IMPORT_C TBool AddShowL(const CShowInfo& item); + 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); @@ -70,6 +70,7 @@ IMPORT_C void GetMimeType(const TDesC& aFileName, TDes& aMimeType); + IMPORT_C void CheckForDeletedShows(TUint aFeedUid); IMPORT_C CMetaDataReader& MetaDataReader(); private: @@ -88,7 +89,7 @@ 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 DBAddShowL(const CShowInfo& aItem); - TBool DBUpdateShowL(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 3c0683f9f72c -r 70749e2f572d engine/inc/ShowInfo.h --- a/engine/inc/ShowInfo.h Wed Mar 10 10:50:53 2010 +0000 +++ b/engine/inc/ShowInfo.h Thu Apr 29 11:55:32 2010 +0100 @@ -42,7 +42,8 @@ enum TShowType { EAudioPodcast = 0, - EVideoPodcast + EVideoPodcast, + EOtherPodcast }; class CShowInfo: public CBase { diff -r 3c0683f9f72c -r 70749e2f572d engine/inc/sqlite3.h --- a/engine/inc/sqlite3.h Wed Mar 10 10:50:53 2010 +0000 +++ /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 3c0683f9f72c -r 70749e2f572d engine/sqlite/group/sqlite.mmp --- a/engine/sqlite/group/sqlite.mmp Wed Mar 10 10:50:53 2010 +0000 +++ b/engine/sqlite/group/sqlite.mmp Thu Apr 29 11:55:32 2010 +0100 @@ -57,4 +57,5 @@ USERINCLUDE .. SYSTEMINCLUDE \Epoc32\include SYSTEMINCLUDE \Epoc32\include\libc +SYSTEMINCLUDE ..\inc macro OS_SYMBIAN diff -r 3c0683f9f72c -r 70749e2f572d engine/sqlite/inc/sqlite3.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/engine/sqlite/inc/sqlite3.h Thu Apr 29 11:55:32 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 3c0683f9f72c -r 70749e2f572d engine/src/ConnectionEngine.cpp --- a/engine/src/ConnectionEngine.cpp Wed Mar 10 10:50:53 2010 +0000 +++ b/engine/src/ConnectionEngine.cpp Thu Apr 29 11:55:32 2010 +0100 @@ -261,7 +261,7 @@ return iConnectionState; } -void CConnectionEngine::AddObserver(MConnectionObserver* aObserver) +EXPORT_C void CConnectionEngine::AddObserver(MConnectionObserver* aObserver) { iObserverArray.Append(aObserver); } diff -r 3c0683f9f72c -r 70749e2f572d engine/src/FeedEngine.cpp --- a/engine/src/FeedEngine.cpp Wed Mar 10 10:50:53 2010 +0000 +++ b/engine/src/FeedEngine.cpp Thu Apr 29 11:55:32 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); 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::DBUpdateFeedL(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); - NotifyFeedUpdateCompleteL(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; } - - NotifyFeedUpdateCompleteL(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; - - NotifyFeedUpdateCompleteL(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: @@ -625,17 +661,22 @@ BaflUtils::DeleteFile(iPodcastModel.FsSession(), iSearchResultsFileName); }break; + case EIdle: + UpdateNextFeedL(); + break; + default: + Panic(EPodcatcherPanicFeedEngineState); + break; } DP("CFeedEngine::CompleteL END"); } -void CFeedEngine::NotifyFeedUpdateCompleteL(TInt aError) +void CFeedEngine::NotifyFeedUpdateComplete(TInt aFeedUid, TInt aError) { - DP("CFeedEngine::NotifyFeedUpdateComplete"); - DBUpdateFeedL(*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,15 +1047,28 @@ feedInfo->SetLastError(lasterror); CleanupStack::Pop(feedInfo); - } + } + else + { + User::Leave(KErrNotFound); + } CleanupStack::PopAndDestroy();//st - } + } + else + { + User::Leave(KErrNotFound); + } return feedInfo; } -EXPORT_C void CFeedEngine::UpdateFeedL(CFeedInfo *aItem) +EXPORT_C void CFeedEngine::UpdateFeedInfoL(CFeedInfo *aItem) { + if (iActiveFeed && iActiveFeed->Uid() == aItem->Uid()) + { + User::Leave(KErrInUse); + } + DBUpdateFeedL(*aItem); } diff -r 3c0683f9f72c -r 70749e2f572d engine/src/FeedInfo.cpp --- a/engine/src/FeedInfo.cpp Wed Mar 10 10:50:53 2010 +0000 +++ b/engine/src/FeedInfo.cpp Thu Apr 29 11:55:32 2010 +0100 @@ -17,8 +17,13 @@ */ #include "FeedInfo.h" +#include "FeedEngine.h" +#include "PodcastModel.h" #include #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 3c0683f9f72c -r 70749e2f572d engine/src/FeedParser.cpp --- a/engine/src/FeedParser.cpp Wed Mar 10 10:50:53 2010 +0000 +++ b/engine/src/FeedParser.cpp Thu Apr 29 11:55:32 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 3c0683f9f72c -r 70749e2f572d engine/src/HttpClient.cpp --- a/engine/src/HttpClient.cpp Wed Mar 10 10:50:53 2010 +0000 +++ b/engine/src/HttpClient.cpp Thu Apr 29 11:55:32 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 3c0683f9f72c -r 70749e2f572d engine/src/HttpEventHandler.cpp --- a/engine/src/HttpEventHandler.cpp Wed Mar 10 10:50:53 2010 +0000 +++ b/engine/src/HttpEventHandler.cpp Thu Apr 29 11:55:32 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 3c0683f9f72c -r 70749e2f572d engine/src/ImageHandler.cpp --- a/engine/src/ImageHandler.cpp Wed Mar 10 10:50:53 2010 +0000 +++ b/engine/src/ImageHandler.cpp Thu Apr 29 11:55:32 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 3c0683f9f72c -r 70749e2f572d engine/src/OpmlParser.cpp --- a/engine/src/OpmlParser.cpp Wed Mar 10 10:50:53 2010 +0000 +++ b/engine/src/OpmlParser.cpp Thu Apr 29 11:55:32 2010 +0100 @@ -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,6 +155,14 @@ 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); @@ -230,7 +245,7 @@ void COpmlParser::OnError(TInt aErrorCode) { DP1("COpmlParser::OnError %d", aErrorCode); - iFeedEngine.OpmlParsingCompleteL(aErrorCode, iNumFeedsAdded); + TRAP_IGNORE(iFeedEngine.OpmlParsingCompleteL(aErrorCode, iNumFeedsAdded)); } TAny* COpmlParser::GetExtendedInterface(const TInt32 /*aUid*/) diff -r 3c0683f9f72c -r 70749e2f572d engine/src/PodcastModel.cpp --- a/engine/src/PodcastModel.cpp Wed Mar 10 10:50:53 2010 +0000 +++ b/engine/src/PodcastModel.cpp Thu Apr 29 11:55:32 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,6 +435,7 @@ EXPORT_C void CPodcastModel::GetShowsByFeedL(TUint aFeedUid) { iActiveShowList.ResetAndDestroy(); + iShowEngine->CheckForDeletedShows(aFeedUid); iShowEngine->GetShowsByFeedL(iActiveShowList, aFeedUid); } @@ -435,7 +466,7 @@ } -void CPodcastModel::ImageOperationCompleteL(TInt /*aError*/, TUint /*aHandle*/) +void CPodcastModel::ImageOperationCompleteL(TInt /*aError*/, TUint /*aHandle*/, CPodcastModel& /*aPodcastModel*/) { } diff -r 3c0683f9f72c -r 70749e2f572d engine/src/PodcastUtils.cpp --- a/engine/src/PodcastUtils.cpp Wed Mar 10 10:50:53 2010 +0000 +++ b/engine/src/PodcastUtils.cpp Thu Apr 29 11:55:32 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 3c0683f9f72c -r 70749e2f572d engine/src/SettingsEngine.cpp --- a/engine/src/SettingsEngine.cpp Wed Mar 10 10:50:53 2010 +0000 +++ b/engine/src/SettingsEngine.cpp Thu Apr 29 11:55:32 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 3c0683f9f72c -r 70749e2f572d engine/src/ShowEngine.cpp --- a/engine/src/ShowEngine.cpp Wed Mar 10 10:50:53 2010 +0000 +++ b/engine/src/ShowEngine.cpp Thu Apr 29 11:55:32 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()) @@ -122,15 +112,14 @@ 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; } @@ -148,25 +141,21 @@ 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,10 +205,10 @@ 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()); @@ -232,12 +216,11 @@ if (showInfo == NULL) { DBAddShowL(aItem); - return ETrue; } 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()) @@ -300,7 +283,7 @@ iShowDownloading->SetDownloadState(EDownloaded); DBUpdateShowL(*iShowDownloading); - DBRemoveDownload(iShowDownloading->Uid()); + DBRemoveDownloadL(iShowDownloading->Uid()); AddShowToMpxCollection(*iShowDownloading); NotifyShowFinishedL(aError); iDownloadErrors = 0; @@ -314,20 +297,28 @@ { iShowDownloading->SetDownloadState(EFailedDownload); DBUpdateShowL(*iShowDownloading); - DBRemoveDownload(iShowDownloading->Uid()); + 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); DBUpdateShowL(*iShowDownloading); } + NotifyDownloadQueueUpdatedL(); iDownloadErrors++; - if (iDownloadErrors > KMaxDownloadErrors) + if (iDownloadErrors >= KMaxDownloadErrors) { DP("Too many downloading errors, suspending downloads"); iPodcastModel.SettingsEngine().SetDownloadSuspended(ETrue); @@ -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::DBAddShowL(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::DBUpdateShowL(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); } } @@ -1065,11 +1112,6 @@ 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); 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) @@ -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); DBUpdateShowL(aInfo); - DBAddDownload(aInfo.Uid()); + 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); - DBUpdateShowL(*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()); - DBUpdateShowL(*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); } } @@ -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 3c0683f9f72c -r 70749e2f572d engine/src/ShowInfo.cpp --- a/engine/src/ShowInfo.cpp Wed Mar 10 10:50:53 2010 +0000 +++ b/engine/src/ShowInfo.cpp Thu Apr 29 11:55:32 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 3c0683f9f72c -r 70749e2f572d group/bld.inf --- a/group/bld.inf Wed Mar 10 10:50:53 2010 +0000 +++ b/group/bld.inf Thu Apr 29 11:55:32 2010 +0100 @@ -17,7 +17,8 @@ */ PRJ_PLATFORMS -DEFAULT +GCCE +WINSCW PRJ_MMPFILES @@ -27,28 +28,12 @@ PRJ_MMPFILES ..\engine\group\engine.mmp + +gnumakefile ..\application\group\icons.mk ..\application\group\Podcast.mmp -PRJ_EXTENSIONS - -START EXTENSION s60/mifconv -OPTION TARGETFILE Podcast.mif -OPTION HEADERFILE Podcast.mbg -OPTION SOURCEDIR ../application/data/images -OPTION SOURCES \ - -c16,1 podcatcher_64px\ - -c16,1 Audio\ - -c16,1 Audio_new\ - -c16,1 Audio_queued\ - -c16,1 Audio_downloading\ - -c16,1 Audio_downloaded\ - -c16,1 Audio_downloaded_new\ - -c16,1 Audio_failed\ - -c16,1 Audio_suspended\ - -c16,1 Feed -END - 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