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

          Line data    Source code
       1             : /* File: data_database_diagram_reader.c; Copyright and License: see below */
       2             : 
       3             : #include "storage/data_database_diagram_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_diagram_reader_init ( data_database_diagram_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_diagram_by_id = NULL;
      19          92 :     (*this_).statement_diagram_by_uuid = NULL;
      20          92 :     (*this_).statement_diagrams_by_parent_id = NULL;
      21          92 :     (*this_).statement_diagrams_by_parent_id_null = NULL;
      22          92 :     (*this_).statement_diagrams_by_classifier_id = NULL;
      23          92 :     (*this_).statement_diagram_ids_by_parent_id = NULL;
      24          92 :     (*this_).statement_diagram_ids_by_parent_id_null = NULL;
      25          92 :     (*this_).statement_diagram_ids_by_classifier_id = NULL;
      26          92 :     (*this_).statement_diagramelement_by_id = NULL;
      27          92 :     (*this_).statement_diagramelement_by_uuid = NULL;
      28          92 :     (*this_).statement_diagramelements_by_diagram_id = NULL;
      29          92 :     (*this_).statement_diagramelements_by_classifier_id = NULL;
      30             : 
      31          92 :     result |= data_database_diagram_reader_private_open( this_ );
      32             : 
      33          92 :     U8_TRACE_END_ERR(result);
      34          92 :     return result;
      35             : }
      36             : 
      37          92 : u8_error_t data_database_diagram_reader_destroy ( data_database_diagram_reader_t *this_ )
      38             : {
      39          92 :     U8_TRACE_BEGIN();
      40          92 :     u8_error_t result = U8_ERROR_NONE;
      41             : 
      42          92 :     result |= data_database_diagram_reader_private_close( this_ );
      43             : 
      44          92 :     (*this_).database = NULL;
      45             : 
      46          92 :     U8_TRACE_END_ERR(result);
      47          92 :     return result;
      48             : }
      49             : 
      50             : /* ================================ DIAGRAM ================================ */
      51             : 
      52             : /*!
      53             :  *  \brief predefined search statement to find a diagram by id
      54             :  */
      55             : static const char DATA_DATABASE_READER_SELECT_DIAGRAM_BY_ID[] =
      56             :     "SELECT id,parent_id,diagram_type,stereotype,name,description,list_order,display_flags,uuid "
      57             :     "FROM diagrams WHERE id=?;";
      58             : 
      59             : /*!
      60             :  *  \brief predefined search statement to find a diagram by uuid
      61             :  */
      62             : static const char DATA_DATABASE_READER_SELECT_DIAGRAM_BY_UUID[] =
      63             :     "SELECT id,parent_id,diagram_type,stereotype,name,description,list_order,display_flags,uuid "
      64             :     "FROM diagrams WHERE uuid=?;";
      65             : 
      66             : /*!
      67             :  *  \brief predefined search statement to find diagrams by parent-id
      68             :  */
      69             : static const char DATA_DATABASE_READER_SELECT_DIAGRAMS_BY_PARENT_ID[] =
      70             :     "SELECT id,parent_id,diagram_type,stereotype,name,description,list_order,display_flags,uuid "
      71             :     "FROM diagrams WHERE parent_id=? ORDER BY list_order ASC;";
      72             : 
      73             : /*!
      74             :  *  \brief predefined search statement to find diagrams by NULL parent-id
      75             :  */
      76             : static const char DATA_DATABASE_READER_SELECT_DIAGRAMS_BY_PARENT_ID_NULL[] =
      77             :     "SELECT id,parent_id,diagram_type,stereotype,name,description,list_order,display_flags,uuid "
      78             :     "FROM diagrams WHERE parent_id IS NULL ORDER BY list_order ASC;";
      79             : 
      80             : /*!
      81             :  *  \brief predefined search statement to find diagrams by classifier-id
      82             :  */
      83             : static const char DATA_DATABASE_READER_SELECT_DIAGRAMS_BY_CLASSIFIER_ID[] =
      84             :     "SELECT diagrams.id,diagrams.parent_id,diagrams.diagram_type,diagrams.stereotype,"
      85             :     "diagrams.name,diagrams.description,diagrams.list_order,diagrams.display_flags,diagrams.uuid "
      86             :     "FROM diagrams "
      87             :     "INNER JOIN diagramelements ON diagramelements.diagram_id=diagrams.id "
      88             :     "WHERE diagramelements.classifier_id=? "
      89             :     "GROUP BY diagrams.id "  /* filter duplicates if a classifier exists twice in a diagram */
      90             :     "ORDER BY diagrams.list_order ASC;";
      91             : 
      92             : /*!
      93             :  *  \brief the column id of the result where this parameter is stored: id
      94             :  */
      95             : static const int RESULT_DIAGRAM_ID_COLUMN = 0;
      96             : 
      97             : /*!
      98             :  *  \brief the column id of the result where this parameter is stored: parent_id
      99             :  */
     100             : static const int RESULT_DIAGRAM_PARENT_ID_COLUMN = 1;
     101             : 
     102             : /*!
     103             :  *  \brief the column id of the result where this parameter is stored: type
     104             :  */
     105             : static const int RESULT_DIAGRAM_TYPE_COLUMN = 2;
     106             : 
     107             : /*!
     108             :  *  \brief the column id of the result where this parameter is stored: stereotype
     109             :  */
     110             : static const int RESULT_DIAGRAM_STEREOTYPE_COLUMN = 3;
     111             : 
     112             : /*!
     113             :  *  \brief the column id of the result where this parameter is stored: name
     114             :  */
     115             : static const int RESULT_DIAGRAM_NAME_COLUMN = 4;
     116             : 
     117             : /*!
     118             :  *  \brief the column id of the result where this parameter is stored: description
     119             :  */
     120             : static const int RESULT_DIAGRAM_DESCRIPTION_COLUMN = 5;
     121             : 
     122             : /*!
     123             :  *  \brief the column id of the result where this parameter is stored: list_order
     124             :  */
     125             : static const int RESULT_DIAGRAM_LIST_ORDER_COLUMN = 6;
     126             : 
     127             : /*!
     128             :  *  \brief the column id of the result where this parameter is stored: display_flags
     129             :  */
     130             : static const int RESULT_DIAGRAM_DISPLAY_FLAGS_COLUMN = 7;
     131             : 
     132             : /*!
     133             :  *  \brief the column id of the result where this parameter is stored: uuid
     134             :  */
     135             : static const int RESULT_DIAGRAM_UUID_COLUMN = 8;
     136             : 
     137             : /*!
     138             :  *  \brief predefined search statement to find diagram ids by parent-id
     139             :  */
     140             : static const char DATA_DATABASE_READER_SELECT_DIAGRAM_IDS_BY_PARENT_ID[] =
     141             :     "SELECT id "
     142             :     "FROM diagrams WHERE parent_id=? ORDER BY list_order ASC;";
     143             : 
     144             : /*!
     145             :  *  \brief predefined search statement to find diagram ids by NULL parent-id
     146             :  */
     147             : static const char DATA_DATABASE_READER_SELECT_DIAGRAM_IDS_BY_PARENT_ID_NULL[] =
     148             :     "SELECT id "
     149             :     "FROM diagrams WHERE parent_id IS NULL ORDER BY list_order ASC;";
     150             : 
     151             : /*!
     152             :  *  \brief predefined search statement to find diagram ids by classifier-id
     153             :  */
     154             : static const char DATA_DATABASE_READER_SELECT_DIAGRAM_IDS_BY_CLASSIFIER_ID[] =
     155             :     "SELECT diagrams.id "
     156             :     "FROM diagrams "
     157             :     "INNER JOIN diagramelements ON diagramelements.diagram_id=diagrams.id "
     158             :     "WHERE diagramelements.classifier_id=? "
     159             :     "GROUP BY diagrams.id "  /* filter duplicates if a classifier exists twice in a diagram */
     160             :     "ORDER BY diagrams.list_order ASC;";
     161             : 
     162          71 : u8_error_t data_database_diagram_reader_get_diagram_by_id ( data_database_diagram_reader_t *this_,
     163             :                                                             data_row_id_t id,
     164             :                                                             data_diagram_t *out_diagram )
     165             : {
     166          71 :     U8_TRACE_BEGIN();
     167          71 :     assert( NULL != out_diagram );
     168          71 :     u8_error_t result = U8_ERROR_NONE;
     169             :     int sqlite_err;
     170             :     sqlite3_stmt *prepared_statement;
     171             : 
     172             :     {
     173          71 :         prepared_statement = (*this_).statement_diagram_by_id;
     174             : 
     175          71 :         result |= data_database_diagram_reader_private_bind_id_to_statement( this_, prepared_statement, id );
     176             : 
     177          71 :         U8_TRACE_INFO( "sqlite3_step()" );
     178          71 :         sqlite_err = sqlite3_step( prepared_statement );
     179          71 :         if ( SQLITE_ROW != sqlite_err )
     180             :         {
     181             :             /* This may happen e.g. when a diagram is deleted and a window still tries to show it. */
     182           3 :             U8_TRACE_INFO_INT( "sqlite3_step did not find a row for id", id );
     183           3 :             result |= U8_ERROR_DB_STRUCTURE;
     184             :         }
     185             : 
     186          71 :         if ( SQLITE_ROW == sqlite_err )
     187             :         {
     188         136 :             result |= data_diagram_init( out_diagram,
     189          68 :                                          sqlite3_column_int64( prepared_statement, RESULT_DIAGRAM_ID_COLUMN ),
     190          68 :                                          sqlite3_column_int64( prepared_statement, RESULT_DIAGRAM_PARENT_ID_COLUMN ),
     191          68 :                                          sqlite3_column_int( prepared_statement, RESULT_DIAGRAM_TYPE_COLUMN ),
     192          68 :                                          (const char*) sqlite3_column_text( prepared_statement, RESULT_DIAGRAM_STEREOTYPE_COLUMN ),
     193          68 :                                          (const char*) sqlite3_column_text( prepared_statement, RESULT_DIAGRAM_NAME_COLUMN ),
     194          68 :                                          (const char*) sqlite3_column_text( prepared_statement, RESULT_DIAGRAM_DESCRIPTION_COLUMN ),
     195             :                                          sqlite3_column_int( prepared_statement, RESULT_DIAGRAM_LIST_ORDER_COLUMN ),
     196          68 :                                          sqlite3_column_int64( prepared_statement, RESULT_DIAGRAM_DISPLAY_FLAGS_COLUMN ),
     197          68 :                                          (const char*) sqlite3_column_text( prepared_statement, RESULT_DIAGRAM_UUID_COLUMN )
     198             :                                        );
     199          68 :             if ( SQLITE_NULL == sqlite3_column_type( prepared_statement, RESULT_DIAGRAM_PARENT_ID_COLUMN ) )
     200             :             {
     201          46 :                 (*out_diagram).parent_id = DATA_ROW_ID_VOID;
     202             :             }
     203             : 
     204          68 :             data_diagram_trace( out_diagram );
     205             : 
     206          68 :             sqlite_err = sqlite3_step( prepared_statement );
     207          68 :             if ( SQLITE_DONE != sqlite_err )
     208             :             {
     209           0 :                 U8_LOG_ERROR_INT( "sqlite3_step failed:", sqlite_err );
     210           0 :                 result |= U8_ERROR_DB_STRUCTURE;
     211             :             }
     212             :         }
     213             :     }
     214             : 
     215          71 :     U8_TRACE_END_ERR( result );
     216          71 :     return result;
     217             : }
     218             : 
     219          10 : u8_error_t data_database_diagram_reader_get_diagram_by_uuid ( data_database_diagram_reader_t *this_,
     220             :                                                               const char *uuid,
     221             :                                                               data_diagram_t *out_diagram )
     222             : {
     223          10 :     U8_TRACE_BEGIN();
     224          10 :     assert( NULL != uuid );
     225          10 :     assert( NULL != out_diagram );
     226          10 :     u8_error_t result = U8_ERROR_NONE;
     227             :     int sqlite_err;
     228             :     sqlite3_stmt *prepared_statement;
     229             : 
     230             :     {
     231          10 :         prepared_statement = (*this_).statement_diagram_by_uuid;
     232             : 
     233          10 :         result |= data_database_diagram_reader_private_bind_text_to_statement( this_, prepared_statement, uuid );
     234             : 
     235          10 :         U8_TRACE_INFO( "sqlite3_step()" );
     236          10 :         sqlite_err = sqlite3_step( prepared_statement );
     237          10 :         if ( SQLITE_ROW != sqlite_err )
     238             :         {
     239             :             /* Do not log this incident, the caller may not expect to find a row. */
     240           6 :             U8_TRACE_INFO_STR( "sqlite3_step did not find a row for uuid", uuid );
     241           6 :             result |= U8_ERROR_NOT_FOUND;
     242             :         }
     243             : 
     244          10 :         if ( SQLITE_ROW == sqlite_err )
     245             :         {
     246           8 :             result |= data_diagram_init( out_diagram,
     247           4 :                                          sqlite3_column_int64( prepared_statement, RESULT_DIAGRAM_ID_COLUMN ),
     248           4 :                                          sqlite3_column_int64( prepared_statement, RESULT_DIAGRAM_PARENT_ID_COLUMN ),
     249           4 :                                          sqlite3_column_int( prepared_statement, RESULT_DIAGRAM_TYPE_COLUMN ),
     250           4 :                                          (const char*) sqlite3_column_text( prepared_statement, RESULT_DIAGRAM_STEREOTYPE_COLUMN ),
     251           4 :                                          (const char*) sqlite3_column_text( prepared_statement, RESULT_DIAGRAM_NAME_COLUMN ),
     252           4 :                                          (const char*) sqlite3_column_text( prepared_statement, RESULT_DIAGRAM_DESCRIPTION_COLUMN ),
     253             :                                          sqlite3_column_int( prepared_statement, RESULT_DIAGRAM_LIST_ORDER_COLUMN ),
     254           4 :                                          sqlite3_column_int64( prepared_statement, RESULT_DIAGRAM_DISPLAY_FLAGS_COLUMN ),
     255           4 :                                          (const char*) sqlite3_column_text( prepared_statement, RESULT_DIAGRAM_UUID_COLUMN )
     256             :                                        );
     257           4 :             if ( SQLITE_NULL == sqlite3_column_type( prepared_statement, RESULT_DIAGRAM_PARENT_ID_COLUMN ) )
     258             :             {
     259           3 :                 (*out_diagram).parent_id = DATA_ROW_ID_VOID;
     260             :             }
     261             : 
     262           4 :             data_diagram_trace( out_diagram );
     263             : 
     264           4 :             sqlite_err = sqlite3_step( prepared_statement );
     265           4 :             if ( SQLITE_DONE != sqlite_err )
     266             :             {
     267           0 :                 U8_LOG_ERROR_INT( "sqlite3_step not done yet:", sqlite_err );
     268           0 :                 result |= U8_ERROR_DB_STRUCTURE;
     269             :             }
     270             :         }
     271             :     }
     272             : 
     273          10 :     U8_TRACE_END_ERR( result );
     274          10 :     return result;
     275             : }
     276             : 
     277         176 : u8_error_t data_database_diagram_reader_get_diagrams_by_parent_id ( data_database_diagram_reader_t *this_,
     278             :                                                                     data_row_id_t parent_id,
     279             :                                                                     uint32_t max_out_array_size,
     280             :                                                                     data_diagram_t (*out_diagram)[],
     281             :                                                                     uint32_t *out_diagram_count )
     282             : {
     283         176 :     U8_TRACE_BEGIN();
     284         176 :     assert( NULL != out_diagram_count );
     285         176 :     assert( NULL != out_diagram );
     286         176 :     u8_error_t result = U8_ERROR_NONE;
     287             :     int sqlite_err;
     288             :     sqlite3_stmt *prepared_statement;
     289             : 
     290             :     {
     291         176 :         if ( DATA_ROW_ID_VOID == parent_id )
     292             :         {
     293          39 :             prepared_statement = (*this_).statement_diagrams_by_parent_id_null;
     294          39 :             result |= data_database_diagram_reader_private_bind_void_to_statement( this_, prepared_statement );
     295             :         }
     296             :         else
     297             :         {
     298         137 :             prepared_statement = (*this_).statement_diagrams_by_parent_id;
     299         137 :             result |= data_database_diagram_reader_private_bind_id_to_statement( this_, prepared_statement, parent_id );
     300             :         }
     301             : 
     302         176 :         *out_diagram_count = 0;
     303         176 :         sqlite_err = SQLITE_ROW;
     304         391 :         for ( uint32_t row_index = 0; (SQLITE_ROW == sqlite_err) && (row_index <= max_out_array_size); row_index ++ )
     305             :         {
     306         215 :             U8_TRACE_INFO( "sqlite3_step()" );
     307         215 :             sqlite_err = sqlite3_step( prepared_statement );
     308         215 :             if (( SQLITE_ROW != sqlite_err )&&( SQLITE_DONE != sqlite_err ))
     309             :             {
     310           0 :                 U8_LOG_ERROR_INT( "sqlite3_step failed:", sqlite_err );
     311           0 :                 result |= U8_ERROR_AT_DB;
     312             :             }
     313         215 :             if (( SQLITE_ROW == sqlite_err )&&(row_index < max_out_array_size))
     314             :             {
     315          39 :                 *out_diagram_count = row_index+1;
     316          39 :                 data_diagram_t *current_diag = &((*out_diagram)[row_index]);
     317             : 
     318          78 :                 result |= data_diagram_init( current_diag,
     319          39 :                                              sqlite3_column_int64( prepared_statement, RESULT_DIAGRAM_ID_COLUMN ),
     320          39 :                                              sqlite3_column_int64( prepared_statement, RESULT_DIAGRAM_PARENT_ID_COLUMN ),
     321          39 :                                              sqlite3_column_int( prepared_statement, RESULT_DIAGRAM_TYPE_COLUMN ),
     322          39 :                                              (const char*) sqlite3_column_text( prepared_statement, RESULT_DIAGRAM_STEREOTYPE_COLUMN ),
     323          39 :                                              (const char*) sqlite3_column_text( prepared_statement, RESULT_DIAGRAM_NAME_COLUMN ),
     324          39 :                                              (const char*) sqlite3_column_text( prepared_statement, RESULT_DIAGRAM_DESCRIPTION_COLUMN ),
     325             :                                              sqlite3_column_int( prepared_statement, RESULT_DIAGRAM_LIST_ORDER_COLUMN ),
     326          39 :                                              sqlite3_column_int64( prepared_statement, RESULT_DIAGRAM_DISPLAY_FLAGS_COLUMN ),
     327          39 :                                              (const char*) sqlite3_column_text( prepared_statement, RESULT_DIAGRAM_UUID_COLUMN )
     328             :                                            );
     329          39 :                 if ( SQLITE_NULL == sqlite3_column_type( prepared_statement, RESULT_DIAGRAM_PARENT_ID_COLUMN ) )
     330             :                 {
     331          36 :                     (*current_diag).parent_id = DATA_ROW_ID_VOID;
     332             :                 }
     333             : 
     334          39 :                 data_diagram_trace( current_diag );
     335             :             }
     336         215 :             if (( SQLITE_ROW == sqlite_err )&&(row_index >= max_out_array_size))
     337             :             {
     338           1 :                 U8_LOG_ANOMALY_INT( "out_diagram[] full:", (row_index+1) );
     339           1 :                 result |= U8_ERROR_ARRAY_BUFFER_EXCEEDED;
     340             :             }
     341         215 :             if ( SQLITE_DONE == sqlite_err )
     342             :             {
     343         175 :                 U8_TRACE_INFO( "sqlite3_step finished: SQLITE_DONE" );
     344             :             }
     345             :         }
     346             :     }
     347             : 
     348         176 :     U8_TRACE_END_ERR( result );
     349         176 :     return result;
     350             : }
     351             : 
     352          14 : u8_error_t data_database_diagram_reader_get_diagrams_by_classifier_id ( data_database_diagram_reader_t *this_,
     353             :                                                                         data_row_id_t classifier_id,
     354             :                                                                         uint32_t max_out_array_size,
     355             :                                                                         data_diagram_t (*out_diagram)[],
     356             :                                                                         uint32_t *out_diagram_count )
     357             : {
     358          14 :     U8_TRACE_BEGIN();
     359          14 :     assert( NULL != out_diagram_count );
     360          14 :     assert( NULL != out_diagram );
     361          14 :     u8_error_t result = U8_ERROR_NONE;
     362             :     int sqlite_err;
     363             :     sqlite3_stmt *prepared_statement;
     364             : 
     365             :     {
     366          14 :         prepared_statement = (*this_).statement_diagrams_by_classifier_id;
     367             : 
     368          14 :         result |= data_database_diagram_reader_private_bind_id_to_statement( this_, prepared_statement, classifier_id );
     369             : 
     370          14 :         *out_diagram_count = 0;
     371          14 :         sqlite_err = SQLITE_ROW;
     372          35 :         for ( uint32_t row_index = 0; (SQLITE_ROW == sqlite_err) && (row_index <= max_out_array_size); row_index ++ )
     373             :         {
     374          21 :             U8_TRACE_INFO( "sqlite3_step()" );
     375          21 :             sqlite_err = sqlite3_step( prepared_statement );
     376          21 :             if (( SQLITE_ROW != sqlite_err )&&( SQLITE_DONE != sqlite_err ))
     377             :             {
     378           0 :                 U8_LOG_ERROR_INT( "sqlite3_step failed:", sqlite_err );
     379           0 :                 result |= U8_ERROR_AT_DB;
     380             :             }
     381          21 :             if (( SQLITE_ROW == sqlite_err )&&(row_index < max_out_array_size))
     382             :             {
     383           7 :                 *out_diagram_count = row_index+1;
     384           7 :                 data_diagram_t *current_diag = &((*out_diagram)[row_index]);
     385             : 
     386          14 :                 result |= data_diagram_init( current_diag,
     387           7 :                                              sqlite3_column_int64( prepared_statement, RESULT_DIAGRAM_ID_COLUMN ),
     388           7 :                                              sqlite3_column_int64( prepared_statement, RESULT_DIAGRAM_PARENT_ID_COLUMN ),
     389           7 :                                              sqlite3_column_int( prepared_statement, RESULT_DIAGRAM_TYPE_COLUMN ),
     390           7 :                                              (const char*) sqlite3_column_text( prepared_statement, RESULT_DIAGRAM_STEREOTYPE_COLUMN ),
     391           7 :                                              (const char*) sqlite3_column_text( prepared_statement, RESULT_DIAGRAM_NAME_COLUMN ),
     392           7 :                                              (const char*) sqlite3_column_text( prepared_statement, RESULT_DIAGRAM_DESCRIPTION_COLUMN ),
     393             :                                              sqlite3_column_int( prepared_statement, RESULT_DIAGRAM_LIST_ORDER_COLUMN ),
     394           7 :                                              sqlite3_column_int64( prepared_statement, RESULT_DIAGRAM_DISPLAY_FLAGS_COLUMN ),
     395           7 :                                              (const char*) sqlite3_column_text( prepared_statement, RESULT_DIAGRAM_UUID_COLUMN )
     396             :                                            );
     397           7 :                 if ( SQLITE_NULL == sqlite3_column_type( prepared_statement, RESULT_DIAGRAM_PARENT_ID_COLUMN ) )
     398             :                 {
     399           6 :                     (*current_diag).parent_id = DATA_ROW_ID_VOID;
     400             :                 }
     401             : 
     402           7 :                 data_diagram_trace( current_diag );
     403             :             }
     404          21 :             if (( SQLITE_ROW == sqlite_err )&&(row_index >= max_out_array_size))
     405             :             {
     406           0 :                 U8_LOG_ANOMALY_INT( "out_diagram[] full:", (row_index+1) );
     407           0 :                 result |= U8_ERROR_ARRAY_BUFFER_EXCEEDED;
     408             :             }
     409          21 :             if ( SQLITE_DONE == sqlite_err )
     410             :             {
     411          14 :                 U8_TRACE_INFO( "sqlite3_step finished: SQLITE_DONE" );
     412             :             }
     413             :         }
     414             :     }
     415             : 
     416          14 :     U8_TRACE_END_ERR( result );
     417          14 :     return result;
     418             : }
     419             : 
     420          20 : u8_error_t data_database_diagram_reader_get_diagram_ids_by_parent_id ( data_database_diagram_reader_t *this_,
     421             :                                                                        data_row_id_t parent_id,
     422             :                                                                        data_small_set_t *out_diagram_ids )
     423             : {
     424          20 :     U8_TRACE_BEGIN();
     425          20 :     assert( NULL != out_diagram_ids );
     426          20 :     u8_error_t result = U8_ERROR_NONE;
     427             :     int sqlite_err;
     428             :     sqlite3_stmt *prepared_statement;
     429             : 
     430             :     {
     431          20 :         if ( DATA_ROW_ID_VOID == parent_id )
     432             :         {
     433          18 :             prepared_statement = (*this_).statement_diagram_ids_by_parent_id_null;
     434          18 :             result |= data_database_diagram_reader_private_bind_void_to_statement( this_, prepared_statement );
     435             :         }
     436             :         else
     437             :         {
     438           2 :             prepared_statement = (*this_).statement_diagram_ids_by_parent_id;
     439           2 :             result |= data_database_diagram_reader_private_bind_id_to_statement( this_, prepared_statement, parent_id );
     440             :         }
     441             : 
     442          20 :         data_small_set_clear( out_diagram_ids );
     443          20 :         sqlite_err = SQLITE_ROW;
     444          57 :         for ( uint32_t row_index = 0; (SQLITE_ROW == sqlite_err) && (row_index <= DATA_SMALL_SET_MAX_SET_SIZE); row_index ++ )
     445             :         {
     446          37 :             U8_TRACE_INFO( "sqlite3_step()" );
     447          37 :             sqlite_err = sqlite3_step( prepared_statement );
     448          37 :             if (( SQLITE_ROW != sqlite_err )&&( SQLITE_DONE != sqlite_err ))
     449             :             {
     450           0 :                 U8_LOG_ERROR_INT( "sqlite3_step failed:", sqlite_err );
     451           0 :                 result |= U8_ERROR_AT_DB;
     452             :             }
     453          37 :             if (( SQLITE_ROW == sqlite_err )&&(row_index < DATA_SMALL_SET_MAX_SET_SIZE))
     454             :             {
     455             :                 data_id_t current_diag_id;
     456          17 :                 data_id_init( &current_diag_id, DATA_TABLE_DIAGRAM, sqlite3_column_int64( prepared_statement, RESULT_DIAGRAM_ID_COLUMN ) );
     457          17 :                 result |= data_small_set_add_obj( out_diagram_ids, current_diag_id );
     458             :             }
     459          37 :             if (( SQLITE_ROW == sqlite_err )&&(row_index >= DATA_SMALL_SET_MAX_SET_SIZE))
     460             :             {
     461           0 :                 U8_LOG_ANOMALY_INT( "out_diagram_ids[] full:", (row_index+1) );
     462           0 :                 result |= U8_ERROR_ARRAY_BUFFER_EXCEEDED;
     463             :             }
     464          37 :             if ( SQLITE_DONE == sqlite_err )
     465             :             {
     466          20 :                 U8_TRACE_INFO( "sqlite3_step finished: SQLITE_DONE" );
     467             :             }
     468             :         }
     469          20 :         data_small_set_trace( out_diagram_ids );
     470             :     }
     471             : 
     472          20 :     U8_TRACE_END_ERR( result );
     473          20 :     return result;
     474             : }
     475             : 
     476           1 : u8_error_t data_database_diagram_reader_get_diagram_ids_by_classifier_id ( data_database_diagram_reader_t *this_,
     477             :                                                                            data_row_id_t classifier_id,
     478             :                                                                            data_small_set_t *out_diagram_ids )
     479             : {
     480           1 :     U8_TRACE_BEGIN();
     481           1 :     assert( NULL != out_diagram_ids );
     482           1 :     u8_error_t result = U8_ERROR_NONE;
     483             :     int sqlite_err;
     484             :     sqlite3_stmt *prepared_statement;
     485             : 
     486             :     {
     487           1 :         prepared_statement = (*this_).statement_diagram_ids_by_classifier_id;
     488             : 
     489           1 :         result |= data_database_diagram_reader_private_bind_id_to_statement( this_, prepared_statement, classifier_id );
     490             : 
     491           1 :         sqlite_err = SQLITE_ROW;
     492           4 :         for ( uint32_t row_index = 0; (SQLITE_ROW == sqlite_err) && (row_index <= DATA_SMALL_SET_MAX_SET_SIZE); row_index ++ )
     493             :         {
     494           3 :             U8_TRACE_INFO( "sqlite3_step()" );
     495           3 :             sqlite_err = sqlite3_step( prepared_statement );
     496           3 :             if (( SQLITE_ROW != sqlite_err )&&( SQLITE_DONE != sqlite_err ))
     497             :             {
     498           0 :                 U8_LOG_ERROR_INT( "sqlite3_step failed:", sqlite_err );
     499           0 :                 result |= U8_ERROR_AT_DB;
     500             :             }
     501           3 :             if (( SQLITE_ROW == sqlite_err )&&(row_index < DATA_SMALL_SET_MAX_SET_SIZE))
     502             :             {
     503             :                 data_id_t current_diag_id;
     504           2 :                 data_id_init( &current_diag_id, DATA_TABLE_DIAGRAM, sqlite3_column_int64( prepared_statement, RESULT_DIAGRAM_ID_COLUMN ) );
     505           2 :                 result |= data_small_set_add_obj( out_diagram_ids, current_diag_id );
     506           2 :                 data_id_trace( &current_diag_id );
     507             :             }
     508           3 :             if (( SQLITE_ROW == sqlite_err )&&(row_index >= DATA_SMALL_SET_MAX_SET_SIZE))
     509             :             {
     510           0 :                 U8_LOG_ANOMALY_INT( "out_diagram_ids[] full:", (row_index+1) );
     511           0 :                 result |= U8_ERROR_ARRAY_BUFFER_EXCEEDED;
     512             :             }
     513           3 :             if ( SQLITE_DONE == sqlite_err )
     514             :             {
     515           1 :                 U8_TRACE_INFO( "sqlite3_step finished: SQLITE_DONE" );
     516             :             }
     517             :         }
     518             :     }
     519             : 
     520           1 :     U8_TRACE_END_ERR( result );
     521           1 :     return result;
     522             : }
     523             : 
     524             : /* ================================ DIAGRAMELEMENT ================================ */
     525             : 
     526             : /*!
     527             :  *  \brief predefined search statement to find a diagramelement by id
     528             :  */
     529             : static const char DATA_DATABASE_READER_SELECT_DIAGRAMELEMENT_BY_ID[] =
     530             :     "SELECT id,diagram_id,classifier_id,display_flags,focused_feature_id,uuid FROM diagramelements WHERE id=?;";
     531             : 
     532             : /*!
     533             :  *  \brief predefined search statement to find a diagramelement by uuid
     534             :  */
     535             : static const char DATA_DATABASE_READER_SELECT_DIAGRAMELEMENT_BY_UUID[] =
     536             :     "SELECT id,diagram_id,classifier_id,display_flags,focused_feature_id,uuid FROM diagramelements WHERE uuid=?;";
     537             : 
     538             : /*!
     539             :  *  \brief predefined search statement to find diagramelements by diagram id
     540             :  *
     541             :  *  The "order by id" is important to get reproducable results, e.g. for json export
     542             :  */
     543             : static const char DATA_DATABASE_READER_SELECT_DIAGRAMELEMENTS_BY_DIAGRAM_ID[] =
     544             :     "SELECT id,diagram_id,classifier_id,display_flags,focused_feature_id,uuid FROM diagramelements "
     545             :     "WHERE diagram_id=? ORDER BY id ASC;";
     546             : 
     547             : /*!
     548             :  *  \brief predefined search statement to find diagramelements by classifier id
     549             :  *
     550             :  *  The "order by id" is important to get reproducable results, e.g. for json export
     551             :  */
     552             : static const char DATA_DATABASE_READER_SELECT_DIAGRAMELEMENTS_BY_CLASSIFIER_ID[] =
     553             :     "SELECT id,diagram_id,classifier_id,display_flags,focused_feature_id,uuid FROM diagramelements "
     554             :     "WHERE classifier_id=? ORDER BY id ASC;";
     555             : 
     556             : /*!
     557             :  *  \brief the column id of the result where this parameter is stored: id
     558             :  */
     559             : static const int RESULT_DIAGRAMELEMENT_ID_COLUMN = 0;
     560             : 
     561             : /*!
     562             :  *  \brief the column id of the result where this parameter is stored: diagram_id
     563             :  */
     564             : static const int RESULT_DIAGRAMELEMENT_DIAGRAM_ID_COLUMN = 1;
     565             : 
     566             : /*!
     567             :  *  \brief the column id of the result where this parameter is stored: classifier_id
     568             :  */
     569             : static const int RESULT_DIAGRAMELEMENT_CLASSIFIER_ID_COLUMN = 2;
     570             : 
     571             : /*!
     572             :  *  \brief the column id of the result where this parameter is stored: display_flags
     573             :  */
     574             : static const int RESULT_DIAGRAMELEMENT_DISPLAY_FLAGS_COLUMN = 3;
     575             : 
     576             : /*!
     577             :  *  \brief the column id of the result where this parameter is stored: focused_feature_id
     578             :  */
     579             : static const int RESULT_DIAGRAMELEMENT_FOCUSED_FEATURE_ID_COLUMN = 4;
     580             : 
     581             : /*!
     582             :  *  \brief the column id of the result where this parameter is stored: uuid
     583             :  */
     584             : static const int RESULT_DIAGRAMELEMENT_UUID_COLUMN = 5;
     585             : 
     586          38 : u8_error_t data_database_diagram_reader_get_diagramelement_by_id ( data_database_diagram_reader_t *this_,
     587             :                                                                    data_row_id_t id,
     588             :                                                                    data_diagramelement_t *out_diagramelement )
     589             : {
     590          38 :     U8_TRACE_BEGIN();
     591          38 :     assert( NULL != out_diagramelement );
     592          38 :     u8_error_t result = U8_ERROR_NONE;
     593             :     int sqlite_err;
     594             :     sqlite3_stmt *prepared_statement;
     595             : 
     596             :     {
     597          38 :         prepared_statement = (*this_).statement_diagramelement_by_id;
     598             : 
     599          38 :         result |= data_database_diagram_reader_private_bind_id_to_statement( this_, prepared_statement, id );
     600             : 
     601          38 :         U8_TRACE_INFO( "sqlite3_step()" );
     602          38 :         sqlite_err = sqlite3_step( prepared_statement );
     603          38 :         if ( SQLITE_ROW != sqlite_err )
     604             :         {
     605           3 :             U8_TRACE_INFO_INT( "sqlite3_step did not find a row for id", id );
     606           3 :             result |= U8_ERROR_DB_STRUCTURE;
     607             :         }
     608             : 
     609          38 :         if ( SQLITE_ROW == sqlite_err )
     610             :         {
     611          35 :             result |= data_diagramelement_init( out_diagramelement,
     612          35 :                                                 sqlite3_column_int64( prepared_statement, RESULT_DIAGRAMELEMENT_ID_COLUMN ),
     613          35 :                                                 sqlite3_column_int64( prepared_statement, RESULT_DIAGRAMELEMENT_DIAGRAM_ID_COLUMN ),
     614          35 :                                                 sqlite3_column_int64( prepared_statement, RESULT_DIAGRAMELEMENT_CLASSIFIER_ID_COLUMN ),
     615          35 :                                                 sqlite3_column_int64( prepared_statement, RESULT_DIAGRAMELEMENT_DISPLAY_FLAGS_COLUMN ),
     616          35 :                                                 sqlite3_column_int64( prepared_statement, RESULT_DIAGRAMELEMENT_FOCUSED_FEATURE_ID_COLUMN ),
     617          35 :                                                 (const char*) sqlite3_column_text( prepared_statement, RESULT_DIAGRAMELEMENT_UUID_COLUMN )
     618             :                                               );
     619          35 :             if ( SQLITE_NULL == sqlite3_column_type( prepared_statement, RESULT_DIAGRAMELEMENT_FOCUSED_FEATURE_ID_COLUMN ) )
     620             :             {
     621          23 :                 data_diagramelement_set_focused_feature_row_id ( out_diagramelement, DATA_ROW_ID_VOID );
     622             :             }
     623             : 
     624          35 :             data_diagramelement_trace( out_diagramelement );
     625             : 
     626          35 :             sqlite_err = sqlite3_step( prepared_statement );
     627          35 :             if ( SQLITE_DONE != sqlite_err )
     628             :             {
     629           0 :                 U8_LOG_ERROR_INT( "sqlite3_step failed:", sqlite_err );
     630           0 :                 result |= U8_ERROR_DB_STRUCTURE;
     631             :             }
     632             :         }
     633             :     }
     634             : 
     635          38 :     U8_TRACE_END_ERR( result );
     636          38 :     return result;
     637             : }
     638             : 
     639           2 : u8_error_t data_database_diagram_reader_get_diagramelement_by_uuid ( data_database_diagram_reader_t *this_,
     640             :                                                                      const char *uuid,
     641             :                                                                      data_diagramelement_t *out_diagramelement )
     642             : {
     643           2 :     U8_TRACE_BEGIN();
     644           2 :     assert( NULL != uuid );
     645           2 :     assert( NULL != out_diagramelement );
     646           2 :     u8_error_t result = U8_ERROR_NONE;
     647             :     int sqlite_err;
     648             :     sqlite3_stmt *prepared_statement;
     649             : 
     650             :     {
     651           2 :         prepared_statement = (*this_).statement_diagramelement_by_uuid;
     652             : 
     653           2 :         result |= data_database_diagram_reader_private_bind_text_to_statement( this_, prepared_statement, uuid );
     654             : 
     655           2 :         U8_TRACE_INFO( "sqlite3_step()" );
     656           2 :         sqlite_err = sqlite3_step( prepared_statement );
     657           2 :         if ( SQLITE_ROW != sqlite_err )
     658             :         {
     659             :             /* Do not log this incident, the caller may not expect to find a row. */
     660           1 :             U8_TRACE_INFO_STR( "sqlite3_step did not find a row for uuid", uuid );
     661           1 :             result |= U8_ERROR_NOT_FOUND;
     662             :         }
     663             : 
     664           2 :         if ( SQLITE_ROW == sqlite_err )
     665             :         {
     666           1 :             result |= data_diagramelement_init( out_diagramelement,
     667           1 :                                                 sqlite3_column_int64( prepared_statement, RESULT_DIAGRAMELEMENT_ID_COLUMN ),
     668           1 :                                                 sqlite3_column_int64( prepared_statement, RESULT_DIAGRAMELEMENT_DIAGRAM_ID_COLUMN ),
     669           1 :                                                 sqlite3_column_int64( prepared_statement, RESULT_DIAGRAMELEMENT_CLASSIFIER_ID_COLUMN ),
     670           1 :                                                 sqlite3_column_int64( prepared_statement, RESULT_DIAGRAMELEMENT_DISPLAY_FLAGS_COLUMN ),
     671           1 :                                                 sqlite3_column_int64( prepared_statement, RESULT_DIAGRAMELEMENT_FOCUSED_FEATURE_ID_COLUMN ),
     672           1 :                                                 (const char*) sqlite3_column_text( prepared_statement, RESULT_DIAGRAMELEMENT_UUID_COLUMN )
     673             :                                               );
     674           1 :             if ( SQLITE_NULL == sqlite3_column_type( prepared_statement, RESULT_DIAGRAMELEMENT_FOCUSED_FEATURE_ID_COLUMN ) )
     675             :             {
     676           1 :                 data_diagramelement_set_focused_feature_row_id ( out_diagramelement, DATA_ROW_ID_VOID );
     677             :             }
     678             : 
     679           1 :             data_diagramelement_trace( out_diagramelement );
     680             : 
     681           1 :             sqlite_err = sqlite3_step( prepared_statement );
     682           1 :             if ( SQLITE_DONE != sqlite_err )
     683             :             {
     684           0 :                 U8_LOG_ERROR_INT( "sqlite3_step not done yet:", sqlite_err );
     685           0 :                 result |= U8_ERROR_DB_STRUCTURE;
     686             :             }
     687             :         }
     688             :     }
     689             : 
     690           2 :     U8_TRACE_END_ERR( result );
     691           2 :     return result;
     692             : }
     693             : 
     694           5 : u8_error_t data_database_diagram_reader_get_diagramelements_by_diagram_id ( data_database_diagram_reader_t *this_,
     695             :                                                                             data_row_id_t diagram_id,
     696             :                                                                             uint32_t max_out_array_size,
     697             :                                                                             data_diagramelement_t (*out_diagramelement)[],
     698             :                                                                             uint32_t *out_diagramelement_count )
     699             : {
     700           5 :     U8_TRACE_BEGIN();
     701           5 :     assert( NULL != out_diagramelement_count );
     702           5 :     assert( NULL != out_diagramelement );
     703           5 :     u8_error_t result = U8_ERROR_NONE;
     704             :     int sqlite_err;
     705             :     sqlite3_stmt *prepared_statement;
     706             : 
     707             :     {
     708           5 :         prepared_statement = (*this_).statement_diagramelements_by_diagram_id;
     709             : 
     710           5 :         result |= data_database_diagram_reader_private_bind_id_to_statement( this_, prepared_statement, diagram_id );
     711             : 
     712           5 :         *out_diagramelement_count = 0;
     713           5 :         sqlite_err = SQLITE_ROW;
     714          14 :         for ( uint32_t row_index = 0; (SQLITE_ROW == sqlite_err) && (row_index <= max_out_array_size); row_index ++ )
     715             :         {
     716           9 :             U8_TRACE_INFO( "sqlite3_step()" );
     717           9 :             sqlite_err = sqlite3_step( prepared_statement );
     718           9 :             if (( SQLITE_ROW != sqlite_err )&&( SQLITE_DONE != sqlite_err ))
     719             :             {
     720           0 :                 U8_LOG_ERROR_INT( "sqlite3_step failed:", sqlite_err );
     721           0 :                 result |= U8_ERROR_AT_DB;
     722             :             }
     723           9 :             if (( SQLITE_ROW == sqlite_err )&&(row_index < max_out_array_size))
     724             :             {
     725           4 :                 *out_diagramelement_count = row_index+1;
     726           4 :                 data_diagramelement_t *current_diagele = &((*out_diagramelement)[row_index]);
     727             : 
     728           4 :                 result |= data_diagramelement_init( current_diagele,
     729           4 :                                                     sqlite3_column_int64( prepared_statement, RESULT_DIAGRAMELEMENT_ID_COLUMN ),
     730           4 :                                                     sqlite3_column_int64( prepared_statement, RESULT_DIAGRAMELEMENT_DIAGRAM_ID_COLUMN ),
     731           4 :                                                     sqlite3_column_int64( prepared_statement, RESULT_DIAGRAMELEMENT_CLASSIFIER_ID_COLUMN ),
     732           4 :                                                     sqlite3_column_int64( prepared_statement, RESULT_DIAGRAMELEMENT_DISPLAY_FLAGS_COLUMN ),
     733           4 :                                                     sqlite3_column_int64( prepared_statement, RESULT_DIAGRAMELEMENT_FOCUSED_FEATURE_ID_COLUMN ),
     734           4 :                                                     (const char*) sqlite3_column_text( prepared_statement, RESULT_DIAGRAMELEMENT_UUID_COLUMN )
     735             :                                                   );
     736           4 :                 if ( SQLITE_NULL == sqlite3_column_type( prepared_statement, RESULT_DIAGRAMELEMENT_FOCUSED_FEATURE_ID_COLUMN ) )
     737             :                 {
     738           2 :                     data_diagramelement_set_focused_feature_row_id ( current_diagele, DATA_ROW_ID_VOID );
     739             :                 }
     740             : 
     741           4 :                 data_diagramelement_trace( current_diagele );
     742             :             }
     743           9 :             if (( SQLITE_ROW == sqlite_err )&&(row_index >= max_out_array_size))
     744             :             {
     745           0 :                 U8_LOG_ANOMALY_INT( "out_diagramelement[] full:", (row_index+1) );
     746           0 :                 result |= U8_ERROR_ARRAY_BUFFER_EXCEEDED;
     747             :             }
     748           9 :             if ( SQLITE_DONE == sqlite_err )
     749             :             {
     750           5 :                 U8_TRACE_INFO( "sqlite3_step finished: SQLITE_DONE" );
     751             :             }
     752             :         }
     753             :     }
     754             : 
     755           5 :     U8_TRACE_END_ERR( result );
     756           5 :     return result;
     757             : }
     758             : 
     759          10 : u8_error_t data_database_diagram_reader_get_diagramelements_by_classifier_id ( data_database_diagram_reader_t *this_,
     760             :                                                                                data_row_id_t classifier_id,
     761             :                                                                                uint32_t max_out_array_size,
     762             :                                                                                data_diagramelement_t (*out_diagramelement)[],
     763             :                                                                                uint32_t *out_diagramelement_count )
     764             : {
     765          10 :     U8_TRACE_BEGIN();
     766          10 :     assert( NULL != out_diagramelement_count );
     767          10 :     assert( NULL != out_diagramelement );
     768          10 :     u8_error_t result = U8_ERROR_NONE;
     769             :     int sqlite_err;
     770             :     sqlite3_stmt *prepared_statement;
     771             : 
     772             :     {
     773          10 :         prepared_statement = (*this_).statement_diagramelements_by_classifier_id;
     774             : 
     775          10 :         result |= data_database_diagram_reader_private_bind_id_to_statement( this_, prepared_statement, classifier_id );
     776             : 
     777          10 :         *out_diagramelement_count = 0;
     778          10 :         sqlite_err = SQLITE_ROW;
     779          31 :         for ( uint32_t row_index = 0; (SQLITE_ROW == sqlite_err) && (row_index <= max_out_array_size); row_index ++ )
     780             :         {
     781          21 :             U8_TRACE_INFO( "sqlite3_step()" );
     782          21 :             sqlite_err = sqlite3_step( prepared_statement );
     783          21 :             if (( SQLITE_ROW != sqlite_err )&&( SQLITE_DONE != sqlite_err ))
     784             :             {
     785           0 :                 U8_LOG_ERROR_INT( "sqlite3_step failed:", sqlite_err );
     786           0 :                 result |= U8_ERROR_AT_DB;
     787             :             }
     788          21 :             if (( SQLITE_ROW == sqlite_err )&&(row_index < max_out_array_size))
     789             :             {
     790          11 :                 *out_diagramelement_count = row_index+1;
     791          11 :                 data_diagramelement_t *current_diagele = &((*out_diagramelement)[row_index]);
     792             : 
     793          11 :                 result |= data_diagramelement_init( current_diagele,
     794          11 :                                                     sqlite3_column_int64( prepared_statement, RESULT_DIAGRAMELEMENT_ID_COLUMN ),
     795          11 :                                                     sqlite3_column_int64( prepared_statement, RESULT_DIAGRAMELEMENT_DIAGRAM_ID_COLUMN ),
     796          11 :                                                     sqlite3_column_int64( prepared_statement, RESULT_DIAGRAMELEMENT_CLASSIFIER_ID_COLUMN ),
     797          11 :                                                     sqlite3_column_int64( prepared_statement, RESULT_DIAGRAMELEMENT_DISPLAY_FLAGS_COLUMN ),
     798          11 :                                                     sqlite3_column_int64( prepared_statement, RESULT_DIAGRAMELEMENT_FOCUSED_FEATURE_ID_COLUMN ),
     799          11 :                                                     (const char*) sqlite3_column_text( prepared_statement, RESULT_DIAGRAMELEMENT_UUID_COLUMN )
     800             :                                                   );
     801          11 :                 if ( SQLITE_NULL == sqlite3_column_type( prepared_statement, RESULT_DIAGRAMELEMENT_FOCUSED_FEATURE_ID_COLUMN ) )
     802             :                 {
     803           2 :                     data_diagramelement_set_focused_feature_row_id ( current_diagele, DATA_ROW_ID_VOID );
     804             :                 }
     805             : 
     806          11 :                 data_diagramelement_trace( current_diagele );
     807             :             }
     808          21 :             if (( SQLITE_ROW == sqlite_err )&&(row_index >= max_out_array_size))
     809             :             {
     810           0 :                 U8_LOG_ANOMALY_INT( "out_diagramelement[] full:", (row_index+1) );
     811           0 :                 result |= U8_ERROR_ARRAY_BUFFER_EXCEEDED;
     812             :             }
     813          21 :             if ( SQLITE_DONE == sqlite_err )
     814             :             {
     815          10 :                 U8_TRACE_INFO( "sqlite3_step finished: SQLITE_DONE" );
     816             :             }
     817             :         }
     818             :     }
     819             : 
     820          10 :     U8_TRACE_END_ERR( result );
     821          10 :     return result;
     822             : }
     823             : 
     824             : /* ================================ private ================================ */
     825             : 
     826          92 : u8_error_t data_database_diagram_reader_private_open ( data_database_diagram_reader_t *this_ )
     827             : {
     828          92 :     U8_TRACE_BEGIN();
     829          92 :     u8_error_t result = U8_ERROR_NONE;
     830             : 
     831             :     {
     832          92 :         result |= data_database_prepare_statement( (*this_).database,
     833             :                                                    DATA_DATABASE_READER_SELECT_DIAGRAM_BY_ID,
     834             :                                                    sizeof( DATA_DATABASE_READER_SELECT_DIAGRAM_BY_ID ),
     835             :                                                    &((*this_).statement_diagram_by_id)
     836             :                                                  );
     837             : 
     838          92 :         result |= data_database_prepare_statement( (*this_).database,
     839             :                                                    DATA_DATABASE_READER_SELECT_DIAGRAM_BY_UUID,
     840             :                                                    sizeof( DATA_DATABASE_READER_SELECT_DIAGRAM_BY_UUID ),
     841             :                                                    &((*this_).statement_diagram_by_uuid)
     842             :                                                  );
     843             : 
     844          92 :         result |= data_database_prepare_statement( (*this_).database,
     845             :                                                    DATA_DATABASE_READER_SELECT_DIAGRAMS_BY_PARENT_ID,
     846             :                                                    sizeof( DATA_DATABASE_READER_SELECT_DIAGRAMS_BY_PARENT_ID ),
     847             :                                                    &((*this_).statement_diagrams_by_parent_id)
     848             :                                                  );
     849             : 
     850          92 :         result |= data_database_prepare_statement( (*this_).database,
     851             :                                                    DATA_DATABASE_READER_SELECT_DIAGRAMS_BY_PARENT_ID_NULL,
     852             :                                                    sizeof( DATA_DATABASE_READER_SELECT_DIAGRAMS_BY_PARENT_ID_NULL ),
     853             :                                                    &((*this_).statement_diagrams_by_parent_id_null)
     854             :                                                  );
     855             : 
     856          92 :         result |= data_database_prepare_statement( (*this_).database,
     857             :                                                    DATA_DATABASE_READER_SELECT_DIAGRAMS_BY_CLASSIFIER_ID,
     858             :                                                    sizeof( DATA_DATABASE_READER_SELECT_DIAGRAMS_BY_CLASSIFIER_ID ),
     859             :                                                    &((*this_).statement_diagrams_by_classifier_id)
     860             :                                                  );
     861             : 
     862          92 :         result |= data_database_prepare_statement( (*this_).database,
     863             :                                                    DATA_DATABASE_READER_SELECT_DIAGRAM_IDS_BY_PARENT_ID,
     864             :                                                    sizeof( DATA_DATABASE_READER_SELECT_DIAGRAM_IDS_BY_PARENT_ID ),
     865             :                                                    &((*this_).statement_diagram_ids_by_parent_id)
     866             :                                                  );
     867             : 
     868          92 :         result |= data_database_prepare_statement( (*this_).database,
     869             :                                                    DATA_DATABASE_READER_SELECT_DIAGRAM_IDS_BY_PARENT_ID_NULL,
     870             :                                                    sizeof( DATA_DATABASE_READER_SELECT_DIAGRAM_IDS_BY_PARENT_ID_NULL ),
     871             :                                                    &((*this_).statement_diagram_ids_by_parent_id_null)
     872             :                                                  );
     873             : 
     874          92 :         result |= data_database_prepare_statement( (*this_).database,
     875             :                                                    DATA_DATABASE_READER_SELECT_DIAGRAM_IDS_BY_CLASSIFIER_ID,
     876             :                                                    sizeof( DATA_DATABASE_READER_SELECT_DIAGRAM_IDS_BY_CLASSIFIER_ID ),
     877             :                                                    &((*this_).statement_diagram_ids_by_classifier_id)
     878             :                                                  );
     879             : 
     880          92 :         result |= data_database_prepare_statement( (*this_).database,
     881             :                                                    DATA_DATABASE_READER_SELECT_DIAGRAMELEMENT_BY_ID,
     882             :                                                    sizeof( DATA_DATABASE_READER_SELECT_DIAGRAMELEMENT_BY_ID ),
     883             :                                                    &((*this_).statement_diagramelement_by_id)
     884             :                                                  );
     885             : 
     886          92 :         result |= data_database_prepare_statement( (*this_).database,
     887             :                                                    DATA_DATABASE_READER_SELECT_DIAGRAMELEMENT_BY_UUID,
     888             :                                                    sizeof( DATA_DATABASE_READER_SELECT_DIAGRAMELEMENT_BY_UUID ),
     889             :                                                    &((*this_).statement_diagramelement_by_uuid)
     890             :                                                  );
     891             : 
     892          92 :         result |= data_database_prepare_statement( (*this_).database,
     893             :                                                    DATA_DATABASE_READER_SELECT_DIAGRAMELEMENTS_BY_DIAGRAM_ID,
     894             :                                                    sizeof( DATA_DATABASE_READER_SELECT_DIAGRAMELEMENTS_BY_DIAGRAM_ID ),
     895             :                                                    &((*this_).statement_diagramelements_by_diagram_id)
     896             :                                                  );
     897             : 
     898          92 :         result |= data_database_prepare_statement( (*this_).database,
     899             :                                                    DATA_DATABASE_READER_SELECT_DIAGRAMELEMENTS_BY_CLASSIFIER_ID,
     900             :                                                    sizeof( DATA_DATABASE_READER_SELECT_DIAGRAMELEMENTS_BY_CLASSIFIER_ID ),
     901             :                                                    &((*this_).statement_diagramelements_by_classifier_id)
     902             :                                                  );
     903             : 
     904          92 :         if ( result != U8_ERROR_NONE )
     905             :         {
     906           0 :             U8_LOG_ERROR( "A prepared statement could not be prepared." );
     907             :         }
     908             :     }
     909             : 
     910          92 :     U8_TRACE_END_ERR(result);
     911          92 :     return result;
     912             : }
     913             : 
     914          92 : u8_error_t data_database_diagram_reader_private_close ( data_database_diagram_reader_t *this_ )
     915             : {
     916          92 :     U8_TRACE_BEGIN();
     917          92 :     u8_error_t result = U8_ERROR_NONE;
     918             : 
     919             :     {
     920          92 :         result |= data_database_finalize_statement( (*this_).database, (*this_).statement_diagram_by_id );
     921          92 :         (*this_).statement_diagram_by_id = NULL;
     922             : 
     923          92 :         result |= data_database_finalize_statement( (*this_).database, (*this_).statement_diagram_by_uuid );
     924          92 :         (*this_).statement_diagram_by_uuid = NULL;
     925             : 
     926          92 :         result |= data_database_finalize_statement( (*this_).database, (*this_).statement_diagrams_by_parent_id );
     927          92 :         (*this_).statement_diagrams_by_parent_id = NULL;
     928             : 
     929          92 :         result |= data_database_finalize_statement( (*this_).database, (*this_).statement_diagrams_by_parent_id_null );
     930          92 :         (*this_).statement_diagrams_by_parent_id_null = NULL;
     931             : 
     932          92 :         result |= data_database_finalize_statement( (*this_).database, (*this_).statement_diagrams_by_classifier_id );
     933          92 :         (*this_).statement_diagrams_by_classifier_id = NULL;
     934             : 
     935          92 :         result |= data_database_finalize_statement( (*this_).database, (*this_).statement_diagram_ids_by_parent_id );
     936          92 :         (*this_).statement_diagram_ids_by_parent_id = NULL;
     937             : 
     938          92 :         result |= data_database_finalize_statement( (*this_).database, (*this_).statement_diagram_ids_by_parent_id_null );
     939          92 :         (*this_).statement_diagram_ids_by_parent_id_null = NULL;
     940             : 
     941          92 :         result |= data_database_finalize_statement( (*this_).database, (*this_).statement_diagram_ids_by_classifier_id );
     942          92 :         (*this_).statement_diagram_ids_by_classifier_id = NULL;
     943             : 
     944          92 :         result |= data_database_finalize_statement( (*this_).database, (*this_).statement_diagramelement_by_id );
     945          92 :         (*this_).statement_diagramelement_by_id = NULL;
     946             : 
     947          92 :         result |= data_database_finalize_statement( (*this_).database, (*this_).statement_diagramelement_by_uuid );
     948          92 :         (*this_).statement_diagramelement_by_uuid = NULL;
     949             : 
     950          92 :         result |= data_database_finalize_statement( (*this_).database, (*this_).statement_diagramelements_by_diagram_id );
     951          92 :         (*this_).statement_diagramelements_by_diagram_id = NULL;
     952             : 
     953          92 :         result |= data_database_finalize_statement( (*this_).database, (*this_).statement_diagramelements_by_classifier_id );
     954          92 :         (*this_).statement_diagramelements_by_classifier_id = NULL;
     955             : 
     956             :     }
     957             : 
     958          92 :     U8_TRACE_END_ERR(result);
     959          92 :     return result;
     960             : }
     961             : 
     962             : 
     963             : /*
     964             : Copyright 2016-2024 Andreas Warnke
     965             : 
     966             : Licensed under the Apache License, Version 2.0 (the "License");
     967             : you may not use this file except in compliance with the License.
     968             : You may obtain a copy of the License at
     969             : 
     970             :     http://www.apache.org/licenses/LICENSE-2.0
     971             : 
     972             : Unless required by applicable law or agreed to in writing, software
     973             : distributed under the License is distributed on an "AS IS" BASIS,
     974             : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     975             : See the License for the specific language governing permissions and
     976             : limitations under the License.
     977             : */

Generated by: LCOV version 1.16