LCOV - code coverage report
Current view: top level - data/source/storage - data_database_classifier_reader.c (source / functions) Hit Total Coverage
Test: crystal-facet-uml_v1.57.0_covts Lines: 488 528 92.4 %
Date: 2024-04-07 11:14:42 Functions: 18 18 100.0 %

          Line data    Source code
       1             : /* File: data_database_classifier_reader.c; Copyright and License: see below */
       2             : 
       3             : #include "storage/data_database_classifier_reader.h"
       4             : #include "u8/u8_trace.h"
       5             : #include "u8/u8_log.h"
       6             : #include "utf8stringbuf/utf8stringbuf.h"
       7             : #include <sqlite3.h>
       8             : #include <assert.h>
       9             : 
      10          92 : u8_error_t data_database_classifier_reader_init ( data_database_classifier_reader_t *this_, data_database_t *database )
      11             : {
      12          92 :     U8_TRACE_BEGIN();
      13          92 :     assert( NULL != database );
      14          92 :     u8_error_t result = U8_ERROR_NONE;
      15             : 
      16          92 :     (*this_).database = database;
      17             : 
      18          92 :     (*this_).statement_classifier_by_id = NULL;
      19          92 :     (*this_).statement_classifier_by_name = NULL;
      20          92 :     (*this_).statement_classifier_by_uuid = NULL;
      21          92 :     (*this_).statement_classifiers_by_diagram_id = NULL;
      22          92 :     (*this_).statement_feature_by_id = NULL;
      23          92 :     (*this_).statement_feature_by_uuid = NULL;
      24          92 :     (*this_).statement_features_by_classifier_id = NULL;
      25          92 :     (*this_).statement_features_by_diagram_id = NULL;
      26          92 :     (*this_).statement_relationship_by_id = NULL;
      27          92 :     (*this_).statement_relationship_by_uuid = NULL;
      28          92 :     (*this_).statement_relationships_by_classifier_id = NULL;
      29          92 :     (*this_).statement_relationships_by_feature_id = NULL;
      30          92 :     (*this_).statement_relationships_by_diagram_id = NULL;
      31             : 
      32          92 :     result |= data_database_classifier_reader_private_open( this_ );
      33             : 
      34          92 :     U8_TRACE_END_ERR(result);
      35          92 :     return result;
      36             : }
      37             : 
      38          92 : u8_error_t data_database_classifier_reader_destroy ( data_database_classifier_reader_t *this_ )
      39             : {
      40          92 :     U8_TRACE_BEGIN();
      41          92 :     u8_error_t result = U8_ERROR_NONE;
      42             : 
      43          92 :     result |= data_database_classifier_reader_private_close( this_ );
      44             : 
      45          92 :     (*this_).database = NULL;
      46             : 
      47          92 :     U8_TRACE_END_ERR(result);
      48          92 :     return result;
      49             : }
      50             : 
      51             : /* ================================ CLASSIFIER ================================ */
      52             : 
      53             : /*!
      54             :  *  \brief predefined search statement to find a classifier by id
      55             :  */
      56             : static const char DATA_DATABASE_READER_SELECT_CLASSIFIER_BY_ID[] =
      57             :     "SELECT id,main_type,stereotype,name,description,x_order,y_order,list_order,uuid "
      58             :     "FROM classifiers WHERE id=?;";
      59             : 
      60             : /*!
      61             :  *  \brief predefined search statement to find a classifier by uuid
      62             :  */
      63             : static const char DATA_DATABASE_READER_SELECT_CLASSIFIER_BY_UUID[] =
      64             :     "SELECT id,main_type,stereotype,name,description,x_order,y_order,list_order,uuid "
      65             :     "FROM classifiers WHERE uuid=?;";
      66             : 
      67             : /*!
      68             :  *  \brief predefined search statement to find a classifier by name
      69             :  */
      70             : static const char DATA_DATABASE_READER_SELECT_CLASSIFIER_BY_NAME[] =
      71             :     "SELECT id,main_type,stereotype,name,description,x_order,y_order,list_order,uuid "
      72             :     "FROM classifiers WHERE name=?;";
      73             : 
      74             : /*!
      75             :  *  \brief predefined search statement to find classifier by diagram-id
      76             :  */
      77             : static const char DATA_DATABASE_READER_SELECT_CLASSIFIERS_BY_DIAGRAM_ID[] =
      78             :     "SELECT classifiers.id,classifiers.main_type,classifiers.stereotype,"
      79             :     "classifiers.name,classifiers.description,classifiers.x_order,classifiers.y_order,classifiers.list_order,"
      80             :     "classifiers.uuid,"
      81             :     "diagramelements.id,diagramelements.display_flags,diagramelements.focused_feature_id,diagramelements.uuid "
      82             :     "FROM classifiers "
      83             :     "INNER JOIN diagramelements ON diagramelements.classifier_id=classifiers.id "
      84             :     "WHERE diagramelements.diagram_id=? "
      85             :     "ORDER BY diagramelements.id ASC;";
      86             :     /* To ensure reporducible results of json esports, ordering by a unique key is required here. */
      87             :     /* Ordering by 2 keys did not produce the expected results with sqlite3 3.34.1 */
      88             :     /* "ORDER BY classifiers.list_order ASC,diagramelements.id ASC;"; */
      89             :     /* see also https://sqlite.org/forum/forumpost/e1033dab18c262ac4b36cdf7c65bf87a5aaaecab3b3ba100e4588fc30e50f9fb */
      90             : 
      91             : /*!
      92             :  *  \brief the column id of the result where this parameter is stored: id
      93             :  */
      94             : static const int RESULT_CLASSIFIER_ID_COLUMN = 0;
      95             : 
      96             : /*!
      97             :  *  \brief the column id of the result where this parameter is stored: main_type
      98             :  */
      99             : static const int RESULT_CLASSIFIER_MAIN_TYPE_COLUMN = 1;
     100             : 
     101             : /*!
     102             :  *  \brief the column id of the result where this parameter is stored: stereotype
     103             :  */
     104             : static const int RESULT_CLASSIFIER_STEREOTYPE_COLUMN = 2;
     105             : 
     106             : /*!
     107             :  *  \brief the column id of the result where this parameter is stored: name
     108             :  */
     109             : static const int RESULT_CLASSIFIER_NAME_COLUMN = 3;
     110             : 
     111             : /*!
     112             :  *  \brief the column id of the result where this parameter is stored: description
     113             :  */
     114             : static const int RESULT_CLASSIFIER_DESCRIPTION_COLUMN = 4;
     115             : 
     116             : /*!
     117             :  *  \brief the column id of the result where this parameter is stored: x_order
     118             :  */
     119             : static const int RESULT_CLASSIFIER_X_ORDER_COLUMN = 5;
     120             : 
     121             : /*!
     122             :  *  \brief the column id of the result where this parameter is stored: y_order
     123             :  */
     124             : static const int RESULT_CLASSIFIER_Y_ORDER_COLUMN = 6;
     125             : 
     126             : /*!
     127             :  *  \brief the column id of the result where this parameter is stored: list_order
     128             :  */
     129             : static const int RESULT_CLASSIFIER_LIST_ORDER_COLUMN = 7;
     130             : 
     131             : /*!
     132             :  *  \brief the column id of the result where this parameter is stored: uuid
     133             :  */
     134             : static const int RESULT_CLASSIFIER_UUID_COLUMN = 8;
     135             : 
     136             : /*!
     137             :  *  \brief the column id of the result where this parameter is stored: diagramelements.id
     138             :  */
     139             : static const int RESULT_CLASSIFIER_DIAGRAMELEMENT_ID_COLUMN = 9;
     140             : 
     141             : /*!
     142             :  *  \brief the column id of the result where this parameter is stored: diagramelements.display_flags
     143             :  */
     144             : static const int RESULT_CLASSIFIER_DISPLAY_FLAGS_COLUMN = 10;
     145             : 
     146             : /*!
     147             :  *  \brief the column id of the result where this parameter is stored: diagramelements.focused_feature_id
     148             :  */
     149             : static const int RESULT_CLASSIFIER_FOCUSED_FEATURE_ID_COLUMN = 11;
     150             : 
     151             : /*!
     152             :  *  \brief the column id of the result where this parameter is stored: diagramelements.uuid
     153             :  */
     154             : static const int RESULT_CLASSIFIER_DIAGELE_UUID_COLUMN = 12;
     155             : 
     156          12 : u8_error_t data_database_classifier_reader_get_classifier_by_id( data_database_classifier_reader_t *this_,
     157             :                                                                  data_row_id_t id,
     158             :                                                                  data_classifier_t *out_classifier )
     159             : {
     160          12 :     U8_TRACE_BEGIN();
     161          12 :     assert( NULL != out_classifier );
     162          12 :     u8_error_t result = U8_ERROR_NONE;
     163             :     int sqlite_err;
     164             :     sqlite3_stmt *prepared_statement;
     165             : 
     166             :     {
     167          12 :         prepared_statement = (*this_).statement_classifier_by_id;
     168             : 
     169          12 :         result |= data_database_classifier_reader_private_bind_id_to_statement( this_, prepared_statement, id );
     170             : 
     171          12 :         U8_TRACE_INFO( "sqlite3_step()" );
     172          12 :         sqlite_err = sqlite3_step( prepared_statement );
     173          12 :         if ( SQLITE_ROW != sqlite_err )
     174             :         {
     175             :             /* this situation may happen if a classifier is deleted that is shown in the attributes editor */
     176           0 :             U8_TRACE_INFO_INT( "sqlite3_step did not find a row for id", id );
     177           0 :             result |= U8_ERROR_DB_STRUCTURE;  /* non-existing ids are worse than U8_ERROR_NOT_FOUND */
     178             :         }
     179             : 
     180          12 :         if ( SQLITE_ROW == sqlite_err )
     181             :         {
     182          24 :             result |= data_classifier_init( out_classifier,
     183          12 :                                             sqlite3_column_int64( prepared_statement, RESULT_CLASSIFIER_ID_COLUMN ),
     184          12 :                                             sqlite3_column_int( prepared_statement, RESULT_CLASSIFIER_MAIN_TYPE_COLUMN ),
     185          12 :                                             (const char*) sqlite3_column_text( prepared_statement, RESULT_CLASSIFIER_STEREOTYPE_COLUMN ),
     186          12 :                                             (const char*) sqlite3_column_text( prepared_statement, RESULT_CLASSIFIER_NAME_COLUMN ),
     187          12 :                                             (const char*) sqlite3_column_text( prepared_statement, RESULT_CLASSIFIER_DESCRIPTION_COLUMN ),
     188             :                                             sqlite3_column_int( prepared_statement, RESULT_CLASSIFIER_X_ORDER_COLUMN ),
     189             :                                             sqlite3_column_int( prepared_statement, RESULT_CLASSIFIER_Y_ORDER_COLUMN ),
     190             :                                             sqlite3_column_int( prepared_statement, RESULT_CLASSIFIER_LIST_ORDER_COLUMN ),
     191          12 :                                             (const char*) sqlite3_column_text( prepared_statement, RESULT_CLASSIFIER_UUID_COLUMN )
     192             :                                           );
     193             : 
     194          12 :             data_classifier_trace( out_classifier );
     195             : 
     196          12 :             sqlite_err = sqlite3_step( prepared_statement );
     197          12 :             if ( SQLITE_DONE != sqlite_err )
     198             :             {
     199           0 :                 U8_LOG_ERROR_INT( "sqlite3_step failed:", sqlite_err );
     200           0 :                 result |= U8_ERROR_DB_STRUCTURE;
     201             :             }
     202             :         }
     203             :     }
     204             : 
     205          12 :     U8_TRACE_END_ERR( result );
     206          12 :     return result;
     207             : }
     208             : 
     209          31 : u8_error_t data_database_classifier_reader_get_classifier_by_name( data_database_classifier_reader_t *this_,
     210             :                                                                    const char *name,
     211             :                                                                    data_classifier_t *out_classifier )
     212             : {
     213          31 :     U8_TRACE_BEGIN();
     214          31 :     assert( NULL != out_classifier );
     215          31 :     assert( NULL != name );
     216          31 :     u8_error_t result = U8_ERROR_NONE;
     217             :     int sqlite_err;
     218             :     sqlite3_stmt *prepared_statement;
     219             : 
     220             :     {
     221          31 :         prepared_statement = (*this_).statement_classifier_by_name;
     222             : 
     223          31 :         result |= data_database_classifier_reader_private_bind_text_to_statement( this_, prepared_statement, name );
     224             : 
     225          31 :         U8_TRACE_INFO( "sqlite3_step()" );
     226          31 :         sqlite_err = sqlite3_step( prepared_statement );
     227          31 :         if ( SQLITE_ROW != sqlite_err )
     228             :         {
     229           4 :             U8_TRACE_INFO_STR( "sqlite3_step did not find a row for name", name );
     230           4 :             result |= U8_ERROR_NOT_FOUND;
     231             :         }
     232             : 
     233          31 :         if ( SQLITE_ROW == sqlite_err )
     234             :         {
     235          54 :             result |= data_classifier_init( out_classifier,
     236          27 :                                             sqlite3_column_int64( prepared_statement, RESULT_CLASSIFIER_ID_COLUMN ),
     237          27 :                                             sqlite3_column_int( prepared_statement, RESULT_CLASSIFIER_MAIN_TYPE_COLUMN ),
     238          27 :                                             (const char*) sqlite3_column_text( prepared_statement, RESULT_CLASSIFIER_STEREOTYPE_COLUMN ),
     239          27 :                                             (const char*) sqlite3_column_text( prepared_statement, RESULT_CLASSIFIER_NAME_COLUMN ),
     240          27 :                                             (const char*) sqlite3_column_text( prepared_statement, RESULT_CLASSIFIER_DESCRIPTION_COLUMN ),
     241             :                                             sqlite3_column_int( prepared_statement, RESULT_CLASSIFIER_X_ORDER_COLUMN ),
     242             :                                             sqlite3_column_int( prepared_statement, RESULT_CLASSIFIER_Y_ORDER_COLUMN ),
     243             :                                             sqlite3_column_int( prepared_statement, RESULT_CLASSIFIER_LIST_ORDER_COLUMN ),
     244          27 :                                             (const char*) sqlite3_column_text( prepared_statement, RESULT_CLASSIFIER_UUID_COLUMN )
     245             :                                           );
     246             : 
     247          27 :             data_classifier_trace( out_classifier );
     248             : 
     249          27 :             sqlite_err = sqlite3_step( prepared_statement );
     250          27 :             if ( SQLITE_DONE != sqlite_err )
     251             :             {
     252           0 :                 U8_LOG_ERROR_INT( "sqlite3_step not done yet:", sqlite_err );
     253           0 :                 result |= U8_ERROR_DB_STRUCTURE;
     254             :             }
     255             :         }
     256             :     }
     257             : 
     258          31 :     U8_TRACE_END_ERR( result );
     259          31 :     return result;
     260             : }
     261             : 
     262          72 : u8_error_t data_database_classifier_reader_get_classifier_by_uuid ( data_database_classifier_reader_t *this_,
     263             :                                                                     const char *uuid,
     264             :                                                                     data_classifier_t *out_classifier )
     265             : {
     266          72 :     U8_TRACE_BEGIN();
     267          72 :     assert( NULL != out_classifier );
     268          72 :     assert( NULL != uuid );
     269          72 :     u8_error_t result = U8_ERROR_NONE;
     270             :     int sqlite_err;
     271             :     sqlite3_stmt *prepared_statement;
     272             : 
     273             :     {
     274          72 :         prepared_statement = (*this_).statement_classifier_by_uuid;
     275             : 
     276          72 :         result |= data_database_classifier_reader_private_bind_text_to_statement( this_, prepared_statement, uuid );
     277             : 
     278          72 :         U8_TRACE_INFO( "sqlite3_step()" );
     279          72 :         sqlite_err = sqlite3_step( prepared_statement );
     280          72 :         if ( SQLITE_ROW != sqlite_err )
     281             :         {
     282             :             /* Do not log this incident, the caller may not expect to find a row. */
     283          31 :             U8_TRACE_INFO_STR( "sqlite3_step did not find a row for uuid", uuid );
     284          31 :             result |= U8_ERROR_NOT_FOUND;
     285             :         }
     286             : 
     287          72 :         if ( SQLITE_ROW == sqlite_err )
     288             :         {
     289          82 :             result |= data_classifier_init( out_classifier,
     290          41 :                                             sqlite3_column_int64( prepared_statement, RESULT_CLASSIFIER_ID_COLUMN ),
     291          41 :                                             sqlite3_column_int( prepared_statement, RESULT_CLASSIFIER_MAIN_TYPE_COLUMN ),
     292          41 :                                             (const char*) sqlite3_column_text( prepared_statement, RESULT_CLASSIFIER_STEREOTYPE_COLUMN ),
     293          41 :                                             (const char*) sqlite3_column_text( prepared_statement, RESULT_CLASSIFIER_NAME_COLUMN ),
     294          41 :                                             (const char*) sqlite3_column_text( prepared_statement, RESULT_CLASSIFIER_DESCRIPTION_COLUMN ),
     295             :                                             sqlite3_column_int( prepared_statement, RESULT_CLASSIFIER_X_ORDER_COLUMN ),
     296             :                                             sqlite3_column_int( prepared_statement, RESULT_CLASSIFIER_Y_ORDER_COLUMN ),
     297             :                                             sqlite3_column_int( prepared_statement, RESULT_CLASSIFIER_LIST_ORDER_COLUMN ),
     298          41 :                                             (const char*) sqlite3_column_text( prepared_statement, RESULT_CLASSIFIER_UUID_COLUMN )
     299             :                                           );
     300             : 
     301          41 :             data_classifier_trace( out_classifier );
     302             : 
     303          41 :             sqlite_err = sqlite3_step( prepared_statement );
     304          41 :             if ( SQLITE_DONE != sqlite_err )
     305             :             {
     306           0 :                 U8_LOG_ERROR_INT( "sqlite3_step not done yet:", sqlite_err );
     307           0 :                 result |= U8_ERROR_DB_STRUCTURE;
     308             :             }
     309             :         }
     310             :     }
     311             : 
     312          72 :     U8_TRACE_END_ERR( result );
     313          72 :     return result;
     314             : }
     315             : 
     316         142 : u8_error_t data_database_classifier_reader_get_classifiers_by_diagram_id( data_database_classifier_reader_t *this_,
     317             :                                                                           data_row_id_t diagram_id,
     318             :                                                                           uint32_t max_out_array_size,
     319             :                                                                           data_visible_classifier_t (*out_visible_classifier)[],
     320             :                                                                           uint32_t *out_visible_classifier_count )
     321             : {
     322         142 :     U8_TRACE_BEGIN();
     323         142 :     assert( NULL != out_visible_classifier_count );
     324         142 :     assert( NULL != out_visible_classifier );
     325         142 :     u8_error_t result = U8_ERROR_NONE;
     326             :     int sqlite_err;
     327             :     sqlite3_stmt *prepared_statement;
     328             : 
     329             :     {
     330         142 :         prepared_statement = (*this_).statement_classifiers_by_diagram_id;
     331             : 
     332         142 :         result |= data_database_classifier_reader_private_bind_id_to_statement( this_, prepared_statement, diagram_id );
     333             : 
     334         142 :         *out_visible_classifier_count = 0;
     335         142 :         sqlite_err = SQLITE_ROW;
     336         319 :         for ( uint32_t row_index = 0; (SQLITE_ROW == sqlite_err) && (row_index <= max_out_array_size); row_index ++ )
     337             :         {
     338         177 :             U8_TRACE_INFO( "sqlite3_step()" );
     339         177 :             sqlite_err = sqlite3_step( prepared_statement );
     340         177 :             if (( SQLITE_ROW != sqlite_err )&&( SQLITE_DONE != sqlite_err ))
     341             :             {
     342           0 :                 U8_LOG_ERROR_INT( "sqlite3_step failed:", sqlite_err );
     343           0 :                 result |= U8_ERROR_AT_DB;
     344             :             }
     345         177 :             if (( SQLITE_ROW == sqlite_err )&&(row_index < max_out_array_size))
     346             :             {
     347          35 :                 *out_visible_classifier_count = row_index+1;
     348             :                 data_visible_classifier_t *current_vis_classifier;
     349          35 :                 current_vis_classifier = &((*out_visible_classifier)[row_index]);
     350          35 :                 data_visible_classifier_init_empty( current_vis_classifier );
     351             : 
     352             :                 data_classifier_t *current_classifier;
     353          35 :                 current_classifier = data_visible_classifier_get_classifier_ptr( current_vis_classifier );
     354          35 :                 data_row_id_t classifier_id = sqlite3_column_int64( prepared_statement, RESULT_CLASSIFIER_ID_COLUMN );
     355          70 :                 result |= data_classifier_reinit( current_classifier,
     356             :                                                   classifier_id,
     357          35 :                                                   sqlite3_column_int( prepared_statement, RESULT_CLASSIFIER_MAIN_TYPE_COLUMN ),
     358          35 :                                                   (const char*) sqlite3_column_text( prepared_statement, RESULT_CLASSIFIER_STEREOTYPE_COLUMN ),
     359          35 :                                                   (const char*) sqlite3_column_text( prepared_statement, RESULT_CLASSIFIER_NAME_COLUMN ),
     360          35 :                                                   (const char*) sqlite3_column_text( prepared_statement, RESULT_CLASSIFIER_DESCRIPTION_COLUMN ),
     361             :                                                   sqlite3_column_int( prepared_statement, RESULT_CLASSIFIER_X_ORDER_COLUMN ),
     362             :                                                   sqlite3_column_int( prepared_statement, RESULT_CLASSIFIER_Y_ORDER_COLUMN ),
     363             :                                                   sqlite3_column_int( prepared_statement, RESULT_CLASSIFIER_LIST_ORDER_COLUMN ),
     364          35 :                                                   (const char*) sqlite3_column_text( prepared_statement, RESULT_CLASSIFIER_UUID_COLUMN )
     365             :                                                 );
     366             : 
     367             :                 data_diagramelement_t *current_diag_element;
     368          35 :                 current_diag_element = data_visible_classifier_get_diagramelement_ptr( current_vis_classifier );
     369          35 :                 result |= data_diagramelement_reinit( current_diag_element,
     370          35 :                                                       sqlite3_column_int64( prepared_statement, RESULT_CLASSIFIER_DIAGRAMELEMENT_ID_COLUMN ),
     371             :                                                       diagram_id,
     372             :                                                       classifier_id,
     373          35 :                                                       sqlite3_column_int64( prepared_statement, RESULT_CLASSIFIER_DISPLAY_FLAGS_COLUMN ),
     374          35 :                                                       sqlite3_column_int64( prepared_statement, RESULT_CLASSIFIER_FOCUSED_FEATURE_ID_COLUMN ),
     375          35 :                                                       (const char*) sqlite3_column_text( prepared_statement, RESULT_CLASSIFIER_DIAGELE_UUID_COLUMN )
     376             :                                                     );
     377          35 :                 if ( SQLITE_NULL == sqlite3_column_type( prepared_statement, RESULT_CLASSIFIER_FOCUSED_FEATURE_ID_COLUMN ) )
     378             :                 {
     379          34 :                     data_diagramelement_set_focused_feature_row_id ( current_diag_element, DATA_ROW_ID_VOID );
     380             :                 }
     381             : 
     382          35 :                 data_classifier_trace( current_classifier );
     383          35 :                 data_diagramelement_trace( current_diag_element );
     384             :             }
     385         177 :             if (( SQLITE_ROW == sqlite_err )&&(row_index >= max_out_array_size))
     386             :             {
     387           1 :                 U8_LOG_ANOMALY_INT( "out_visible_classifier[] full:", (row_index+1) );
     388           1 :                 result |= U8_ERROR_ARRAY_BUFFER_EXCEEDED;
     389             :             }
     390         177 :             if ( SQLITE_DONE == sqlite_err )
     391             :             {
     392         141 :                 U8_TRACE_INFO( "sqlite3_step finished: SQLITE_DONE" );
     393             :             }
     394             :         }
     395             :     }
     396             : 
     397         142 :     U8_TRACE_END_ERR( result );
     398         142 :     return result;
     399             : }
     400             : 
     401           1 : u8_error_t data_database_classifier_reader_get_all_classifiers_iterator( data_database_classifier_reader_t *this_,
     402             :                                                                          bool hierarchical,
     403             :                                                                          data_database_iterator_classifiers_t *io_classifier_iterator
     404             :                                                                        )
     405             : {
     406           1 :     U8_TRACE_BEGIN();
     407           1 :     assert( NULL != io_classifier_iterator );
     408           1 :     u8_error_t result = U8_ERROR_NONE;
     409             : 
     410           1 :     result |= data_database_iterator_classifiers_reinit( io_classifier_iterator, (*this_).database, hierarchical );
     411             : 
     412           1 :     U8_TRACE_END_ERR( result );
     413           1 :     return result;
     414             : }
     415             : 
     416             : /* ================================ FEATURE ================================ */
     417             : 
     418             : /*!
     419             :  *  \brief predefined search statement to find a feature by id
     420             :  */
     421             : static const char DATA_DATABASE_READER_SELECT_FEATURE_BY_ID[] =
     422             :     "SELECT id,main_type,classifier_id,key,value,description,list_order,uuid "
     423             :     "FROM features WHERE id=?;";
     424             : 
     425             : /*!
     426             :  *  \brief predefined search statement to find a feature by uuid
     427             :  */
     428             : static const char DATA_DATABASE_READER_SELECT_FEATURE_BY_UUID[] =
     429             :     "SELECT id,main_type,classifier_id,key,value,description,list_order,uuid "
     430             :     "FROM features WHERE uuid=?;";
     431             : 
     432             : /*!
     433             :  *  \brief predefined search statement to find features by diagram-id
     434             :  */
     435             : static const char DATA_DATABASE_READER_SELECT_FEATURES_BY_DIAGRAM_ID[] =
     436             :     "SELECT features.id,features.main_type,features.classifier_id,"
     437             :     "features.key,features.value,features.description,features.list_order,features.uuid,"
     438             :     "diagramelements.id " /* diagramelements.id needed only for debugging */
     439             :     "FROM features INNER JOIN diagramelements ON diagramelements.classifier_id=features.classifier_id "
     440             :     "WHERE diagramelements.diagram_id=? GROUP BY features.id ORDER BY features.list_order ASC;";
     441             : 
     442             : /*!
     443             :  *  \brief predefined search statement to find features by classifier-id
     444             :  *
     445             :  *  Order by id to ensure a defined, non-changeing order of relationships in json export
     446             :  */
     447             : static const char DATA_DATABASE_READER_SELECT_FEATURES_BY_CLASSIFIER_ID[] =
     448             :     "SELECT id,main_type,classifier_id,key,value,description,list_order,uuid "
     449             :     "FROM features "
     450             :     "WHERE classifier_id=? ORDER BY id ASC;";
     451             : 
     452             : /*!
     453             :  *  \brief the column id of the result where this parameter is stored: id
     454             :  */
     455             : static const int RESULT_FEATURE_ID_COLUMN = 0;
     456             : 
     457             : /*!
     458             :  *  \brief the column id of the result where this parameter is stored: main_type
     459             :  */
     460             : static const int RESULT_FEATURE_MAIN_TYPE_COLUMN = 1;
     461             : 
     462             : /*!
     463             :  *  \brief the column id of the result where this parameter is stored: classifier_id
     464             :  */
     465             : static const int RESULT_FEATURE_CLASSIFIER_ID_COLUMN = 2;
     466             : 
     467             : /*!
     468             :  *  \brief the column id of the result where this parameter is stored: key
     469             :  */
     470             : static const int RESULT_FEATURE_KEY_COLUMN = 3;
     471             : 
     472             : /*!
     473             :  *  \brief the column id of the result where this parameter is stored: value
     474             :  */
     475             : static const int RESULT_FEATURE_VALUE_COLUMN = 4;
     476             : 
     477             : /*!
     478             :  *  \brief the column id of the result where this parameter is stored: description
     479             :  */
     480             : static const int RESULT_FEATURE_DESCRIPTION_COLUMN = 5;
     481             : 
     482             : /*!
     483             :  *  \brief the column id of the result where this parameter is stored: list_order
     484             :  */
     485             : static const int RESULT_FEATURE_LIST_ORDER_COLUMN = 6;
     486             : 
     487             : /*!
     488             :  *  \brief the column id of the result where this parameter is stored: uuid
     489             :  */
     490             : static const int RESULT_FEATURE_LIST_UUID_COLUMN = 7;
     491             : 
     492             : /*!
     493             :  *  \brief the column id of the result where this parameter is stored: diagramelements.id
     494             :  */
     495             : static const int RESULT_FEATURE_DIAGRAMELEMENTS_ID_COLUMN = 8;
     496             : 
     497          31 : u8_error_t data_database_classifier_reader_get_feature_by_id ( data_database_classifier_reader_t *this_,
     498             :                                                                data_row_id_t id,
     499             :                                                                data_feature_t *out_feature )
     500             : {
     501          31 :     U8_TRACE_BEGIN();
     502          31 :     assert( NULL != out_feature );
     503          31 :     u8_error_t result = U8_ERROR_NONE;
     504             :     int sqlite_err;
     505             :     sqlite3_stmt *prepared_statement;
     506             : 
     507             :     {
     508          31 :         prepared_statement = (*this_).statement_feature_by_id;
     509             : 
     510          31 :         result |= data_database_classifier_reader_private_bind_id_to_statement( this_, prepared_statement, id );
     511             : 
     512          31 :         U8_TRACE_INFO( "sqlite3_step()" );
     513          31 :         sqlite_err = sqlite3_step( prepared_statement );
     514          31 :         if ( SQLITE_ROW != sqlite_err )
     515             :         {
     516           5 :             U8_TRACE_INFO_INT( "sqlite3_step did not find a row for id", id );
     517           5 :             result |= U8_ERROR_DB_STRUCTURE;  /* non-existing ids are worse than U8_ERROR_NOT_FOUND */
     518             :         }
     519             : 
     520          31 :         if ( SQLITE_ROW == sqlite_err )
     521             :         {
     522          52 :             result |= data_feature_init( out_feature,
     523          26 :                                          sqlite3_column_int64( prepared_statement, RESULT_FEATURE_ID_COLUMN ),
     524          26 :                                          sqlite3_column_int( prepared_statement, RESULT_FEATURE_MAIN_TYPE_COLUMN ),
     525          26 :                                          sqlite3_column_int64( prepared_statement, RESULT_FEATURE_CLASSIFIER_ID_COLUMN ),
     526          26 :                                          (const char*) sqlite3_column_text( prepared_statement, RESULT_FEATURE_KEY_COLUMN ),
     527          26 :                                          (const char*) sqlite3_column_text( prepared_statement, RESULT_FEATURE_VALUE_COLUMN ),
     528          26 :                                          (const char*) sqlite3_column_text( prepared_statement, RESULT_FEATURE_DESCRIPTION_COLUMN ),
     529             :                                          sqlite3_column_int( prepared_statement, RESULT_FEATURE_LIST_ORDER_COLUMN ),
     530          26 :                                          (const char*) sqlite3_column_text( prepared_statement, RESULT_FEATURE_LIST_UUID_COLUMN )
     531             :                                        );
     532             : 
     533          26 :             data_feature_trace( out_feature );
     534             : 
     535          26 :             sqlite_err = sqlite3_step( prepared_statement );
     536          26 :             if ( SQLITE_DONE != sqlite_err )
     537             :             {
     538           0 :                 U8_LOG_ERROR_INT( "sqlite3_step failed:", sqlite_err );
     539           0 :                 result |= U8_ERROR_DB_STRUCTURE;
     540             :             }
     541             :         }
     542             :     }
     543             : 
     544          31 :     U8_TRACE_END_ERR( result );
     545          31 :     return result;
     546             : }
     547             : 
     548          35 : u8_error_t data_database_classifier_reader_get_feature_by_uuid ( data_database_classifier_reader_t *this_,
     549             :                                                                  const char *uuid,
     550             :                                                                  data_feature_t *out_feature )
     551             : {
     552          35 :     U8_TRACE_BEGIN();
     553          35 :     assert( NULL != uuid );
     554          35 :     assert( NULL != out_feature );
     555          35 :     u8_error_t result = U8_ERROR_NONE;
     556             :     int sqlite_err;
     557             :     sqlite3_stmt *prepared_statement;
     558             : 
     559             :     {
     560          35 :         prepared_statement = (*this_).statement_feature_by_uuid;
     561             : 
     562          35 :         result |= data_database_classifier_reader_private_bind_text_to_statement( this_, prepared_statement, uuid );
     563             : 
     564          35 :         U8_TRACE_INFO( "sqlite3_step()" );
     565          35 :         sqlite_err = sqlite3_step( prepared_statement );
     566          35 :         if ( SQLITE_ROW != sqlite_err )
     567             :         {
     568             :             /* Do not log this incident, the caller may not expect to find a row. */
     569          27 :             U8_TRACE_INFO_STR( "sqlite3_step did not find a row for uuid", uuid );
     570          27 :             result |= U8_ERROR_NOT_FOUND;
     571             :         }
     572             : 
     573          35 :         if ( SQLITE_ROW == sqlite_err )
     574             :         {
     575          16 :             result |= data_feature_init( out_feature,
     576           8 :                                          sqlite3_column_int64( prepared_statement, RESULT_FEATURE_ID_COLUMN ),
     577           8 :                                          sqlite3_column_int( prepared_statement, RESULT_FEATURE_MAIN_TYPE_COLUMN ),
     578           8 :                                          sqlite3_column_int64( prepared_statement, RESULT_FEATURE_CLASSIFIER_ID_COLUMN ),
     579           8 :                                          (const char*) sqlite3_column_text( prepared_statement, RESULT_FEATURE_KEY_COLUMN ),
     580           8 :                                          (const char*) sqlite3_column_text( prepared_statement, RESULT_FEATURE_VALUE_COLUMN ),
     581           8 :                                          (const char*) sqlite3_column_text( prepared_statement, RESULT_FEATURE_DESCRIPTION_COLUMN ),
     582             :                                          sqlite3_column_int( prepared_statement, RESULT_FEATURE_LIST_ORDER_COLUMN ),
     583           8 :                                          (const char*) sqlite3_column_text( prepared_statement, RESULT_FEATURE_LIST_UUID_COLUMN )
     584             :                                        );
     585             : 
     586           8 :             data_feature_trace( out_feature );
     587             : 
     588           8 :             sqlite_err = sqlite3_step( prepared_statement );
     589           8 :             if ( SQLITE_DONE != sqlite_err )
     590             :             {
     591           0 :                 U8_LOG_ERROR_INT( "sqlite3_step not done yet:", sqlite_err );
     592           0 :                 result |= U8_ERROR_DB_STRUCTURE;
     593             :             }
     594             :         }
     595             :     }
     596             : 
     597          35 :     U8_TRACE_END_ERR( result );
     598          35 :     return result;
     599             : }
     600             : 
     601          13 : u8_error_t data_database_classifier_reader_get_features_by_classifier_id ( data_database_classifier_reader_t *this_,
     602             :                                                                            data_row_id_t classifier_id,
     603             :                                                                            uint32_t max_out_array_size,
     604             :                                                                            data_feature_t (*out_feature)[],
     605             :                                                                            uint32_t *out_feature_count )
     606             : {
     607          13 :     U8_TRACE_BEGIN();
     608          13 :     assert( NULL != out_feature_count );
     609          13 :     assert( NULL != out_feature );
     610          13 :     u8_error_t result = U8_ERROR_NONE;
     611             :     int sqlite_err;
     612             :     sqlite3_stmt *prepared_statement;
     613             : 
     614             :     {
     615          13 :         prepared_statement = (*this_).statement_features_by_classifier_id;
     616             : 
     617          13 :         result |= data_database_classifier_reader_private_bind_id_to_statement( this_, prepared_statement, classifier_id );
     618             : 
     619          13 :         *out_feature_count = 0;
     620          13 :         sqlite_err = SQLITE_ROW;
     621          33 :         for ( uint32_t row_index = 0; (SQLITE_ROW == sqlite_err) && (row_index <= max_out_array_size); row_index ++ )
     622             :         {
     623          20 :             U8_TRACE_INFO( "sqlite3_step()" );
     624          20 :             sqlite_err = sqlite3_step( prepared_statement );
     625          20 :             if (( SQLITE_ROW != sqlite_err )&&( SQLITE_DONE != sqlite_err ))
     626             :             {
     627           0 :                 U8_LOG_ERROR_INT( "sqlite3_step failed:", sqlite_err );
     628           0 :                 result |= U8_ERROR_AT_DB;
     629             :             }
     630          20 :             if (( SQLITE_ROW == sqlite_err )&&(row_index < max_out_array_size))
     631             :             {
     632           7 :                 *out_feature_count = row_index+1;
     633             :                 data_feature_t *current_feature;
     634           7 :                 current_feature = &((*out_feature)[row_index]);
     635             : 
     636          14 :                 result |= data_feature_init( current_feature,
     637           7 :                                              sqlite3_column_int64( prepared_statement, RESULT_FEATURE_ID_COLUMN ),
     638           7 :                                              sqlite3_column_int( prepared_statement, RESULT_FEATURE_MAIN_TYPE_COLUMN ),
     639           7 :                                              sqlite3_column_int64( prepared_statement, RESULT_FEATURE_CLASSIFIER_ID_COLUMN ),
     640           7 :                                              (const char*) sqlite3_column_text( prepared_statement, RESULT_FEATURE_KEY_COLUMN ),
     641           7 :                                              (const char*) sqlite3_column_text( prepared_statement, RESULT_FEATURE_VALUE_COLUMN ),
     642           7 :                                              (const char*) sqlite3_column_text( prepared_statement, RESULT_FEATURE_DESCRIPTION_COLUMN ),
     643             :                                              sqlite3_column_int( prepared_statement, RESULT_FEATURE_LIST_ORDER_COLUMN ),
     644           7 :                                              (const char*) sqlite3_column_text( prepared_statement, RESULT_FEATURE_LIST_UUID_COLUMN )
     645             :                                            );
     646             : 
     647           7 :                 data_feature_trace( current_feature );
     648             :             }
     649          20 :             if (( SQLITE_ROW == sqlite_err )&&(row_index >= max_out_array_size))
     650             :             {
     651           0 :                 U8_LOG_ANOMALY_INT( "out_feature[] full:", (row_index+1) );
     652           0 :                 result |= U8_ERROR_ARRAY_BUFFER_EXCEEDED;
     653             :             }
     654          20 :             if ( SQLITE_DONE == sqlite_err )
     655             :             {
     656          13 :                 U8_TRACE_INFO( "sqlite3_step finished: SQLITE_DONE" );
     657             :             }
     658             :         }
     659             :     }
     660             : 
     661          13 :     U8_TRACE_END_ERR( result );
     662          13 :     return result;
     663             : }
     664             : 
     665           4 : u8_error_t data_database_classifier_reader_get_features_by_diagram_id ( data_database_classifier_reader_t *this_,
     666             :                                                                         data_row_id_t diagram_id,
     667             :                                                                         uint32_t max_out_array_size,
     668             :                                                                         data_feature_t (*out_feature)[],
     669             :                                                                         uint32_t *out_feature_count )
     670             : {
     671           4 :     U8_TRACE_BEGIN();
     672           4 :     assert( NULL != out_feature_count );
     673           4 :     assert( NULL != out_feature );
     674           4 :     u8_error_t result = U8_ERROR_NONE;
     675             :     int sqlite_err;
     676             :     sqlite3_stmt *prepared_statement;
     677             : 
     678             :     {
     679           4 :         prepared_statement = (*this_).statement_features_by_diagram_id;
     680             : 
     681           4 :         result |= data_database_classifier_reader_private_bind_id_to_statement( this_, prepared_statement, diagram_id );
     682             : 
     683           4 :         *out_feature_count = 0;
     684           4 :         sqlite_err = SQLITE_ROW;
     685          11 :         for ( uint32_t row_index = 0; (SQLITE_ROW == sqlite_err) && (row_index <= max_out_array_size); row_index ++ )
     686             :         {
     687           7 :             U8_TRACE_INFO( "sqlite3_step()" );
     688           7 :             sqlite_err = sqlite3_step( prepared_statement );
     689           7 :             if (( SQLITE_ROW != sqlite_err )&&( SQLITE_DONE != sqlite_err ))
     690             :             {
     691           0 :                 U8_LOG_ERROR_INT( "sqlite3_step failed:", sqlite_err );
     692           0 :                 result |= U8_ERROR_AT_DB;
     693             :             }
     694           7 :             if (( SQLITE_ROW == sqlite_err )&&(row_index < max_out_array_size))
     695             :             {
     696           3 :                 *out_feature_count = row_index+1;
     697             :                 data_feature_t *current_feature;
     698           3 :                 current_feature = &((*out_feature)[row_index]);
     699             : 
     700           6 :                 result |= data_feature_init( current_feature,
     701           3 :                                              sqlite3_column_int64( prepared_statement, RESULT_FEATURE_ID_COLUMN ),
     702           3 :                                              sqlite3_column_int( prepared_statement, RESULT_FEATURE_MAIN_TYPE_COLUMN ),
     703           3 :                                              sqlite3_column_int64( prepared_statement, RESULT_FEATURE_CLASSIFIER_ID_COLUMN ),
     704           3 :                                              (const char*) sqlite3_column_text( prepared_statement, RESULT_FEATURE_KEY_COLUMN ),
     705           3 :                                              (const char*) sqlite3_column_text( prepared_statement, RESULT_FEATURE_VALUE_COLUMN ),
     706           3 :                                              (const char*) sqlite3_column_text( prepared_statement, RESULT_FEATURE_DESCRIPTION_COLUMN ),
     707             :                                              sqlite3_column_int( prepared_statement, RESULT_FEATURE_LIST_ORDER_COLUMN ),
     708           3 :                                              (const char*) sqlite3_column_text( prepared_statement, RESULT_FEATURE_LIST_UUID_COLUMN )
     709             :                                            );
     710             : 
     711           3 :                 U8_TRACE_INFO_INT( "diagramelements.id:", sqlite3_column_int64( prepared_statement, RESULT_FEATURE_DIAGRAMELEMENTS_ID_COLUMN ) );
     712           3 :                 data_feature_trace( current_feature );
     713             :             }
     714           7 :             if (( SQLITE_ROW == sqlite_err )&&(row_index >= max_out_array_size))
     715             :             {
     716           0 :                 U8_LOG_ANOMALY_INT( "out_feature[] full:", (row_index+1) );
     717           0 :                 result |= U8_ERROR_ARRAY_BUFFER_EXCEEDED;
     718             :             }
     719           7 :             if ( SQLITE_DONE == sqlite_err )
     720             :             {
     721           4 :                 U8_TRACE_INFO( "sqlite3_step finished: SQLITE_DONE" );
     722             :             }
     723             :         }
     724             :     }
     725             : 
     726           4 :     U8_TRACE_END_ERR( result );
     727           4 :     return result;
     728             : }
     729             : 
     730             : /* ================================ RELATIONSHIP ================================ */
     731             : 
     732             : /*!
     733             :  *  \brief predefined search statement to find a relationship by id
     734             :  */
     735             : static const char DATA_DATABASE_READER_SELECT_RELATIONSHIP_BY_ID[] =
     736             :     "SELECT id,main_type,from_classifier_id,to_classifier_id,stereotype,name,description,list_order,"
     737             :     "from_feature_id,to_feature_id,uuid "
     738             :     "FROM relationships WHERE id=?;";
     739             : 
     740             : /*!
     741             :  *  \brief predefined search statement to find a relationship by uuid
     742             :  */
     743             : static const char DATA_DATABASE_READER_SELECT_RELATIONSHIP_BY_UUID[] =
     744             :     "SELECT id,main_type,from_classifier_id,to_classifier_id,stereotype,name,description,list_order,"
     745             :     "from_feature_id,to_feature_id,uuid "
     746             :     "FROM relationships WHERE uuid=?;";
     747             : 
     748             : /*!
     749             :  *  \brief predefined search statement to find relationships by diagram-id
     750             :  */
     751             : static const char DATA_DATABASE_READER_SELECT_RELATIONSHIPS_BY_DIAGRAM_ID[] =
     752             :     "SELECT relationships.id,relationships.main_type,relationships.from_classifier_id,relationships.to_classifier_id,"
     753             :     "relationships.stereotype,relationships.name,relationships.description,relationships.list_order,"
     754             :     "relationships.from_feature_id,relationships.to_feature_id,relationships.uuid,"
     755             :     "source.id, dest.id " /* source.id, dest.id needed only for debugging */
     756             :     "FROM relationships "
     757             :     "INNER JOIN diagramelements AS source "
     758             :     "ON source.classifier_id=relationships.from_classifier_id "
     759             :     "INNER JOIN diagramelements AS dest "
     760             :     "ON (dest.classifier_id=relationships.to_classifier_id)AND(dest.diagram_id=source.diagram_id) "
     761             :     "WHERE source.diagram_id=? "
     762             :     "GROUP BY relationships.id "
     763             :     "ORDER BY relationships.list_order ASC;";
     764             : 
     765             : /*!
     766             :  *  \brief predefined search statement to find relationships by classifier-id
     767             :  *
     768             :  *  Order by id to ensure a defined, non-changeing order of relationships in json export
     769             :  */
     770             : static const char DATA_DATABASE_READER_SELECT_RELATIONSHIPS_BY_CLASSIFIER_ID[] =
     771             :     "SELECT id,main_type,from_classifier_id,to_classifier_id,stereotype,name,description,list_order,"
     772             :     "from_feature_id,to_feature_id,uuid "
     773             :     "FROM relationships "
     774             :     "WHERE from_classifier_id=? OR to_classifier_id=? "
     775             :     "ORDER BY id ASC;";
     776             : 
     777             : /*!
     778             :  *  \brief predefined search statement to find relationships by feature-id
     779             :  */
     780             : static const char DATA_DATABASE_READER_SELECT_RELATIONSHIPS_BY_FEATURE_ID[] =
     781             :     "SELECT id,main_type,from_classifier_id,to_classifier_id,stereotype,name,description,list_order,"
     782             :     "from_feature_id,to_feature_id,uuid "
     783             :     "FROM relationships "
     784             :     "WHERE from_feature_id=? OR to_feature_id=?;";
     785             : 
     786             : /*!
     787             :  *  \brief the column id of the result where this parameter is stored: id
     788             :  */
     789             : static const int RESULT_RELATIONSHIP_ID_COLUMN = 0;
     790             : 
     791             : /*!
     792             :  *  \brief the column id of the result where this parameter is stored: main_type
     793             :  */
     794             : static const int RESULT_RELATIONSHIP_MAIN_TYPE_COLUMN = 1;
     795             : 
     796             : /*!
     797             :  *  \brief the column id of the result where this parameter is stored: from_classifier_id
     798             :  */
     799             : static const int RESULT_RELATIONSHIP_FROM_CLASSIFIER_ID_COLUMN = 2;
     800             : 
     801             : /*!
     802             :  *  \brief the column id of the result where this parameter is stored: to_classifier_id
     803             :  */
     804             : static const int RESULT_RELATIONSHIP_TO_CLASSIFIER_ID_COLUMN = 3;
     805             : 
     806             : /*!
     807             :  *  \brief the column id of the result where this parameter is stored: name
     808             :  */
     809             : static const int RESULT_RELATIONSHIP_STEREOTYPE_COLUMN = 4;
     810             : 
     811             : /*!
     812             :  *  \brief the column id of the result where this parameter is stored: name
     813             :  */
     814             : static const int RESULT_RELATIONSHIP_NAME_COLUMN = 5;
     815             : 
     816             : /*!
     817             :  *  \brief the column id of the result where this parameter is stored: description
     818             :  */
     819             : static const int RESULT_RELATIONSHIP_DESCRIPTION_COLUMN = 6;
     820             : 
     821             : /*!
     822             :  *  \brief the column id of the result where this parameter is stored: list_order
     823             :  */
     824             : static const int RESULT_RELATIONSHIP_LIST_ORDER_COLUMN = 7;
     825             : 
     826             : /*!
     827             :  *  \brief the column id of the result where this parameter is stored: from_feature_id
     828             :  */
     829             : static const int RESULT_RELATIONSHIP_FROM_FEATURE_ID_COLUMN = 8;
     830             : 
     831             : /*!
     832             :  *  \brief the column id of the result where this parameter is stored: to_feature_id
     833             :  */
     834             : static const int RESULT_RELATIONSHIP_TO_FEATURE_ID_COLUMN = 9;
     835             : 
     836             : /*!
     837             :  *  \brief the column id of the result where this parameter is stored: uuid
     838             :  */
     839             : static const int RESULT_RELATIONSHIP_UUID_COLUMN = 10;
     840             : 
     841             : /*!
     842             :  *  \brief the column id of the result where this parameter is stored: source diagramelements.id
     843             :  */
     844             : static const int RESULT_RELATIONSHIP_SOURCE_DIAGRAMELEMENTS_ID_COLUMN = 11;
     845             : 
     846             : /*!
     847             :  *  \brief the column id of the result where this parameter is stored: dest diagramelements.id
     848             :  */
     849             : static const int RESULT_RELATIONSHIP_DEST_DIAGRAMELEMENTS_ID_COLUMN = 12;
     850             : 
     851          25 : u8_error_t data_database_classifier_reader_get_relationship_by_id ( data_database_classifier_reader_t *this_,
     852             :                                                                     data_row_id_t id,
     853             :                                                                     data_relationship_t *out_relationship )
     854             : {
     855          25 :     U8_TRACE_BEGIN();
     856          25 :     assert( NULL != out_relationship );
     857          25 :     u8_error_t result = U8_ERROR_NONE;
     858             :     int sqlite_err;
     859             :     sqlite3_stmt *prepared_statement;
     860             : 
     861             :     {
     862          25 :         prepared_statement = (*this_).statement_relationship_by_id;
     863             : 
     864          25 :         result |= data_database_classifier_reader_private_bind_id_to_statement( this_, prepared_statement, id );
     865             : 
     866          25 :         U8_TRACE_INFO( "sqlite3_step()" );
     867          25 :         sqlite_err = sqlite3_step( prepared_statement );
     868          25 :         if ( SQLITE_ROW != sqlite_err )
     869             :         {
     870           7 :             U8_TRACE_INFO_INT( "sqlite3_step did not find a row for id", id );
     871           7 :             result |= U8_ERROR_DB_STRUCTURE;  /* non-existing ids are worse than U8_ERROR_NOT_FOUND */
     872             :         }
     873             : 
     874          25 :         if ( SQLITE_ROW == sqlite_err )
     875             :         {
     876          36 :             result |= data_relationship_init( out_relationship,
     877          18 :                                               sqlite3_column_int64( prepared_statement, RESULT_RELATIONSHIP_ID_COLUMN ),
     878          18 :                                               sqlite3_column_int( prepared_statement, RESULT_RELATIONSHIP_MAIN_TYPE_COLUMN ),
     879          18 :                                               sqlite3_column_int64( prepared_statement, RESULT_RELATIONSHIP_FROM_CLASSIFIER_ID_COLUMN ),
     880          18 :                                               sqlite3_column_int64( prepared_statement, RESULT_RELATIONSHIP_TO_CLASSIFIER_ID_COLUMN ),
     881          18 :                                               (const char*) sqlite3_column_text( prepared_statement, RESULT_RELATIONSHIP_STEREOTYPE_COLUMN ),
     882          18 :                                               (const char*) sqlite3_column_text( prepared_statement, RESULT_RELATIONSHIP_NAME_COLUMN ),
     883          18 :                                               (const char*) sqlite3_column_text( prepared_statement, RESULT_RELATIONSHIP_DESCRIPTION_COLUMN ),
     884             :                                               sqlite3_column_int( prepared_statement, RESULT_RELATIONSHIP_LIST_ORDER_COLUMN ),
     885          18 :                                               sqlite3_column_int64( prepared_statement, RESULT_RELATIONSHIP_FROM_FEATURE_ID_COLUMN ),
     886          18 :                                               sqlite3_column_int64( prepared_statement, RESULT_RELATIONSHIP_TO_FEATURE_ID_COLUMN ),
     887          18 :                                               (const char*) sqlite3_column_text( prepared_statement, RESULT_RELATIONSHIP_UUID_COLUMN )
     888             :                                             );
     889          18 :             if ( SQLITE_NULL == sqlite3_column_type( prepared_statement, RESULT_RELATIONSHIP_FROM_FEATURE_ID_COLUMN ) )
     890             :             {
     891          15 :                 data_relationship_set_from_feature_row_id ( out_relationship, DATA_ROW_ID_VOID );
     892             :             }
     893          18 :             if ( SQLITE_NULL == sqlite3_column_type( prepared_statement, RESULT_RELATIONSHIP_TO_FEATURE_ID_COLUMN ) )
     894             :             {
     895           2 :                 data_relationship_set_to_feature_row_id ( out_relationship, DATA_ROW_ID_VOID );
     896             :             }
     897             : 
     898          18 :             data_relationship_trace( out_relationship );
     899             : 
     900          18 :             sqlite_err = sqlite3_step( prepared_statement );
     901          18 :             if ( SQLITE_DONE != sqlite_err )
     902             :             {
     903           0 :                 U8_LOG_ERROR_INT( "sqlite3_step failed:", sqlite_err );
     904           0 :                 result |= U8_ERROR_DB_STRUCTURE;
     905             :             }
     906             :         }
     907             :     }
     908             : 
     909          25 :     U8_TRACE_END_ERR( result );
     910          25 :     return result;
     911             : }
     912             : 
     913           9 : u8_error_t data_database_classifier_reader_get_relationship_by_uuid ( data_database_classifier_reader_t *this_,
     914             :                                                                       const char *uuid,
     915             :                                                                       data_relationship_t *out_relationship )
     916             : {
     917           9 :     U8_TRACE_BEGIN();
     918           9 :     assert( NULL != uuid );
     919           9 :     assert( NULL != out_relationship );
     920           9 :     u8_error_t result = U8_ERROR_NONE;
     921             :     int sqlite_err;
     922             :     sqlite3_stmt *prepared_statement;
     923             : 
     924             :     {
     925           9 :         prepared_statement = (*this_).statement_relationship_by_uuid;
     926             : 
     927           9 :         result |= data_database_classifier_reader_private_bind_text_to_statement( this_, prepared_statement, uuid );
     928             : 
     929           9 :         U8_TRACE_INFO( "sqlite3_step()" );
     930           9 :         sqlite_err = sqlite3_step( prepared_statement );
     931           9 :         if ( SQLITE_ROW != sqlite_err )
     932             :         {
     933             :             /* Do not log this incident, the caller may not expect to find a row. */
     934           7 :             U8_TRACE_INFO_STR( "sqlite3_step did not find a row for uuid", uuid );
     935           7 :             result |= U8_ERROR_NOT_FOUND;
     936             :         }
     937             : 
     938           9 :         if ( SQLITE_ROW == sqlite_err )
     939             :         {
     940           4 :             result |= data_relationship_init( out_relationship,
     941           2 :                                               sqlite3_column_int64( prepared_statement, RESULT_RELATIONSHIP_ID_COLUMN ),
     942           2 :                                               sqlite3_column_int( prepared_statement, RESULT_RELATIONSHIP_MAIN_TYPE_COLUMN ),
     943           2 :                                               sqlite3_column_int64( prepared_statement, RESULT_RELATIONSHIP_FROM_CLASSIFIER_ID_COLUMN ),
     944           2 :                                               sqlite3_column_int64( prepared_statement, RESULT_RELATIONSHIP_TO_CLASSIFIER_ID_COLUMN ),
     945           2 :                                               (const char*) sqlite3_column_text( prepared_statement, RESULT_RELATIONSHIP_STEREOTYPE_COLUMN ),
     946           2 :                                               (const char*) sqlite3_column_text( prepared_statement, RESULT_RELATIONSHIP_NAME_COLUMN ),
     947           2 :                                               (const char*) sqlite3_column_text( prepared_statement, RESULT_RELATIONSHIP_DESCRIPTION_COLUMN ),
     948             :                                               sqlite3_column_int( prepared_statement, RESULT_RELATIONSHIP_LIST_ORDER_COLUMN ),
     949           2 :                                               sqlite3_column_int64( prepared_statement, RESULT_RELATIONSHIP_FROM_FEATURE_ID_COLUMN ),
     950           2 :                                               sqlite3_column_int64( prepared_statement, RESULT_RELATIONSHIP_TO_FEATURE_ID_COLUMN ),
     951           2 :                                               (const char*) sqlite3_column_text( prepared_statement, RESULT_RELATIONSHIP_UUID_COLUMN )
     952             :                                             );
     953           2 :             if ( SQLITE_NULL == sqlite3_column_type( prepared_statement, RESULT_RELATIONSHIP_FROM_FEATURE_ID_COLUMN ) )
     954             :             {
     955           1 :                 data_relationship_set_from_feature_row_id ( out_relationship, DATA_ROW_ID_VOID );
     956             :             }
     957           2 :             if ( SQLITE_NULL == sqlite3_column_type( prepared_statement, RESULT_RELATIONSHIP_TO_FEATURE_ID_COLUMN ) )
     958             :             {
     959           1 :                 data_relationship_set_to_feature_row_id ( out_relationship, DATA_ROW_ID_VOID );
     960             :             }
     961             : 
     962           2 :             data_relationship_trace( out_relationship );
     963             : 
     964           2 :             sqlite_err = sqlite3_step( prepared_statement );
     965           2 :             if ( SQLITE_DONE != sqlite_err )
     966             :             {
     967           0 :                 U8_LOG_ERROR_INT( "sqlite3_step not done yet:", sqlite_err );
     968           0 :                 result |= U8_ERROR_DB_STRUCTURE;
     969             :             }
     970             :         }
     971             :     }
     972             : 
     973           9 :     U8_TRACE_END_ERR( result );
     974           9 :     return result;
     975             : }
     976             : 
     977          13 : u8_error_t data_database_classifier_reader_get_relationships_by_classifier_id ( data_database_classifier_reader_t *this_,
     978             :                                                                                 data_row_id_t classifier_id,
     979             :                                                                                 uint32_t max_out_array_size,
     980             :                                                                                 data_relationship_t (*out_relationship)[],
     981             :                                                                                 uint32_t *out_relationship_count )
     982             : {
     983          13 :     U8_TRACE_BEGIN();
     984          13 :     assert( NULL != out_relationship_count );
     985          13 :     assert( NULL != out_relationship );
     986          13 :     u8_error_t result = U8_ERROR_NONE;
     987             :     int sqlite_err;
     988             :     sqlite3_stmt *prepared_statement;
     989             : 
     990             :     {
     991          13 :         prepared_statement = (*this_).statement_relationships_by_classifier_id;
     992             : 
     993          13 :         result |= data_database_classifier_reader_private_bind_two_ids_to_statement( this_, prepared_statement, classifier_id, classifier_id );
     994             : 
     995          13 :         *out_relationship_count = 0;
     996          13 :         sqlite_err = SQLITE_ROW;
     997          30 :         for ( uint32_t row_index = 0; (SQLITE_ROW == sqlite_err) && (row_index <= max_out_array_size); row_index ++ )
     998             :         {
     999          17 :             U8_TRACE_INFO( "sqlite3_step()" );
    1000          17 :             sqlite_err = sqlite3_step( prepared_statement );
    1001          17 :             if (( SQLITE_ROW != sqlite_err )&&( SQLITE_DONE != sqlite_err ))
    1002             :             {
    1003           0 :                 U8_LOG_ERROR_INT( "sqlite3_step failed:", sqlite_err );
    1004           0 :                 result |= U8_ERROR_AT_DB;
    1005             :             }
    1006          17 :             if (( SQLITE_ROW == sqlite_err )&&(row_index < max_out_array_size))
    1007             :             {
    1008           4 :                 *out_relationship_count = row_index+1;
    1009             :                 data_relationship_t *current_relation;
    1010           4 :                 current_relation = &((*out_relationship)[row_index]);
    1011             : 
    1012           8 :                 result |= data_relationship_init( current_relation,
    1013           4 :                                                   sqlite3_column_int64( prepared_statement, RESULT_RELATIONSHIP_ID_COLUMN ),
    1014           4 :                                                   sqlite3_column_int( prepared_statement, RESULT_RELATIONSHIP_MAIN_TYPE_COLUMN ),
    1015           4 :                                                   sqlite3_column_int64( prepared_statement, RESULT_RELATIONSHIP_FROM_CLASSIFIER_ID_COLUMN ),
    1016           4 :                                                   sqlite3_column_int64( prepared_statement, RESULT_RELATIONSHIP_TO_CLASSIFIER_ID_COLUMN ),
    1017           4 :                                                   (const char*) sqlite3_column_text( prepared_statement, RESULT_RELATIONSHIP_STEREOTYPE_COLUMN ),
    1018           4 :                                                   (const char*) sqlite3_column_text( prepared_statement, RESULT_RELATIONSHIP_NAME_COLUMN ),
    1019           4 :                                                   (const char*) sqlite3_column_text( prepared_statement, RESULT_RELATIONSHIP_DESCRIPTION_COLUMN ),
    1020             :                                                   sqlite3_column_int( prepared_statement, RESULT_RELATIONSHIP_LIST_ORDER_COLUMN ),
    1021           4 :                                                   sqlite3_column_int64( prepared_statement, RESULT_RELATIONSHIP_FROM_FEATURE_ID_COLUMN ),
    1022           4 :                                                   sqlite3_column_int64( prepared_statement, RESULT_RELATIONSHIP_TO_FEATURE_ID_COLUMN ),
    1023           4 :                                                   (const char*) sqlite3_column_text( prepared_statement, RESULT_RELATIONSHIP_UUID_COLUMN )
    1024             :                                                 );
    1025           4 :                 if ( SQLITE_NULL == sqlite3_column_type( prepared_statement, RESULT_RELATIONSHIP_FROM_FEATURE_ID_COLUMN ) )
    1026             :                 {
    1027           1 :                     data_relationship_set_from_feature_row_id ( current_relation, DATA_ROW_ID_VOID );
    1028             :                 }
    1029           4 :                 if ( SQLITE_NULL == sqlite3_column_type( prepared_statement, RESULT_RELATIONSHIP_TO_FEATURE_ID_COLUMN ) )
    1030             :                 {
    1031           3 :                     data_relationship_set_to_feature_row_id ( current_relation, DATA_ROW_ID_VOID );
    1032             :                 }
    1033             : 
    1034           4 :                 data_relationship_trace( current_relation );
    1035             :             }
    1036          17 :             if (( SQLITE_ROW == sqlite_err )&&(row_index >= max_out_array_size))
    1037             :             {
    1038           0 :                 U8_LOG_ANOMALY_INT( "out_relationship[] full:", (row_index+1) );
    1039           0 :                 result |= U8_ERROR_ARRAY_BUFFER_EXCEEDED;
    1040             :             }
    1041          17 :             if ( SQLITE_DONE == sqlite_err )
    1042             :             {
    1043          13 :                 U8_TRACE_INFO( "sqlite3_step finished: SQLITE_DONE" );
    1044             :             }
    1045             :         }
    1046             :     }
    1047             : 
    1048          13 :     U8_TRACE_END_ERR( result );
    1049          13 :     return result;
    1050             : }
    1051             : 
    1052          11 : u8_error_t data_database_classifier_reader_get_relationships_by_feature_id ( data_database_classifier_reader_t *this_,
    1053             :                                                                              data_row_id_t feature_id,
    1054             :                                                                              uint32_t max_out_array_size,
    1055             :                                                                              data_relationship_t (*out_relationship)[],
    1056             :                                                                              uint32_t *out_relationship_count )
    1057             : {
    1058          11 :     U8_TRACE_BEGIN();
    1059          11 :     assert( NULL != out_relationship_count );
    1060          11 :     assert( NULL != out_relationship );
    1061          11 :     u8_error_t result = U8_ERROR_NONE;
    1062             :     int sqlite_err;
    1063             :     sqlite3_stmt *prepared_statement;
    1064             : 
    1065             :     {
    1066          11 :         prepared_statement = (*this_).statement_relationships_by_feature_id;
    1067             : 
    1068          11 :         result |= data_database_classifier_reader_private_bind_two_ids_to_statement( this_, prepared_statement, feature_id, feature_id );
    1069             : 
    1070          11 :         *out_relationship_count = 0;
    1071          11 :         sqlite_err = SQLITE_ROW;
    1072          23 :         for ( uint32_t row_index = 0; (SQLITE_ROW == sqlite_err) && (row_index <= max_out_array_size); row_index ++ )
    1073             :         {
    1074          12 :             U8_TRACE_INFO( "sqlite3_step()" );
    1075          12 :             sqlite_err = sqlite3_step( prepared_statement );
    1076          12 :             if (( SQLITE_ROW != sqlite_err )&&( SQLITE_DONE != sqlite_err ))
    1077             :             {
    1078           0 :                 U8_LOG_ERROR_INT( "sqlite3_step failed:", sqlite_err );
    1079           0 :                 result |= U8_ERROR_AT_DB;
    1080             :             }
    1081          12 :             if (( SQLITE_ROW == sqlite_err )&&(row_index < max_out_array_size))
    1082             :             {
    1083           1 :                 *out_relationship_count = row_index+1;
    1084             :                 data_relationship_t *current_relation;
    1085           1 :                 current_relation = &((*out_relationship)[row_index]);
    1086             : 
    1087           2 :                 result |= data_relationship_init( current_relation,
    1088           1 :                                                   sqlite3_column_int64( prepared_statement, RESULT_RELATIONSHIP_ID_COLUMN ),
    1089           1 :                                                   sqlite3_column_int( prepared_statement, RESULT_RELATIONSHIP_MAIN_TYPE_COLUMN ),
    1090           1 :                                                   sqlite3_column_int64( prepared_statement, RESULT_RELATIONSHIP_FROM_CLASSIFIER_ID_COLUMN ),
    1091           1 :                                                   sqlite3_column_int64( prepared_statement, RESULT_RELATIONSHIP_TO_CLASSIFIER_ID_COLUMN ),
    1092           1 :                                                   (const char*) sqlite3_column_text( prepared_statement, RESULT_RELATIONSHIP_STEREOTYPE_COLUMN ),
    1093           1 :                                                   (const char*) sqlite3_column_text( prepared_statement, RESULT_RELATIONSHIP_NAME_COLUMN ),
    1094           1 :                                                   (const char*) sqlite3_column_text( prepared_statement, RESULT_RELATIONSHIP_DESCRIPTION_COLUMN ),
    1095             :                                                   sqlite3_column_int( prepared_statement, RESULT_RELATIONSHIP_LIST_ORDER_COLUMN ),
    1096           1 :                                                   sqlite3_column_int64( prepared_statement, RESULT_RELATIONSHIP_FROM_FEATURE_ID_COLUMN ),
    1097           1 :                                                   sqlite3_column_int64( prepared_statement, RESULT_RELATIONSHIP_TO_FEATURE_ID_COLUMN ),
    1098           1 :                                                   (const char*) sqlite3_column_text( prepared_statement, RESULT_RELATIONSHIP_UUID_COLUMN )
    1099             :                                                 );
    1100           1 :                 if ( SQLITE_NULL == sqlite3_column_type( prepared_statement, RESULT_RELATIONSHIP_FROM_FEATURE_ID_COLUMN ) )
    1101             :                 {
    1102           0 :                     data_relationship_set_from_feature_row_id ( current_relation, DATA_ROW_ID_VOID );
    1103             :                 }
    1104           1 :                 if ( SQLITE_NULL == sqlite3_column_type( prepared_statement, RESULT_RELATIONSHIP_TO_FEATURE_ID_COLUMN ) )
    1105             :                 {
    1106           1 :                     data_relationship_set_to_feature_row_id ( current_relation, DATA_ROW_ID_VOID );
    1107             :                 }
    1108             : 
    1109           1 :                 data_relationship_trace( current_relation );
    1110             :             }
    1111          12 :             if (( SQLITE_ROW == sqlite_err )&&(row_index >= max_out_array_size))
    1112             :             {
    1113           0 :                 U8_LOG_ANOMALY_INT( "out_relationship[] full:", (row_index+1) );
    1114           0 :                 result |= U8_ERROR_ARRAY_BUFFER_EXCEEDED;
    1115             :             }
    1116          12 :             if ( SQLITE_DONE == sqlite_err )
    1117             :             {
    1118          11 :                 U8_TRACE_INFO( "sqlite3_step finished: SQLITE_DONE" );
    1119             :             }
    1120             :         }
    1121             :     }
    1122             : 
    1123          11 :     U8_TRACE_END_ERR( result );
    1124          11 :     return result;
    1125             : }
    1126             : 
    1127           4 : u8_error_t data_database_classifier_reader_get_relationships_by_diagram_id ( data_database_classifier_reader_t *this_,
    1128             :                                                                              data_row_id_t diagram_id,
    1129             :                                                                              uint32_t max_out_array_size,
    1130             :                                                                              data_relationship_t (*out_relationship)[],
    1131             :                                                                              uint32_t *out_relationship_count )
    1132             : {
    1133           4 :     U8_TRACE_BEGIN();
    1134           4 :     assert( NULL != out_relationship_count );
    1135           4 :     assert( NULL != out_relationship );
    1136           4 :     u8_error_t result = U8_ERROR_NONE;
    1137             :     int sqlite_err;
    1138             :     sqlite3_stmt *prepared_statement;
    1139             : 
    1140             :     {
    1141           4 :         prepared_statement = (*this_).statement_relationships_by_diagram_id;
    1142             : 
    1143           4 :         result |= data_database_classifier_reader_private_bind_id_to_statement( this_, prepared_statement, diagram_id );
    1144             : 
    1145           4 :         *out_relationship_count = 0;
    1146           4 :         sqlite_err = SQLITE_ROW;
    1147          10 :         for ( uint32_t row_index = 0; (SQLITE_ROW == sqlite_err) && (row_index <= max_out_array_size); row_index ++ )
    1148             :         {
    1149           6 :             U8_TRACE_INFO( "sqlite3_step()" );
    1150           6 :             sqlite_err = sqlite3_step( prepared_statement );
    1151           6 :             if (( SQLITE_ROW != sqlite_err )&&( SQLITE_DONE != sqlite_err ))
    1152             :             {
    1153           0 :                 U8_LOG_ERROR_INT( "sqlite3_step failed:", sqlite_err );
    1154           0 :                 result |= U8_ERROR_AT_DB;
    1155             :             }
    1156           6 :             if (( SQLITE_ROW == sqlite_err )&&(row_index < max_out_array_size))
    1157             :             {
    1158           2 :                 *out_relationship_count = row_index+1;
    1159             :                 data_relationship_t *current_relation;
    1160           2 :                 current_relation = &((*out_relationship)[row_index]);
    1161             : 
    1162           4 :                 result |= data_relationship_init( current_relation,
    1163           2 :                                                   sqlite3_column_int64( prepared_statement, RESULT_RELATIONSHIP_ID_COLUMN ),
    1164           2 :                                                   sqlite3_column_int( prepared_statement, RESULT_RELATIONSHIP_MAIN_TYPE_COLUMN ),
    1165           2 :                                                   sqlite3_column_int64( prepared_statement, RESULT_RELATIONSHIP_FROM_CLASSIFIER_ID_COLUMN ),
    1166           2 :                                                   sqlite3_column_int64( prepared_statement, RESULT_RELATIONSHIP_TO_CLASSIFIER_ID_COLUMN ),
    1167           2 :                                                   (const char*) sqlite3_column_text( prepared_statement, RESULT_RELATIONSHIP_STEREOTYPE_COLUMN ),
    1168           2 :                                                   (const char*) sqlite3_column_text( prepared_statement, RESULT_RELATIONSHIP_NAME_COLUMN ),
    1169           2 :                                                   (const char*) sqlite3_column_text( prepared_statement, RESULT_RELATIONSHIP_DESCRIPTION_COLUMN ),
    1170             :                                                   sqlite3_column_int( prepared_statement, RESULT_RELATIONSHIP_LIST_ORDER_COLUMN ),
    1171           2 :                                                   sqlite3_column_int64( prepared_statement, RESULT_RELATIONSHIP_FROM_FEATURE_ID_COLUMN ),
    1172           2 :                                                   sqlite3_column_int64( prepared_statement, RESULT_RELATIONSHIP_TO_FEATURE_ID_COLUMN ),
    1173           2 :                                                   (const char*) sqlite3_column_text( prepared_statement, RESULT_RELATIONSHIP_UUID_COLUMN )
    1174             :                                                 );
    1175           2 :                 if ( SQLITE_NULL == sqlite3_column_type( prepared_statement, RESULT_RELATIONSHIP_FROM_FEATURE_ID_COLUMN ) )
    1176             :                 {
    1177           1 :                     data_relationship_set_from_feature_row_id ( current_relation, DATA_ROW_ID_VOID );
    1178             :                 }
    1179           2 :                 if ( SQLITE_NULL == sqlite3_column_type( prepared_statement, RESULT_RELATIONSHIP_TO_FEATURE_ID_COLUMN ) )
    1180             :                 {
    1181           1 :                     data_relationship_set_to_feature_row_id ( current_relation, DATA_ROW_ID_VOID );
    1182             :                 }
    1183             : 
    1184           2 :                 U8_TRACE_INFO_INT( "(source)diagramelements.id:", sqlite3_column_int64( prepared_statement, RESULT_RELATIONSHIP_SOURCE_DIAGRAMELEMENTS_ID_COLUMN ) );
    1185           2 :                 U8_TRACE_INFO_INT( "(dest)diagramelements.id:", sqlite3_column_int64( prepared_statement, RESULT_RELATIONSHIP_DEST_DIAGRAMELEMENTS_ID_COLUMN ) );
    1186           2 :                 data_relationship_trace( current_relation );
    1187             :             }
    1188           6 :             if (( SQLITE_ROW == sqlite_err )&&(row_index >= max_out_array_size))
    1189             :             {
    1190           0 :                 U8_LOG_ANOMALY_INT( "out_relationship[] full:", (row_index+1) );
    1191           0 :                 result |= U8_ERROR_ARRAY_BUFFER_EXCEEDED;
    1192             :             }
    1193           6 :             if ( SQLITE_DONE == sqlite_err )
    1194             :             {
    1195           4 :                 U8_TRACE_INFO( "sqlite3_step finished: SQLITE_DONE" );
    1196             :             }
    1197             :         }
    1198             :     }
    1199             : 
    1200           4 :     U8_TRACE_END_ERR( result );
    1201           4 :     return result;
    1202             : }
    1203             : 
    1204             : /* ================================ private ================================ */
    1205             : 
    1206          92 : u8_error_t data_database_classifier_reader_private_open ( data_database_classifier_reader_t *this_ )
    1207             : {
    1208          92 :     U8_TRACE_BEGIN();
    1209          92 :     u8_error_t result = U8_ERROR_NONE;
    1210             : 
    1211             :     {
    1212          92 :         result |= data_database_prepare_statement( (*this_).database,
    1213             :                                                    DATA_DATABASE_READER_SELECT_CLASSIFIER_BY_ID,
    1214             :                                                    sizeof( DATA_DATABASE_READER_SELECT_CLASSIFIER_BY_ID ),
    1215             :                                                    &((*this_).statement_classifier_by_id)
    1216             :                                                  );
    1217             : 
    1218          92 :         result |= data_database_prepare_statement( (*this_).database,
    1219             :                                                    DATA_DATABASE_READER_SELECT_CLASSIFIER_BY_UUID,
    1220             :                                                    sizeof( DATA_DATABASE_READER_SELECT_CLASSIFIER_BY_UUID ),
    1221             :                                                    &((*this_).statement_classifier_by_uuid)
    1222             :                                                  );
    1223             : 
    1224          92 :         result |= data_database_prepare_statement( (*this_).database,
    1225             :                                                    DATA_DATABASE_READER_SELECT_CLASSIFIER_BY_NAME,
    1226             :                                                    sizeof( DATA_DATABASE_READER_SELECT_CLASSIFIER_BY_NAME ),
    1227             :                                                    &((*this_).statement_classifier_by_name)
    1228             :                                                  );
    1229             : 
    1230          92 :         result |= data_database_prepare_statement( (*this_).database,
    1231             :                                                    DATA_DATABASE_READER_SELECT_CLASSIFIERS_BY_DIAGRAM_ID,
    1232             :                                                    sizeof( DATA_DATABASE_READER_SELECT_CLASSIFIERS_BY_DIAGRAM_ID ),
    1233             :                                                    &((*this_).statement_classifiers_by_diagram_id)
    1234             :                                                  );
    1235             : 
    1236          92 :         result |= data_database_prepare_statement( (*this_).database,
    1237             :                                                    DATA_DATABASE_READER_SELECT_FEATURE_BY_ID,
    1238             :                                                    sizeof( DATA_DATABASE_READER_SELECT_FEATURE_BY_ID ),
    1239             :                                                    &((*this_).statement_feature_by_id)
    1240             :                                                  );
    1241             : 
    1242          92 :         result |= data_database_prepare_statement( (*this_).database,
    1243             :                                                    DATA_DATABASE_READER_SELECT_FEATURE_BY_UUID,
    1244             :                                                    sizeof( DATA_DATABASE_READER_SELECT_FEATURE_BY_UUID ),
    1245             :                                                    &((*this_).statement_feature_by_uuid)
    1246             :                                                  );
    1247             : 
    1248          92 :         result |= data_database_prepare_statement( (*this_).database,
    1249             :                                                    DATA_DATABASE_READER_SELECT_FEATURES_BY_CLASSIFIER_ID,
    1250             :                                                    sizeof( DATA_DATABASE_READER_SELECT_FEATURES_BY_CLASSIFIER_ID ),
    1251             :                                                    &((*this_).statement_features_by_classifier_id)
    1252             :                                                  );
    1253             : 
    1254          92 :         result |= data_database_prepare_statement( (*this_).database,
    1255             :                                                    DATA_DATABASE_READER_SELECT_FEATURES_BY_DIAGRAM_ID,
    1256             :                                                    sizeof( DATA_DATABASE_READER_SELECT_FEATURES_BY_DIAGRAM_ID ),
    1257             :                                                    &((*this_).statement_features_by_diagram_id)
    1258             :                                                  );
    1259             : 
    1260          92 :         result |= data_database_prepare_statement( (*this_).database,
    1261             :                                                    DATA_DATABASE_READER_SELECT_RELATIONSHIP_BY_ID,
    1262             :                                                    sizeof( DATA_DATABASE_READER_SELECT_RELATIONSHIP_BY_ID ),
    1263             :                                                    &((*this_).statement_relationship_by_id)
    1264             :                                                  );
    1265             : 
    1266          92 :         result |= data_database_prepare_statement( (*this_).database,
    1267             :                                                    DATA_DATABASE_READER_SELECT_RELATIONSHIP_BY_UUID,
    1268             :                                                    sizeof( DATA_DATABASE_READER_SELECT_RELATIONSHIP_BY_UUID ),
    1269             :                                                    &((*this_).statement_relationship_by_uuid)
    1270             :                                                  );
    1271             : 
    1272          92 :         result |= data_database_prepare_statement( (*this_).database,
    1273             :                                                    DATA_DATABASE_READER_SELECT_RELATIONSHIPS_BY_CLASSIFIER_ID,
    1274             :                                                    sizeof( DATA_DATABASE_READER_SELECT_RELATIONSHIPS_BY_CLASSIFIER_ID ),
    1275             :                                                    &((*this_).statement_relationships_by_classifier_id)
    1276             :                                                  );
    1277             : 
    1278          92 :         result |= data_database_prepare_statement( (*this_).database,
    1279             :                                                    DATA_DATABASE_READER_SELECT_RELATIONSHIPS_BY_FEATURE_ID,
    1280             :                                                    sizeof( DATA_DATABASE_READER_SELECT_RELATIONSHIPS_BY_FEATURE_ID ),
    1281             :                                                    &((*this_).statement_relationships_by_feature_id)
    1282             :                                                  );
    1283             : 
    1284          92 :         result |= data_database_prepare_statement( (*this_).database,
    1285             :                                                    DATA_DATABASE_READER_SELECT_RELATIONSHIPS_BY_DIAGRAM_ID,
    1286             :                                                    sizeof( DATA_DATABASE_READER_SELECT_RELATIONSHIPS_BY_DIAGRAM_ID ),
    1287             :                                                    &((*this_).statement_relationships_by_diagram_id)
    1288             :                                                  );
    1289             : 
    1290          92 :         if ( result != U8_ERROR_NONE )
    1291             :         {
    1292           0 :             U8_LOG_ERROR( "A prepared statement could not be prepared." );
    1293             :         }
    1294             :     }
    1295             : 
    1296          92 :     U8_TRACE_END_ERR(result);
    1297          92 :     return result;
    1298             : }
    1299             : 
    1300          92 : u8_error_t data_database_classifier_reader_private_close ( data_database_classifier_reader_t *this_ )
    1301             : {
    1302          92 :     U8_TRACE_BEGIN();
    1303          92 :     u8_error_t result = U8_ERROR_NONE;
    1304             : 
    1305             :     {
    1306          92 :         result |= data_database_finalize_statement( (*this_).database, (*this_).statement_classifier_by_id );
    1307          92 :         (*this_).statement_classifier_by_id = NULL;
    1308             : 
    1309          92 :         result |= data_database_finalize_statement( (*this_).database, (*this_).statement_classifier_by_name );
    1310          92 :         (*this_).statement_classifier_by_name = NULL;
    1311             : 
    1312          92 :         result |= data_database_finalize_statement( (*this_).database, (*this_).statement_classifier_by_uuid );
    1313          92 :         (*this_).statement_classifier_by_uuid = NULL;
    1314             : 
    1315          92 :         result |= data_database_finalize_statement( (*this_).database, (*this_).statement_classifiers_by_diagram_id );
    1316          92 :         (*this_).statement_classifiers_by_diagram_id = NULL;
    1317             : 
    1318          92 :         result |= data_database_finalize_statement( (*this_).database, (*this_).statement_feature_by_id );
    1319          92 :         (*this_).statement_feature_by_id = NULL;
    1320             : 
    1321          92 :         result |= data_database_finalize_statement( (*this_).database, (*this_).statement_feature_by_uuid );
    1322          92 :         (*this_).statement_feature_by_uuid = NULL;
    1323             : 
    1324          92 :         result |= data_database_finalize_statement( (*this_).database, (*this_).statement_features_by_classifier_id );
    1325          92 :         (*this_).statement_features_by_classifier_id = NULL;
    1326             : 
    1327          92 :         result |= data_database_finalize_statement( (*this_).database, (*this_).statement_features_by_diagram_id );
    1328          92 :         (*this_).statement_features_by_diagram_id = NULL;
    1329             : 
    1330          92 :         result |= data_database_finalize_statement( (*this_).database, (*this_).statement_relationship_by_id );
    1331          92 :         (*this_).statement_relationship_by_id = NULL;
    1332             : 
    1333          92 :         result |= data_database_finalize_statement( (*this_).database, (*this_).statement_relationship_by_uuid );
    1334          92 :         (*this_).statement_relationship_by_uuid = NULL;
    1335             : 
    1336          92 :         result |= data_database_finalize_statement( (*this_).database, (*this_).statement_relationships_by_classifier_id );
    1337          92 :         (*this_).statement_relationships_by_classifier_id = NULL;
    1338             : 
    1339          92 :         result |= data_database_finalize_statement( (*this_).database, (*this_).statement_relationships_by_feature_id );
    1340          92 :         (*this_).statement_relationships_by_feature_id = NULL;
    1341             : 
    1342          92 :         result |= data_database_finalize_statement( (*this_).database, (*this_).statement_relationships_by_diagram_id );
    1343          92 :         (*this_).statement_relationships_by_diagram_id = NULL;
    1344             :     }
    1345             : 
    1346          92 :     U8_TRACE_END_ERR(result);
    1347          92 :     return result;
    1348             : }
    1349             : 
    1350             : 
    1351             : /*
    1352             : Copyright 2016-2024 Andreas Warnke
    1353             : 
    1354             : Licensed under the Apache License, Version 2.0 (the "License");
    1355             : you may not use this file except in compliance with the License.
    1356             : You may obtain a copy of the License at
    1357             : 
    1358             :     http://www.apache.org/licenses/LICENSE-2.0
    1359             : 
    1360             : Unless required by applicable law or agreed to in writing, software
    1361             : distributed under the License is distributed on an "AS IS" BASIS,
    1362             : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    1363             : See the License for the specific language governing permissions and
    1364             : limitations under the License.
    1365             : */

Generated by: LCOV version 1.16