<!-- ##### SECTION Title ##### -->
GdaDataModel

<!-- ##### SECTION Short_Description ##### -->
Basic data model class

<!-- ##### SECTION Long_Description ##### -->
<para>
A #GdaDataMode represents an array of values organized in rows and columns. All the data in the same 
column have the same type, and all the data in each row have the same semantic meaning. The #GdaDataModel is
actually an interface implemented by other objects to support various kinds of data storage and operations.
</para>
<para>
Depending on the real implementation, the contents of data models may be modified by the user using functions
provided by the model. The actual operations a data model permits can be known using the 
gda_data_model_get_access_flags() method.
</para>
<para>
Again, depending on the real implementation, data retreiving can be done either accessing direct random
values located by their row and column, or using a #GdaDataModelIter cursor, or both. Use the 
gda_data_model_get_access_flags() method to know how the data model can be accessed. Note that a #GdaDatamodel
which can be accessed in a random way can also be accessed using cursors (and several cusrors may be used at the same
time), whereas data model which can only be accessed using cursors can only have one cursor for iterating.
</para>
<para>
Random access data models are easier to use since picking a value is very simple using the gda_data_model_get_value_at(),
but consume more memory since all the accessible values must generally be present in memory even if they are not used.
Thus if a data model must handle large quantities of data, it is generally wiser to use a data model which can be 
only accessed using a cursor.
</para>
<para>
As a side note there are also data models which wrap other data models such as:
<itemizedlist>
    <listitem><para>The #GdaDataProxy data model which stores temporary modifications and shows only some
	parts of the wrapped data model</para></listitem>
    <listitem><para>The #GdaDataAccessWrapper data model which offers a memory-efficient random access on top of a
	wrapped cursor based access data model</para></listitem>
</itemizedlist>
</para>

<!-- ##### SECTION See_Also ##### -->
<para>

</para>

<!-- ##### SECTION Stability_Level ##### -->


<!-- ##### STRUCT GdaDataModel ##### -->
<para>

</para>


<!-- ##### SIGNAL GdaDataModel::row-inserted ##### -->
<para>

</para>

@gdadatamodel: the object which received the signal.
@arg1: 

<!-- ##### SIGNAL GdaDataModel::row-removed ##### -->
<para>

</para>

@gdadatamodel: the object which received the signal.
@arg1: 

<!-- ##### SIGNAL GdaDataModel::row-updated ##### -->
<para>

</para>

@gdadatamodel: the object which received the signal.
@arg1: 

<!-- ##### ENUM GdaDataModelAccessFlags ##### -->
<para>

</para>

@GDA_DATA_MODEL_ACCESS_RANDOM: 
@GDA_DATA_MODEL_ACCESS_CURSOR_FORWARD: 
@GDA_DATA_MODEL_ACCESS_CURSOR_BACKWARD: 
@GDA_DATA_MODEL_ACCESS_INSERT: 
@GDA_DATA_MODEL_ACCESS_UPDATE: 
@GDA_DATA_MODEL_ACCESS_DELETE: 
@GDA_DATA_MODEL_ACCESS_WRITE: 

<!-- ##### ENUM GdaDataModelHint ##### -->
<para>

</para>

@GDA_DATA_MODEL_HINT_START_BATCH_UPDATE: 
@GDA_DATA_MODEL_HINT_END_BATCH_UPDATE: 
@GDA_DATA_MODEL_HINT_REFRESH: 

<!-- ##### ENUM GdaDataModelIOFormat ##### -->
<para>

</para>

@GDA_DATA_MODEL_IO_DATA_ARRAY_XML: 
@GDA_DATA_MODEL_IO_TEXT_SEPARATED: 

<!-- ##### FUNCTION gda_data_model_changed ##### -->
<para>

</para>

@model: 


<!-- ##### FUNCTION gda_data_model_row_inserted ##### -->
<para>

</para>

@model: 
@row: 


<!-- ##### FUNCTION gda_data_model_row_updated ##### -->
<para>

</para>

@model: 
@row: 


<!-- ##### FUNCTION gda_data_model_row_removed ##### -->
<para>

</para>

@model: 
@row: 


<!-- ##### FUNCTION gda_data_model_freeze ##### -->
<para>

</para>

@model: 


<!-- ##### FUNCTION gda_data_model_thaw ##### -->
<para>

</para>

@model: 


<!-- ##### FUNCTION gda_data_model_get_access_flags ##### -->
<para>

</para>

@model: 
@Returns: 


<!-- ##### FUNCTION gda_data_model_get_n_rows ##### -->
<para>

</para>

@model: 
@Returns: 


<!-- ##### FUNCTION gda_data_model_get_n_columns ##### -->
<para>

</para>

@model: 
@Returns: 


<!-- ##### FUNCTION gda_data_model_describe_column ##### -->
<para>

</para>

@model: 
@col: 
@Returns: 


<!-- ##### FUNCTION gda_data_model_get_column_title ##### -->
<para>

</para>

@model: 
@col: 
@Returns: 


<!-- ##### FUNCTION gda_data_model_set_column_title ##### -->
<para>

</para>

@model: 
@col: 
@title: 


<!-- ##### FUNCTION gda_data_model_get_value_at ##### -->
<para>

</para>

@model: 
@col: 
@row: 
@Returns: 


<!-- ##### FUNCTION gda_data_model_set_value_at ##### -->
<para>

</para>

@model: 
@col: 
@row: 
@value: 
@error: 
@Returns: 


<!-- ##### FUNCTION gda_data_model_create_iter ##### -->
<para>

</para>

@model: 
@Returns: 
<!-- # Unused Parameters # -->
@row: 


<!-- ##### FUNCTION gda_data_model_move_iter_at_row ##### -->
<para>

</para>

@model: 
@iter: 
@row: 
@Returns: 


<!-- ##### FUNCTION gda_data_model_move_iter_next ##### -->
<para>

</para>

@model: 
@iter: 
@Returns: 


<!-- ##### FUNCTION gda_data_model_move_iter_prev ##### -->
<para>

</para>

@model: 
@iter: 
@Returns: 


<!-- ##### FUNCTION gda_data_model_append_values ##### -->
<para>

</para>

@model: 
@values: 
@error: 
@Returns: 


<!-- ##### FUNCTION gda_data_model_append_row ##### -->
<para>

</para>

@model: 
@error: 
@Returns: 
<!-- # Unused Parameters # -->
@row: 
@values: 


<!-- ##### FUNCTION gda_data_model_remove_row ##### -->
<para>

</para>

@model: 
@row: 
@error: 
@Returns: 


<!-- ##### FUNCTION gda_data_model_get_row_from_values ##### -->
<para>

</para>

@model: 
@values: 
@cols_index: 
@Returns: 


<!-- ##### FUNCTION gda_data_model_send_hint ##### -->
<para>

</para>

@model: 
@hint: 
@hint_value: 


<!-- ##### FUNCTION gda_data_model_export_to_string ##### -->
<para>

</para>

@model: 
@format: 
@cols: 
@nb_cols: 
@options: 
@Returns: 


<!-- ##### FUNCTION gda_data_model_export_to_file ##### -->
<para>

</para>

@model: 
@format: 
@file: 
@cols: 
@nb_cols: 
@options: 
@error: 
@Returns: 


<!-- ##### FUNCTION gda_data_model_import_from_model ##### -->
<para>

</para>

@to: 
@from: 
@cols_trans: 
@error: 
@Returns: 


<!-- ##### FUNCTION gda_data_model_import_from_string ##### -->
<para>

</para>

@model: 
@string: 
@cols_trans: 
@options: 
@error: 
@Returns: 
<!-- # Unused Parameters # -->
@format: 
@cols: 
@nb_cols: 


<!-- ##### FUNCTION gda_data_model_import_from_file ##### -->
<para>

</para>

@model: 
@file: 
@cols_trans: 
@options: 
@error: 
@Returns: 
<!-- # Unused Parameters # -->
@format: 
@cols: 
@nb_cols: 


<!-- ##### FUNCTION gda_data_model_dump ##### -->
<para>

</para>

@model: 
@to_stream: 


<!-- ##### FUNCTION gda_data_model_dump_as_string ##### -->
<para>

</para>

@model: 
@Returns: 


