22#include <unordered_set>
24#include <boost/algorithm/string.hpp>
36 m_libTable( nullptr ),
49 const wxString& aLibraryPath,
52 std::vector<LIB_SYMBOL*> symbols;
56 aSymbolNameList.Add( symbol->GetName() );
61 const wxString& aLibraryPath,
64 wxCHECK_RET(
m_libTable,
"Database plugin missing library table handle!" );
68 bool powerSymbolsOnly = ( aProperties &&
74 std::vector<DATABASE_CONNECTION::ROW> results;
78 if( !
m_conn->GetLastError().empty() )
90 if( !result.count( table.
key_col ) )
93 std::string prefix = table.
name.empty() ?
"" : fmt::format(
"{}/", table.
name );
94 wxString
name( fmt::format(
"{}{}", prefix,
95 std::any_cast<std::string>( result[table.
key_col] ) ) );
99 if( symbol && ( !powerSymbolsOnly || symbol->
IsPower() ) )
100 aSymbolList.emplace_back( symbol );
107 const wxString& aAliasName,
123 std::string tableName =
"";
124 std::string symbolName( aAliasName.ToUTF8() );
126 if( aAliasName.Contains(
'/' ) )
128 tableName = std::string( aAliasName.BeforeFirst(
'/' ).ToUTF8() );
129 symbolName = std::string( aAliasName.AfterFirst(
'/' ).ToUTF8() );
132 std::vector<const DATABASE_LIB_TABLE*> tablesToTry;
136 if( tableIter.
name == tableName )
137 tablesToTry.emplace_back( &tableIter );
140 if( tablesToTry.empty() )
142 wxLogTrace(
traceDatabase, wxT(
"LoadSymbol: table '%s' not found in config" ), tableName );
151 if(
m_conn->SelectOne( table->table, std::make_pair( table->key_col, symbolName ),
155 wxLogTrace(
traceDatabase, wxT(
"LoadSymbol: SelectOne (%s, %s) found in %s" ),
156 table->key_col, symbolName, table->table );
160 wxLogTrace(
traceDatabase, wxT(
"LoadSymbol: SelectOne (%s, %s) failed for table %s" ),
161 table->key_col, symbolName, table->table );
165 wxCHECK( foundTable,
nullptr );
177 std::set<wxString> tableNames;
181 if( tableNames.count( tableIter.
name ) )
184 aNames.emplace_back( tableIter.
name );
185 tableNames.insert( tableIter.
name );
199 std::back_inserter( aNames ) );
218 _(
"Could not load database library: settings file %s missing or invalid" ),
227 std::string
path( aSettingsPath.ToUTF8() );
240 wxASSERT_MSG( aSettingsPath ==
m_settings->GetFilename(),
241 "Path changed for database library without re-initializing plugin!" );
245 wxLogTrace(
traceDatabase, wxT(
"ensureSettings: no settings but no valid path!" ) );
252 wxCHECK_RET(
m_settings,
"Call ensureSettings before ensureConnection!" );
259 if(
m_settings->m_Source.connection_string.empty() )
268 std::string cs =
m_settings->m_Source.connection_string;
269 std::string basePath( wxFileName(
m_settings->GetFilename() ).GetPath().ToUTF8() );
273 boost::replace_all( cs,
"${CWD}", basePath );
275 m_conn = std::make_unique<DATABASE_CONNECTION>( cs,
m_settings->m_Source.timeout );
278 if( !
m_conn->IsConnected() )
281 _(
"Could not load database library: could not connect to database %s (%s)" ),
304 std::string symbolIdStr = std::any_cast<std::string>( aRow.at( aTable.
symbols_col ) );
306 symbolId.
Parse( std::any_cast<std::string>( aRow.at( aTable.
symbols_col ) ) );
312 wxLogTrace(
traceDatabase, wxT(
"loadSymbolFromRow: found original symbol '%s'" ),
319 wxLogTrace(
traceDatabase, wxT(
"loadSymboFromRow: source symbol '%s' not found, "
320 "will create empty symbol" ), symbolIdStr );
332 symbol->
SetName( aSymbolName );
340 std::string footprints = std::any_cast<std::string>( aRow.at( aTable.
footprints_col ) );
341 wxString footprint = wxString( footprints.c_str(), wxConvUTF8 ).BeforeFirst(
';' );
346 wxLogTrace(
traceDatabase, wxT(
"loadSymboFromRow: footprint field %s not found." ),
360 wxString value( std::any_cast<std::string>( aRow.at( aTable.
properties.
keywords ) ).c_str(),
371 wxArrayString filters;
372 filters.push_back( value );
390 std::vector<LIB_FIELD*> fields;
393 std::unordered_map<wxString, LIB_FIELD*> fieldsMap;
396 fieldsMap[field->GetName()] = field;
400 if( !aRow.count( mapping.
column ) )
402 wxLogTrace(
traceDatabase, wxT(
"loadSymboFromRow: field %s not found in result" ),
407 wxString value( std::any_cast<std::string>( aRow.at( mapping.
column ) ).c_str(),
410 if( mapping.
name == wxT(
"Value" ) )
422 else if( mapping.
name == wxT(
"Datasheet" ) )
442 if( fieldsMap.count( mapping.
name ) )
444 field = fieldsMap[mapping.
name];
451 fieldsMap[mapping.
name] = field;
std::map< std::string, std::any > ROW
virtual void SetVisible(bool aVisible)
virtual void SetText(const wxString &aText)
Field object used in symbol libraries.
void SetAutoAdded(bool aAutoAdded)
void SetName(const wxString &aName)
Set a user definable field name to aName.
void SetNameShown(bool aShown=true)
A logical library item identifier and consists of various portions much like a URI.
int Parse(const UTF8 &aId, bool aFix=false)
Parse LIB_ID with the information from aId.
void SetSubLibraryName(const UTF8 &aName)
Define a library symbol object.
void SetIncludeOnBoard(bool aIncludeOnBoard)
Set or clear include in board netlist flag.
void SetSourceLibId(const LIB_ID &aLibId)
int GetNextAvailableFieldId() const
virtual LIB_SYMBOL * Duplicate() const
Create a copy of a LIB_SYMBOL and assigns unique KIIDs to the copy and its children.
LIB_FIELD & GetFootprintField()
Return reference to the footprint field.
void SetDescription(const wxString &aDescription)
void SetKeyWords(const wxString &aKeyWords)
void GetFields(std::vector< LIB_FIELD * > &aList)
Return a list of fields within this symbol.
LIB_FIELD & GetValueField()
Return reference to the value field.
void SetFPFilters(const wxArrayString &aFilters)
void AddField(LIB_FIELD *aField)
Add a field.
LIB_FIELD & GetDatasheetField()
Return reference to the datasheet field.
void SetIncludeInBom(bool aIncludeInBom)
Set or clear the include in schematic bill of materials flag.
virtual void SetName(const wxString &aName)
void GetAvailableSymbolFields(std::vector< wxString > &aNames) override
Retrieves a list of (custom) field names that are present on symbols in this library.
std::unique_ptr< DATABASE_CONNECTION > m_conn
void GetSubLibraryNames(std::vector< wxString > &aNames) override
Retrieves a list of sub-libraries in this library.
void EnumerateSymbolLib(wxArrayString &aSymbolNameList, const wxString &aLibraryPath, const STRING_UTF8_MAP *aProperties=nullptr) override
Populate a list of LIB_SYMBOL alias names contained within the library aLibraryPath.
void ensureSettings(const wxString &aSettingsPath)
bool CheckHeader(const wxString &aFileName) override
Return true if the first line in aFileName begins with the expected header.
std::set< wxString > m_defaultShownFields
std::set< wxString > m_customFields
LIB_SYMBOL * loadSymbolFromRow(const wxString &aSymbolName, const DATABASE_LIB_TABLE &aTable, const DATABASE_CONNECTION::ROW &aRow)
LIB_SYMBOL * LoadSymbol(const wxString &aLibraryPath, const wxString &aAliasName, const STRING_UTF8_MAP *aProperties=nullptr) override
Load a LIB_SYMBOL object having aPartName from the aLibraryPath containing a library format that this...
void GetDefaultSymbolFields(std::vector< wxString > &aNames) override
Retrieves a list of (custom) field names that should be shown by default for this library in the symb...
virtual ~SCH_DATABASE_PLUGIN()
std::unique_ptr< DATABASE_LIB_SETTINGS > m_settings
SYMBOL_LIB_TABLE * m_libTable
A name/value tuple with unique names and optional values.
static const char * PropPowerSymsOnly
LIB_SYMBOL * LoadSymbol(const wxString &aNickname, const wxString &aName)
Load a LIB_SYMBOL having aName from the library given by aNickname.
const char *const traceDatabase
#define THROW_IO_ERROR(msg)
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
bool visible_in_chooser
Whether the column is shown by default in the chooser.
std::string column
Database column name.
std::string name
KiCad field name.
bool inherit_properties
Whether or not to inherit properties from symbol field.
bool visible_on_add
Whether to show the field when placing the symbol.
bool show_name
Whether or not to show the field name as well as its value.
A database library table will be mapped to a sub-library provided by the database library entry in th...
std::string key_col
Unique key column name (will form part of the LIB_ID)
std::string name
KiCad library nickname (will form part of the LIB_ID)
std::string symbols_col
Column name containing KiCad symbol refs.
std::string footprints_col
Column name containing KiCad footprint refs.
std::vector< DATABASE_FIELD_MAPPING > fields
std::string table
Database table to pull content from.
MAPPABLE_SYMBOL_PROPERTIES properties
std::string footprint_filters
std::string exclude_from_board
std::string exclude_from_bom