## Other changes

### Multi threading environment

Previous versions of Libgda only supported being used in a single thread at a time; this new version still keeps this limitation except for objects which implement the GdaLockable interface which can be used from any thread at the same time: the GdaConnection and GdaSqlParser objects implement that interface.

### Configuration management

- Data sources and installed providers are now handled using the GdaConfig object, with the particularity that there can only be one such object instantiated per program.

- The GDA_DSN_LIST_IN_MEMORY environment variable which , if set, prevented Libgda from writing the list of defined data sources to a file has been removed. To obtain the same result, one must force the creation of the unique GdaConfig object with the user-file property set to NULL.

### Database provider's changes

- BLOB handling in the PostgreSQL provider has changed and is now similar to JDBC and ODBC: the provider does not handle orphaned BLOBs (which is a problem specific to PostgreSQL). See the section about PostgreSQL's limitations for more information.

### API changes

- Connections are now opened using gda_connection_open_from_dsn () or gda_connection_open_from_string () depending on how the connection is defined

- Upon opening a connection, the `username` and `password` arguments have been replaced by a more flexible arguments passing mechanism where providers can specify what authorization parameters they use

- gda_server_provider_get_last_insert_id() has been removed in favor of the "last_insert_row" argument of the gda_connection_statement_execute () and gda_connection_statement_execute_non_select () methods. If that argument is not NULL, then if the statement is an INSERT statement, the argument will contain a list of values, one for each column of the modified table.

- The GdaServerProviderInfo structure has been removed as it was useless, and the gda_server_provider_get_info() has been replaced by a gda_server_provider_get_name () method to access the provider's name.

- gda_data_model_get_value_at () now has an extra GError argument to return an error if getting the value has failed

- gda_data_model_get_column_index_by_name() has been replaced by gda_data_model_get_column_index()

- gda_data_model_get_value_at_col_name() has been replaced by gda_data_model_get_value_at_column()

### List of removed objects and interfaces

- GdaClient

- GdaRenderer, GdaXmlStorage, GdaEntity, GdaEntityField and GdaReferer interfaces

- GdaDict, GdaDictType, GdaDictDatabase, GdaDictTable, GdaDictAggregate, GdaDictField, GdaDictConstraint and GdaDictFunction dictionary related objects

- GdaQuery, GdaQueryObject, GdaQueryFieldAgg, GdaQueryFieldAll, GdaQueryCondition, GdaQueryJoin, GdaQueryFieldField, GdaQueryTarget, GdaQueryFieldFunc, GdaQueryFieldValue and GdaQueryField query related objects

- GdaCommand

- GdaParameterList (replaced by GdaSet), GdaParameter (replaced by GdaHolder)

- GdaObject, GdaObjectRef

- GdaDataModelFilterSQL

- GdaGraph, GdaGraphItem, GdaGraphQuery

- GdaGraphviz

- GdaDataModelQuery (features redundant with the GdaDataSelect object)

### List of removed functions

- gda_delimiter_*()

- gda_sql_transaction_parse*()

- sql_*() (from the libsql library)

- gda_server_provider_change_database()

- gda_value_compare_ext()

- gda_data_access_wrapper_row_exists()