| 768 | } |
| 769 | |
| 770 | void SqliteSampleBlock::Commit(Sizes sizes) |
| 771 | { |
| 772 | const auto mSummary256Bytes = sizes.first; |
| 773 | const auto mSummary64kBytes = sizes.second; |
| 774 | |
| 775 | auto db = DB(); |
| 776 | int rc; |
| 777 | |
| 778 | // Prepare and cache statement...automatically finalized at DB close |
| 779 | sqlite3_stmt *stmt = Conn()->Prepare(DBConnection::InsertSampleBlock, |
| 780 | "INSERT INTO sampleblocks (sampleformat, summin, summax, sumrms," |
| 781 | " summary256, summary64k, samples)" |
| 782 | " VALUES(?1,?2,?3,?4,?5,?6,?7);"); |
| 783 | |
| 784 | // Bind statement parameters |
| 785 | // Might return SQLITE_MISUSE which means it's our mistake that we violated |
| 786 | // preconditions; should return SQL_OK which is 0 |
| 787 | if (sqlite3_bind_int(stmt, 1, static_cast<int>(mSampleFormat)) || |
| 788 | sqlite3_bind_double(stmt, 2, mSumMin) || |
| 789 | sqlite3_bind_double(stmt, 3, mSumMax) || |
| 790 | sqlite3_bind_double(stmt, 4, mSumRms) || |
| 791 | sqlite3_bind_blob(stmt, 5, mSummary256.get(), mSummary256Bytes, SQLITE_STATIC) || |
| 792 | sqlite3_bind_blob(stmt, 6, mSummary64k.get(), mSummary64kBytes, SQLITE_STATIC) || |
| 793 | sqlite3_bind_blob(stmt, 7, mSamples.get(), mSampleBytes, SQLITE_STATIC)) |
| 794 | { |
| 795 | |
| 796 | ADD_EXCEPTION_CONTEXT( |
| 797 | "sqlite3.rc", std::to_string(sqlite3_errcode(Conn()->DB()))); |
| 798 | ADD_EXCEPTION_CONTEXT("sqlite3.context", "SqliteSampleBlock::Commit::bind"); |
| 799 | |
| 800 | |
| 801 | wxASSERT_MSG(false, wxT("Binding failed...bug!!!")); |
| 802 | } |
| 803 | |
| 804 | // Execute the statement |
| 805 | rc = sqlite3_step(stmt); |
| 806 | if (rc != SQLITE_DONE) |
| 807 | { |
| 808 | ADD_EXCEPTION_CONTEXT("sqlite3.rc", std::to_string(rc)); |
| 809 | ADD_EXCEPTION_CONTEXT("sqlite3.context", "SqliteSampleBlock::Commit::step"); |
| 810 | |
| 811 | wxLogDebug(wxT("SqliteSampleBlock::Commit - SQLITE error %s"), sqlite3_errmsg(db)); |
| 812 | |
| 813 | // Clear statement bindings and rewind statement |
| 814 | sqlite3_clear_bindings(stmt); |
| 815 | sqlite3_reset(stmt); |
| 816 | |
| 817 | // Just showing the user a simple message, not the library error too |
| 818 | // which isn't internationalized |
| 819 | Conn()->ThrowException( true ); |
| 820 | } |
| 821 | |
| 822 | // Retrieve returned data |
| 823 | mBlockID = sqlite3_last_insert_rowid(db); |
| 824 | |
| 825 | // Reset local arrays |
| 826 | mSamples.reset(); |
| 827 | mSummary256.reset(); |