From 6f9af10912a037e2a1de7e942cd8461dc263f2c3 Mon Sep 17 00:00:00 2001 From: Jon Evans Date: Sat, 16 Sep 2023 22:37:12 -0400 Subject: [PATCH] DbLib: support columns with numeric data Fixes https://gitlab.com/kicad/code/kicad/-/issues/15662 --- common/database/database_connection.cpp | 35 ++++++++++++++++++++++-- qa/data/dblib/database.sqlite | Bin 139264 -> 139264 bytes qa/data/dblib/qa_dblib.kicad_dbl | 14 +++++++++- qa/tests/common/test_database.cpp | 9 ++++++ 4 files changed, 55 insertions(+), 3 deletions(-) diff --git a/common/database/database_connection.cpp b/common/database/database_connection.cpp index 3208bf7525..1b5d9b7689 100644 --- a/common/database/database_connection.cpp +++ b/common/database/database_connection.cpp @@ -435,7 +435,22 @@ bool DATABASE_CONNECTION::SelectOne( const std::string& aTable, for( short i = 0; i < results.columns(); ++i ) { std::string column = toUTF8( results.column_name( i ) ); - aResult[ column ] = toUTF8( results.get( i, NANODBC_TEXT( "" ) ) ); + + switch( results.column_datatype( i ) ) + { + case SQL_DOUBLE: + case SQL_FLOAT: + case SQL_REAL: + case SQL_DECIMAL: + case SQL_NUMERIC: + { + aResult[column] = fmt::format( "{:G}", results.get( i ) ); + break; + } + + default: + aResult[column] = toUTF8( results.get( i, NANODBC_TEXT( "" ) ) ); + } } } catch( nanodbc::database_error& e ) @@ -534,7 +549,23 @@ bool DATABASE_CONNECTION::SelectAll( const std::string& aTable, const std::strin for( short j = 0; j < results.columns(); ++j ) { std::string column = toUTF8( results.column_name( j ) ); - result[column] = toUTF8( results.get( j, NANODBC_TEXT( "" ) ) ); + + switch( results.column_datatype( j ) ) + { + case SQL_DOUBLE: + case SQL_FLOAT: + case SQL_REAL: + case SQL_DECIMAL: + case SQL_NUMERIC: + { + result[column] = fmt::format( "{:G}", results.get( j ) ); + break; + } + + default: + result[column] = toUTF8( results.get( j, + NANODBC_TEXT( "" ) ) ); + } } aResults.emplace_back( std::move( result ) ); diff --git a/qa/data/dblib/database.sqlite b/qa/data/dblib/database.sqlite index 41b992b6f98ecb5537f0a73b4cb5a72f16e6fa9f..4d9be4e18c52a15fc5ada07df84a6cb84287fa20 100644 GIT binary patch delta 301 zcmZoTz|nAkV}i7x00RSq5)i{c%tReyQ2_?MWJX@T0tObI)eL;A`6_r;^I30p6yWCG zT+gk;$kohi%`UE}$k>{?`2tTMqm+VkesPIHUTJP>QD(A^f^TARu|i6IX;Mz=W(B^7 zioCoN7?^n;GVrnUJmlL5H0LspaH9^BfV8Bcthc+SxTvJCs5m?O( result.at( "MPN" ) ) ); BOOST_CHECK_EQUAL( std::any_cast( result.at( "MPN" ) ), "RC0603FR-0710KL" ); + + BOOST_CHECK( dc.SelectOne( "Capacitors", std::make_pair( "Part ID", "CAP-003" ), result ) ); + + BOOST_CHECK( !result.empty() ); + BOOST_CHECK( result.count( "Cost" ) ); + BOOST_CHECK_NO_THROW( std::any_cast( result.at( "Cost" ) ) ); + BOOST_CHECK_EQUAL( std::any_cast( result.at( "Cost" ) ), "1.95" ); } BOOST_AUTO_TEST_SUITE_END()