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 41b992b6f9..4d9be4e18c 100644 Binary files a/qa/data/dblib/database.sqlite and b/qa/data/dblib/database.sqlite differ diff --git a/qa/data/dblib/qa_dblib.kicad_dbl b/qa/data/dblib/qa_dblib.kicad_dbl index 865eb4c684..4066e66462 100644 --- a/qa/data/dblib/qa_dblib.kicad_dbl +++ b/qa/data/dblib/qa_dblib.kicad_dbl @@ -102,6 +102,18 @@ "name": "Voltage Rating", "visible_on_add": true, "visible_in_chooser": true + }, + { + "column": "Cost", + "name": "Cost", + "visible_on_add": false, + "visible_in_chooser": true + }, + { + "column": "Mass", + "name": "Mass", + "visible_on_add": false, + "visible_in_chooser": true } ], "properties": { @@ -109,4 +121,4 @@ } } ] -} \ No newline at end of file +} diff --git a/qa/tests/common/test_database.cpp b/qa/tests/common/test_database.cpp index 8e2e99f8a6..c0de3e4d00 100644 --- a/qa/tests/common/test_database.cpp +++ b/qa/tests/common/test_database.cpp @@ -54,6 +54,8 @@ BOOST_AUTO_TEST_CASE( Connect ) } dc.Connect(); + dc.CacheTableInfo( "Resistors", { "Part ID", "MPN" } ); + dc.CacheTableInfo( "Capacitors", { "Part ID", "Cost" } ); BOOST_CHECK( dc.IsConnected() ); DATABASE_CONNECTION::ROW result; @@ -64,6 +66,13 @@ BOOST_AUTO_TEST_CASE( Connect ) BOOST_CHECK( result.count( "MPN" ) ); BOOST_CHECK_NO_THROW( std::any_cast( 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()