Проблемы с компиляцией процедуры преобразования PX - PullRequest
0 голосов
/ 27 мая 2020

У меня есть подпрограмма преобразователя, написанная на C ++, которая настроена на очистку всех пробелов и отображение значения, если входная строка либо пуста, либо пуста. Код C ++ компилируется и протестирован правильно, но у меня возникают проблемы с тем, чтобы эта процедура работала в Datastage.

Согласно инструкциям, я скопировал точные параметры компилятора, которые есть в моей среде DS, как показано ниже.

g++ -c -O -fPIC -Wno-deprecated -m64 -mtune=generic -mcmodel=small BlankToValue.cpp
g++ -shared -m64 BlankToValue.so BlankToValue.o

Однако при тестировании подпрограммы в задании я получаю следующую ошибку.

Sequential_File_36,0: Внутренняя ошибка: (shbuf): iomgr / iomgr. C: 2649

Есть ли другой набор параметров, который я должен использовать для компиляции?

Для справки, код C ++.

#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <locale.h>
#include <locale>

char * BlankToValue(char *InStr, char *RepStr)
{
    if (InStr[0] == '\0')                           // Check for null pointer at first character of input string.
    {
        return RepStr;                              // Return replacement string if true. This is to prevent unnecessary processing.
    } else
    {
        const char* checkstr = InStr;               // Establish copy of inputstring stored in checkstring.
        do {                                        // Start outer loop.
            while (isspace(*checkstr)) {            // Inner loop while current checkstring byte is whitespace.
                ++checkstr;                         // Increment to next checkstring byte.
            }
        } while ((*InStr++ = *checkstr++));         // Set inputstring byte to current checkstring and iterate both. Breaks when either string evaluates to null.
        *InStr = '\0';                              // Set null terminator for input string at current byte location.
        if (InStr[0] == '\0')                       // Checks first character of cleaned input string for null pointer.
        {
            return RepStr;                          // Return replacement string if true.
        } else
        {
            return InStr;                           // Return new input string if false.
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 27 мая 2020

Кроме того, я заметил, что ошибка исходит из этапа последовательного файла, а не из этапа преобразования, который использует настраиваемую процедуру. Таким образом, может также потребоваться рассмотреть тип выходных данных для вашей настраиваемой процедуры и убедиться, что она выходит с допустимым значением, которое не слишком велико для этого типа данных, а также не превышает размер транспортного буфера по умолчанию, используемого между этапами (по умолчанию 128 КБ).

0 голосов
/ 29 мая 2020

После нескольких дней или двух попыток попробовать разные подходы к компиляции и кодированию я нашел решение своей проблемы. Приведенный ниже код выдавал ошибку сегментации при передаче пустого столбца. В ретроспективе это имеет смысл.

if (InStr[0] == '\0')

Это было исправлено ниже, и теперь все работает правильно.

if ((InStr == NULL) || (InStr[0] == '\0'))   
0 голосов
/ 27 мая 2020

William,

в определении подпрограммы DataStage, которое указывает на эту настраиваемую функцию, выбрали ли вы тип подпрограммы как объект (файл .o, который компилируется в ступень преобразователя во время выполнения задания) или библиотека (файл lib .so, который загружается во время выполнения задания, но имеет требования к соглашению об именах библиотек и эта библиотека находится в пути к библиотеке). В приведенном выше коде предполагается, что вы создаете файл * .so, но без префикса lib. Вот пример: https://www.ibm.com/support/pages/node/403041

Кроме того, если первая ошибка в журнале заданий не была ошибкой загрузки библиотеки, а скорее была ошибкой внутренней ошибки (shbuf), я обнаружил пару случаев, когда это происходило в прошлом с пользовательскими подпрограммами:

  1. Пользовательская процедура включала нулевую обработку, как и ваша, и начала давать сбой после обновления до Information Server 8.5 при изменении правил нулевой обработки в нашем продукте. Изменения объясняются здесь: https://www.ibm.com/support/pages/node/433863 Вы можете проверить, является ли это проблемой, запустив задание с новой переменной среды уровня задания: APT_TRANSFORM_COMPILE_OLD_NULL_HANDLING = 1

  2. В В другом случае ошибка shbuf в настраиваемой подпрограмме была результатом того, что каскад преобразователя получил большую запись (больше, чем может быть обработано типом данных, определенным в настраиваемой подпрограмме). Задание по-прежнему завершается ошибкой при использовании только одной входной записи образца с небольшими значениями во всех полях строкового типа.

Спасибо.

...