LCOV - code coverage report
Current view: top level - data/source/storage - data_database_sql_builder.c (source / functions) Coverage Total Hit
Test: crystal-facet-uml_v1.63.2_covts Lines: 89.4 % 887 793
Test Date: 2025-05-01 10:10:14 Functions: 100.0 % 37 37

            Line data    Source code
       1              : /* File: data_database_sql_builder.c; Copyright and License: see below */
       2              : 
       3              : #include "storage/data_database_sql_builder.h"
       4              : #include "entity/data_id.h"
       5              : #include "u8/u8_trace.h"
       6              : #include "u8/u8_log.h"
       7              : #include "utf8stringbuf/utf8string.h"
       8              : #include "utf8stringbuf/utf8stringview.h"
       9              : #include <assert.h>
      10              : 
      11              : /*!
      12              :  *  \brief value separator string constant to insert a diagram or classifier or other table-row
      13              :  */
      14              : static const char *DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR = ",";
      15              : 
      16              : /*!
      17              :  *  \brief string start marker string constant to insert/update a diagram
      18              :  */
      19              : static const char *DATA_DATABASE_SQL_BUILDER_STRING_VALUE_START = "\'";
      20              : 
      21              : /*!
      22              :  *  \brief string end marker string constant to insert/update a diagram
      23              :  */
      24              : static const char *DATA_DATABASE_SQL_BUILDER_STRING_VALUE_END = "\'";
      25              : 
      26              : /*!
      27              :  *  \brief constant representing the null value
      28              :  */
      29              : static const char *DATA_DATABASE_SQL_BUILDER_NULL_VALUE = "NULL";
      30              : 
      31              : /*!
      32              :  *  \brief translation table to encode strings for usage in string literals
      33              :  *
      34              :  *  Note: This table is not suitable for searches using the LIKE operator because _ and % are not handled.
      35              :  */
      36              : const char *const DATA_DATABASE_SQL_BUILDER_SQL_ENCODE[][2] = {
      37              :     { "'", "''" },
      38              :     { NULL, NULL }
      39              : };
      40              : 
      41           70 : void data_database_sql_builder_init ( data_database_sql_builder_t *this_ )
      42              : {
      43           70 :     U8_TRACE_BEGIN();
      44              :     /* data_diagram_t is the biggest data structure that may contain lots of quote symbols; */
      45              :     /* an additional SQL statement around is also added, e.g. DATA_DATABASE_SQL_BUILDER_INSERT_DIAGRAM_WITH_ID_PREFIX */
      46              :     assert( sizeof((*this_).private_sql_buffer) > 2*sizeof(data_diagram_t)+1024 );
      47              : 
      48              :     /* initialize a memory output stream */
      49           70 :     universal_memory_output_stream_init( &((*this_).plain_out),
      50           70 :                                          &((*this_).private_sql_buffer),
      51              :                                          sizeof((*this_).private_sql_buffer),
      52              :                                          UNIVERSAL_MEMORY_OUTPUT_STREAM_0TERM_UTF8
      53              :                                        );
      54              :     universal_output_stream_t *const plain_output
      55           70 :         = universal_memory_output_stream_get_output_stream( &((*this_).plain_out) );
      56              : 
      57           70 :     utf8stream_writer_init( &((*this_).plain), plain_output );
      58              : 
      59              :     /* initialize an sql escaped output stream */
      60           70 :     universal_escaping_output_stream_init( &((*this_).escaped_out),
      61              :                                            &DATA_DATABASE_SQL_BUILDER_SQL_ENCODE,
      62              :                                            plain_output
      63              :                                          );
      64              :     universal_output_stream_t *const escaped_output
      65           70 :         = universal_escaping_output_stream_get_output_stream( &((*this_).escaped_out) );
      66              : 
      67           70 :     utf8stream_writer_init( &((*this_).escaped), escaped_output );
      68              : 
      69           70 :     U8_TRACE_END();
      70           70 : }
      71              : 
      72           70 : void data_database_sql_builder_destroy ( data_database_sql_builder_t *this_ )
      73              : {
      74           70 :     U8_TRACE_BEGIN();
      75              : 
      76              :     /* de-initialize an sql escaped output stream */
      77           70 :     utf8stream_writer_destroy( &((*this_).escaped) );
      78           70 :     universal_escaping_output_stream_destroy( &((*this_).escaped_out) );
      79              : 
      80              :     /* de-initialize an output stream */
      81           70 :     utf8stream_writer_destroy( &((*this_).plain) );
      82           70 :     universal_memory_output_stream_destroy( &((*this_).plain_out) );
      83              : 
      84           70 :     U8_TRACE_END();
      85           70 : }
      86              : 
      87              : /* ================================ DIAGRAM ================================ */
      88              : 
      89              : /*!
      90              :  *  \brief prefix string constant to insert a diagram
      91              :  */
      92              : static const char *DATA_DATABASE_SQL_BUILDER_INSERT_DIAGRAM_PREFIX =
      93              :     "INSERT INTO diagrams (parent_id,diagram_type,stereotype,name,description,list_order,display_flags,uuid) VALUES (";
      94              : 
      95              : /*!
      96              :  *  \brief prefix string constant to insert a diagram with predefined id
      97              :  */
      98              : static const char *DATA_DATABASE_SQL_BUILDER_INSERT_DIAGRAM_WITH_ID_PREFIX =
      99              :     "INSERT INTO diagrams (id,parent_id,diagram_type,stereotype,name,description,list_order,display_flags,uuid) VALUES (";
     100              : 
     101              : /*!
     102              :  *  \brief postfix string constant to insert a diagram
     103              :  */
     104              : static const char *DATA_DATABASE_SQL_BUILDER_INSERT_DIAGRAM_POSTFIX = ");";
     105              : 
     106              : /*!
     107              :  *  \brief prefix string constant to delete a diagram
     108              :  */
     109              : static const char *DATA_DATABASE_SQL_BUILDER_DELETE_DIAGRAM_PREFIX =
     110              :     "DELETE FROM diagrams WHERE (id=";
     111              : 
     112              : /*!
     113              :  *  \brief postfix string constant to delete a diagram
     114              :  */
     115              : static const char *DATA_DATABASE_SQL_BUILDER_DELETE_DIAGRAM_POSTFIX = ");";
     116              : 
     117              : /*!
     118              :  *  \brief prefix string constant to update a diagram
     119              :  */
     120              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAM_PREFIX = "UPDATE diagrams SET ";
     121              : 
     122              : /*!
     123              :  *  \brief field name string constant to be used for updating a diagram
     124              :  */
     125              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAM_COL_PARENT_ID = "parent_id=";
     126              : 
     127              : /*!
     128              :  *  \brief field name string constant to be used for updating a diagram
     129              :  */
     130              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAM_COL_TYPE = "diagram_type=";
     131              : 
     132              : /*!
     133              :  *  \brief field name string constant to be used for updating a diagram
     134              :  */
     135              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAM_COL_STEREOTYPE = "stereotype=";
     136              : 
     137              : /*!
     138              :  *  \brief field name string constant to be used for updating a diagram
     139              :  */
     140              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAM_COL_NAME = "name=";
     141              : 
     142              : /*!
     143              :  *  \brief field name string constant to be used for updating a diagram
     144              :  */
     145              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAM_COL_LIST_ORDER = "list_order=";
     146              : 
     147              : /*!
     148              :  *  \brief field name string constant to be used for updating a diagram
     149              :  */
     150              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAM_COL_DESCRIPTION = "description=";
     151              : 
     152              : /*!
     153              :  *  \brief infix string constant to update a diagram
     154              :  */
     155              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAM_INFIX = " WHERE id=";
     156              : 
     157              : /*!
     158              :  *  \brief postfix string constant to update a diagram
     159              :  */
     160              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAM_POSTFIX = ";";
     161              : 
     162          200 : u8_error_t data_database_sql_builder_build_create_diagram_command ( data_database_sql_builder_t *this_, const data_diagram_t *diagram )
     163              : {
     164          200 :     U8_TRACE_BEGIN();
     165          200 :     assert( NULL != diagram );
     166          200 :     u8_error_t out_err = U8_ERROR_NONE;
     167          200 :     u8_error_t result = U8_ERROR_NONE;
     168              : 
     169          200 :     out_err |= universal_memory_output_stream_reset( &((*this_).plain_out) );
     170              : 
     171          200 :     if ( DATA_ROW_VOID == data_diagram_get_row_id( diagram )  )
     172              :     {
     173          164 :         out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_DIAGRAM_PREFIX );
     174              :     }
     175              :     else
     176              :     {
     177           36 :         out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_DIAGRAM_WITH_ID_PREFIX );
     178           36 :         out_err |= utf8stream_writer_write_int( &((*this_).plain), data_diagram_get_row_id( diagram ) );
     179           36 :         out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
     180              :     }
     181          200 :     if ( DATA_ROW_VOID == data_diagram_get_parent_row_id( diagram ) )
     182              :     {
     183           49 :         out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_NULL_VALUE );
     184              :     }
     185              :     else
     186              :     {
     187          151 :         out_err |= utf8stream_writer_write_int( &((*this_).plain), data_diagram_get_parent_row_id( diagram ) );
     188              :     }
     189          200 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
     190          200 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), data_diagram_get_diagram_type( diagram ) );
     191          200 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
     192              : 
     193              :     /* stereotype */
     194          200 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_START );
     195          200 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );
     196          200 :     out_err |= utf8stream_writer_write_str( &((*this_).escaped), data_diagram_get_stereotype_const( diagram ) );
     197          200 :     out_err |= utf8stream_writer_flush( &((*this_).escaped) );
     198          200 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_END );
     199              : 
     200          200 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
     201              : 
     202              :     /* name */
     203          200 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_START );
     204          200 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );
     205          200 :     out_err |= utf8stream_writer_write_str( &((*this_).escaped), data_diagram_get_name_const( diagram ) );
     206          200 :     out_err |= utf8stream_writer_flush( &((*this_).escaped) );
     207          200 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_END );
     208              : 
     209          200 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
     210              : 
     211              :     /* description */
     212          200 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_START );
     213          200 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );
     214          200 :     out_err |= utf8stream_writer_write_str( &((*this_).escaped), data_diagram_get_description_const( diagram ) );
     215          200 :     out_err |= utf8stream_writer_flush( &((*this_).escaped) );
     216          200 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_END );
     217              : 
     218          200 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
     219          200 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), data_diagram_get_list_order( diagram ) );
     220          200 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
     221          200 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), data_diagram_get_display_flags( diagram ) );
     222          200 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
     223              : 
     224          200 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_START );
     225          200 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );
     226          200 :     out_err |= utf8stream_writer_write_str( &((*this_).escaped), data_diagram_get_uuid_const( diagram ) );
     227          200 :     out_err |= utf8stream_writer_flush( &((*this_).escaped) );
     228          200 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_END );
     229              : 
     230          200 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_DIAGRAM_POSTFIX );
     231              : 
     232          200 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );  /* enforces 0-termination on (*this_).plain_out */
     233              : 
     234          200 :     if ( out_err != U8_ERROR_NONE )
     235              :     {
     236            0 :         U8_LOG_ERROR_HEX( "utf8stream_writer_write_...() failed:", out_err );
     237            0 :         result |= U8_ERROR_STRING_BUFFER_EXCEEDED;
     238              :     }
     239              : 
     240          200 :     U8_TRACE_END_ERR( result );
     241          200 :     return( result );
     242              : }
     243              : 
     244          133 : u8_error_t data_database_sql_builder_build_delete_diagram_command ( data_database_sql_builder_t *this_, data_row_t diagram_id )
     245              : {
     246          133 :     U8_TRACE_BEGIN();
     247          133 :     u8_error_t out_err = U8_ERROR_NONE;
     248          133 :     u8_error_t result = U8_ERROR_NONE;
     249              : 
     250          133 :     out_err |= universal_memory_output_stream_reset( &((*this_).plain_out) );
     251              : 
     252          133 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_DELETE_DIAGRAM_PREFIX );
     253          133 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), diagram_id );
     254          133 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_DELETE_DIAGRAM_POSTFIX );
     255              : 
     256          133 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );  /* enforces 0-termination on (*this_).plain_out */
     257              : 
     258          133 :     if ( out_err != U8_ERROR_NONE )
     259              :     {
     260            0 :         U8_LOG_ERROR_HEX( "utf8stream_writer_write_...() failed:", out_err );
     261            0 :         result |= U8_ERROR_STRING_BUFFER_EXCEEDED;
     262              :     }
     263              : 
     264          133 :     U8_TRACE_END_ERR( result );
     265          133 :     return( result );
     266              : }
     267              : 
     268            4 : u8_error_t data_database_sql_builder_build_update_diagram_stereotype_cmd ( data_database_sql_builder_t *this_, data_row_t diagram_id, const char *new_diagram_stereotype )
     269              : {
     270            4 :     U8_TRACE_BEGIN();
     271            4 :     assert( NULL != new_diagram_stereotype );
     272            4 :     u8_error_t out_err = U8_ERROR_NONE;
     273            4 :     u8_error_t result = U8_ERROR_NONE;
     274              : 
     275            4 :     out_err |= universal_memory_output_stream_reset( &((*this_).plain_out) );
     276              : 
     277            4 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAM_PREFIX );
     278            4 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAM_COL_STEREOTYPE );
     279              : 
     280            4 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_START );
     281            4 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );
     282              :     {
     283              :         /* prepare a shortened_text to */
     284              :         /* view the string but limited to the maximum allowed bytes: */
     285              :         utf8stringview_t shortened_text;
     286            4 :         const size_t new_length = utf8string_get_length( new_diagram_stereotype );
     287            4 :         if ( new_length <= DATA_DIAGRAM_MAX_STEREOTYPE_LENGTH )
     288              :         {
     289            4 :             utf8stringview_init_str( &shortened_text, new_diagram_stereotype );
     290              :         }
     291              :         else
     292              :         {
     293            0 :             out_err |= UTF8ERROR_TRUNCATED;
     294            0 :             utf8stringview_init( &shortened_text, new_diagram_stereotype, DATA_DIAGRAM_MAX_STEREOTYPE_LENGTH );
     295              :             /* ignore a possible UTF8ERROR_OUT_OF_RANGE result */
     296              :         }
     297            4 :         out_err |= utf8stream_writer_write_view( &((*this_).escaped), &shortened_text );
     298            4 :         out_err |= utf8stream_writer_flush( &((*this_).escaped) );
     299            4 :         utf8stringview_destroy( &shortened_text );
     300              :     }
     301            4 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_END );
     302              : 
     303            4 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAM_INFIX );
     304              : 
     305            4 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), diagram_id );
     306            4 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAM_POSTFIX );
     307              : 
     308            4 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );  /* enforces 0-termination on (*this_).plain_out */
     309              : 
     310            4 :     if ( out_err != U8_ERROR_NONE )
     311              :     {
     312            0 :         U8_LOG_ERROR_HEX( "utf8stream_writer_write_...() failed:", out_err );
     313            0 :         result |= U8_ERROR_STRING_BUFFER_EXCEEDED;
     314              :     }
     315              : 
     316            4 :     U8_TRACE_END_ERR( result );
     317            4 :     return( result );
     318              : }
     319              : 
     320            6 : u8_error_t data_database_sql_builder_build_update_diagram_name_cmd ( data_database_sql_builder_t *this_, data_row_t diagram_id, const char *new_diagram_name )
     321              : {
     322            6 :     U8_TRACE_BEGIN();
     323            6 :     assert( NULL != new_diagram_name );
     324            6 :     u8_error_t out_err = U8_ERROR_NONE;
     325            6 :     u8_error_t result = U8_ERROR_NONE;
     326              : 
     327            6 :     out_err |= universal_memory_output_stream_reset( &((*this_).plain_out) );
     328              : 
     329            6 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAM_PREFIX );
     330            6 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAM_COL_NAME );
     331              : 
     332            6 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_START );
     333            6 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );
     334              :     {
     335              :         /* prepare a shortened_text to */
     336              :         /* view the string but limited to the maximum allowed bytes: */
     337              :         utf8stringview_t shortened_text;
     338            6 :         const size_t new_length = utf8string_get_length( new_diagram_name );
     339            6 :         if ( new_length <= DATA_DIAGRAM_MAX_NAME_LENGTH )
     340              :         {
     341            6 :             utf8stringview_init_str( &shortened_text, new_diagram_name );
     342              :         }
     343              :         else
     344              :         {
     345            0 :             out_err |= UTF8ERROR_TRUNCATED;
     346            0 :             utf8stringview_init( &shortened_text, new_diagram_name, DATA_DIAGRAM_MAX_NAME_LENGTH );
     347              :             /* ignore a possible UTF8ERROR_OUT_OF_RANGE result */
     348              :         }
     349            6 :         out_err |= utf8stream_writer_write_view( &((*this_).escaped), &shortened_text );
     350            6 :         out_err |= utf8stream_writer_flush( &((*this_).escaped) );
     351            6 :         utf8stringview_destroy( &shortened_text );
     352              :     }
     353            6 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_END );
     354              : 
     355            6 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAM_INFIX );
     356              : 
     357            6 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), diagram_id );
     358            6 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAM_POSTFIX );
     359              : 
     360            6 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );  /* enforces 0-termination on (*this_).plain_out */
     361              : 
     362            6 :     if ( out_err != U8_ERROR_NONE )
     363              :     {
     364            0 :         U8_LOG_ERROR_HEX( "utf8stream_writer_write_...() failed:", out_err );
     365            0 :         result |= U8_ERROR_STRING_BUFFER_EXCEEDED;
     366              :     }
     367              : 
     368            6 :     U8_TRACE_END_ERR( result );
     369            6 :     return( result );
     370              : }
     371              : 
     372            5 : u8_error_t data_database_sql_builder_build_update_diagram_description_cmd ( data_database_sql_builder_t *this_, data_row_t diagram_id, const char *new_diagram_description )
     373              : {
     374            5 :     U8_TRACE_BEGIN();
     375            5 :     assert( NULL != new_diagram_description );
     376            5 :     u8_error_t out_err = U8_ERROR_NONE;
     377            5 :     u8_error_t result = U8_ERROR_NONE;
     378              : 
     379            5 :     out_err |= universal_memory_output_stream_reset( &((*this_).plain_out) );
     380              : 
     381            5 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAM_PREFIX );
     382            5 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAM_COL_DESCRIPTION );
     383              : 
     384            5 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_START );
     385            5 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );
     386              :     {
     387              :         /* prepare a shortened_text to */
     388              :         /* view the string but limited to the maximum allowed bytes: */
     389              :         utf8stringview_t shortened_text;
     390            5 :         const size_t new_length = utf8string_get_length( new_diagram_description );
     391            5 :         if ( new_length <= DATA_DIAGRAM_MAX_DESCRIPTION_LENGTH )
     392              :         {
     393            5 :             utf8stringview_init_str( &shortened_text, new_diagram_description );
     394              :         }
     395              :         else
     396              :         {
     397            0 :             out_err |= UTF8ERROR_TRUNCATED;
     398            0 :             utf8stringview_init( &shortened_text, new_diagram_description, DATA_DIAGRAM_MAX_DESCRIPTION_LENGTH );
     399              :             /* ignore a possible UTF8ERROR_OUT_OF_RANGE result */
     400              :         }
     401            5 :         out_err |= utf8stream_writer_write_view( &((*this_).escaped), &shortened_text );
     402            5 :         out_err |= utf8stream_writer_flush( &((*this_).escaped) );
     403            5 :         utf8stringview_destroy( &shortened_text );
     404              :     }
     405            5 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_END );
     406              : 
     407            5 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAM_INFIX );
     408              : 
     409            5 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), diagram_id );
     410            5 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAM_POSTFIX );
     411              : 
     412            5 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );  /* enforces 0-termination on (*this_).plain_out */
     413              : 
     414            5 :     if ( out_err != U8_ERROR_NONE )
     415              :     {
     416            0 :         U8_LOG_ERROR_HEX( "utf8stream_writer_write_...() failed:", out_err );
     417            0 :         result |= U8_ERROR_STRING_BUFFER_EXCEEDED;
     418              :     }
     419              : 
     420            5 :     U8_TRACE_END_ERR( result );
     421            5 :     return( result );
     422              : }
     423              : 
     424            9 : u8_error_t data_database_sql_builder_build_update_diagram_type_cmd ( data_database_sql_builder_t *this_, data_row_t diagram_id, data_diagram_type_t new_diagram_type )
     425              : {
     426            9 :     U8_TRACE_BEGIN();
     427            9 :     u8_error_t out_err = U8_ERROR_NONE;
     428            9 :     u8_error_t result = U8_ERROR_NONE;
     429              : 
     430            9 :     out_err |= universal_memory_output_stream_reset( &((*this_).plain_out) );
     431              : 
     432            9 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAM_PREFIX );
     433            9 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAM_COL_TYPE );
     434            9 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), new_diagram_type );
     435              : 
     436            9 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAM_INFIX );
     437              : 
     438            9 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), diagram_id );
     439            9 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAM_POSTFIX );
     440              : 
     441            9 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );  /* enforces 0-termination on (*this_).plain_out */
     442              : 
     443            9 :     if ( out_err != U8_ERROR_NONE )
     444              :     {
     445            0 :         U8_LOG_ERROR_HEX( "utf8stream_writer_write_...() failed:", out_err );
     446            0 :         result |= U8_ERROR_STRING_BUFFER_EXCEEDED;
     447              :     }
     448              : 
     449            9 :     U8_TRACE_END_ERR( result );
     450            9 :     return( result );
     451              : }
     452              : 
     453            5 : u8_error_t data_database_sql_builder_build_update_diagram_list_order_cmd ( data_database_sql_builder_t *this_, data_row_t diagram_id, int32_t new_diagram_list_order )
     454              : {
     455            5 :     U8_TRACE_BEGIN();
     456            5 :     u8_error_t out_err = U8_ERROR_NONE;
     457            5 :     u8_error_t result = U8_ERROR_NONE;
     458              : 
     459            5 :     out_err |= universal_memory_output_stream_reset( &((*this_).plain_out) );
     460              : 
     461            5 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAM_PREFIX );
     462            5 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAM_COL_LIST_ORDER );
     463            5 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), new_diagram_list_order );
     464              : 
     465            5 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAM_INFIX );
     466              : 
     467            5 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), diagram_id );
     468            5 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAM_POSTFIX );
     469              : 
     470            5 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );  /* enforces 0-termination on (*this_).plain_out */
     471              : 
     472            5 :     if ( out_err != U8_ERROR_NONE )
     473              :     {
     474            0 :         U8_LOG_ERROR_HEX( "utf8stream_writer_write_...() failed:", out_err );
     475            0 :         result |= U8_ERROR_STRING_BUFFER_EXCEEDED;
     476              :     }
     477              : 
     478            5 :     U8_TRACE_END_ERR( result );
     479            5 :     return( result );
     480              : }
     481              : 
     482            9 : u8_error_t data_database_sql_builder_build_update_diagram_parent_id_cmd ( data_database_sql_builder_t *this_, data_row_t diagram_id, data_row_t new_diagram_parent_id )
     483              : {
     484            9 :     U8_TRACE_BEGIN();
     485            9 :     u8_error_t out_err = U8_ERROR_NONE;
     486            9 :     u8_error_t result = U8_ERROR_NONE;
     487              : 
     488            9 :     out_err |= universal_memory_output_stream_reset( &((*this_).plain_out) );
     489              : 
     490            9 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAM_PREFIX );
     491            9 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAM_COL_PARENT_ID );
     492            9 :     if ( DATA_ROW_VOID == new_diagram_parent_id )
     493              :     {
     494            4 :         out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_NULL_VALUE );
     495              :     }
     496              :     else
     497              :     {
     498            5 :         out_err |= utf8stream_writer_write_int( &((*this_).plain), new_diagram_parent_id );
     499              :     }
     500              : 
     501            9 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAM_INFIX );
     502              : 
     503            9 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), diagram_id );
     504            9 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAM_POSTFIX );
     505              : 
     506            9 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );  /* enforces 0-termination on (*this_).plain_out */
     507              : 
     508            9 :     if ( out_err != U8_ERROR_NONE )
     509              :     {
     510            0 :         U8_LOG_ERROR_HEX( "utf8stream_writer_write_...() failed:", out_err );
     511            0 :         result |= U8_ERROR_STRING_BUFFER_EXCEEDED;
     512              :     }
     513              : 
     514            9 :     U8_TRACE_END_ERR( result );
     515            9 :     return( result );
     516              : }
     517              : 
     518              : /* ================================ CLASSIFIER ================================ */
     519              : 
     520              : /*!
     521              :  *  \brief prefix string constant to insert a classifier
     522              :  */
     523              : static const char *DATA_DATABASE_SQL_BUILDER_INSERT_CLASSIFIER_PREFIX =
     524              :     "INSERT INTO classifiers (main_type,stereotype,name,description,x_order,y_order,list_order,uuid) VALUES (";
     525              : 
     526              : /*!
     527              :  *  \brief prefix string constant to insert a classifier with predefined id
     528              :  */
     529              : static const char *DATA_DATABASE_SQL_BUILDER_INSERT_CLASSIFIER_WITH_ID_PREFIX =
     530              :     "INSERT INTO classifiers (id,main_type,stereotype,name,description,x_order,y_order,list_order,uuid) VALUES (";
     531              : 
     532              : /*!
     533              :  *  \brief postfix string constant to insert a classifier
     534              :  */
     535              : static const char *DATA_DATABASE_SQL_BUILDER_INSERT_CLASSIFIER_POSTFIX = ");";
     536              : 
     537              : /*!
     538              :  *  \brief prefix string constant to delete a classifier
     539              :  */
     540              : static const char *DATA_DATABASE_SQL_BUILDER_DELETE_CLASSIFIER_PREFIX =
     541              :     "DELETE FROM classifiers WHERE (id=";
     542              : 
     543              : /*!
     544              :  *  \brief postfix string constant to delete a classifier
     545              :  */
     546              : static const char *DATA_DATABASE_SQL_BUILDER_DELETE_CLASSIFIER_POSTFIX = ");";
     547              : 
     548              : /*!
     549              :  *  \brief prefix string constant to update a classifier
     550              :  */
     551              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_PREFIX = "UPDATE classifiers SET ";
     552              : 
     553              : /*!
     554              :  *  \brief field name string constant to be used for updating a classifier
     555              :  */
     556              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_COL_STEREOTYPE = "stereotype=";
     557              : 
     558              : /*!
     559              :  *  \brief field name string constant to be used for updating a classifier
     560              :  */
     561              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_COL_MAIN_TYPE = "main_type=";
     562              : 
     563              : /*!
     564              :  *  \brief field name string constant to be used for updating a classifier
     565              :  */
     566              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_COL_NAME = "name=";
     567              : 
     568              : /*!
     569              :  *  \brief field name string constant to be used for updating a classifier
     570              :  */
     571              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_COL_DESCRIPTION = "description=";
     572              : 
     573              : /*!
     574              :  *  \brief field name string constant to be used for updating a classifier
     575              :  */
     576              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_COL_X_ORDER = "x_order=";
     577              : 
     578              : /*!
     579              :  *  \brief field name string constant to be used for updating a classifier
     580              :  */
     581              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_COL_Y_ORDER = "y_order=";
     582              : 
     583              : /*!
     584              :  *  \brief field name string constant to be used for updating a classifier
     585              :  */
     586              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_COL_LIST_ORDER = "list_order=";
     587              : 
     588              : /*!
     589              :  *  \brief infix string constant to update a classifier
     590              :  */
     591              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_INFIX = " WHERE id=";
     592              : 
     593              : /*!
     594              :  *  \brief postfix string constant to update a classifier
     595              :  */
     596              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_POSTFIX = ";";
     597              : 
     598          246 : u8_error_t data_database_sql_builder_build_create_classifier_command ( data_database_sql_builder_t *this_, const data_classifier_t *classifier )
     599              : {
     600          246 :     U8_TRACE_BEGIN();
     601          246 :     assert( NULL != classifier );
     602          246 :     u8_error_t out_err = U8_ERROR_NONE;
     603          246 :     u8_error_t result = U8_ERROR_NONE;
     604              : 
     605          246 :     out_err |= universal_memory_output_stream_reset( &((*this_).plain_out) );
     606              : 
     607          246 :     if ( data_classifier_get_row_id( classifier ) == DATA_ROW_VOID )
     608              :     {
     609          206 :         out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_CLASSIFIER_PREFIX );
     610              :     }
     611              :     else
     612              :     {
     613           40 :         out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_CLASSIFIER_WITH_ID_PREFIX );
     614           40 :         out_err |= utf8stream_writer_write_int( &((*this_).plain), data_classifier_get_row_id( classifier ) );
     615           40 :         out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
     616              :     }
     617          246 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), data_classifier_get_main_type( classifier ) );
     618          246 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
     619              : 
     620          246 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_START );
     621          246 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );
     622          246 :     out_err |= utf8stream_writer_write_str( &((*this_).escaped), data_classifier_get_stereotype_const( classifier ) );
     623          246 :     out_err |= utf8stream_writer_flush( &((*this_).escaped) );
     624          246 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_END );
     625              : 
     626          246 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
     627              : 
     628          246 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_START );
     629          246 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );
     630          246 :     out_err |= utf8stream_writer_write_str( &((*this_).escaped), data_classifier_get_name_const( classifier ) );
     631          246 :     out_err |= utf8stream_writer_flush( &((*this_).escaped) );
     632          246 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_END );
     633              : 
     634          246 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
     635              : 
     636          246 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_START );
     637          246 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );
     638          246 :     out_err |= utf8stream_writer_write_str( &((*this_).escaped), data_classifier_get_description_const( classifier ) );
     639          246 :     out_err |= utf8stream_writer_flush( &((*this_).escaped) );
     640          246 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_END );
     641              : 
     642          246 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
     643          246 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), data_classifier_get_x_order( classifier ) );
     644          246 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
     645          246 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), data_classifier_get_y_order( classifier ) );
     646          246 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
     647          246 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), data_classifier_get_list_order( classifier ) );
     648              : 
     649          246 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
     650              : 
     651          246 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_START );
     652          246 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );
     653          246 :     out_err |= utf8stream_writer_write_str( &((*this_).escaped), data_classifier_get_uuid_const( classifier ) );
     654          246 :     out_err |= utf8stream_writer_flush( &((*this_).escaped) );
     655          246 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_END );
     656              : 
     657          246 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_CLASSIFIER_POSTFIX );
     658              : 
     659          246 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );  /* enforces 0-termination on (*this_).plain_out */
     660              : 
     661          246 :     if ( out_err != U8_ERROR_NONE )
     662              :     {
     663            0 :         U8_LOG_ERROR_HEX( "utf8stream_writer_write_...() failed:", out_err );
     664            0 :         result |= U8_ERROR_STRING_BUFFER_EXCEEDED;
     665              :     }
     666              : 
     667          246 :     U8_TRACE_END_ERR( result );
     668          246 :     return( result );
     669              : }
     670              : 
     671            4 : u8_error_t data_database_sql_builder_build_delete_classifier_command ( data_database_sql_builder_t *this_, data_row_t classifier_id )
     672              : {
     673            4 :     U8_TRACE_BEGIN();
     674            4 :     u8_error_t out_err = U8_ERROR_NONE;
     675            4 :     u8_error_t result = U8_ERROR_NONE;
     676              : 
     677            4 :     out_err |= universal_memory_output_stream_reset( &((*this_).plain_out) );
     678              : 
     679            4 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_DELETE_CLASSIFIER_PREFIX );
     680            4 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), classifier_id );
     681            4 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_DELETE_CLASSIFIER_POSTFIX );
     682              : 
     683            4 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );  /* enforces 0-termination on (*this_).plain_out */
     684              : 
     685            4 :     if ( out_err != U8_ERROR_NONE )
     686              :     {
     687            0 :         U8_LOG_ERROR_HEX( "utf8stream_writer_write_...() failed:", out_err );
     688            0 :         result |= U8_ERROR_STRING_BUFFER_EXCEEDED;
     689              :     }
     690              : 
     691            4 :     U8_TRACE_END_ERR( result );
     692            4 :     return( result );
     693              : }
     694              : 
     695            4 : u8_error_t data_database_sql_builder_build_update_classifier_stereotype_cmd ( data_database_sql_builder_t *this_, data_row_t classifier_id, const char *new_classifier_stereotype )
     696              : {
     697            4 :     U8_TRACE_BEGIN();
     698            4 :     assert( NULL != new_classifier_stereotype );
     699            4 :     u8_error_t out_err = U8_ERROR_NONE;
     700            4 :     u8_error_t result = U8_ERROR_NONE;
     701              : 
     702            4 :     out_err |= universal_memory_output_stream_reset( &((*this_).plain_out) );
     703              : 
     704            4 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_PREFIX );
     705            4 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_COL_STEREOTYPE );
     706              : 
     707            4 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_START );
     708            4 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );
     709              :     {
     710              :         /* prepare a shortened_text to */
     711              :         /* view the string but limited to the maximum allowed bytes: */
     712              :         utf8stringview_t shortened_text;
     713            4 :         const size_t new_length = utf8string_get_length( new_classifier_stereotype );
     714            4 :         if ( new_length <= DATA_CLASSIFIER_MAX_STEREOTYPE_LENGTH )
     715              :         {
     716            4 :             utf8stringview_init_str( &shortened_text, new_classifier_stereotype );
     717              :         }
     718              :         else
     719              :         {
     720            0 :             out_err |= UTF8ERROR_TRUNCATED;
     721            0 :             utf8stringview_init( &shortened_text, new_classifier_stereotype, DATA_CLASSIFIER_MAX_STEREOTYPE_LENGTH );
     722              :             /* ignore a possible UTF8ERROR_OUT_OF_RANGE result */
     723              :         }
     724            4 :         out_err |= utf8stream_writer_write_view( &((*this_).escaped), &shortened_text );
     725            4 :         out_err |= utf8stream_writer_flush( &((*this_).escaped) );
     726            4 :         utf8stringview_destroy( &shortened_text );
     727              :     }
     728            4 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_END );
     729              : 
     730            4 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_INFIX );
     731              : 
     732            4 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), classifier_id );
     733            4 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_POSTFIX );
     734              : 
     735            4 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );  /* enforces 0-termination on (*this_).plain_out */
     736              : 
     737            4 :     if ( out_err != U8_ERROR_NONE )
     738              :     {
     739            0 :         U8_LOG_ERROR_HEX( "utf8stream_writer_write_...() failed:", out_err );
     740            0 :         result |= U8_ERROR_STRING_BUFFER_EXCEEDED;
     741              :     }
     742              : 
     743            4 :     U8_TRACE_END_ERR( result );
     744            4 :     return( result );
     745              : }
     746              : 
     747            3 : u8_error_t data_database_sql_builder_build_update_classifier_name_cmd ( data_database_sql_builder_t *this_, data_row_t classifier_id, const char *new_classifier_name )
     748              : {
     749            3 :     U8_TRACE_BEGIN();
     750            3 :     assert( NULL != new_classifier_name );
     751            3 :     u8_error_t out_err = U8_ERROR_NONE;
     752            3 :     u8_error_t result = U8_ERROR_NONE;
     753              : 
     754            3 :     out_err |= universal_memory_output_stream_reset( &((*this_).plain_out) );
     755              : 
     756            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_PREFIX );
     757            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_COL_NAME );
     758              : 
     759            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_START );
     760            3 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );
     761              :     {
     762              :         /* prepare a shortened_text to */
     763              :         /* view the string but limited to the maximum allowed bytes: */
     764              :         utf8stringview_t shortened_text;
     765            3 :         const size_t new_length = utf8string_get_length( new_classifier_name );
     766            3 :         if ( new_length <= DATA_CLASSIFIER_MAX_NAME_LENGTH )
     767              :         {
     768            3 :             utf8stringview_init_str( &shortened_text, new_classifier_name );
     769              :         }
     770              :         else
     771              :         {
     772            0 :             out_err |= UTF8ERROR_TRUNCATED;
     773            0 :             utf8stringview_init( &shortened_text, new_classifier_name, DATA_CLASSIFIER_MAX_NAME_LENGTH );
     774              :             /* ignore a possible UTF8ERROR_OUT_OF_RANGE result */
     775              :         }
     776            3 :         out_err |= utf8stream_writer_write_view( &((*this_).escaped), &shortened_text );
     777            3 :         out_err |= utf8stream_writer_flush( &((*this_).escaped) );
     778            3 :         utf8stringview_destroy( &shortened_text );
     779              :     }
     780            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_END );
     781              : 
     782            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_INFIX );
     783              : 
     784            3 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), classifier_id );
     785            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_POSTFIX );
     786              : 
     787            3 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );  /* enforces 0-termination on (*this_).plain_out */
     788              : 
     789            3 :     if ( out_err != U8_ERROR_NONE )
     790              :     {
     791            0 :         U8_LOG_ERROR_HEX( "utf8stream_writer_write_...() failed:", out_err );
     792            0 :         result |= U8_ERROR_STRING_BUFFER_EXCEEDED;
     793              :     }
     794              : 
     795            3 :     U8_TRACE_END_ERR( result );
     796            3 :     return( result );
     797              : }
     798              : 
     799            3 : u8_error_t data_database_sql_builder_build_update_classifier_description_cmd ( data_database_sql_builder_t *this_, data_row_t classifier_id, const char *new_classifier_description )
     800              : {
     801            3 :     U8_TRACE_BEGIN();
     802            3 :     assert( NULL != new_classifier_description );
     803            3 :     u8_error_t out_err = U8_ERROR_NONE;
     804            3 :     u8_error_t result = U8_ERROR_NONE;
     805              : 
     806            3 :     out_err |= universal_memory_output_stream_reset( &((*this_).plain_out) );
     807              : 
     808            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_PREFIX );
     809            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_COL_DESCRIPTION );
     810              : 
     811            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_START );
     812            3 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );
     813              :     {
     814              :         /* prepare a shortened_text to */
     815              :         /* view the string but limited to the maximum allowed bytes: */
     816              :         utf8stringview_t shortened_text;
     817            3 :         const size_t new_length = utf8string_get_length( new_classifier_description );
     818            3 :         if ( new_length <= DATA_CLASSIFIER_MAX_DESCRIPTION_LENGTH )
     819              :         {
     820            3 :             utf8stringview_init_str( &shortened_text, new_classifier_description );
     821              :         }
     822              :         else
     823              :         {
     824            0 :             out_err |= UTF8ERROR_TRUNCATED;
     825            0 :             utf8stringview_init( &shortened_text, new_classifier_description, DATA_CLASSIFIER_MAX_DESCRIPTION_LENGTH );
     826              :             /* ignore a possible UTF8ERROR_OUT_OF_RANGE result */
     827              :         }
     828            3 :         out_err |= utf8stream_writer_write_view( &((*this_).escaped), &shortened_text );
     829            3 :         out_err |= utf8stream_writer_flush( &((*this_).escaped) );
     830            3 :         utf8stringview_destroy( &shortened_text );
     831              :     }
     832            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_END );
     833              : 
     834            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_INFIX );
     835              : 
     836            3 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), classifier_id );
     837            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_POSTFIX );
     838              : 
     839            3 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );  /* enforces 0-termination on (*this_).plain_out */
     840              : 
     841            3 :     if ( out_err != U8_ERROR_NONE )
     842              :     {
     843            0 :         U8_LOG_ERROR_HEX( "utf8stream_writer_write_...() failed:", out_err );
     844            0 :         result |= U8_ERROR_STRING_BUFFER_EXCEEDED;
     845              :     }
     846              : 
     847            3 :     U8_TRACE_END_ERR( result );
     848            3 :     return( result );
     849              : }
     850              : 
     851            3 : u8_error_t data_database_sql_builder_build_update_classifier_main_type_cmd ( data_database_sql_builder_t *this_, data_row_t classifier_id, data_classifier_type_t new_classifier_main_type )
     852              : {
     853            3 :     U8_TRACE_BEGIN();
     854            3 :     u8_error_t out_err = U8_ERROR_NONE;
     855            3 :     u8_error_t result = U8_ERROR_NONE;
     856              : 
     857            3 :     out_err |= universal_memory_output_stream_reset( &((*this_).plain_out) );
     858              : 
     859            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_PREFIX );
     860            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_COL_MAIN_TYPE );
     861              : 
     862            3 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), new_classifier_main_type );
     863              : 
     864            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_INFIX );
     865              : 
     866            3 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), classifier_id );
     867            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_POSTFIX );
     868              : 
     869            3 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );  /* enforces 0-termination on (*this_).plain_out */
     870              : 
     871            3 :     if ( out_err != U8_ERROR_NONE )
     872              :     {
     873            0 :         U8_LOG_ERROR_HEX( "utf8stream_writer_write_...() failed:", out_err );
     874            0 :         result |= U8_ERROR_STRING_BUFFER_EXCEEDED;
     875              :     }
     876              : 
     877            3 :     U8_TRACE_END_ERR( result );
     878            3 :     return( result );
     879              : }
     880              : 
     881            3 : u8_error_t data_database_sql_builder_build_update_classifier_x_order_cmd ( data_database_sql_builder_t *this_, data_row_t classifier_id, int32_t new_classifier_x_order )
     882              : {
     883            3 :     U8_TRACE_BEGIN();
     884            3 :     u8_error_t out_err = U8_ERROR_NONE;
     885            3 :     u8_error_t result = U8_ERROR_NONE;
     886              : 
     887            3 :     out_err |= universal_memory_output_stream_reset( &((*this_).plain_out) );
     888              : 
     889            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_PREFIX );
     890            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_COL_X_ORDER );
     891              : 
     892            3 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), new_classifier_x_order );
     893              : 
     894            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_INFIX );
     895              : 
     896            3 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), classifier_id );
     897            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_POSTFIX );
     898              : 
     899            3 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );  /* enforces 0-termination on (*this_).plain_out */
     900              : 
     901            3 :     if ( out_err != U8_ERROR_NONE )
     902              :     {
     903            0 :         U8_LOG_ERROR_HEX( "utf8stream_writer_write_...() failed:", out_err );
     904            0 :         result |= U8_ERROR_STRING_BUFFER_EXCEEDED;
     905              :     }
     906              : 
     907            3 :     U8_TRACE_END_ERR( result );
     908            3 :     return( result );
     909              : }
     910              : 
     911            3 : u8_error_t data_database_sql_builder_build_update_classifier_y_order_cmd ( data_database_sql_builder_t *this_, data_row_t classifier_id, int32_t new_classifier_y_order )
     912              : {
     913            3 :     U8_TRACE_BEGIN();
     914            3 :     u8_error_t out_err = U8_ERROR_NONE;
     915            3 :     u8_error_t result = U8_ERROR_NONE;
     916              : 
     917            3 :     out_err |= universal_memory_output_stream_reset( &((*this_).plain_out) );
     918              : 
     919            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_PREFIX );
     920            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_COL_Y_ORDER );
     921              : 
     922            3 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), new_classifier_y_order );
     923              : 
     924            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_INFIX );
     925              : 
     926            3 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), classifier_id );
     927            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_POSTFIX );
     928              : 
     929            3 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );  /* enforces 0-termination on (*this_).plain_out */
     930              : 
     931            3 :     if ( out_err != U8_ERROR_NONE )
     932              :     {
     933            0 :         U8_LOG_ERROR_HEX( "utf8stream_writer_write_...() failed:", out_err );
     934            0 :         result |= U8_ERROR_STRING_BUFFER_EXCEEDED;
     935              :     }
     936              : 
     937            3 :     U8_TRACE_END_ERR( result );
     938            3 :     return( result );
     939              : }
     940              : 
     941            2 : u8_error_t data_database_sql_builder_build_update_classifier_list_order_cmd ( data_database_sql_builder_t *this_, data_row_t classifier_id, int32_t new_classifier_list_order )
     942              : {
     943            2 :     U8_TRACE_BEGIN();
     944            2 :     u8_error_t out_err = U8_ERROR_NONE;
     945            2 :     u8_error_t result = U8_ERROR_NONE;
     946              : 
     947            2 :     out_err |= universal_memory_output_stream_reset( &((*this_).plain_out) );
     948              : 
     949            2 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_PREFIX );
     950            2 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_COL_LIST_ORDER );
     951              : 
     952            2 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), new_classifier_list_order );
     953              : 
     954            2 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_INFIX );
     955              : 
     956            2 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), classifier_id );
     957            2 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_CLASSIFIER_POSTFIX );
     958              : 
     959            2 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );  /* enforces 0-termination on (*this_).plain_out */
     960              : 
     961            2 :     if ( out_err != U8_ERROR_NONE )
     962              :     {
     963            0 :         U8_LOG_ERROR_HEX( "utf8stream_writer_write_...() failed:", out_err );
     964            0 :         result |= U8_ERROR_STRING_BUFFER_EXCEEDED;
     965              :     }
     966              : 
     967            2 :     U8_TRACE_END_ERR( result );
     968            2 :     return( result );
     969              : }
     970              : 
     971              : /* ================================ DIAGRAMELEMENT ================================ */
     972              : 
     973              : /*!
     974              :  *  \brief prefix string constant to insert a diagramelement
     975              :  */
     976              : static const char *DATA_DATABASE_SQL_BUILDER_INSERT_DIAGRAMELEMENT_PREFIX =
     977              :     "INSERT INTO diagramelements (diagram_id,classifier_id,display_flags,focused_feature_id,uuid) VALUES (";
     978              : 
     979              : /*!
     980              :  *  \brief prefix string constant to insert a diagramelement with predefined id
     981              :  */
     982              : static const char *DATA_DATABASE_SQL_BUILDER_INSERT_DIAGRAMELEMENT_WITH_ID_PREFIX =
     983              :     "INSERT INTO diagramelements (id,diagram_id,classifier_id,display_flags,focused_feature_id,uuid) VALUES (";
     984              : 
     985              : /*!
     986              :  *  \brief postfix string constant to insert a diagramelement
     987              :  */
     988              : static const char *DATA_DATABASE_SQL_BUILDER_INSERT_DIAGRAMELEMENT_POSTFIX = ");";
     989              : 
     990              : /*!
     991              :  *  \brief prefix string constant to delete a diagramelement
     992              :  */
     993              : static const char *DATA_DATABASE_SQL_BUILDER_DELETE_DIAGRAMELEMENT_PREFIX =
     994              :     "DELETE FROM diagramelements WHERE (id=";
     995              : 
     996              : /*!
     997              :  *  \brief postfix string constant to delete a diagramelement
     998              :  */
     999              : static const char *DATA_DATABASE_SQL_BUILDER_DELETE_DIAGRAMELEMENT_POSTFIX = ");";
    1000              : 
    1001              : /*!
    1002              :  *  \brief prefix string constant to update a diagramelement
    1003              :  */
    1004              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAMELEMENT_PREFIX = "UPDATE diagramelements SET ";
    1005              : 
    1006              : /*!
    1007              :  *  \brief field name string constant to be used for updating a diagramelement
    1008              :  */
    1009              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAMELEMENT_COL_DISPLAY_FLAGS = "display_flags=";
    1010              : 
    1011              : /*!
    1012              :  *  \brief field name string constant to be used for updating a diagramelement
    1013              :  */
    1014              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAMELEMENT_COL_FOCUSED_FEATURE_ID = "focused_feature_id=";
    1015              : 
    1016              : /*!
    1017              :  *  \brief infix string constant to update a diagramelement
    1018              :  */
    1019              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAMELEMENT_INFIX = " WHERE id=";
    1020              : 
    1021              : /*!
    1022              :  *  \brief postfix string constant to update a diagramelement
    1023              :  */
    1024              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAMELEMENT_POSTFIX = ";";
    1025              : 
    1026          262 : u8_error_t data_database_sql_builder_build_create_diagramelement_command ( data_database_sql_builder_t *this_, const data_diagramelement_t *diagramelement )
    1027              : {
    1028          262 :     U8_TRACE_BEGIN();
    1029          262 :     assert( NULL != diagramelement );
    1030          262 :     u8_error_t out_err = U8_ERROR_NONE;
    1031          262 :     u8_error_t result = U8_ERROR_NONE;
    1032              : 
    1033          262 :     out_err |= universal_memory_output_stream_reset( &((*this_).plain_out) );
    1034              : 
    1035          262 :     if ( DATA_ROW_VOID == data_diagramelement_get_row_id( diagramelement ) )
    1036              :     {
    1037          220 :         out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_DIAGRAMELEMENT_PREFIX );
    1038              :     }
    1039              :     else
    1040              :     {
    1041           42 :         out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_DIAGRAMELEMENT_WITH_ID_PREFIX );
    1042           42 :         out_err |= utf8stream_writer_write_int( &((*this_).plain), data_diagramelement_get_row_id( diagramelement ) );
    1043           42 :         out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
    1044              :     }
    1045          262 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), data_diagramelement_get_diagram_row_id( diagramelement ) );
    1046          262 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
    1047          262 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), data_diagramelement_get_classifier_row_id( diagramelement ) );
    1048          262 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
    1049          262 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), data_diagramelement_get_display_flags( diagramelement ) );
    1050          262 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
    1051          262 :     if ( DATA_ROW_VOID == data_diagramelement_get_focused_feature_row_id( diagramelement ) )
    1052              :     {
    1053          248 :         out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_NULL_VALUE );
    1054              :     }
    1055              :     else
    1056              :     {
    1057           14 :         out_err |= utf8stream_writer_write_int( &((*this_).plain), data_diagramelement_get_focused_feature_row_id( diagramelement ) );
    1058              :     }
    1059          262 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
    1060              : 
    1061          262 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_START );
    1062          262 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );
    1063          262 :     out_err |= utf8stream_writer_write_str( &((*this_).escaped), data_diagramelement_get_uuid_const( diagramelement ) );
    1064          262 :     out_err |= utf8stream_writer_flush( &((*this_).escaped) );
    1065          262 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_END );
    1066              : 
    1067          262 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_DIAGRAMELEMENT_POSTFIX );
    1068              : 
    1069          262 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );  /* enforces 0-termination on (*this_).plain_out */
    1070              : 
    1071          262 :     if ( out_err != U8_ERROR_NONE )
    1072              :     {
    1073            0 :         U8_LOG_ERROR_HEX( "utf8stream_writer_write_...() failed:", out_err );
    1074            0 :         result |= U8_ERROR_STRING_BUFFER_EXCEEDED;
    1075              :     }
    1076              : 
    1077          262 :     U8_TRACE_END_ERR( result );
    1078          262 :     return( result );
    1079              : }
    1080              : 
    1081           10 : u8_error_t data_database_sql_builder_build_delete_diagramelement_command ( data_database_sql_builder_t *this_, data_row_t diagramelement_id )
    1082              : {
    1083           10 :     U8_TRACE_BEGIN();
    1084           10 :     u8_error_t out_err = U8_ERROR_NONE;
    1085           10 :     u8_error_t result = U8_ERROR_NONE;
    1086              : 
    1087           10 :     out_err |= universal_memory_output_stream_reset( &((*this_).plain_out) );
    1088              : 
    1089           10 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_DELETE_DIAGRAMELEMENT_PREFIX );
    1090           10 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), diagramelement_id );
    1091           10 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_DELETE_DIAGRAMELEMENT_POSTFIX );
    1092              : 
    1093           10 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );  /* enforces 0-termination on (*this_).plain_out */
    1094              : 
    1095           10 :     if ( out_err != U8_ERROR_NONE )
    1096              :     {
    1097            0 :         U8_LOG_ERROR_HEX( "utf8stream_writer_write_...() failed:", out_err );
    1098            0 :         result |= U8_ERROR_STRING_BUFFER_EXCEEDED;
    1099              :     }
    1100              : 
    1101           10 :     U8_TRACE_END_ERR( result );
    1102           10 :     return( result );
    1103              : }
    1104              : 
    1105            6 : u8_error_t data_database_sql_builder_build_update_diagramelement_display_flags_cmd ( data_database_sql_builder_t *this_, data_row_t diagramelement_id, data_diagramelement_flag_t new_display_flags )
    1106              : {
    1107            6 :     U8_TRACE_BEGIN();
    1108            6 :     u8_error_t out_err = U8_ERROR_NONE;
    1109            6 :     u8_error_t result = U8_ERROR_NONE;
    1110              : 
    1111            6 :     out_err |= universal_memory_output_stream_reset( &((*this_).plain_out) );
    1112              : 
    1113            6 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAMELEMENT_PREFIX );
    1114            6 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAMELEMENT_COL_DISPLAY_FLAGS );
    1115              : 
    1116            6 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), new_display_flags );
    1117              : 
    1118            6 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAMELEMENT_INFIX );
    1119              : 
    1120            6 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), diagramelement_id );
    1121            6 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAMELEMENT_POSTFIX );
    1122              : 
    1123            6 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );  /* enforces 0-termination on (*this_).plain_out */
    1124              : 
    1125            6 :     if ( out_err != U8_ERROR_NONE )
    1126              :     {
    1127            0 :         U8_LOG_ERROR_HEX( "utf8stream_writer_write_...() failed:", out_err );
    1128            0 :         result |= U8_ERROR_STRING_BUFFER_EXCEEDED;
    1129              :     }
    1130              : 
    1131            6 :     U8_TRACE_END_ERR( result );
    1132            6 :     return( result );
    1133              : }
    1134              : 
    1135           28 : u8_error_t data_database_sql_builder_build_update_diagramelement_focused_feature_id_cmd ( data_database_sql_builder_t *this_, data_row_t diagramelement_id, data_row_t new_focused_feature_id )
    1136              : {
    1137           28 :     U8_TRACE_BEGIN();
    1138           28 :     u8_error_t out_err = U8_ERROR_NONE;
    1139           28 :     u8_error_t result = U8_ERROR_NONE;
    1140              : 
    1141           28 :     out_err |= universal_memory_output_stream_reset( &((*this_).plain_out) );
    1142              : 
    1143           28 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAMELEMENT_PREFIX );
    1144           28 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAMELEMENT_COL_FOCUSED_FEATURE_ID );
    1145              : 
    1146           28 :     if ( DATA_ROW_VOID == new_focused_feature_id )
    1147              :     {
    1148            6 :         out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_NULL_VALUE );
    1149              :     }
    1150              :     else
    1151              :     {
    1152           22 :         out_err |= utf8stream_writer_write_int( &((*this_).plain), new_focused_feature_id );
    1153              :     }
    1154              : 
    1155           28 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAMELEMENT_INFIX );
    1156              : 
    1157           28 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), diagramelement_id );
    1158           28 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_DIAGRAMELEMENT_POSTFIX );
    1159              : 
    1160           28 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );  /* enforces 0-termination on (*this_).plain_out */
    1161              : 
    1162           28 :     if ( out_err != U8_ERROR_NONE )
    1163              :     {
    1164            0 :         U8_LOG_ERROR_HEX( "utf8stream_writer_write_...() failed:", out_err );
    1165            0 :         result |= U8_ERROR_STRING_BUFFER_EXCEEDED;
    1166              :     }
    1167              : 
    1168           28 :     U8_TRACE_END_ERR( result );
    1169           28 :     return( result );
    1170              : }
    1171              : 
    1172              : /* ================================ FEATURE ================================ */
    1173              : 
    1174              : /*!
    1175              :  *  \brief prefix string constant to insert a feature
    1176              :  */
    1177              : static const char *DATA_DATABASE_SQL_BUILDER_INSERT_FEATURE_PREFIX =
    1178              :     "INSERT INTO features (main_type,classifier_id,key,value,description,list_order,uuid) VALUES (";
    1179              : 
    1180              : /*!
    1181              :  *  \brief prefix string constant to insert a feature with predefined id
    1182              :  */
    1183              : static const char *DATA_DATABASE_SQL_BUILDER_INSERT_FEATURE_WITH_ID_PREFIX =
    1184              :     "INSERT INTO features (id,main_type,classifier_id,key,value,description,list_order,uuid) VALUES (";
    1185              : 
    1186              : /*!
    1187              :  *  \brief postfix string constant to insert a feature
    1188              :  */
    1189              : static const char *DATA_DATABASE_SQL_BUILDER_INSERT_FEATURE_POSTFIX = ");";
    1190              : 
    1191              : /*!
    1192              :  *  \brief prefix string constant to delete a feature
    1193              :  */
    1194              : static const char *DATA_DATABASE_SQL_BUILDER_DELETE_FEATURE_PREFIX =
    1195              :     "DELETE FROM features WHERE (id=";
    1196              : 
    1197              : /*!
    1198              :  *  \brief postfix string constant to delete a feature
    1199              :  */
    1200              : static const char *DATA_DATABASE_SQL_BUILDER_DELETE_FEATURE_POSTFIX = ");";
    1201              : 
    1202              : /*!
    1203              :  *  \brief prefix string constant to update a feature
    1204              :  */
    1205              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_FEATURE_PREFIX = "UPDATE features SET ";
    1206              : 
    1207              : /*!
    1208              :  *  \brief field name string constant to be used for updating a feature
    1209              :  */
    1210              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_FEATURE_COL_MAIN_TYPE = "main_type=";
    1211              : 
    1212              : /*!
    1213              :  *  \brief field name string constant to be used for updating a feature
    1214              :  */
    1215              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_FEATURE_COL_KEY = "key=";
    1216              : 
    1217              : /*!
    1218              :  *  \brief field name string constant to be used for updating a feature
    1219              :  */
    1220              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_FEATURE_COL_VALUE = "value=";
    1221              : 
    1222              : /*!
    1223              :  *  \brief field name string constant to be used for updating a feature
    1224              :  */
    1225              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_FEATURE_COL_DESCRIPTION = "description=";
    1226              : 
    1227              : /*!
    1228              :  *  \brief field name string constant to be used for updating a feature
    1229              :  */
    1230              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_FEATURE_COL_LIST_ORDER = "list_order=";
    1231              : 
    1232              : /*!
    1233              :  *  \brief infix string constant to update a feature
    1234              :  */
    1235              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_FEATURE_INFIX = " WHERE id=";
    1236              : 
    1237              : /*!
    1238              :  *  \brief postfix string constant to update a feature
    1239              :  */
    1240              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_FEATURE_POSTFIX = ";";
    1241              : 
    1242          325 : u8_error_t data_database_sql_builder_build_create_feature_command ( data_database_sql_builder_t *this_, const data_feature_t *feature )
    1243              : {
    1244          325 :     U8_TRACE_BEGIN();
    1245          325 :     assert( NULL != feature );
    1246          325 :     u8_error_t out_err = U8_ERROR_NONE;
    1247          325 :     u8_error_t result = U8_ERROR_NONE;
    1248              : 
    1249          325 :     out_err |= universal_memory_output_stream_reset( &((*this_).plain_out) );
    1250              : 
    1251          325 :     if ( data_feature_get_row_id( feature ) == DATA_ROW_VOID )
    1252              :     {
    1253          287 :         out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_FEATURE_PREFIX );
    1254              :     }
    1255              :     else
    1256              :     {
    1257           38 :         out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_FEATURE_WITH_ID_PREFIX );
    1258           38 :         out_err |= utf8stream_writer_write_int( &((*this_).plain), data_feature_get_row_id( feature ) );
    1259           38 :         out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
    1260              :     }
    1261          325 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), data_feature_get_main_type( feature ) );
    1262          325 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
    1263          325 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), data_feature_get_classifier_row_id( feature ) );
    1264          325 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
    1265              : 
    1266          325 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_START );
    1267          325 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );
    1268          325 :     out_err |= utf8stream_writer_write_str( &((*this_).escaped), data_feature_get_key_const( feature ) );
    1269          325 :     out_err |= utf8stream_writer_flush( &((*this_).escaped) );
    1270          325 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_END );
    1271              : 
    1272          325 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
    1273              : 
    1274          325 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_START );
    1275          325 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );
    1276          325 :     out_err |= utf8stream_writer_write_str( &((*this_).escaped), data_feature_get_value_const( feature ) );
    1277          325 :     out_err |= utf8stream_writer_flush( &((*this_).escaped) );
    1278          325 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_END );
    1279              : 
    1280          325 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
    1281              : 
    1282          325 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_START );
    1283          325 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );
    1284          325 :     out_err |= utf8stream_writer_write_str( &((*this_).escaped), data_feature_get_description_const( feature ) );
    1285          325 :     out_err |= utf8stream_writer_flush( &((*this_).escaped) );
    1286          325 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_END );
    1287              : 
    1288          325 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
    1289          325 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), data_feature_get_list_order( feature ) );
    1290              : 
    1291          325 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
    1292              : 
    1293          325 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_START );
    1294          325 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );
    1295          325 :     out_err |= utf8stream_writer_write_str( &((*this_).escaped), data_feature_get_uuid_const( feature ) );
    1296          325 :     out_err |= utf8stream_writer_flush( &((*this_).escaped) );
    1297          325 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_END );
    1298              : 
    1299          325 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_FEATURE_POSTFIX );
    1300              : 
    1301          325 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );  /* enforces 0-termination on (*this_).plain_out */
    1302              : 
    1303          325 :     if ( out_err != U8_ERROR_NONE )
    1304              :     {
    1305            0 :         U8_LOG_ERROR_HEX( "utf8stream_writer_write_...() failed:", out_err );
    1306            0 :         result |= U8_ERROR_STRING_BUFFER_EXCEEDED;
    1307              :     }
    1308              : 
    1309          325 :     U8_TRACE_END_ERR( result );
    1310          325 :     return( result );
    1311              : }
    1312              : 
    1313           14 : u8_error_t data_database_sql_builder_build_delete_feature_command ( data_database_sql_builder_t *this_, data_row_t feature_id )
    1314              : {
    1315           14 :     U8_TRACE_BEGIN();
    1316           14 :     u8_error_t out_err = U8_ERROR_NONE;
    1317           14 :     u8_error_t result = U8_ERROR_NONE;
    1318              : 
    1319           14 :     out_err |= universal_memory_output_stream_reset( &((*this_).plain_out) );
    1320              : 
    1321           14 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_DELETE_FEATURE_PREFIX );
    1322           14 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), feature_id );
    1323           14 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_DELETE_FEATURE_POSTFIX );
    1324              : 
    1325           14 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );  /* enforces 0-termination on (*this_).plain_out */
    1326              : 
    1327           14 :     if ( out_err != U8_ERROR_NONE )
    1328              :     {
    1329            0 :         U8_LOG_ERROR_HEX( "utf8stream_writer_write_...() failed:", out_err );
    1330            0 :         result |= U8_ERROR_STRING_BUFFER_EXCEEDED;
    1331              :     }
    1332              : 
    1333           14 :     U8_TRACE_END_ERR( result );
    1334           14 :     return( result );
    1335              : }
    1336              : 
    1337            6 : u8_error_t data_database_sql_builder_build_update_feature_main_type_cmd ( data_database_sql_builder_t *this_, data_row_t feature_id, data_feature_type_t new_feature_type )
    1338              : {
    1339            6 :     U8_TRACE_BEGIN();
    1340            6 :     u8_error_t out_err = U8_ERROR_NONE;
    1341            6 :     u8_error_t result = U8_ERROR_NONE;
    1342              : 
    1343            6 :     out_err |= universal_memory_output_stream_reset( &((*this_).plain_out) );
    1344              : 
    1345            6 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_FEATURE_PREFIX );
    1346            6 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_FEATURE_COL_MAIN_TYPE );
    1347              : 
    1348            6 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), new_feature_type );
    1349              : 
    1350            6 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_FEATURE_INFIX );
    1351              : 
    1352            6 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), feature_id );
    1353            6 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_FEATURE_POSTFIX );
    1354              : 
    1355            6 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );  /* enforces 0-termination on (*this_).plain_out */
    1356              : 
    1357            6 :     if ( out_err != U8_ERROR_NONE )
    1358              :     {
    1359            0 :         U8_LOG_ERROR_HEX( "utf8stream_writer_write_...() failed:", out_err );
    1360            0 :         result |= U8_ERROR_STRING_BUFFER_EXCEEDED;
    1361              :     }
    1362              : 
    1363            6 :     U8_TRACE_END_ERR( result );
    1364            6 :     return( result );
    1365              : }
    1366              : 
    1367            5 : u8_error_t data_database_sql_builder_build_update_feature_key_cmd ( data_database_sql_builder_t *this_, data_row_t feature_id, const char *new_feature_key )
    1368              : {
    1369            5 :     U8_TRACE_BEGIN();
    1370            5 :     assert( NULL != new_feature_key );
    1371            5 :     u8_error_t out_err = U8_ERROR_NONE;
    1372            5 :     u8_error_t result = U8_ERROR_NONE;
    1373              : 
    1374            5 :     out_err |= universal_memory_output_stream_reset( &((*this_).plain_out) );
    1375              : 
    1376            5 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_FEATURE_PREFIX );
    1377            5 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_FEATURE_COL_KEY );
    1378              : 
    1379            5 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_START );
    1380            5 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );
    1381              :     {
    1382              :         /* prepare a shortened_text to */
    1383              :         /* view the string but limited to the maximum allowed bytes: */
    1384              :         utf8stringview_t shortened_text;
    1385            5 :         const size_t new_length = utf8string_get_length( new_feature_key );
    1386            5 :         if ( new_length <= DATA_FEATURE_MAX_KEY_LENGTH )
    1387              :         {
    1388            5 :             utf8stringview_init_str( &shortened_text, new_feature_key );
    1389              :         }
    1390              :         else
    1391              :         {
    1392            0 :             out_err |= UTF8ERROR_TRUNCATED;
    1393            0 :             utf8stringview_init( &shortened_text, new_feature_key, DATA_FEATURE_MAX_KEY_LENGTH );
    1394              :             /* ignore a possible UTF8ERROR_OUT_OF_RANGE result */
    1395              :         }
    1396            5 :         out_err |= utf8stream_writer_write_view( &((*this_).escaped), &shortened_text );
    1397            5 :         out_err |= utf8stream_writer_flush( &((*this_).escaped) );
    1398            5 :         utf8stringview_destroy( &shortened_text );
    1399              :     }
    1400            5 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_END );
    1401              : 
    1402            5 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_FEATURE_INFIX );
    1403              : 
    1404            5 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), feature_id );
    1405            5 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_FEATURE_POSTFIX );
    1406              : 
    1407            5 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );  /* enforces 0-termination on (*this_).plain_out */
    1408              : 
    1409            5 :     if ( out_err != U8_ERROR_NONE )
    1410              :     {
    1411            0 :         U8_LOG_ERROR_HEX( "utf8stream_writer_write_...() failed:", out_err );
    1412            0 :         result |= U8_ERROR_STRING_BUFFER_EXCEEDED;
    1413              :     }
    1414              : 
    1415            5 :     U8_TRACE_END_ERR( result );
    1416            5 :     return( result );
    1417              : }
    1418              : 
    1419            6 : u8_error_t data_database_sql_builder_build_update_feature_value_cmd ( data_database_sql_builder_t *this_, data_row_t feature_id, const char *new_feature_value )
    1420              : {
    1421            6 :     U8_TRACE_BEGIN();
    1422            6 :     assert( NULL != new_feature_value );
    1423            6 :     u8_error_t out_err = U8_ERROR_NONE;
    1424            6 :     u8_error_t result = U8_ERROR_NONE;
    1425              : 
    1426            6 :     out_err |= universal_memory_output_stream_reset( &((*this_).plain_out) );
    1427              : 
    1428            6 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_FEATURE_PREFIX );
    1429            6 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_FEATURE_COL_VALUE );
    1430              : 
    1431            6 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_START );
    1432            6 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );
    1433              :     {
    1434              :         /* prepare a shortened_text to */
    1435              :         /* view the string but limited to the maximum allowed bytes: */
    1436              :         utf8stringview_t shortened_text;
    1437            6 :         const size_t new_length = utf8string_get_length( new_feature_value );
    1438            6 :         if ( new_length <= DATA_FEATURE_MAX_VALUE_LENGTH )
    1439              :         {
    1440            6 :             utf8stringview_init_str( &shortened_text, new_feature_value );
    1441              :         }
    1442              :         else
    1443              :         {
    1444            0 :             out_err |= UTF8ERROR_TRUNCATED;
    1445            0 :             utf8stringview_init( &shortened_text, new_feature_value, DATA_FEATURE_MAX_VALUE_LENGTH );
    1446              :             /* ignore a possible UTF8ERROR_OUT_OF_RANGE result */
    1447              :         }
    1448            6 :         out_err |= utf8stream_writer_write_view( &((*this_).escaped), &shortened_text );
    1449            6 :         out_err |= utf8stream_writer_flush( &((*this_).escaped) );
    1450            6 :         utf8stringview_destroy( &shortened_text );
    1451              :     }
    1452            6 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_END );
    1453              : 
    1454            6 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_FEATURE_INFIX );
    1455              : 
    1456            6 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), feature_id );
    1457            6 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_FEATURE_POSTFIX );
    1458              : 
    1459            6 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );  /* enforces 0-termination on (*this_).plain_out */
    1460              : 
    1461            6 :     if ( out_err != U8_ERROR_NONE )
    1462              :     {
    1463            0 :         U8_LOG_ERROR_HEX( "utf8stream_writer_write_...() failed:", out_err );
    1464            0 :         result |= U8_ERROR_STRING_BUFFER_EXCEEDED;
    1465              :     }
    1466              : 
    1467            6 :     U8_TRACE_END_ERR( result );
    1468            6 :     return( result );
    1469              : }
    1470              : 
    1471            5 : u8_error_t data_database_sql_builder_build_update_feature_description_cmd ( data_database_sql_builder_t *this_, data_row_t feature_id, const char *new_feature_description )
    1472              : {
    1473            5 :     U8_TRACE_BEGIN();
    1474            5 :     assert( NULL != new_feature_description );
    1475            5 :     u8_error_t out_err = U8_ERROR_NONE;
    1476            5 :     u8_error_t result = U8_ERROR_NONE;
    1477              : 
    1478            5 :     out_err |= universal_memory_output_stream_reset( &((*this_).plain_out) );
    1479              : 
    1480            5 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_FEATURE_PREFIX );
    1481            5 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_FEATURE_COL_DESCRIPTION );
    1482              : 
    1483            5 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_START );
    1484            5 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );
    1485              :     {
    1486              :         /* prepare a shortened_text to */
    1487              :         /* view the string but limited to the maximum allowed bytes: */
    1488              :         utf8stringview_t shortened_text;
    1489            5 :         const size_t new_length = utf8string_get_length( new_feature_description );
    1490            5 :         if ( new_length <= DATA_FEATURE_MAX_DESCRIPTION_LENGTH )
    1491              :         {
    1492            5 :             utf8stringview_init_str( &shortened_text, new_feature_description );
    1493              :         }
    1494              :         else
    1495              :         {
    1496            0 :             out_err |= UTF8ERROR_TRUNCATED;
    1497            0 :             utf8stringview_init( &shortened_text, new_feature_description, DATA_FEATURE_MAX_DESCRIPTION_LENGTH );
    1498              :             /* ignore a possible UTF8ERROR_OUT_OF_RANGE result */
    1499              :         }
    1500            5 :         out_err |= utf8stream_writer_write_view( &((*this_).escaped), &shortened_text );
    1501            5 :         out_err |= utf8stream_writer_flush( &((*this_).escaped) );
    1502            5 :         utf8stringview_destroy( &shortened_text );
    1503              :     }
    1504            5 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_END );
    1505              : 
    1506            5 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_FEATURE_INFIX );
    1507              : 
    1508            5 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), feature_id );
    1509            5 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_FEATURE_POSTFIX );
    1510              : 
    1511            5 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );  /* enforces 0-termination on (*this_).plain_out */
    1512              : 
    1513            5 :     if ( out_err != U8_ERROR_NONE )
    1514              :     {
    1515            0 :         U8_LOG_ERROR_HEX( "utf8stream_writer_write_...() failed:", out_err );
    1516            0 :         result |= U8_ERROR_STRING_BUFFER_EXCEEDED;
    1517              :     }
    1518              : 
    1519            5 :     U8_TRACE_END_ERR( result );
    1520            5 :     return( result );
    1521              : }
    1522              : 
    1523            5 : u8_error_t data_database_sql_builder_build_update_feature_list_order_cmd ( data_database_sql_builder_t *this_, data_row_t feature_id, int32_t new_feature_list_order )
    1524              : {
    1525            5 :     U8_TRACE_BEGIN();
    1526            5 :     u8_error_t out_err = U8_ERROR_NONE;
    1527            5 :     u8_error_t result = U8_ERROR_NONE;
    1528              : 
    1529            5 :     out_err |= universal_memory_output_stream_reset( &((*this_).plain_out) );
    1530              : 
    1531            5 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_FEATURE_PREFIX );
    1532            5 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_FEATURE_COL_LIST_ORDER );
    1533              : 
    1534            5 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), new_feature_list_order );
    1535              : 
    1536            5 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_FEATURE_INFIX );
    1537              : 
    1538            5 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), feature_id );
    1539            5 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_FEATURE_POSTFIX );
    1540              : 
    1541            5 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );  /* enforces 0-termination on (*this_).plain_out */
    1542              : 
    1543            5 :     if ( out_err != U8_ERROR_NONE )
    1544              :     {
    1545            0 :         U8_LOG_ERROR_HEX( "utf8stream_writer_write_...() failed:", out_err );
    1546            0 :         result |= U8_ERROR_STRING_BUFFER_EXCEEDED;
    1547              :     }
    1548              : 
    1549            5 :     U8_TRACE_END_ERR( result );
    1550            5 :     return( result );
    1551              : }
    1552              : 
    1553              : /* ================================ RELATIONSHIP ================================ */
    1554              : 
    1555              : /*!
    1556              :  *  \brief prefix string constant to insert a relationship
    1557              :  */
    1558              : static const char *DATA_DATABASE_SQL_BUILDER_INSERT_RELATIONSHIP_PREFIX =
    1559              :     "INSERT INTO relationships "
    1560              :     "(main_type,from_classifier_id,to_classifier_id,stereotype,name,description,list_order,from_feature_id,to_feature_id,uuid) "
    1561              :     "VALUES (";
    1562              : 
    1563              : /*!
    1564              :  *  \brief prefix string constant to insert a relationship with predefined id
    1565              :  */
    1566              : static const char *DATA_DATABASE_SQL_BUILDER_INSERT_RELATIONSHIP_WITH_ID_PREFIX =
    1567              :     "INSERT INTO relationships "
    1568              :     "(id,main_type,from_classifier_id,to_classifier_id,stereotype,name,description,list_order,from_feature_id,to_feature_id,uuid) "
    1569              :     "VALUES (";
    1570              : 
    1571              : /*!
    1572              :  *  \brief postfix string constant to insert a relationship
    1573              :  */
    1574              : static const char *DATA_DATABASE_SQL_BUILDER_INSERT_RELATIONSHIP_POSTFIX = ");";
    1575              : 
    1576              : /*!
    1577              :  *  \brief prefix string constant to delete a relationship
    1578              :  */
    1579              : static const char *DATA_DATABASE_SQL_BUILDER_DELETE_RELATIONSHIP_PREFIX =
    1580              :     "DELETE FROM relationships WHERE (id=";
    1581              : 
    1582              : /*!
    1583              :  *  \brief postfix string constant to delete a relationship
    1584              :  */
    1585              : static const char *DATA_DATABASE_SQL_BUILDER_DELETE_RELATIONSHIP_POSTFIX = ");";
    1586              : 
    1587              : /*!
    1588              :  *  \brief prefix string constant to update a relationship
    1589              :  */
    1590              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_RELATIONSHIP_PREFIX = "UPDATE relationships SET ";
    1591              : 
    1592              : /*!
    1593              :  *  \brief field name string constant to be used for updating a relationship
    1594              :  */
    1595              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_RELATIONSHIP_COL_MAIN_TYPE = "main_type=";
    1596              : 
    1597              : /*!
    1598              :  *  \brief field name string constant to be used for updating a relationship
    1599              :  */
    1600              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_RELATIONSHIP_COL_STEREOTYPE = "stereotype=";
    1601              : 
    1602              : /*!
    1603              :  *  \brief field name string constant to be used for updating a relationship
    1604              :  */
    1605              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_RELATIONSHIP_COL_NAME = "name=";
    1606              : 
    1607              : /*!
    1608              :  *  \brief field name string constant to be used for updating a relationship
    1609              :  */
    1610              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_RELATIONSHIP_COL_DESCRIPTION = "description=";
    1611              : 
    1612              : /*!
    1613              :  *  \brief field name string constant to be used for updating a relationship
    1614              :  */
    1615              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_RELATIONSHIP_COL_LIST_ORDER = "list_order=";
    1616              : 
    1617              : /*!
    1618              :  *  \brief infix string constant to update a relationship
    1619              :  */
    1620              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_RELATIONSHIP_INFIX = " WHERE id=";
    1621              : 
    1622              : /*!
    1623              :  *  \brief postfix string constant to update a relationship
    1624              :  */
    1625              : static const char *DATA_DATABASE_SQL_BUILDER_UPDATE_RELATIONSHIP_POSTFIX = ";";
    1626              : 
    1627          435 : u8_error_t data_database_sql_builder_build_create_relationship_command ( data_database_sql_builder_t *this_, const data_relationship_t *relationship )
    1628              : {
    1629          435 :     U8_TRACE_BEGIN();
    1630          435 :     assert( NULL != relationship );
    1631          435 :     u8_error_t out_err = U8_ERROR_NONE;
    1632          435 :     u8_error_t result = U8_ERROR_NONE;
    1633              : 
    1634          435 :     out_err |= universal_memory_output_stream_reset( &((*this_).plain_out) );
    1635              : 
    1636          435 :     if ( data_relationship_get_row_id( relationship ) == DATA_ROW_VOID )
    1637              :     {
    1638          403 :         out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_RELATIONSHIP_PREFIX );
    1639              :     }
    1640              :     else
    1641              :     {
    1642           32 :         out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_RELATIONSHIP_WITH_ID_PREFIX );
    1643           32 :         out_err |= utf8stream_writer_write_int( &((*this_).plain), data_relationship_get_row_id( relationship ) );
    1644           32 :         out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
    1645              :     }
    1646          435 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), data_relationship_get_main_type( relationship ) );
    1647          435 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
    1648          435 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), data_relationship_get_from_classifier_row_id( relationship ) );
    1649          435 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
    1650          435 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), data_relationship_get_to_classifier_row_id( relationship ) );
    1651          435 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
    1652              : 
    1653              :     /* stereotype */
    1654          435 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_START );
    1655          435 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );
    1656          435 :     out_err |= utf8stream_writer_write_str( &((*this_).escaped), data_relationship_get_stereotype_const( relationship ) );
    1657          435 :     out_err |= utf8stream_writer_flush( &((*this_).escaped) );
    1658          435 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_END );
    1659              : 
    1660          435 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
    1661              : 
    1662              :     /* name */
    1663          435 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_START );
    1664          435 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );
    1665          435 :     out_err |= utf8stream_writer_write_str( &((*this_).escaped), data_relationship_get_name_const( relationship ) );
    1666          435 :     out_err |= utf8stream_writer_flush( &((*this_).escaped) );
    1667          435 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_END );
    1668              : 
    1669          435 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
    1670              : 
    1671              :     /* description*/
    1672          435 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_START );
    1673          435 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );
    1674          435 :     out_err |= utf8stream_writer_write_str( &((*this_).escaped), data_relationship_get_description_const( relationship ) );
    1675          435 :     out_err |= utf8stream_writer_flush( &((*this_).escaped) );
    1676          435 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_END );
    1677              : 
    1678          435 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
    1679          435 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), data_relationship_get_list_order( relationship ) );
    1680          435 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
    1681              : 
    1682          435 :     if ( DATA_ROW_VOID == data_relationship_get_from_feature_row_id( relationship ) )
    1683              :     {
    1684          412 :         out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_NULL_VALUE );
    1685              :     }
    1686              :     else
    1687              :     {
    1688           23 :         out_err |= utf8stream_writer_write_int( &((*this_).plain), data_relationship_get_from_feature_row_id( relationship ) );
    1689              :     }
    1690          435 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
    1691          435 :     if ( DATA_ROW_VOID == data_relationship_get_to_feature_row_id( relationship ) )
    1692              :     {
    1693          409 :         out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_NULL_VALUE );
    1694              :     }
    1695              :     else
    1696              :     {
    1697           26 :         out_err |= utf8stream_writer_write_int( &((*this_).plain), data_relationship_get_to_feature_row_id( relationship ) );
    1698              :     }
    1699              : 
    1700          435 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_VALUE_SEPARATOR );
    1701              : 
    1702          435 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_START );
    1703          435 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );
    1704          435 :     out_err |= utf8stream_writer_write_str( &((*this_).escaped), data_relationship_get_uuid_const( relationship ) );
    1705          435 :     out_err |= utf8stream_writer_flush( &((*this_).escaped) );
    1706          435 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_END );
    1707              : 
    1708          435 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_INSERT_RELATIONSHIP_POSTFIX );
    1709              : 
    1710          435 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );  /* enforces 0-termination on (*this_).plain_out */
    1711              : 
    1712          435 :     if ( out_err != U8_ERROR_NONE )
    1713              :     {
    1714            0 :         U8_LOG_ERROR_HEX( "utf8stream_writer_write_...() failed:", out_err );
    1715            0 :         result |= U8_ERROR_STRING_BUFFER_EXCEEDED;
    1716              :     }
    1717              : 
    1718          435 :     U8_TRACE_END_ERR( result );
    1719          435 :     return( result );
    1720              : }
    1721              : 
    1722           15 : u8_error_t data_database_sql_builder_build_delete_relationship_command ( data_database_sql_builder_t *this_, data_row_t relationship_id )
    1723              : {
    1724           15 :     U8_TRACE_BEGIN();
    1725           15 :     u8_error_t out_err = U8_ERROR_NONE;
    1726           15 :     u8_error_t result = U8_ERROR_NONE;
    1727              : 
    1728           15 :     out_err |= universal_memory_output_stream_reset( &((*this_).plain_out) );
    1729              : 
    1730           15 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_DELETE_RELATIONSHIP_PREFIX );
    1731           15 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), relationship_id );
    1732           15 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_DELETE_RELATIONSHIP_POSTFIX );
    1733              : 
    1734           15 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );  /* enforces 0-termination on (*this_).plain_out */
    1735              : 
    1736           15 :     if ( out_err != U8_ERROR_NONE )
    1737              :     {
    1738            0 :         U8_LOG_ERROR_HEX( "utf8stream_writer_write_...() failed:", out_err );
    1739            0 :         result |= U8_ERROR_STRING_BUFFER_EXCEEDED;
    1740              :     }
    1741              : 
    1742           15 :     U8_TRACE_END_ERR( result );
    1743           15 :     return( result );
    1744              : }
    1745              : 
    1746            3 : u8_error_t data_database_sql_builder_build_update_relationship_main_type_cmd ( data_database_sql_builder_t *this_, data_row_t relationship_id, data_relationship_type_t new_relationship_type )
    1747              : {
    1748            3 :     U8_TRACE_BEGIN();
    1749            3 :     u8_error_t out_err = U8_ERROR_NONE;
    1750            3 :     u8_error_t result = U8_ERROR_NONE;
    1751              : 
    1752            3 :     out_err |= universal_memory_output_stream_reset( &((*this_).plain_out) );
    1753              : 
    1754            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_RELATIONSHIP_PREFIX );
    1755            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_RELATIONSHIP_COL_MAIN_TYPE );
    1756              : 
    1757            3 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), new_relationship_type );
    1758              : 
    1759            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_RELATIONSHIP_INFIX );
    1760              : 
    1761            3 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), relationship_id );
    1762            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_RELATIONSHIP_POSTFIX );
    1763              : 
    1764            3 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );  /* enforces 0-termination on (*this_).plain_out */
    1765              : 
    1766            3 :     if ( out_err != U8_ERROR_NONE )
    1767              :     {
    1768            0 :         U8_LOG_ERROR_HEX( "utf8stream_writer_write_...() failed:", out_err );
    1769            0 :         result |= U8_ERROR_STRING_BUFFER_EXCEEDED;
    1770              :     }
    1771              : 
    1772            3 :     U8_TRACE_END_ERR( result );
    1773            3 :     return( result );
    1774              : }
    1775              : 
    1776            3 : u8_error_t data_database_sql_builder_build_update_relationship_stereotype_cmd ( data_database_sql_builder_t *this_,
    1777              :                                                                                 data_row_t relationship_id,
    1778              :                                                                                 const char *new_relationship_stereotype )
    1779              : {
    1780              : 
    1781            3 :     U8_TRACE_BEGIN();
    1782            3 :     assert( NULL != new_relationship_stereotype );
    1783            3 :     u8_error_t out_err = U8_ERROR_NONE;
    1784            3 :     u8_error_t result = U8_ERROR_NONE;
    1785              : 
    1786            3 :     out_err |= universal_memory_output_stream_reset( &((*this_).plain_out) );
    1787              : 
    1788            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_RELATIONSHIP_PREFIX );
    1789            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_RELATIONSHIP_COL_STEREOTYPE );
    1790              : 
    1791            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_START );
    1792            3 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );
    1793              :     {
    1794              :         /* prepare a shortened_text to */
    1795              :         /* view the string but limited to the maximum allowed bytes: */
    1796              :         utf8stringview_t shortened_text;
    1797            3 :         const size_t new_length = utf8string_get_length( new_relationship_stereotype );
    1798            3 :         if ( new_length <= DATA_RELATIONSHIP_MAX_STEREOTYPE_LENGTH )
    1799              :         {
    1800            3 :             utf8stringview_init_str( &shortened_text, new_relationship_stereotype );
    1801              :         }
    1802              :         else
    1803              :         {
    1804            0 :             out_err |= UTF8ERROR_TRUNCATED;
    1805            0 :             utf8stringview_init( &shortened_text, new_relationship_stereotype, DATA_RELATIONSHIP_MAX_STEREOTYPE_LENGTH );
    1806              :             /* ignore a possible UTF8ERROR_OUT_OF_RANGE result */
    1807              :         }
    1808            3 :         out_err |= utf8stream_writer_write_view( &((*this_).escaped), &shortened_text );
    1809            3 :         out_err |= utf8stream_writer_flush( &((*this_).escaped) );
    1810            3 :         utf8stringview_destroy( &shortened_text );
    1811              :     }
    1812            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_END );
    1813              : 
    1814            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_RELATIONSHIP_INFIX );
    1815              : 
    1816            3 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), relationship_id );
    1817            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_RELATIONSHIP_POSTFIX );
    1818              : 
    1819            3 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );  /* enforces 0-termination on (*this_).plain_out */
    1820              : 
    1821            3 :     if ( out_err != U8_ERROR_NONE )
    1822              :     {
    1823            0 :         U8_LOG_ERROR_HEX( "utf8stream_writer_write_...() failed:", out_err );
    1824            0 :         result |= U8_ERROR_STRING_BUFFER_EXCEEDED;
    1825              :     }
    1826              : 
    1827            3 :     U8_TRACE_END_ERR( result );
    1828            3 :     return( result );
    1829              : }
    1830              : 
    1831            3 : u8_error_t data_database_sql_builder_build_update_relationship_name_cmd ( data_database_sql_builder_t *this_,
    1832              :                                                                           data_row_t relationship_id,
    1833              :                                                                           const char *new_relationship_name )
    1834              : {
    1835            3 :     U8_TRACE_BEGIN();
    1836            3 :     assert( NULL != new_relationship_name );
    1837            3 :     u8_error_t out_err = U8_ERROR_NONE;
    1838            3 :     u8_error_t result = U8_ERROR_NONE;
    1839              : 
    1840            3 :     out_err |= universal_memory_output_stream_reset( &((*this_).plain_out) );
    1841              : 
    1842            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_RELATIONSHIP_PREFIX );
    1843            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_RELATIONSHIP_COL_NAME );
    1844              : 
    1845            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_START );
    1846            3 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );
    1847              :     {
    1848              :         /* prepare a shortened_text to */
    1849              :         /* view the string but limited to the maximum allowed bytes: */
    1850              :         utf8stringview_t shortened_text;
    1851            3 :         const size_t new_length = utf8string_get_length( new_relationship_name );
    1852            3 :         if ( new_length <= DATA_RELATIONSHIP_MAX_NAME_LENGTH )
    1853              :         {
    1854            3 :             utf8stringview_init_str( &shortened_text, new_relationship_name );
    1855              :         }
    1856              :         else
    1857              :         {
    1858            0 :             out_err |= UTF8ERROR_TRUNCATED;
    1859            0 :             utf8stringview_init( &shortened_text, new_relationship_name, DATA_RELATIONSHIP_MAX_NAME_LENGTH );
    1860              :             /* ignore a possible UTF8ERROR_OUT_OF_RANGE result */
    1861              :         }
    1862            3 :         out_err |= utf8stream_writer_write_view( &((*this_).escaped), &shortened_text );
    1863            3 :         out_err |= utf8stream_writer_flush( &((*this_).escaped) );
    1864            3 :         utf8stringview_destroy( &shortened_text );
    1865              :     }
    1866            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_END );
    1867              : 
    1868            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_RELATIONSHIP_INFIX );
    1869              : 
    1870            3 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), relationship_id );
    1871            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_RELATIONSHIP_POSTFIX );
    1872              : 
    1873            3 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );  /* enforces 0-termination on (*this_).plain_out */
    1874              : 
    1875            3 :     if ( out_err != U8_ERROR_NONE )
    1876              :     {
    1877            0 :         U8_LOG_ERROR_HEX( "utf8stream_writer_write_...() failed:", out_err );
    1878            0 :         result |= U8_ERROR_STRING_BUFFER_EXCEEDED;
    1879              :     }
    1880              : 
    1881            3 :     U8_TRACE_END_ERR( result );
    1882            3 :     return( result );
    1883              : }
    1884              : 
    1885            4 : u8_error_t data_database_sql_builder_build_update_relationship_description_cmd ( data_database_sql_builder_t *this_, data_row_t relationship_id, const char *new_relationship_description )
    1886              : {
    1887            4 :     U8_TRACE_BEGIN();
    1888            4 :     assert( NULL != new_relationship_description );
    1889            4 :     u8_error_t out_err = U8_ERROR_NONE;
    1890            4 :     u8_error_t result = U8_ERROR_NONE;
    1891              : 
    1892            4 :     out_err |= universal_memory_output_stream_reset( &((*this_).plain_out) );
    1893              : 
    1894            4 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_RELATIONSHIP_PREFIX );
    1895            4 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_RELATIONSHIP_COL_DESCRIPTION );
    1896              : 
    1897            4 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_START );
    1898            4 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );
    1899              :     {
    1900              :         /* prepare a shortened_text to */
    1901              :         /* view the string but limited to the maximum allowed bytes: */
    1902              :         utf8stringview_t shortened_text;
    1903            4 :         const size_t new_length = utf8string_get_length( new_relationship_description );
    1904            4 :         if ( new_length <= DATA_RELATIONSHIP_MAX_DESCRIPTION_LENGTH )
    1905              :         {
    1906            4 :             utf8stringview_init_str( &shortened_text, new_relationship_description );
    1907              :         }
    1908              :         else
    1909              :         {
    1910            0 :             out_err |= UTF8ERROR_TRUNCATED;
    1911            0 :             utf8stringview_init( &shortened_text, new_relationship_description, DATA_RELATIONSHIP_MAX_DESCRIPTION_LENGTH );
    1912              :             /* ignore a possible UTF8ERROR_OUT_OF_RANGE result */
    1913              :         }
    1914            4 :         out_err |= utf8stream_writer_write_view( &((*this_).escaped), &shortened_text );
    1915            4 :         out_err |= utf8stream_writer_flush( &((*this_).escaped) );
    1916            4 :         utf8stringview_destroy( &shortened_text );
    1917              :     }
    1918            4 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_STRING_VALUE_END );
    1919              : 
    1920            4 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_RELATIONSHIP_INFIX );
    1921              : 
    1922            4 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), relationship_id );
    1923            4 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_RELATIONSHIP_POSTFIX );
    1924              : 
    1925            4 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );  /* enforces 0-termination on (*this_).plain_out */
    1926              : 
    1927            4 :     if ( out_err != U8_ERROR_NONE )
    1928              :     {
    1929            0 :         U8_LOG_ERROR_HEX( "utf8stream_writer_write_...() failed:", out_err );
    1930            0 :         result |= U8_ERROR_STRING_BUFFER_EXCEEDED;
    1931              :     }
    1932              : 
    1933            4 :     U8_TRACE_END_ERR( result );
    1934            4 :     return( result );
    1935              : }
    1936              : 
    1937            3 : u8_error_t data_database_sql_builder_build_update_relationship_list_order_cmd ( data_database_sql_builder_t *this_, data_row_t relationship_id, int32_t new_relationship_list_order )
    1938              : {
    1939            3 :     U8_TRACE_BEGIN();
    1940            3 :     u8_error_t out_err = U8_ERROR_NONE;
    1941            3 :     u8_error_t result = U8_ERROR_NONE;
    1942              : 
    1943            3 :     out_err |= universal_memory_output_stream_reset( &((*this_).plain_out) );
    1944              : 
    1945            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_RELATIONSHIP_PREFIX );
    1946            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_RELATIONSHIP_COL_LIST_ORDER );
    1947              : 
    1948            3 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), new_relationship_list_order );
    1949              : 
    1950            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_RELATIONSHIP_INFIX );
    1951              : 
    1952            3 :     out_err |= utf8stream_writer_write_int( &((*this_).plain), relationship_id );
    1953            3 :     out_err |= utf8stream_writer_write_str( &((*this_).plain), DATA_DATABASE_SQL_BUILDER_UPDATE_RELATIONSHIP_POSTFIX );
    1954              : 
    1955            3 :     out_err |= utf8stream_writer_flush( &((*this_).plain) );  /* enforces 0-termination on (*this_).plain_out */
    1956              : 
    1957            3 :     if ( out_err != U8_ERROR_NONE )
    1958              :     {
    1959            0 :         U8_LOG_ERROR_HEX( "utf8stream_writer_write_...() failed:", out_err );
    1960            0 :         result |= U8_ERROR_STRING_BUFFER_EXCEEDED;
    1961              :     }
    1962              : 
    1963            3 :     U8_TRACE_END_ERR( result );
    1964            3 :     return( result );
    1965              : }
    1966              : 
    1967              : 
    1968              : /*
    1969              : Copyright 2016-2025 Andreas Warnke
    1970              : 
    1971              : Licensed under the Apache License, Version 2.0 (the "License");
    1972              : you may not use this file except in compliance with the License.
    1973              : You may obtain a copy of the License at
    1974              : 
    1975              :     http://www.apache.org/licenses/LICENSE-2.0
    1976              : 
    1977              : Unless required by applicable law or agreed to in writing, software
    1978              : distributed under the License is distributed on an "AS IS" BASIS,
    1979              : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    1980              : See the License for the specific language governing permissions and
    1981              : limitations under the License.
    1982              : */
        

Generated by: LCOV version 2.0-1