Перенос пользовательских функций DB2 из AIX в Linux (RHEL) - PullRequest
0 голосов
/ 01 марта 2010

Я успешно скомпилировал некоторые пользовательские функции в 64-битной Linux, которые изначально были скомпилированы в AIX

Linux работает под управлением IBM DB2 v9.5

Вот функция, которая иногда возвращает некоторые значения

#include <cstdlib>
#include <cstdio>
#include <iostream>
#include "cbudf.hpp"


using namespace std;

extern "C"
void SQL_API_FN cbzdt(SQLUDF_VARCHAR_FBD *pArg,
                      SQLUDF_VARCHAR *pResult,
                      SQLUDF_NULLIND *pArgInd,
                      SQLUDF_NULLIND *pResultInd,
                      SQLUDF_CHAR *pSqlState,
                      SQLUDF_VARCHAR *pFuncName,
                      SQLUDF_VARCHAR *pSpecName,
                      SQLUDF_VARCHAR *pMsgTxt)
{
short i;
unsigned long x = 0;

cout << "entered cbzdt";

if (pArg->length < CM_UDF_ZDT_SIZE){
   *pResultInd = CM_UDF_IS_NULL_IND;
   cout << "pArg length is:" << pArg->length << " and that is smaller than CM_UDF_ZDT_SIZE: " << CM_UDF_ZDT_SIZE;
   }
else
   {
   cout << "entered else";
   for (i = 0; i < 4; i++)
      x = (x << 8) | pArg->data[i];
   if (x & 0xff000000){
      *pResultInd = CM_UDF_IS_NULL_IND;
      cout << "x mask is true.. making null";
      }
   else
      {
      cout << "entered nested else";
      *pResultInd = CM_UDF_NOT_NULL_IND;
      CtDate zDate(x);
//      strcpy(pResult, (const char *)(zDate.asString("%Y-%m-%d")));
      strncpy(pResult, (const char *)(zDate.asString("%Y-%m-%d")),11);
      if (pResult[0] == '3'){             // if year is 3000
         pResult[9] = '1';               // fix day
         cout << "pResult =1";
         }
      }
   }
}

А вот данные:

COID_                      TIMESTAMP_                 CHANGE_DATE                
-------------------------- -------------------------- ---------------------------
1814              2010-02-17-15.44.22.995784 x'0025780F000000000804011B'
1814              2010-02-17-15.44.55.583734 x'0025780F000000000804011B'
1814              2010-02-17-15.46.09.929014 x'0025780F000000000804011B'
1324              2009-12-02-21.31.13.058337 x'0025769F000000000804011B'
1324              2009-12-02-21.32.47.387150 x'0025769F000000000804011B'
1324              2009-12-02-21.34.03.020405 x'0025769F000000000804011B'
1324              2009-12-08-19.54.13.492488 x'002576A1000000000804011B'
1324              2009-12-08-19.55.22.041794 x'002576A1000000000804011B'
1358              2009-12-09-15.14.05.593887 x'002576A1000000000804011B'



After function applied:

COID_                      TIMESTAMP_                 3         
-------------------------- -------------------------- ----------
1814              2010-02-17-15.44.22.995784 2011-01-05
1814              2010-02-17-15.44.55.583734 2011-01-05
1814              2010-02-17-15.46.09.929014 2011-01-05
1324              2009-12-02-21.31.13.058337 -         
1324              2009-12-02-21.32.47.387150 -         
1324              2009-12-02-21.34.03.020405 -         
1324              2009-12-08-19.54.13.492488 -         
1324              2009-12-08-19.55.22.041794 -         
1358              2009-12-09-15.14.05.593887 -         

У кого-нибудь есть идеи?

Я предполагаю, что это утверждение if:

if (x & 0xff000000){
          *pResultInd = CM_UDF_IS_NULL_IND;

возвращает true для некоторых значений. Может ли это быть что-то, связанное с 64-битным?

Коты также не печатаются в выводе DB2

Спасибо

1 Ответ

0 голосов
/ 04 марта 2010

Каковы правила преобразования части двоичной zDate в пригодную для использования дату? Возможно, вы могли бы придумать эквивалентную функцию преобразования в SQL и полностью избежать внешнего скомпилированного UDF. Функция HEX преобразует двоичное значение в шестнадцатеричную строку, которую вы затем можете перебрать с помощью SUBSTR, чтобы получить целочисленное значение.

Что касается сообщений cout, я не думаю, что cout будет очень полезен во внешнем UDF. Тебе повезет, сохранив информацию об отладке в локальный файл.

...