#define SQL_TEXT Latin_Text #include <sqltypes_td.h> #include <string.h> #define buffer_size 100000 const char trunc_err[6] = "22001"; static int append_lob(LOB_RESULT_LOCATOR, LOB_LOCATOR); void concat3( LOB_LOCATOR *a, VARBYTE *b, LOB_LOCATOR *c, LOB_RESULT_LOCATOR *result, char sqlstate[6] ) { FNC_LobLength_t actlen; /* Append the first argument. Note that a truncation error could occur only if the result exceeds the maximum LOB size, so the first append should never get that error. */ if (append_lob(*result, *a) != 0) { strcpy(sqlstate, trunc_err); return; } /* Append the second argument */ if (FNC_LobAppend(*result, b->bytes, b->length, &actlen) != 0) { strcpy(sqlstate, trunc_err); return; } /* Append the third argument */ if (append_lob(*result, *c) != 0) { strcpy(sqlstate, trunc_err); return; } } int append_lob( LOB_RESULT_LOCATOR dest, LOB_LOCATOR source ) { BYTE buffer[buffer_size]; LOB_CONTEXT_ID id; FNC_LobLength_t actlen; int trunc_err = 0; FNC_LobOpen(source, &id, 0, 0); while( FNC_LobRead(id, buffer, buffer_size, &actlen) == 0 && !trunc_err ) trunc_err = FNC_LobAppend(dest, buffer, actlen, &actlen); FNC_LobClose(id); return trunc_err; }